From f1956201afc370806a1c2d3b80b6b4b57c97fc1c Mon Sep 17 00:00:00 2001 From: SamTV12345 <40429738+samtv12345@users.noreply.github.com> Date: Fri, 28 Jul 2023 22:35:13 +0200 Subject: [PATCH] Moved store to class based approach. --- session/store.js | 137 +++++++++++++++++------------------- test/support/smart-store.js | 74 +++++++++---------- test/support/sync-store.js | 38 +++++----- 3 files changed, 122 insertions(+), 127 deletions(-) diff --git a/session/store.js b/session/store.js index 3793877e..4bc71903 100644 --- a/session/store.js +++ b/session/store.js @@ -12,91 +12,84 @@ * @private */ -var Cookie = require('./cookie') -var EventEmitter = require('events').EventEmitter -var Session = require('./session') -var util = require('util') +const Cookie = require('./cookie') +const EventEmitter = require('events').EventEmitter +const Session = require('./session') /** * Module exports. * @public */ -module.exports = Store /** * Abstract base class for session stores. * @public */ -function Store () { - EventEmitter.call(this) -} - -/** - * Inherit from EventEmitter. - */ - -util.inherits(Store, EventEmitter) - -/** - * Re-generate the given requests's session. - * - * @param {IncomingRequest} req - * @return {Function} fn - * @api public - */ - -Store.prototype.regenerate = function(req, fn){ - var self = this; - this.destroy(req.sessionID, function(err){ - self.generate(req); - fn(err); - }); -}; - -/** - * Load a `Session` instance via the given `sid` - * and invoke the callback `fn(err, sess)`. - * - * @param {String} sid - * @param {Function} fn - * @api public - */ - -Store.prototype.load = function(sid, fn){ - var self = this; - this.get(sid, function(err, sess){ - if (err) return fn(err); - if (!sess) return fn(); - var req = { sessionID: sid, sessionStore: self }; - fn(null, self.createSession(req, sess)) - }); -}; - -/** - * Create session from JSON `sess` data. - * - * @param {IncomingRequest} req - * @param {Object} sess - * @return {Session} - * @api private - */ - -Store.prototype.createSession = function(req, sess){ - var expires = sess.cookie.expires - var originalMaxAge = sess.cookie.originalMaxAge +class Store extends EventEmitter { - sess.cookie = new Cookie(sess.cookie); - - if (typeof expires === 'string') { - // convert expires to a Date object - sess.cookie.expires = new Date(expires) + constructor() { + super(); + EventEmitter.call(this) + } + /** + * Re-generate the given request's session. + * + * @param req + * @param {Function} fn + * @api public + */ + regenerate(req, fn){ + const self = this; + this.destroy(req.sessionID, (err)=>{ + self.generate(req); + fn(err); + }); + } + /** + * Load a `Session` instance via the given `sid` + * and invoke the callback `fn(err, sess)`. + * + * @param {String} sid + * @param {Function} fn + * @api public + */ + load(sid, fn){ + const self = this; + this.get(sid, function(err, sess){ + if (err) return fn(err); + if (!sess) return fn(); + const req = { sessionID: sid, sessionStore: self }; + fn(null, self.createSession(req, sess)) + }); } + /** + * Create session from JSON `sess` data. + * + * @param {Function} req + * @param {Object} sess + * @return {Session} + * @api private + */ + createSession(req, sess) { + const expires = sess.cookie.expires + const originalMaxAge = sess.cookie.originalMaxAge + + sess.cookie = new Cookie(sess.cookie); + + if (typeof expires === 'string') { + // convert expires to a Date object + sess.cookie.expires = new Date(expires) + } + + // keep originalMaxAge intact + sess.cookie.originalMaxAge = originalMaxAge + + req.session = new Session(req, sess); + return req.session; + } +} - // keep originalMaxAge intact - sess.cookie.originalMaxAge = originalMaxAge - req.session = new Session(req, sess); - return req.session; -}; +module.exports = Store diff --git a/test/support/smart-store.js b/test/support/smart-store.js index 8b224fdd..c8aa5bb5 100644 --- a/test/support/smart-store.js +++ b/test/support/smart-store.js @@ -1,54 +1,56 @@ 'use strict' -var session = require('../../') -var util = require('util') - +const session = require('../../') +const util = require('util') +const Store = require('../../session/store') /* istanbul ignore next */ -var defer = typeof setImmediate === 'function' +const defer = typeof setImmediate === 'function' ? setImmediate : function(fn){ process.nextTick(fn.bind.apply(fn, arguments)) } -module.exports = SmartStore - -function SmartStore () { - session.Store.call(this) - this.sessions = Object.create(null) -} -util.inherits(SmartStore, session.Store) +class SmartStore extends Store { + constructor() { + super() + this.sessions = Object.create(null) + } -SmartStore.prototype.destroy = function destroy (sid, callback) { - delete this.sessions[sid] - defer(callback, null) -} + destroy(sid, callback) { + delete this.sessions[sid] + defer(callback) + } -SmartStore.prototype.get = function get (sid, callback) { - var sess = this.sessions[sid] + get(sid, callback) { + let sess = this.sessions[sid] - if (!sess) { - return - } + if (!sess) { + return + } - // parse - sess = JSON.parse(sess) + // parse + sess = JSON.parse(sess) - if (sess.cookie) { - // expand expires into Date object - sess.cookie.expires = typeof sess.cookie.expires === 'string' - ? new Date(sess.cookie.expires) - : sess.cookie.expires + if (sess.cookie) { + // expand expires into Date object + sess.cookie.expires = typeof sess.cookie.expires === 'string' + ? new Date(sess.cookie.expires) + : sess.cookie.expires - // destroy expired session - if (sess.cookie.expires && sess.cookie.expires <= Date.now()) { - delete this.sessions[sid] - sess = null + // destroy expired session + if (sess.cookie.expires && sess.cookie.expires <= Date.now()) { + delete this.sessions[sid] + sess = null + } } + + defer(callback, null, sess) } - defer(callback, null, sess) + set(sid, sess, callback) { + this.sessions[sid] = JSON.stringify(sess) + defer(callback) + } } -SmartStore.prototype.set = function set (sid, sess, callback) { - this.sessions[sid] = JSON.stringify(sess) - defer(callback, null) -} + +module.exports = SmartStore diff --git a/test/support/sync-store.js b/test/support/sync-store.js index b45dc9a8..2036c723 100644 --- a/test/support/sync-store.js +++ b/test/support/sync-store.js @@ -1,27 +1,27 @@ 'use strict' -var session = require('../../') -var util = require('util') +const Store = require('../../session/store') -module.exports = SyncStore - -function SyncStore () { - session.Store.call(this) - this.sessions = Object.create(null) -} +class SyncStore extends Store { + constructor() { + // @ts-ignore + super() + this.sessions = Object.create(null) + } -util.inherits(SyncStore, session.Store) + destroy(sid, callback) { + delete this.sessions[sid] + callback() + } -SyncStore.prototype.destroy = function destroy (sid, callback) { - delete this.sessions[sid] - callback() -} + get(sid, callback) { + callback(null, JSON.parse(this.sessions[sid])) + } -SyncStore.prototype.get = function get (sid, callback) { - callback(null, JSON.parse(this.sessions[sid])) + set(sid, sess, callback) { + this.sessions[sid] = JSON.stringify(sess) + callback() + } } -SyncStore.prototype.set = function set (sid, sess, callback) { - this.sessions[sid] = JSON.stringify(sess) - callback() -} +module.exports = SyncStore