diff --git a/package-lock.json b/package-lock.json index 6c5fd3e..7087139 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2133,9 +2133,9 @@ "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" }, "engine.io": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.1.0.tgz", - "integrity": "sha512-ErhZOVu2xweCjEfYcTdkCnEYUiZgkAcBBAhW4jbIvNG8SLU3orAqoJCiytZjYF7eTpVmmCrLDjLIEaPlUAs1uw==", + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.1.2.tgz", + "integrity": "sha512-v/7eGHxPvO2AWsksyx2PUsQvBafuvqs0jJJQ0FdmJG1b9qIvgSbqDRGwNhfk2XHaTTbTXiC4quRE8Q9nRjsrQQ==", "requires": { "@types/cookie": "^0.4.1", "@types/cors": "^2.8.12", diff --git a/server/api/GamesAPI.js b/server/api/GamesAPI.js index 27a6650..64264dd 100644 --- a/server/api/GamesAPI.js +++ b/server/api/GamesAPI.js @@ -19,7 +19,7 @@ const apiLimiter = rateLimit({ const corsOptions = process.env.NODE_ENV.trim() === 'development' ? { origin: '*', - optionsSuccessStatus: 200 // some legacy browsers (IE11, various SmartTVs) choke on 204 + optionsSuccessStatus: 200 } : { origin: 'https://playwerewolf.uk.r.appspot.com', @@ -27,7 +27,7 @@ const corsOptions = process.env.NODE_ENV.trim() === 'development' }; router.use(cors(corsOptions)); -router.options('/:code/players', cors(corsOptions)); // enable pre-flight request for DELETE +//router.options('/:code/players', cors(corsOptions)); if (process.env.NODE_ENV.trim() === 'production') { // in prod, limit clients to creating 5 games per 10 minutes. router.use('/create', apiLimiter); diff --git a/server/modules/GameManager.js b/server/modules/GameManager.js index dc892f1..c87ff11 100644 --- a/server/modules/GameManager.js +++ b/server/modules/GameManager.js @@ -14,9 +14,9 @@ class GameManager { } addGameSocketHandlers = (namespace, socket) => { - socket.on(globals.CLIENT_COMMANDS.FETCH_GAME_STATE, (accessCode, personId, ackFn) => { + socket.on(globals.CLIENT_COMMANDS.FETCH_GAME_STATE, async (accessCode, personId, ackFn) => { this.logger.trace('request for game state for accessCode: ' + accessCode + ' from socket: ' + socket.id + ' with cookie: ' + personId); - this.handleRequestForGameState( + await this.handleRequestForGameState( this.namespace, this.logger, this.activeGameRunner, @@ -285,22 +285,28 @@ class GameManager { } }; - handleRequestForGameState = (namespace, logger, gameRunner, accessCode, personCookie, ackFn, socket) => { + handleRequestForGameState = async (namespace, logger, gameRunner, accessCode, personCookie, ackFn, clientSocket) => { const game = gameRunner.activeGames[accessCode]; if (game) { const matchingPerson = findPersonByField(game, 'cookie', personCookie); if (matchingPerson) { - if (matchingPerson.socketId === socket.id) { + if (matchingPerson.socketId === clientSocket.id) { logger.trace('matching person found with an established connection to the room: ' + matchingPerson.name); - ackFn(GameStateCurator.getGameStateFromPerspectiveOfPerson(game, matchingPerson, gameRunner, socket, logger)); + ackFn(GameStateCurator.getGameStateFromPerspectiveOfPerson(game, matchingPerson, gameRunner, clientSocket, logger)); } else { logger.trace('matching person found with a new connection to the room: ' + matchingPerson.name); - socket.join(accessCode); - matchingPerson.socketId = socket.id; - ackFn(GameStateCurator.getGameStateFromPerspectiveOfPerson(game, matchingPerson, gameRunner, socket, logger)); + clientSocket.join(accessCode); + matchingPerson.socketId = clientSocket.id; + ackFn(GameStateCurator.getGameStateFromPerspectiveOfPerson(game, matchingPerson, gameRunner, clientSocket, logger)); } } else { - rejectClientRequestForGameState(ackFn); + const namespaceSockets = await namespace.in(accessCode).fetchSockets(); + if (!namespaceSockets.find((namespaceSocket) => namespaceSocket.id === clientSocket.id)) { + let newlyAssignedPerson = this.joinGame(game); + clientSocket.join(accessCode); + newlyAssignedPerson.socketId = clientSocket.id; + ackFn(GameStateCurator.getGameStateFromPerspectiveOfPerson(game, newlyAssignedPerson, gameRunner, clientSocket, logger)); + } } } else { rejectClientRequestForGameState(ackFn);