| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586 |
- const crypto = require('crypto')
- ,Cache = require('../lib/node-file-cache.js');
- function SessionManager() {
- this.sessions = Cache.create({
- file: "sessions.json"
- });
- }
- const DEFAULT_TTL = 60 * 60 * 24; // keep sessions 24h
- function Session(reqT, sessId) {
- this.sessId = sessId;
- this.accountId = null;
- this.modifiedAt = reqT;
- this.isNative = false;
- }
- SessionManager.createSessionId = function(req) {
- var token = Date.now() + "" +Math.random();
- return crypto.createHash('md5').update(token).digest('hex');
- };
- SessionManager.prototype.forRequest = function(request) {
- if (request.cookies && request.cookies.sessID) {
- var sess = new Session()
- ,cachedSession = this.sessions.get(request.cookies.sessID);
- sess.sessId = request.cookies.sessID;
- for (var i in cachedSession)
- if (cachedSession.hasOwnProperty(i))
- sess[i] = cachedSession[i];
- return sess;
- }
- return null;
- };
- SessionManager.prototype.lazyForRequest = function(request) {
- var session = this.forRequest(request);
- if (session) {
- return session;
- }
- var sessionId = SessionManager.createSessionId(request);
- session = new Session(request.reqT, sessionId);
- return session;
- };
- SessionManager.prototype.closeSession = function(req) {
- if (req.account && req.session) {
- let sessionCountForUser = 0,
- allSessions = this.sessions.values();
- allSessions.forEach((sess) => {
- if (sess["accountId"] === req.account.id) {
- sessionCountForUser++;
- if (sess.sessId === req.session.sessId) {
- this.sessions.expire(sess.sessId);
- }
- }
- });
- if (sessionCountForUser === 1) {
- // FIXME this session was the only one for this user, terminate all its connections (not linked in another logged account)
- }
- }
- };
- SessionManager.prototype.saveSession = function(session) {
- if (session) {
- var sessionData = {};
- for (var i in session)
- if (session.hasOwnProperty(i))
- sessionData[i] = session[i];
- this.sessions.set(session.sessId, sessionData, {
- life: DEFAULT_TTL
- });
- }
- };
- Session.prototype.setAccountId = function(reqT, accountId) {
- this.accountId = accountId;
- this.modifiedAt = reqT;
- };
- var sessMan = new SessionManager();
- module.exports.SessionManager = sessMan;
|