Real-time notifikace (SSE)

2 min čtení

Real-time notifikace (SSE)

Přihlaste se k PostgreSQL NOTIFY kanálům přes Server-Sent Events:

# Bearer token (JWT nebo API token)
curl -N "http://localhost:8080/db/my_database/sse?channels=orders,users" \
  -H "Authorization: Bearer $TOKEN"

# Přímé přihlašovací údaje (HTTP Basic Auth — není potřeba GRANT … TO pgarachne)
curl -N "http://localhost:8080/db/my_database/sse?channels=orders,users" \
  -u "alice:secret"

Každá zpráva je JSON s názvem kanálu a payloadem:

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

Pokud je payload text, zabalí se jako string do data.

Kanály nejsou vázané na roli

Na rozdíl od JSON-RPC a MCP endpointů SSE nepoužívá SET LOCAL ROLE ani jinak nekontroluje oprávnění autentizované role před přihlášením k odběru. PgArachne autentizuje volajícího (platný JWT, API token nebo přímé přihlašovací údaje pro cílovou databázi), ale libovolný autentizovaný volající — bez ohledu na to, jaké roli jeho přihlašovací údaje odpovídají — se může přihlásit k odběru jakéhokoli NOTIFY kanálu a bude dostávat vše, co se do něj publikuje. Vyplývá to z architektury endpointu: všichni SSE klienti pro danou databázi sdílí jedno společné LISTEN spojení otevřené jako servisní účet DB_USER, a PostgreSQL samotný nemá žádný GRANT na úrovni kanálu, na který by se dalo delegovat — kanály LISTEN/NOTIFY nejsou databázové objekty.

Neposílejte přes NOTIFY payloady s daty, která by neměla vidět úplně každá autentizovaná role. Pokud potřebujete řízení přístupu na úrovni kanálu, implementujte ho ve vlastní aplikační logice (např. konvencí pojmenování kanálů podle role, nebo filtrováním obsahu payloadu) — PgArachne to na tomto endpointu za vás neudělá.

Odesílání notifikací z PostgreSQL

Z psql nebo jakékoli databázové session:

-- Jednoduchý textový payload
NOTIFY orders, 'nova objednavka';

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

Z triggeru nebo uložené procedury:

PERFORM pg_notify('orders', json_build_object('id', NEW.id, 'status', NEW.status)::text);
Poznámka: NOTIFY se doručí ostatním sessions až po commitu transakce, která ho odeslala. Pokud ho spustíte uvnitř otevřené transakce v psql, odběratelé ho obdrží až po COMMIT.