3 * Copyright(c) 2010 Sencha Inc.
4 * Copyright(c) 2011 TJ Holowaychuk
5 * Copyright(c) 2015 Douglas Christopher Wilson
10 * Module dependencies.
14 var Store = require('./store')
15 var util = require('util')
18 * Shim setImmediate for node.js < 0.10
22 /* istanbul ignore next */
23 var defer = typeof setImmediate === 'function'
25 : function(fn){ process.nextTick(fn.bind.apply(fn, arguments)) }
31 module.exports = MemoryStore
34 * A session store in memory.
38 function MemoryStore() {
40 this.sessions = Object.create(null)
47 util.inherits(MemoryStore, Store)
50 * Get all active sessions.
52 * @param {function} callback
56 MemoryStore.prototype.all = function all(callback) {
57 var sessionIds = Object.keys(this.sessions)
58 var sessions = Object.create(null)
60 for (var i = 0; i < sessionIds.length; i++) {
61 var sessionId = sessionIds[i]
62 var session = getSession.call(this, sessionId)
65 sessions[sessionId] = session;
69 callback && defer(callback, null, sessions)
75 * @param {function} callback
79 MemoryStore.prototype.clear = function clear(callback) {
80 this.sessions = Object.create(null)
81 callback && defer(callback)
85 * Destroy the session associated with the given session ID.
87 * @param {string} sessionId
91 MemoryStore.prototype.destroy = function destroy(sessionId, callback) {
92 delete this.sessions[sessionId]
93 callback && defer(callback)
97 * Fetch session by the given session ID.
99 * @param {string} sessionId
100 * @param {function} callback
104 MemoryStore.prototype.get = function get(sessionId, callback) {
105 defer(callback, null, getSession.call(this, sessionId))
109 * Commit the given session associated with the given sessionId to the store.
111 * @param {string} sessionId
112 * @param {object} session
113 * @param {function} callback
118 * Get number of active sessions.
120 * @param {function} callback
124 MemoryStore.prototype.length = function length(callback) {
125 this.all(function (err, sessions) {
126 if (err) return callback(err)
127 callback(null, Object.keys(sessions).length)
131 MemoryStore.prototype.set = function set(sessionId, session, callback) {
132 this.sessions[sessionId] = JSON.stringify(session)
133 callback && defer(callback)
137 * Touch the given session object associated with the given session ID.
139 * @param {string} sessionId
140 * @param {object} session
141 * @param {function} callback
145 MemoryStore.prototype.touch = function touch(sessionId, session, callback) {
146 var currentSession = getSession.call(this, sessionId)
148 if (currentSession) {
150 currentSession.cookie = session.cookie
151 this.sessions[sessionId] = JSON.stringify(currentSession)
154 callback && defer(callback)
158 * Get session from the store.
162 function getSession(sessionId) {
163 var sess = this.sessions[sessionId]
170 sess = JSON.parse(sess)
172 var expires = typeof sess.cookie.expires === 'string'
173 ? new Date(sess.cookie.expires)
174 : sess.cookie.expires
176 // destroy expired session
177 if (expires && expires <= Date.now()) {
178 delete this.sessions[sessionId]