sp3-verify-1770325830/.sdlc/features/websocket-chat/spec.md
rdev-worker 42c1444274
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
build: /implement-feature websocket-chat --requirements 'GET /ws upgrades to...
2026-02-05 21:50:17 +00:00

3.4 KiB

Feature Specification: WebSocket Chat

Overview

Add real-time WebSocket chat capability to the chat-api service. This feature enables bidirectional communication between clients and the server, with message distribution via Redis pub/sub for horizontal scaling across multiple pods.

Requirements

Core Requirements

  1. WebSocket Endpoint: GET /ws upgrades HTTP connections to WebSocket
  2. Message Publication: Incoming messages from clients are published to a Redis channel
  3. Message Broadcasting: A Redis subscriber broadcasts received messages to all connected clients

Functional Requirements

ID Requirement Priority
FR-1 WebSocket endpoint at GET /api/chat-api/ws upgrades HTTP to WebSocket Must
FR-2 WebSocket endpoint at GET /api/chat-api/ws/{room} allows joining specific rooms Must
FR-3 Incoming chat messages are published to Redis pub/sub channel Must
FR-4 Redis subscriber receives messages and broadcasts to all connected clients in the room Must
FR-5 Messages without a room are broadcast to all connected clients (global) Must
FR-6 Automatic ping/pong heartbeat maintains connection health Must
FR-7 Graceful connection lifecycle with proper cleanup on disconnect Must

Non-Functional Requirements

ID Requirement Priority
NFR-1 Connection supports 64KB max message size Must
NFR-2 60-second pong timeout for dead connection detection Must
NFR-3 256-message send buffer per connection Must
NFR-4 Multi-pod support via Redis pub/sub Must
NFR-5 Graceful shutdown closes all connections cleanly Must

Message Format

Messages follow the standard realtime.Message structure:

{
  "id": "uuid",
  "type": "chat",
  "room": "room-name",
  "from": "client-id",
  "data": { "content": "message text" },
  "timestamp": "2024-01-15T10:30:00Z"
}

Message Types

  • chat - User chat messages
  • presence - Online/offline status changes
  • notification - Server notifications
  • system - System messages
  • error - Error messages
  • ping/pong - Client-initiated heartbeat

API Endpoints

WebSocket Connection

GET /api/chat-api/ws
GET /api/chat-api/ws/{room}
GET /api/chat-api/ws?room={room}

Upgrade Headers:

  • Connection: Upgrade
  • Upgrade: websocket

Response: 101 Switching Protocols (on success)

Configuration

Environment Variable Description Default
REDIS_URL Redis connection URL redis://localhost:6379
AUTH_ENABLED Require authentication for WebSocket false

Out of Scope

  • Message persistence/history
  • Typing indicators
  • Read receipts
  • User presence tracking (beyond connection events)
  • Rate limiting (future enhancement)

Success Criteria

  1. WebSocket connections can be established at /api/chat-api/ws
  2. Messages sent by one client are received by all other connected clients
  3. Room-based messaging isolates conversations
  4. Multi-pod deployment correctly distributes messages via Redis
  5. Connection cleanup occurs properly on disconnect

Dependencies

  • Existing pkg/realtime package (WebSocket handling, hub, Redis broadcaster)
  • Redis server for pub/sub
  • github.com/gorilla/websocket (already in go.mod)
  • github.com/redis/go-redis/v9 (already in go.mod)