3 * Copyright(c) 2010 Sencha Inc.
4 * Copyright(c) 2011 TJ Holowaychuk
5 * Copyright(c) 2015 Douglas Christopher Wilson
12 * Module dependencies.
16 var Store = require('./store')
17 var util = require('util')
20 * Shim setImmediate for node.js < 0.10
24 /* istanbul ignore next */
25 var defer = typeof setImmediate === 'function'
27 : function(fn){ process.nextTick(fn.bind.apply(fn, arguments)) }
33 module.exports = MemoryStore
36 * A session store in memory.
40 function MemoryStore() {
42 this.sessions = Object.create(null)
49 util.inherits(MemoryStore, Store)
52 * Get all active sessions.
54 * @param {function} callback
58 MemoryStore.prototype.all = function all(callback) {
59 var sessionIds = Object.keys(this.sessions)
60 var sessions = Object.create(null)
62 for (var i = 0; i < sessionIds.length; i++) {
63 var sessionId = sessionIds[i]
64 var session = getSession.call(this, sessionId)
67 sessions[sessionId] = session;
71 callback && defer(callback, null, sessions)
77 * @param {function} callback
81 MemoryStore.prototype.clear = function clear(callback) {
82 this.sessions = Object.create(null)
83 callback && defer(callback)
87 * Destroy the session associated with the given session ID.
89 * @param {string} sessionId
93 MemoryStore.prototype.destroy = function destroy(sessionId, callback) {
94 delete this.sessions[sessionId]
95 callback && defer(callback)
99 * Fetch session by the given session ID.
101 * @param {string} sessionId
102 * @param {function} callback
106 MemoryStore.prototype.get = function get(sessionId, callback) {
107 defer(callback, null, getSession.call(this, sessionId))
111 * Commit the given session associated with the given sessionId to the store.
113 * @param {string} sessionId
114 * @param {object} session
115 * @param {function} callback
119 MemoryStore.prototype.set = function set(sessionId, session, callback) {
120 this.sessions[sessionId] = JSON.stringify(session)
121 callback && defer(callback)
125 * Get number of active sessions.
127 * @param {function} callback
131 MemoryStore.prototype.length = function length(callback) {
132 this.all(function (err, sessions) {
133 if (err) return callback(err)
134 callback(null, Object.keys(sessions).length)
139 * Touch the given session object associated with the given session ID.
141 * @param {string} sessionId
142 * @param {object} session
143 * @param {function} callback
147 MemoryStore.prototype.touch = function touch(sessionId, session, callback) {
148 var currentSession = getSession.call(this, sessionId)
150 if (currentSession) {
152 currentSession.cookie = session.cookie
153 this.sessions[sessionId] = JSON.stringify(currentSession)
156 callback && defer(callback)
160 * Get session from the store.
164 function getSession(sessionId) {
165 var sess = this.sessions[sessionId]
172 sess = JSON.parse(sess)
175 var expires = typeof sess.cookie.expires === 'string'
176 ? new Date(sess.cookie.expires)
177 : sess.cookie.expires
179 // destroy expired session
180 if (expires && expires <= Date.now()) {
181 delete this.sessions[sessionId]