Skip to content

Commit

Permalink
Moved store to class based approach.
Browse files Browse the repository at this point in the history
  • Loading branch information
SamTV12345 committed Jul 28, 2023
1 parent 1cee294 commit f195620
Show file tree
Hide file tree
Showing 3 changed files with 122 additions and 127 deletions.
137 changes: 65 additions & 72 deletions session/store.js
Original file line number Diff line number Diff line change
Expand Up @@ -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
74 changes: 38 additions & 36 deletions test/support/smart-store.js
Original file line number Diff line number Diff line change
@@ -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
38 changes: 19 additions & 19 deletions test/support/sync-store.js
Original file line number Diff line number Diff line change
@@ -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

0 comments on commit f195620

Please sign in to comment.