|
|
var cookie = require("cookie");
|
|
|
var uuid = require("uuid");
|
|
|
|
|
|
var memory_store = require("./memory_store.js");
|
|
|
|
|
|
var sessions = function(options){
|
|
|
this.settings = options || {};
|
|
|
this.settings.sessionCookie = this.settings.sessionCookie || "sid";
|
|
|
this.settings.regenerateTokens = this.settings.regenerateTokens || false;
|
|
|
this.settings.sessionTTL = this.settings.sessionTTL || 0;
|
|
|
this.generateToken = this.settings.generateToken || uuid.v4;
|
|
|
this.sessions = options.sessionStore || new memory_store();
|
|
|
|
|
|
this.on("setup", this.on_setup);
|
|
|
};
|
|
|
|
|
|
sessions.prototype.on_setup = function(request, server, done){
|
|
|
var self = this;
|
|
|
request.session_token = this.getSessionToken(request);
|
|
|
request.session = this.getSession(request.session_token);
|
|
|
|
|
|
// regenerate the user session token per request
|
|
|
if(this.settings.regenerateTokens){
|
|
|
var old_token = request.session_token;
|
|
|
request.session_token = this.generateToken();
|
|
|
this.sessions.delete(old_token);
|
|
|
this.sessions.set(request.session_token, request.session, this.settings.sessionTTL);
|
|
|
}
|
|
|
|
|
|
request.sessionGet = function(key){
|
|
|
request.session = request.session || {};
|
|
|
return request.session[key];
|
|
|
};
|
|
|
|
|
|
request.sessionSet = function(key, value){
|
|
|
request.session = request.session || {};
|
|
|
request.session[key] = value;
|
|
|
self.sessions.set(request.session_token, request.session, self.settings.sessionTTL);
|
|
|
};
|
|
|
|
|
|
request.addHeader("Set-Cookie", cookie.serialize(
|
|
|
this.settings.sessionCookie,
|
|
|
request.session_token
|
|
|
));
|
|
|
done();
|
|
|
};
|
|
|
|
|
|
sessions.prototype.getSessionToken = function(request){
|
|
|
var cookies = request.cookies || cookie.parse(request.headers.cookie || "");
|
|
|
request.session_token = cookies[this.settings.sessionCookie];
|
|
|
if(!request.session_token){
|
|
|
request.session_token = this.generateToken();
|
|
|
this.sessions.set(request.session_token, {}, this.settings.sessionTTL);
|
|
|
}
|
|
|
return request.session_token;
|
|
|
};
|
|
|
|
|
|
sessions.prototype.getSession = function(token){
|
|
|
return this.sessions.get(token);
|
|
|
};
|
|
|
|
|
|
module.exports = sessions;
|