UNPKG

3.03 kBJavaScriptView Raw
1/*!
2 * Connect - session - Session
3 * Copyright(c) 2010 Sencha Inc.
4 * Copyright(c) 2011 TJ Holowaychuk
5 * MIT Licensed
6 */
7
8'use strict';
9
10/**
11 * Expose Session.
12 */
13
14module.exports = Session;
15
16/**
17 * Create a new `Session` with the given request and `data`.
18 *
19 * @param {IncomingRequest} req
20 * @param {Object} data
21 * @api private
22 */
23
24function Session(req, data) {
25 Object.defineProperty(this, 'req', { value: req });
26 Object.defineProperty(this, 'id', { value: req.sessionID });
27
28 if (typeof data === 'object' && data !== null) {
29 // merge data into this, ignoring prototype properties
30 for (var prop in data) {
31 if (!(prop in this)) {
32 this[prop] = data[prop]
33 }
34 }
35 }
36}
37
38/**
39 * Update reset `.cookie.maxAge` to prevent
40 * the cookie from expiring when the
41 * session is still active.
42 *
43 * @return {Session} for chaining
44 * @api public
45 */
46
47defineMethod(Session.prototype, 'touch', function touch() {
48 return this.resetMaxAge();
49});
50
51/**
52 * Reset `.maxAge` to `.originalMaxAge`.
53 *
54 * @return {Session} for chaining
55 * @api public
56 */
57
58defineMethod(Session.prototype, 'resetMaxAge', function resetMaxAge() {
59 this.cookie.maxAge = this.cookie.originalMaxAge;
60 return this;
61});
62
63/**
64 * Save the session data with optional callback `fn(err)`.
65 *
66 * @param {Function} fn
67 * @return {Session} for chaining
68 * @api public
69 */
70
71defineMethod(Session.prototype, 'save', function save(fn) {
72 this.req.sessionStore.set(this.id, this, fn || function(){});
73 return this;
74});
75
76/**
77 * Re-loads the session data _without_ altering
78 * the maxAge properties. Invokes the callback `fn(err)`,
79 * after which time if no exception has occurred the
80 * `req.session` property will be a new `Session` object,
81 * although representing the same session.
82 *
83 * @param {Function} fn
84 * @return {Session} for chaining
85 * @api public
86 */
87
88defineMethod(Session.prototype, 'reload', function reload(fn) {
89 var req = this.req
90 var store = this.req.sessionStore
91
92 store.get(this.id, function(err, sess){
93 if (err) return fn(err);
94 if (!sess) return fn(new Error('failed to load session'));
95 store.createSession(req, sess);
96 fn();
97 });
98 return this;
99});
100
101/**
102 * Destroy `this` session.
103 *
104 * @param {Function} fn
105 * @return {Session} for chaining
106 * @api public
107 */
108
109defineMethod(Session.prototype, 'destroy', function destroy(fn) {
110 delete this.req.session;
111 this.req.sessionStore.destroy(this.id, fn);
112 return this;
113});
114
115/**
116 * Regenerate this request's session.
117 *
118 * @param {Function} fn
119 * @return {Session} for chaining
120 * @api public
121 */
122
123defineMethod(Session.prototype, 'regenerate', function regenerate(fn) {
124 this.req.sessionStore.regenerate(this.req, fn);
125 return this;
126});
127
128/**
129 * Helper function for creating a method on a prototype.
130 *
131 * @param {Object} obj
132 * @param {String} name
133 * @param {Function} fn
134 * @private
135 */
136function defineMethod(obj, name, fn) {
137 Object.defineProperty(obj, name, {
138 configurable: true,
139 enumerable: false,
140 value: fn,
141 writable: true
142 });
143};