Session manager for YAPS
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.
 
 

62 lines
2.1 KiB

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;