Lobby join/leave handlers + broadcast lobby state #36

Open
opened 2026-04-19 07:23:37 +00:00 by forgejo-lila · 0 comments
Owner

Context

When players join or leave a lobby via WebSocket, all other players need to see the updated player list in real time.

What to do

Implement handlers for lobby:join and lobby:leave, plus a broadcast mechanism.

Files to create/change

  • apps/api/src/ws/handlers/lobbyHandlers.ts — join/leave handlers.
  • apps/api/src/ws/connections.ts — new file. Track which WebSocket connections belong to which lobby (Map from lobbyId to Set of connections).

Behavior

  • lobby:join { code } — validate joinable, add player to DB, register connection, broadcast updated state.
  • lobby:leave { lobbyId } — remove player, remove connection, broadcast. If host leaves, handle transfer or closure.
  • On WebSocket disconnect — treat as implicit leave.

Broadcast format

{
  "type": "lobby:state",
  "lobby": {
    "id": "...", "code": "...", "status": "waiting", "game_mode": "...",
    "players": [{ "user_id": "...", "display_name": "...", "is_host": true }]
  }
}

Acceptance criteria

  • Joining broadcasts updated player list to all connected players
  • Leaving (explicit or disconnect) updates remaining players
  • Connection tracking correctly maps WebSocket instances to lobbies
  • Stale connections cleaned up on disconnect
  • Broadcasting only goes to connections in the same lobby
## Context When players join or leave a lobby via WebSocket, all other players need to see the updated player list in real time. ## What to do Implement handlers for `lobby:join` and `lobby:leave`, plus a broadcast mechanism. ## Files to create/change - `apps/api/src/ws/handlers/lobbyHandlers.ts` — join/leave handlers. - `apps/api/src/ws/connections.ts` — new file. Track which WebSocket connections belong to which lobby (Map from lobbyId to Set of connections). ## Behavior - `lobby:join { code }` — validate joinable, add player to DB, register connection, broadcast updated state. - `lobby:leave { lobbyId }` — remove player, remove connection, broadcast. If host leaves, handle transfer or closure. - On WebSocket disconnect — treat as implicit leave. ## Broadcast format ```json { "type": "lobby:state", "lobby": { "id": "...", "code": "...", "status": "waiting", "game_mode": "...", "players": [{ "user_id": "...", "display_name": "...", "is_host": true }] } } ``` ## Acceptance criteria - Joining broadcasts updated player list to all connected players - Leaving (explicit or disconnect) updates remaining players - Connection tracking correctly maps WebSocket instances to lobbies - Stale connections cleaned up on disconnect - Broadcasting only goes to connections in the same lobby
forgejo-lila added the
multiplayer
label 2026-04-19 07:23:37 +00:00
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: forgejo-lila/lila#36
No description provided.