Notificaciones en tiempo real (SSE)
Notificaciones en tiempo real (SSE)
Suscríbete a canales NOTIFY de PostgreSQL mediante Server-Sent Events:
curl -N "http://localhost:8080/db/my_database/sse?channels=orders,users" \
-H "Authorization: Bearer $TOKEN"Cada mensaje es JSON con el canal y el payload:
{"channel":"orders","data":{"id":123,"status":"created"}}Si el payload es texto, se envuelve como string en data.
Los canales no están restringidos por rol
A diferencia de los endpoints JSON-RPC y MCP, SSE no aplica SET LOCAL ROLE
ni comprueba de ningún otro modo los permisos del rol autenticado antes de suscribirse. PgArachne
autentica al llamante (un JWT válido, un token de API o credenciales directas para la base de datos de
destino), pero cualquier llamante autenticado — sin importar a qué rol correspondan sus credenciales —
puede suscribirse a cualquier canal NOTIFY y recibirá todo lo que se
publique en él. Esto se debe a cómo está construido el endpoint: todos los clientes SSE de una base de
datos comparten una única conexión LISTEN abierta como la cuenta de servicio
DB_USER, y PostgreSQL en sí no tiene ningún GRANT por canal en el que
delegar — los canales LISTEN/NOTIFY no son objetos de base de datos.
No envíes mediante NOTIFY payloads con datos que no todos los roles autenticados deberían
ver. Si necesitas control de acceso a nivel de canal, impleméntalo en tu propia lógica de aplicación
(por ejemplo, convenciones de nombres de canal por rol, o filtrando lo que incluyes en el payload) —
PgArachne no lo hará por ti en este endpoint.
Enviar notificaciones desde PostgreSQL
Desde psql o cualquier sesión de base de datos:
-- Payload de texto simple
NOTIFY orders, 'nuevo pedido';
-- Payload JSON
NOTIFY orders, '{"id":123,"status":"created"}';
Desde un trigger o procedimiento almacenado:
PERFORM pg_notify('orders', json_build_object('id', NEW.id, 'status', NEW.status)::text);NOTIFY solo se entrega a otras sesiones tras el commit de la transacción
que lo envió. Si lo ejecutas dentro de una transacción abierta en psql, los suscriptores no
lo recibirán hasta el COMMIT.