diff --git a/experimental/2nub/src/server/routes.ts b/experimental/2nub/src/server/routes.ts index 31b4414..488dc21 100644 --- a/experimental/2nub/src/server/routes.ts +++ b/experimental/2nub/src/server/routes.ts @@ -84,6 +84,10 @@ export function setupRoutes(): Router { // Get updated game state after connection update const updatedGame = gameStateManager.getGame(gameId); + if (!updatedGame) { + return respondGameNotFound(res, null); + } + broadcastToGame(gameId, 'playerJoined', { player: result.player, game: updatedGame }); return respondSuccessWithData(res, 200, { @@ -108,6 +112,10 @@ export function setupRoutes(): Router { const game = gameStateManager.getGame(gameId); + if (!game) { + return respondGameNotFound(res, null); + } + broadcastToGame(gameId, 'playerJoined', { player, game }); return respondSuccessWithData(res, 201, { player, game }); @@ -134,6 +142,10 @@ export function setupRoutes(): Router { // Get updated game state after connection update const updatedGame = gameStateManager.getGame(gameId); + if (!updatedGame) { + return respondGameNotFound(res, null); + } + broadcastToGame(gameId, 'playerJoined', { player: result.player, game: updatedGame }); return respondSuccessWithData(res, 200, { player: result.player, game: updatedGame }); diff --git a/experimental/2nub/src/server/websocket.ts b/experimental/2nub/src/server/websocket.ts index 2b3f9f7..f23e7f4 100644 --- a/experimental/2nub/src/server/websocket.ts +++ b/experimental/2nub/src/server/websocket.ts @@ -1,6 +1,6 @@ import { Server, Socket } from 'socket.io'; import { gameStateManager } from './gameState'; -import { ClientToServerEvents, ServerToClientEvents } from '../types'; +import { ClientToServerEvents, ServerToClientEvents, ServerToClientEventShapes } from '../types'; interface ExtendedSocket extends Socket { gameId?: string; @@ -65,16 +65,18 @@ export function setupSocketIO(io: Server(gameId: string, event: K, data: ServerToClientEventShapes[K]) { const io = global.io as Server; if (io) { + // @ts-expect-error -- TS cannot infer that event is a valid key here io.to(gameId).emit(event, data); } } -export function broadcastToAll(event: keyof ServerToClientEvents, data: any) { +export function broadcastToAll(event: K, data: ServerToClientEventShapes[K]) { const io = global.io as Server; if (io) { + // @ts-expect-error -- TS cannot infer that event is a valid key here io.emit(event, data); } } \ No newline at end of file diff --git a/experimental/2nub/src/types.ts b/experimental/2nub/src/types.ts index d1837cd..eaa1767 100644 --- a/experimental/2nub/src/types.ts +++ b/experimental/2nub/src/types.ts @@ -81,14 +81,18 @@ export interface JoinGameRequest { existingPlayerId?: Player["id"]; } +export interface ServerToClientEventShapes { + gameState: GameState; + playerJoined: { game: GameState; player: Player }; + playerLeft: { game: GameState; playerId: string }; + gameCreated: GameState; + gameDeleted: { gameId: string }; + error: { error: string }; +} + // Socket.io event interfaces -export interface ServerToClientEvents { - gameState: (gameState: GameState) => void; - playerJoined: (data: { game: GameState; player: Player }) => void; - playerLeft: (data: { game: GameState; playerId: string }) => void; - gameCreated: (game: GameState) => void; - gameDeleted: (data: { gameId: string }) => void; - error: (data: { error: string }) => void; +export type ServerToClientEvents = { + [K in keyof ServerToClientEventShapes]: (data: ServerToClientEventShapes[K]) => void; } export interface ClientToServerEvents {