Source: middleware/session.js

import crypto from "node:crypto";
import Session from "../models/session.js";
import app from "../app.js";

/**
 * Middleware to manage user sessions.
 * @param req
 * @param res
 * @param next
 */
export const sessionMiddleware = (req, res, next) => {
  console.log("Sessions: ", app.locals.sessions);

  const sessionId = req.cookies.sessionId;
  let session;

  if (!sessionId || !app.locals.sessions[sessionId]) {
    const newSessionId = generateSessionId();
    session = new Session(newSessionId);

    res.cookie("sessionId", newSessionId, { path: "/", httpOnly: true });
    app.locals.sessions[newSessionId] = session;
  } else {
    session = app.locals.sessions[sessionId];
  }

  req.session = session;
  res.locals.session = session;

  next();
};

/**
 * Generates a new session ID.
 * @returns {string} A new session ID.
 */
function generateSessionId() {
  return crypto.randomBytes(16).toString("hex");
}