UNPKG

2.11 kBJavaScriptView Raw
1"use strict";
2
3const Store = require('express-session/session/store');
4const defer = require('../helper/defer');
5
6/**
7 * Drop in replacement for express session store that saves session data in
8 * a collection.
9 */
10class CollectionSessionStore extends Store
11{
12
13 /**
14 * @param {CachedCollection} collection collection wrapped
15 * @param {object} options see fields
16 */
17 constructor(collection, options = {})
18 {
19 super();
20
21 /**
22 * collection wrapped
23 */
24 this.collection = collection;
25
26 /**
27 * Session dueation
28 */
29 this.sessionsTTL = options.sessionsTTL || 8 * 60 * 60 * 1000;
30 }
31
32 /**
33 * clean up expired sessions
34 * @protected
35 */
36 cleanup()
37 {
38 const collection = this.collection;
39 const sessions = collection.lookup;
40
41 for (let sessionId in sessions)
42 {
43 let session = sessions[sessionId];
44
45 if (session)
46 {
47 if (session.expires < Date.now())
48 {
49 collection.deleteRecord(session);
50 }
51 }
52 }
53 }
54
55 /**
56 * @override
57 */
58 get(sessionId, callback)
59 {
60 this.cleanup();
61 defer(callback, null, this.collection.lookup[sessionId]);
62 }
63
64 /**
65 * @override
66 */
67 set(sessionId, session, callback)
68 {
69 this.cleanup();
70 session = JSON.parse(JSON.stringify(session));
71 session.id = sessionId;
72
73 // let's not send an update to database every time the user makes a request
74 const THRESHOLD = this.sessionsTTL / 10;
75
76 session.expires = Math.ceil((Date.now() + this.sessionsTTL) / THRESHOLD) * THRESHOLD;
77
78 if (this.collection.lookup[sessionId] && JSON.stringify(this.collection.lookup[sessionId]) !== JSON.stringify(session))
79 {
80 this.collection.updateRecord(session);
81 }
82 else if (!this.collection.lookup[sessionId])
83 {
84 this.collection.createRecord(session);
85 }
86 defer(callback);
87 }
88
89 /**
90 * @override
91 */
92 destroy(sessionId, callback)
93 {
94 let session = this.collection.lookup[sessionId];
95
96 if (session)
97 {
98 this.collection.deleteRecord(session);
99 }
100 defer(callback);
101 }
102}
103
104module.exports = CollectionSessionStore;