123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187 |
- /*!
- * express-session
- * Copyright(c) 2010 Sencha Inc.
- * Copyright(c) 2011 TJ Holowaychuk
- * Copyright(c) 2015 Douglas Christopher Wilson
- * MIT Licensed
- */
- 'use strict';
- /**
- * Module dependencies.
- * @private
- */
- var Store = require('./store')
- var util = require('util')
- /**
- * Shim setImmediate for node.js < 0.10
- * @private
- */
- /* istanbul ignore next */
- var defer = typeof setImmediate === 'function'
- ? setImmediate
- : function(fn){ process.nextTick(fn.bind.apply(fn, arguments)) }
- /**
- * Module exports.
- */
- module.exports = MemoryStore
- /**
- * A session store in memory.
- * @public
- */
- function MemoryStore() {
- Store.call(this)
- this.sessions = Object.create(null)
- }
- /**
- * Inherit from Store.
- */
- util.inherits(MemoryStore, Store)
- /**
- * Get all active sessions.
- *
- * @param {function} callback
- * @public
- */
- MemoryStore.prototype.all = function all(callback) {
- var sessionIds = Object.keys(this.sessions)
- var sessions = Object.create(null)
- for (var i = 0; i < sessionIds.length; i++) {
- var sessionId = sessionIds[i]
- var session = getSession.call(this, sessionId)
- if (session) {
- sessions[sessionId] = session;
- }
- }
- callback && defer(callback, null, sessions)
- }
- /**
- * Clear all sessions.
- *
- * @param {function} callback
- * @public
- */
- MemoryStore.prototype.clear = function clear(callback) {
- this.sessions = Object.create(null)
- callback && defer(callback)
- }
- /**
- * Destroy the session associated with the given session ID.
- *
- * @param {string} sessionId
- * @public
- */
- MemoryStore.prototype.destroy = function destroy(sessionId, callback) {
- delete this.sessions[sessionId]
- callback && defer(callback)
- }
- /**
- * Fetch session by the given session ID.
- *
- * @param {string} sessionId
- * @param {function} callback
- * @public
- */
- MemoryStore.prototype.get = function get(sessionId, callback) {
- defer(callback, null, getSession.call(this, sessionId))
- }
- /**
- * Commit the given session associated with the given sessionId to the store.
- *
- * @param {string} sessionId
- * @param {object} session
- * @param {function} callback
- * @public
- */
- MemoryStore.prototype.set = function set(sessionId, session, callback) {
- this.sessions[sessionId] = JSON.stringify(session)
- callback && defer(callback)
- }
- /**
- * Get number of active sessions.
- *
- * @param {function} callback
- * @public
- */
- MemoryStore.prototype.length = function length(callback) {
- this.all(function (err, sessions) {
- if (err) return callback(err)
- callback(null, Object.keys(sessions).length)
- })
- }
- /**
- * Touch the given session object associated with the given session ID.
- *
- * @param {string} sessionId
- * @param {object} session
- * @param {function} callback
- * @public
- */
- MemoryStore.prototype.touch = function touch(sessionId, session, callback) {
- var currentSession = getSession.call(this, sessionId)
- if (currentSession) {
- // update expiration
- currentSession.cookie = session.cookie
- this.sessions[sessionId] = JSON.stringify(currentSession)
- }
- callback && defer(callback)
- }
- /**
- * Get session from the store.
- * @private
- */
- function getSession(sessionId) {
- var sess = this.sessions[sessionId]
- if (!sess) {
- return
- }
- // parse
- sess = JSON.parse(sess)
- if (sess.cookie) {
- var expires = typeof sess.cookie.expires === 'string'
- ? new Date(sess.cookie.expires)
- : sess.cookie.expires
- // destroy expired session
- if (expires && expires <= Date.now()) {
- delete this.sessions[sessionId]
- return
- }
- }
- return sess
- }
|