Ir al contenido

API del canal (Conecta y WhatsApp)

import { clienteConecta, verificarRelay, normalizarWebhook, enviarTexto, cifrar } from "@/lib/agente/core/canal";

Todo usa WebCrypto y fetch: funciona en Workers, Deno, Bun y Node 20+.

Función
clienteConecta(apiKey, base?) .crearSesion({client_name?, tenant_ref?}), .verSesion(id), .reclamar(id), .activar(id). Cada una devuelve { ok, status, json }
esMensajeConecta(evento, sessionId) Valida el postMessage del pop-up (origen https://agentes.lemabot.com, type: "lema:conecta")
CONECTA_URL https://agentes.lemabot.com
Función
verificarRelay({ cuerpo, timestamp, firma, claveHex, ahora?, toleranciaSeg? }) { ok: true } o { ok: false, motivo: "timestamp_viejo" | "firma_invalida" }
CABECERAS_RELAY Nombres de las cabeceras x-lema-*
normalizarWebhook(cuerpo) EventoWhatsApp[]: entrante, eco (respuesta desde la app), estado
numerosDelCuerpo(cuerpo) phone_number_id presentes (comparar con la conexión → 403)
textoDeMensaje(msg) Texto legible de cualquier tipo ([audio], [image], título de botón…)
Función
enviarTexto({ token, phoneNumberId, to, texto }) Teléfono (to) o BSUID (recipient). Devuelve { ok, wamid } o { ok:false, error, codigo }
marcarLeidoYEscribiendo({ token, phoneNumberId, wamid }) Leído + “escribiendo…” (máx. 25 s)
dentroDeVentana(ultimoEntrante) Ventana de 24 h
Función
cifrar(texto, ENCRYPTION_KEY) / descifrar(cifrado, ENCRYPTION_KEY) AES-GCM, formato iv:ct base64. Compatible con lo que guardó Minerales
hmacSha256Hex, hexABytes, igualSeguro Utilidades