Lifecycle States
code
CREATE → WAITING → PLAYING → RESULTS → PLAYING → ... → FINISHED → DELETED
Phase Transitions
- •CREATE -
POST /api/rooms→ Generate 4-char code - •WAITING (Lobby) - Players join via HTTP, WebSocket connects
- •START_GAME - Any player sends message → Load questions, start timer
- •PLAYING - 15s question timer, players answer
- •RESULTS - Show correct answer, 10s timer
- •Next question - Or if last question → FINISHED
- •FINISHED - Winner announced, 60s timer → ROOM_CLOSED → DELETE
Key Behaviors
Immediate cleanup: Empty rooms (no active connections) deleted immediately Reconnection: Player identity persists after WebSocket disconnect Timer management: Always cancel timers on state transition Retry logic: Frontend retries HTTP join 4x with 500ms delay (handles reconnection race)
Cleanup Triggers
- •All players disconnect → Delete immediately
- •Game finishes → 60s grace period → ROOM_CLOSED → Delete
- •Timer cancellation on disconnect/delete (prevent leaks)
Reconnection Flow
- •Player disconnects (WebSocket closes)
- •Backend detaches connection, keeps player in room
- •Player refreshes page → HTTP join (allows same name) → WebSocket reconnects
- •Server broadcasts current ROOM_STATE → Player resumes
Deep Linking
/room/AB3D → Redirects to /?join=AB3D → Prefills join form