Home Reference Source

node-user-accounts-boilerplate-nahid/session/MemorySessionStore.js

"use strict";

const Store = require('express-session/session/store');
const defer = require('../helper/defer');

/**
 * In memory session store.
 * 
 * Apparently the default session store is not menat to be used for prouction
 * or something.
 * 
 * Will not scale horizontally.
 */
class MemorySessionStore extends Store
{

  /**
   * @param {object} options see fields
   */
  constructor(options = {})
  {
    super();

    /**
     * In memory sessions list.
     */
    this.sessions = {};

    /**
     * Session dueation
     */
    this.sessionsTTL = options.sessionsTTL || 8 * 60 * 60 * 1000;
  }

  /**
   * clean up expired sessions
   * @protected
   */
  cleanup()
  {
    for (let sessionId in this.sessions)
    {
      let session = this.sessions[sessionId];

      if (session)
      {
        if (session.expires < Date.now())
        {
          delete this.sessions[sessionId];
        }
      }
    }
  }

  /**
   * @override
   */
  get(sessionId, callback)
  {
    this.cleanup();
    defer(callback, null, this.sessions[sessionId]);
  }

  /**
   * @override
   */
  set(sessionId, session, callback)
  {
    this.cleanup();
    this.sessions[sessionId] = session;
    session.expires = Date.now() + this.sessionsTTL;
    defer(callback);
  }

  /**
   * @override
   */
  destroy(sessionId, callback)
  {
    delete this.sessions[sessionId];
    defer(callback);
  }
}

module.exports = MemorySessionStore;