realtime
WebSocket-based real-time communication with JWT authentication, message routing, and topic-based pub/sub.
Key namespaces
| Namespace | Purpose |
|---|---|
|
Pure: connection records, authorization, filtering |
|
Pure: message creation, routing logic |
|
Pure: JWT extraction, claims validation, permission checks |
|
Pure: topic subscription management |
|
Protocols: |
|
Service orchestrating core + adapters |
|
In-memory registry (atom-backed) |
|
Atom-backed pub/sub state management |
|
Ring/Jetty WebSocket adapter |
|
JWT verifier delegating to |
Message routing types
| Type | Target | Example use case |
|---|---|---|
|
All connections |
System announcement |
|
Specific user-id |
Direct message or notification |
|
Users with a specific role |
Admin-only alert |
|
Specific connection-id |
Job progress update |
Usage
(require '[boundary.realtime.ports :as ports])
;; Broadcast
(ports/send-to-all service {:type :announcement :text "Maintenance in 5 minutes"})
;; To specific user
(ports/send-to-user service user-id {:type :notification :data {...}})
;; Topic pub/sub
(ports/subscribe-to-topic pubsub conn-id "order:123")
(ports/publish-to-topic service "order:123" {:type :order-updated :payload {...}})
Connection lifecycle
-
Client connects:
ws://host/ws?token=<jwt> -
Server verifies JWT via
IJWTVerifier -
Connection registered in registry
-
Client sends/receives messages
-
On disconnect: cleanup + unsubscribe from all topics
Testing
clojure -M:test:db/h2 :realtime