store.js
  1  /*!
  2   * Connect - session - Store
  3   * Copyright(c) 2010 Sencha Inc.
  4   * Copyright(c) 2011 TJ Holowaychuk
  5   * MIT Licensed
  6   */
  7  
  8  'use strict';
  9  
 10  /**
 11   * Module dependencies.
 12   * @private
 13   */
 14  
 15  var Cookie = require('./cookie')
 16  var EventEmitter = require('events').EventEmitter
 17  var Session = require('./session')
 18  var util = require('util')
 19  
 20  /**
 21   * Module exports.
 22   * @public
 23   */
 24  
 25  module.exports = Store
 26  
 27  /**
 28   * Abstract base class for session stores.
 29   * @public
 30   */
 31  
 32  function Store () {
 33    EventEmitter.call(this)
 34  }
 35  
 36  /**
 37   * Inherit from EventEmitter.
 38   */
 39  
 40  util.inherits(Store, EventEmitter)
 41  
 42  /**
 43   * Re-generate the given requests's session.
 44   *
 45   * @param {IncomingRequest} req
 46   * @return {Function} fn
 47   * @api public
 48   */
 49  
 50  Store.prototype.regenerate = function(req, fn){
 51    var self = this;
 52    this.destroy(req.sessionID, function(err){
 53      self.generate(req);
 54      fn(err);
 55    });
 56  };
 57  
 58  /**
 59   * Load a `Session` instance via the given `sid`
 60   * and invoke the callback `fn(err, sess)`.
 61   *
 62   * @param {String} sid
 63   * @param {Function} fn
 64   * @api public
 65   */
 66  
 67  Store.prototype.load = function(sid, fn){
 68    var self = this;
 69    this.get(sid, function(err, sess){
 70      if (err) return fn(err);
 71      if (!sess) return fn();
 72      var req = { sessionID: sid, sessionStore: self };
 73      fn(null, self.createSession(req, sess))
 74    });
 75  };
 76  
 77  /**
 78   * Create session from JSON `sess` data.
 79   *
 80   * @param {IncomingRequest} req
 81   * @param {Object} sess
 82   * @return {Session}
 83   * @api private
 84   */
 85  
 86  Store.prototype.createSession = function(req, sess){
 87    var expires = sess.cookie.expires
 88    var originalMaxAge = sess.cookie.originalMaxAge
 89  
 90    sess.cookie = new Cookie(sess.cookie);
 91  
 92    if (typeof expires === 'string') {
 93      // convert expires to a Date object
 94      sess.cookie.expires = new Date(expires)
 95    }
 96  
 97    // keep originalMaxAge intact
 98    sess.cookie.originalMaxAge = originalMaxAge
 99  
100    req.session = new Session(req, sess);
101    return req.session;
102  };