Notifications temps réel (SSE)
Notifications temps réel (SSE)
Abonnez-vous aux canaux NOTIFY de PostgreSQL via Server-Sent Events :
curl -N "http://localhost:8080/db/my_database/sse?channels=orders,users" \
-H "Authorization: Bearer $TOKEN"Chaque message est du JSON avec le canal et le payload :
{"channel":"orders","data":{"id":123,"status":"created"}}Si le payload est du texte, il est encapsulé en string dans data.
Les canaux ne sont pas restreints par rôle
Contrairement aux endpoints JSON-RPC et MCP, SSE n’applique pas SET LOCAL ROLE
et ne vérifie pas non plus les droits du rôle authentifié avant l’abonnement. PgArachne authentifie
l’appelant (un JWT valide, un jeton API ou des identifiants directs pour la base de données cible),
mais n’importe quel appelant authentifié — quel que soit le rôle auquel ses identifiants correspondent
— peut s’abonner à n’importe quel canal NOTIFY et recevra tout ce qui y
est publié. Cela découle de la façon dont l’endpoint est construit : tous les clients SSE d’une base
de données partagent une unique connexion LISTEN ouverte en tant que compte de service
DB_USER, et PostgreSQL lui-même n’a aucun GRANT par canal auquel déléguer —
les canaux LISTEN/NOTIFY ne sont pas des objets de base de données.
N’envoyez pas via NOTIFY des payloads contenant des données que tous les rôles
authentifiés ne devraient pas voir. Si vous avez besoin d’un contrôle d’accès au niveau du canal,
mettez-le en œuvre dans votre propre logique applicative (par exemple des conventions de nommage des
canaux par rôle, ou en filtrant le contenu du payload) — PgArachne ne le fera pas pour vous sur cet
endpoint.
Envoyer des notifications depuis PostgreSQL
Depuis psql ou n’importe quelle session de base de données :
-- Payload texte simple
NOTIFY orders, 'nouvelle commande';
-- Payload JSON
NOTIFY orders, '{"id":123,"status":"created"}';
Depuis un trigger ou une procédure stockée :
PERFORM pg_notify('orders', json_build_object('id', NEW.id, 'status', NEW.status)::text);NOTIFY n’est délivré aux autres sessions qu’après le commit de la
transaction émettrice. Si vous l’exécutez à l’intérieur d’une transaction ouverte dans psql,
les abonnés ne le recevront qu’après le COMMIT.