772 B
772 B
ADR 0002: In-memory WebSocket hub
- Status: accepted
- Date: 2026-09
Context
Realtime delivery (messages, typing, presence, read receipts) must reach connected clients immediately. Options: external broker (Redis pub/sub, NATS), Postgres LISTEN/NOTIFY, or an in-process hub.
Decision
Use an in-process hub: map[userID] -> connections plus
map[conversationID] -> subscribers, guarded by a mutex. Membership and
read-state are resolved through a MembershipProvider interface implemented
by the store.
Consequences
- Sub-millisecond fan-out, no extra moving parts.
- Presence checks (
IsOnline) are lock-free reads used by the push notifier. - Multi-node scaling would require a broker; the hub's publish methods are the seam where that would plug in.