You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
137 lines
2.7 KiB
137 lines
2.7 KiB
|
|
/*! |
|
* Connect - session - Session |
|
* Copyright(c) 2010 Sencha Inc. |
|
* Copyright(c) 2011 TJ Holowaychuk |
|
* MIT Licensed |
|
*/ |
|
|
|
/** |
|
* Module dependencies. |
|
*/ |
|
|
|
var utils = require('../../utils') |
|
, Cookie = require('./cookie'); |
|
|
|
/** |
|
* Create a new `Session` with the given request and `data`. |
|
* |
|
* @param {IncomingRequest} req |
|
* @param {Object} data |
|
* @api private |
|
*/ |
|
|
|
var Session = module.exports = function Session(req, data) { |
|
Object.defineProperty(this, 'req', { value: req }); |
|
Object.defineProperty(this, 'id', { value: req.sessionID }); |
|
if ('object' == typeof data) { |
|
utils.merge(this, data); |
|
} else { |
|
this.lastAccess = Date.now(); |
|
} |
|
}; |
|
|
|
/** |
|
* Update `.lastAccess` timestamp, |
|
* and reset `.cookie.maxAge` to prevent |
|
* the cookie from expiring when the |
|
* session is still active. |
|
* |
|
* @return {Session} for chaining |
|
* @api public |
|
*/ |
|
|
|
Session.prototype.touch = function(){ |
|
return this |
|
.resetLastAccess() |
|
.resetMaxAge(); |
|
}; |
|
|
|
/** |
|
* Update `.lastAccess` timestamp. |
|
* |
|
* @return {Session} for chaining |
|
* @api public |
|
*/ |
|
|
|
Session.prototype.resetLastAccess = function(){ |
|
this.lastAccess = Date.now(); |
|
return this; |
|
}; |
|
|
|
/** |
|
* Reset `.maxAge` to `.originalMaxAge`. |
|
* |
|
* @return {Session} for chaining |
|
* @api public |
|
*/ |
|
|
|
Session.prototype.resetMaxAge = function(){ |
|
this.cookie.maxAge = this.cookie.originalMaxAge; |
|
return this; |
|
}; |
|
|
|
/** |
|
* Save the session data with optional callback `fn(err)`. |
|
* |
|
* @param {Function} fn |
|
* @return {Session} for chaining |
|
* @api public |
|
*/ |
|
|
|
Session.prototype.save = function(fn){ |
|
this.req.sessionStore.set(this.id, this, fn || function(){}); |
|
return this; |
|
}; |
|
|
|
/** |
|
* Re-loads the session data _without_ altering |
|
* the maxAge or lastAccess properties. Invokes the |
|
* callback `fn(err)`, after which time if no exception |
|
* has occurred the `req.session` property will be |
|
* a new `Session` object, although representing the |
|
* same session. |
|
* |
|
* @param {Function} fn |
|
* @return {Session} for chaining |
|
* @api public |
|
*/ |
|
|
|
Session.prototype.reload = function(fn){ |
|
var req = this.req |
|
, store = this.req.sessionStore; |
|
store.get(this.id, function(err, sess){ |
|
if (err) return fn(err); |
|
if (!sess) return fn(new Error('failed to load session')); |
|
store.createSession(req, sess); |
|
fn(); |
|
}); |
|
return this; |
|
}; |
|
|
|
/** |
|
* Destroy `this` session. |
|
* |
|
* @param {Function} fn |
|
* @return {Session} for chaining |
|
* @api public |
|
*/ |
|
|
|
Session.prototype.destroy = function(fn){ |
|
delete this.req.session; |
|
this.req.sessionStore.destroy(this.id, fn); |
|
return this; |
|
}; |
|
|
|
/** |
|
* Regenerate this request's session. |
|
* |
|
* @param {Function} fn |
|
* @return {Session} for chaining |
|
* @api public |
|
*/ |
|
|
|
Session.prototype.regenerate = function(fn){ |
|
this.req.sessionStore.regenerate(this.req, fn); |
|
return this; |
|
};
|
|
|