bogart-edge
Version:
Fast JSGI web framework taking inspiration from Sinatra
82 lines (67 loc) • 2.45 kB
JavaScript
var uuid = require("node-uuid"),
security = require("../../security"),
util = require("../../util"),
format = require('util').format,
SESSION_ID_COOKIE = "bogart_session_id",
DEFAULT_SESSION_LIFETIME = 1800;
exports.IdProvider = IdProvider;
function IdProvider(config) {
config = config || {};
config.lifetime = config.lifetime || DEFAULT_SESSION_LIFETIME;
this.config = config;
this.cookieKey = encodeURIComponent(security.encrypt(SESSION_ID_COOKIE, this.config.secret));
}
/**
* Called once at the beginning of each request.
*/
IdProvider.prototype.getSessionId = function(req) {
var cookie = util.parseCookies(req)[this.cookieKey];
var id;
if (!cookie) {
id = uuid();
} else {
id = security.decrypt(decodeURIComponent(cookie), this.config.secret);
}
return id;
};
/**
* Modifies the response to include the SessionId
*
* @param {Object} req JSGI Request
* @param {Object} res JSGI Response
* @param {String} sessionId Unique identifier of the Session.
*
* @returns {Object} JSGI Response
*/
IdProvider.prototype.save = function(req, res, sessionId) {
return setCookie(req, res, sessionId, this.config.lifetime, this.config.secret, this.cookieKey);
};
IdProvider.prototype.destroy = function (req, res, sessionId) {
return setCookie(req, res, sessionId, -1, this.config.secret, this.cookieKey);
};
function setCookie(req, res, sessionId, expiresInSeconds, secret, cookieKey) {
res = res || {};
res.headers = res.headers || {};
res.headers["Set-Cookie"] = res.headers["Set-Cookie"] || [];
var expires = new Date();
expires.setSeconds(expires.getSeconds() + expiresInSeconds);
var cookie = sessionCookie(sessionId, secret, expires, cookieKey);
res = util.ensureSetCookieArray(res);
res.headers["Set-Cookie"] = res.headers["Set-Cookie"].filter(isNotSessionIdCookie(cookieKey));
res.headers["Set-Cookie"].push(cookie);
return res;
}
function isNotSessionIdCookie(cookieKey) {
return function (el) {
return !(new RegExp("^" + cookieKey + "=").test(el));
}
}
function sessionCookie(sessionId, secret, expires, cookieKey) {
return format("%s=%s; Path=/; Expires=%s;",
cookieKey,
encodeSessionId(sessionId, secret),
expires.toUTCString());
}
function encodeSessionId(sessionId, secret) {
return encodeURIComponent(security.encrypt(sessionId, secret));
}