feat(api): add WebSocket foundation and multiplayer game store
- Add ws/ directory: server setup, auth, router, connections map - WebSocket auth rejects upgrade with 401 if no Better Auth session - Router parses WsClientMessageSchema, dispatches to handlers, two-layer error handling (AppError -> WsErrorSchema, unknown -> 500) - connections.ts: in-memory Map<lobbyId, Map<userId, WebSocket>> with addConnection, removeConnection, broadcastToLobby - LobbyGameStore interface + InMemoryLobbyGameStore implementation following existing GameSessionStore pattern - multiplayerGameService: generateMultiplayerQuestions() decoupled from single-player flow, hardcoded defaults en->it nouns easy 3 rounds - handleLobbyJoin and handleLobbyLeave implemented - WsErrorSchema added to shared schemas - server.ts switched to createServer + setupWebSocket
This commit is contained in:
parent
b0aef8cc16
commit
745c5c4e3a
14 changed files with 443 additions and 1 deletions
|
|
@ -112,11 +112,19 @@ export const WsGameFinishedSchema = z.object({
|
|||
|
||||
export type WsGameFinished = z.infer<typeof WsGameFinishedSchema>;
|
||||
|
||||
export const WsErrorSchema = z.object({
|
||||
type: z.literal("error"),
|
||||
code: z.string(),
|
||||
message: z.string(),
|
||||
});
|
||||
export type WsError = z.infer<typeof WsErrorSchema>;
|
||||
|
||||
export const WsServerMessageSchema = z.discriminatedUnion("type", [
|
||||
WsLobbyStateSchema,
|
||||
WsGameQuestionSchema,
|
||||
WsGameAnswerResultSchema,
|
||||
WsGameFinishedSchema,
|
||||
WsErrorSchema,
|
||||
]);
|
||||
|
||||
export type WsServerMessage = z.infer<typeof WsServerMessageSchema>;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue