2.4 KiB
2.4 KiB
| kind | slug | title | plan_slug | epic_slug | status | priority | tenant_id | owner | cursor_todo_id | updated_at |
|---|---|---|---|---|---|---|---|---|---|---|
| task | chat-realtime-delivery | Deliver scalable realtime chat events | workspace-communications | workspace-chat | ready | P1 | global | unassigned | null | 2026-10-22 |
Task summary
Broadcast committed chat events over authenticated WebSockets and support horizontal fan-out and reconnect recovery.
Description
Use HTTP/tRPC for commands and Postgres as the source of truth. Consume the outbox contract and atomic writes established by the persistence task; do not create a second message transaction. A worker claims and publishes normalized events through Redis to authenticated WebSocket subscribers. Each channel uses its own (channel_id, sequence) cursor, and clients reconnect by replaying missed rows from Postgres per authorized channel. Reuse Hocuspocus/Yjs only for presence, typing, or drafts rather than canonical history.
Subtasks
- Finalize one versioned envelope for message, reply, tombstone, channel lifecycle, membership, and read-state events using the existing outbox contract.
- Add subscriptions/replay using workspace AND context AND channel access; recheck at delivery, close revoked subscriptions, and test that removed access never receives subsequent payloads. No same-workspace-only shortcut or unsupported-object fallback.
- Claim and publish outbox events through Redis with retry and idempotent consumption semantics.
- Add per-channel reconnect catch-up and cross-device read-state invalidation.
- Add heartbeat, backpressure, graceful-shutdown, outage, ordering, and authorization tests.
Owner or assignee
unassigned
Status
ready
Estimation
L
Acceptance criteria
- A message is visible through the query API even when Redis is unavailable.
- Multiple realtime instances deliver committed events to local subscribers.
- Clients recover each subscribed channel from its own sequence without duplicates or assumed cross-channel ordering.
- Subscription authorization matches public/private/direct/archived rules and is rechecked against current workspace/channel access.
- Durable mark-read events reconcile unread badges on another connected device.
pnpm lint && pnpm type-check && pnpm testpass;pnpm buildpasses for changed server entry points.
Links to related Epic / Plan
- Epic:
./Epic-workspace-chat.md - Plan:
../Plan-workspace-communications.md