From 3466003e498d45dab79737107b7ae8f6053a54ae Mon Sep 17 00:00:00 2001 From: Carl Worth Date: Wed, 7 Dec 2022 22:12:40 -0800 Subject: [PATCH] Add infrastructure for doing proper sessions The sessions are stored server-side and in a persistent file store. --- index.js | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/index.js b/index.js index 638c59d..cd1911d 100644 --- a/index.js +++ b/index.js @@ -5,6 +5,8 @@ const execFile = util.promisify(require('child_process').execFile); const express = require('express'); const app = express(); +const session = require('express-session'); +const FileStore = require('session-file-store')(session); const http = require('http'); const server = http.createServer(app); const { Server } = require("socket.io"); @@ -17,6 +19,26 @@ const state_file = 'zombocom-state.json' var state; +if (!process.env.ZOMBOCOM_SESSION_SECRET) { + console.log("Error: Environment variable ZOMBOCOM_SESSION_SECRET not set."); + console.log("Please set it to a random, but persistent, value.") + process.exit(); +} + +const session_middleware = session( + {store: new FileStore, + secret: process.env.ZOMBOCOM_SESSION_SECRET, + resave: false, + saveUninitialized: true + }); + +app.use(session_middleware); + +// convert a connect middleware to a Socket.IO middleware +const wrap = middleware => (socket, next) => middleware(socket.request, {}, next); + +io.use(wrap(session_middleware)); + // Load comments at server startup fs.readFile(state_file, (err, data) => { if (err) @@ -43,11 +65,18 @@ process.on('SIGINT', () => { }); app.get('/index.html', (req, res) => { + if (req.session.views) { + req.session.views++; + } else { + req.session.views = 1; + } res.sendFile(__dirname + '/index.html'); }); io.on('connection', (socket) => { + console.log("Connection from client with " + socket.request.session.views + " views."); + // Replay old comments and images to a newly-joining client state.comments.forEach((comment) => { socket.emit('comment', comment) -- 2.43.0