Realtime-Benachrichtigungen (SSE)

2 Min. Lesezeit

Realtime-Benachrichtigungen (SSE)

Abonnieren Sie PostgreSQL-NOTIFY-Kanäle über Server-Sent Events:

curl -N "http://localhost:8080/db/my_database/sse?channels=orders,users" \
  -H "Authorization: Bearer $TOKEN"

Jede Nachricht ist JSON mit Kanal und Payload:

{"channel":"orders","data":{"id":123,"status":"created"}}

Wenn der Payload Text ist, wird er als String in data verpackt.

Kanäle sind nicht rollenbasiert eingeschränkt

Im Gegensatz zu den JSON-RPC- und MCP-Endpunkten wendet SSE kein SET LOCAL ROLE an und prüft auch sonst nicht die Berechtigungen der authentifizierten Rolle vor dem Abonnieren. PgArachne authentifiziert den Aufrufer (ein gültiges JWT, ein API-Token oder direkte Zugangsdaten für die Zieldatenbank), aber jeder authentifizierte Aufrufer — unabhängig davon, welcher Rolle seine Zugangsdaten zugeordnet sind — kann jeden beliebigen NOTIFY-Kanalnamen abonnieren und erhält alles, was darauf veröffentlicht wird. Das ergibt sich aus dem Aufbau des Endpunkts: Alle SSE-Clients einer Datenbank teilen sich eine einzige LISTEN-Verbindung, die als DB_USER-Servicekonto geöffnet wird, und PostgreSQL selbst kennt kein kanalbezogenes GRANT, an das delegiert werden könnte — LISTEN/NOTIFY-Kanäle sind keine Datenbankobjekte.

Verschicken Sie über NOTIFY keine Payloads mit Daten, die nicht jede authentifizierte Rolle sehen darf. Wenn Sie eine Zugriffskontrolle auf Kanalebene benötigen, setzen Sie diese in Ihrer eigenen Anwendungslogik um (z. B. rollenbasierte Namenskonventionen für Kanäle oder Filterung des Payload-Inhalts) — PgArachne übernimmt das auf diesem Endpunkt nicht für Sie.

Benachrichtigungen aus PostgreSQL senden

Aus psql oder einer beliebigen Datenbank-Session:

-- Einfacher Text-Payload
NOTIFY orders, 'neue Bestellung';

-- JSON-Payload
NOTIFY orders, '{"id":123,"status":"created"}';

Aus einem Trigger oder einer gespeicherten Prozedur:

PERFORM pg_notify('orders', json_build_object('id', NEW.id, 'status', NEW.status)::text);
Hinweis: NOTIFY wird erst nach dem Commit der sendenden Transaktion an andere Sessions zugestellt. Wenn Sie es innerhalb einer offenen Transaktion in psql ausführen, erhalten Abonnenten die Nachricht erst nach COMMIT.