From de54f7c1a16118b59504aeb64cb0eb98dcb3a909 Mon Sep 17 00:00:00 2001 From: Alex Pickett <49637204+theRealestAEP@users.noreply.github.com> Date: Mon, 20 Apr 2026 11:18:02 -0700 Subject: [PATCH] Merge commit from fork --- src/server/GameManager.ts | 7 ++++++- src/server/Worker.ts | 9 ++++++++- src/server/WorkerLobbyService.ts | 8 ++++++-- 3 files changed, 20 insertions(+), 4 deletions(-) diff --git a/src/server/GameManager.ts b/src/server/GameManager.ts index fde2678c2..5b2db298c 100644 --- a/src/server/GameManager.ts +++ b/src/server/GameManager.ts @@ -59,7 +59,12 @@ export class GameManager { creatorPersistentID?: string, startsAt?: number, publicGameType?: PublicGameType, - ) { + ): GameServer | null { + if (this.games.has(id)) { + this.log.warn("cannot create game, id already exists", { gameID: id }); + return null; + } + const game = new GameServer( id, this.log, diff --git a/src/server/Worker.ts b/src/server/Worker.ts index 14a380667..eb2f102f5 100644 --- a/src/server/Worker.ts +++ b/src/server/Worker.ts @@ -187,6 +187,10 @@ export async function startWorker() { // Pass creatorPersistentID to createGame const game = gm.createGame(id, gc, creatorPersistentID); + if (game === null) { + log.warn(`cannot create game, id ${id} already exists`); + return res.status(409).json({ error: "Game ID already exists" }); + } log.info( `Worker ${workerId}: IP ${ipAnonymize(clientIP)} creating ${game.isPublic() ? GameType.Public : GameType.Private}${gc?.gameMode ? ` ${gc.gameMode}` : ""} game with id ${id}${creatorPersistentID ? `, creator: ${creatorPersistentID.substring(0, 8)}...` : ""}`, @@ -587,12 +591,15 @@ async function startMatchmakingPolling(gm: GameManager) { log.info(`Lobby poll successful:`, data); if (data.assignment) { - gm.createGame( + const game = gm.createGame( gameId, playlist.get1v1Config(), undefined, Date.now() + 7000, ); + if (game === null) { + log.warn(`Failed to create matchmaking game ${gameId}`); + } } } catch (error) { if (error instanceof Error && error.name === "AbortError") { diff --git a/src/server/WorkerLobbyService.ts b/src/server/WorkerLobbyService.ts index ab8852968..3c5dab1d5 100644 --- a/src/server/WorkerLobbyService.ts +++ b/src/server/WorkerLobbyService.ts @@ -44,20 +44,24 @@ export class WorkerLobbyService { // Update master with my lobby info this.sendMyLobbiesToMaster(); break; - case "createGame": + case "createGame": { if (this.gm.game(msg.gameID) !== null) { this.log.warn(`Game ${msg.gameID} already exists, skipping create`); return; } this.log.info(`Creating public game ${msg.gameID} from master`); - this.gm.createGame( + const game = this.gm.createGame( msg.gameID, msg.gameConfig, undefined, undefined, msg.publicGameType, ); + if (game === null) { + this.log.warn(`Game ${msg.gameID} already exists, skipping create`); + } break; + } case "updateLobby": { const game = this.gm.game(msg.gameID); if (!game) {