From 51a60d0837faecbdcb4bbe2d5d205395bb6e3c50 Mon Sep 17 00:00:00 2001 From: James Ketrenos Date: Fri, 28 Jan 2022 22:22:15 -0800 Subject: [PATCH] Fixed DB and session management Signed-off-by: James Ketrenos --- server/routes/games.js | 47 +++++++++++++++++++++++------------------- 1 file changed, 26 insertions(+), 21 deletions(-) diff --git a/server/routes/games.js b/server/routes/games.js index de01fc2..61b433b 100755 --- a/server/routes/games.js +++ b/server/routes/games.js @@ -147,16 +147,23 @@ const getSession = (game, session) => { game.sessions = {}; } + if (!session.player_id) { + session.player_id = crypto.randomBytes(32).toString('hex'); + } + + const id = session.player_id; + /* If this session is not yet in the game, * add it and set the player's name */ - if (!(session in game.sessions)) { - game.sessions[session] = { + if (!(id in game.sessions)) { + game.sessions[id] = { name: undefined, + color: undefined, player: undefined }; } - return game.sessions[session]; + return game.sessions[id]; }; const loadGame = async (id) => { @@ -346,15 +353,15 @@ router.put("/:id/:action/:value?", async (req, res) => { return sendGame(req, res, game, error); } - const session = getSession(game, req.session.id); + const session = getSession(game, req.session); switch (action) { - case 'player-name': - error = setPlayerName(game, session, value); - return sendGame(req, res, game, error); - case 'player-selected': - error = setPlayerColor(game, session, value); - return sendGame(req, res, game, error); + case 'player-name': + error = setPlayerName(game, session, value); + return sendGame(req, res, game, error); + case 'player-selected': + error = setPlayerColor(game, session, value); + return sendGame(req, res, game, error); } if (!session.player) { @@ -456,23 +463,28 @@ const sendGame = async (req, res, game, error) => { let session; if (req.session) { - session = getSession(game, req.session.id); + session = getSession(game, req.session); session.lastActive = Date.now(); } else { session = { name: "command line" }; } - + /* Shallow copy game, filling its sessions with a shallow copy of sessions so we can then * delete the player field from them */ - const reducedGame = Object.assign({}, game, { sessions: {} }); + const reducedGame = Object.assign({}, game, { sessions: {} }), + reducedSessions = []; + for (let id in game.sessions) { const reduced = Object.assign({}, game.sessions[id]); if (reduced.player) { delete reduced.player; } reducedGame.sessions[id] = reduced; + + /* Do not send session-id as those are secrets */ + reducedSessions.push(reduced); } await writeFile(`games/${game.id}`, JSON.stringify(reducedGame, null, 2)) @@ -481,19 +493,12 @@ const sendGame = async (req, res, game, error) => { console.error(error); }); - /* Do not send session-id as those are secrets */ - const sessions = []; - for (let id in reducedGame.sessions) { - const reduced = reducedGame.sessions[id]; - sessions.push(reduced); - } - const playerGame = Object.assign({}, reducedGame, { timestamp: Date.now(), status: error ? error : "success", name: session.name, color: session.color, - sessions: sessions + sessions: reducedSessions }); return res.status(200).send(playerGame);