- handleLobbyJoin: validates DB membership and waiting status, registers connection, tags ws.lobbyId, broadcasts lobby:state - handleLobbyLeave: host leave deletes lobby, non-host leave removes player and broadcasts updated state - handleLobbyStart: validates host + connected players >= 2, generates questions, initializes LobbyGameData, broadcasts first game:question, starts 15s round timer - handleGameAnswer: stores answer, resolves round when all players answered or timer fires - resolveRound: evaluates answers, updates scores, broadcasts game:answer_result, advances to next question or ends game - endGame: persists final scores via finishGame transaction, determines winnerIds handling ties, broadcasts game:finished - gameState.ts: shared lobbyGameStore singleton and timers Map - LobbyGameData extended with code field to avoid mid-game DB lookups by ID
18 lines
746 B
TypeScript
18 lines
746 B
TypeScript
import type { MultiplayerQuestion } from "../services/multiplayerGameService.js";
|
|
|
|
export type LobbyGameData = {
|
|
code: string;
|
|
questions: MultiplayerQuestion[];
|
|
currentIndex: number;
|
|
// NOTE: Map types are used here for O(1) lookups in-process.
|
|
// When migrating to Valkey, convert to plain objects for JSON serialization.
|
|
playerAnswers: Map<string, number | null>; // userId → selectedOptionId, null = timed out
|
|
scores: Map<string, number>; // userId → running total
|
|
};
|
|
|
|
export interface LobbyGameStore {
|
|
create(lobbyId: string, data: LobbyGameData): Promise<void>;
|
|
get(lobbyId: string): Promise<LobbyGameData | null>;
|
|
set(lobbyId: string, data: LobbyGameData): Promise<void>;
|
|
delete(lobbyId: string): Promise<void>;
|
|
}
|