Ειδοποιήσεις σε Πραγματικό Χρόνο (SSE)

2 λεπτά ανάγνωσης

Ειδοποιήσεις σε Πραγματικό Χρόνο (SSE)

Εγγραφείτε σε κανάλια NOTIFY του PostgreSQL μέσω Server-Sent Events:

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

# Direct credentials (HTTP Basic Auth — no GRANT … TO pgarachne required)
curl -N "http://localhost:8080/db/my_database/sse?channels=orders,users" \
  -u "alice:secret"

Κάθε μήνυμα είναι σε μορφή JSON με το όνομα του καναλιού και το payload:

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

Εάν το payload είναι απλό κείμενο, περιτυλίγεται ως συμβολοσειρά στο data.

Τα κανάλια δεν περιορίζονται ανά ρόλο

Σε αντίθεση με τα endpoints JSON-RPC και MCP, το SSE δεν εφαρμόζει SET LOCAL ROLE ούτε ελέγχει τα δικαιώματα του πιστοποιημένου ρόλου πριν από την εγγραφή. Το PgArachne πιστοποιεί τον καλούντα (έγκυρο JWT, token API ή απευθείας διαπιστευτήρια για τη βάση δεδομένων προορισμού), αλλά οποιοσδήποτε πιστοποιημένος καλών — ανεξάρτητα από τον ρόλο στον οποίο αντιστοιχούν τα διαπιστευτήριά του — μπορεί να εγγραφεί σε οποιοδήποτε κανάλι NOTIFY και θα λαμβάνει ό,τι δημοσιεύεται σε αυτό. Αυτό προκύπτει από τον τρόπο δόμησης του endpoint: όλοι οι πελάτες SSE για μια βάση δεδομένων μοιράζονται μία μοναδική σύνδεση LISTEN που ανοίγει ως ο λογαριασμός υπηρεσίας DB_USER, και η ίδια η PostgreSQL δεν διαθέτει GRANT ανά κανάλι στο οποίο θα μπορούσε να γίνει ανάθεση — τα κανάλια LISTEN/NOTIFY δεν είναι αντικείμενα βάσης δεδομένων.

Μην στέλνετε μέσω NOTIFY payloads με δεδομένα που δεν θα έπρεπε να βλέπει κάθε πιστοποιημένος ρόλος. Εάν χρειάζεστε έλεγχο πρόσβασης σε επίπεδο καναλιού, εφαρμόστε τον στη δική σας λογική εφαρμογής (π.χ. συμβάσεις ονοματοδοσίας καναλιών ανά ρόλο, ή φιλτράρισμα του περιεχομένου του payload) — το PgArachne δεν θα το κάνει για εσάς σε αυτό το endpoint.

Αποστολή ειδοποιήσεων από το PostgreSQL

Από το psql ή οποιαδήποτε συνεδρία βάσης δεδομένων:

-- Simple text payload
NOTIFY orders, 'new order';

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

Από ένα trigger ή αποθηκευμένη διαδικασία:

PERFORM pg_notify('orders', json_build_object('id', NEW.id, 'status', NEW.status)::text);
Σημείωση: Το NOTIFY παραδίδεται σε άλλες συνεδρίες μόνο μετά την ολοκλήρωση (commit) της συναλλαγής αποστολής. Εάν το εκτελέσετε μέσα σε μια ανοιχτή συναλλαγή στο psql, οι συνδρομητές δεν θα το λάβουν μέχρι να εκτελέσετε COMMIT.