session.js 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. const crypto = require('crypto')
  2. ,Cache = require('../lib/node-file-cache.js');
  3. function SessionManager() {
  4. this.sessions = Cache.create({
  5. file: "sessions.json"
  6. });
  7. }
  8. const DEFAULT_TTL = 60 * 60 * 24; // keep sessions 24h
  9. function Session(reqT, sessId) {
  10. this.sessId = sessId;
  11. this.accountId = null;
  12. this.modifiedAt = reqT;
  13. this.isNative = false;
  14. }
  15. SessionManager.createSessionId = function(req) {
  16. var token = Date.now() + "" +Math.random();
  17. return crypto.createHash('md5').update(token).digest('hex');
  18. };
  19. SessionManager.prototype.forRequest = function(request) {
  20. if (request.cookies && request.cookies.sessID) {
  21. var sess = new Session()
  22. ,cachedSession = this.sessions.get(request.cookies.sessID);
  23. sess.sessId = request.cookies.sessID;
  24. for (var i in cachedSession)
  25. if (cachedSession.hasOwnProperty(i))
  26. sess[i] = cachedSession[i];
  27. return sess;
  28. }
  29. return null;
  30. };
  31. SessionManager.prototype.lazyForRequest = function(request) {
  32. var session = this.forRequest(request);
  33. if (session) {
  34. return session;
  35. }
  36. var sessionId = SessionManager.createSessionId(request);
  37. session = new Session(request.reqT, sessionId);
  38. return session;
  39. };
  40. SessionManager.prototype.closeSession = function(req) {
  41. if (req.account && req.session) {
  42. let sessionCountForUser = 0,
  43. allSessions = this.sessions.values();
  44. allSessions.forEach((sess) => {
  45. if (sess["accountId"] === req.account.id) {
  46. sessionCountForUser++;
  47. if (sess.sessId === req.session.sessId) {
  48. this.sessions.expire(sess.sessId);
  49. }
  50. }
  51. });
  52. if (sessionCountForUser === 1) {
  53. // FIXME this session was the only one for this user, terminate all its connections (not linked in another logged account)
  54. }
  55. }
  56. };
  57. SessionManager.prototype.saveSession = function(session) {
  58. if (session) {
  59. var sessionData = {};
  60. for (var i in session)
  61. if (session.hasOwnProperty(i))
  62. sessionData[i] = session[i];
  63. this.sessions.set(session.sessId, sessionData, {
  64. life: DEFAULT_TTL
  65. });
  66. }
  67. };
  68. Session.prototype.setAccountId = function(reqT, accountId) {
  69. this.accountId = accountId;
  70. this.modifiedAt = reqT;
  71. };
  72. var sessMan = new SessionManager();
  73. module.exports.SessionManager = sessMan;