@prairielearn/session 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (44) hide show
  1. package/.turbo/turbo-build.log +0 -0
  2. package/README.md +39 -0
  3. package/dist/before-end.d.ts +25 -0
  4. package/dist/before-end.js +81 -0
  5. package/dist/before-end.js.map +1 -0
  6. package/dist/before-end.test.d.ts +1 -0
  7. package/dist/before-end.test.js +33 -0
  8. package/dist/before-end.test.js.map +1 -0
  9. package/dist/cookie.d.ts +4 -0
  10. package/dist/cookie.js +34 -0
  11. package/dist/cookie.js.map +1 -0
  12. package/dist/index.d.ts +24 -0
  13. package/dist/index.js +89 -0
  14. package/dist/index.js.map +1 -0
  15. package/dist/index.test.d.ts +1 -0
  16. package/dist/index.test.js +506 -0
  17. package/dist/index.test.js.map +1 -0
  18. package/dist/memory-store.d.ts +7 -0
  19. package/dist/memory-store.js +28 -0
  20. package/dist/memory-store.js.map +1 -0
  21. package/dist/session.d.ts +14 -0
  22. package/dist/session.js +78 -0
  23. package/dist/session.js.map +1 -0
  24. package/dist/session.test.d.ts +1 -0
  25. package/dist/session.test.js +92 -0
  26. package/dist/session.test.js.map +1 -0
  27. package/dist/store.d.ts +9 -0
  28. package/dist/store.js +3 -0
  29. package/dist/store.js.map +1 -0
  30. package/dist/test-utils.d.ts +10 -0
  31. package/dist/test-utils.js +32 -0
  32. package/dist/test-utils.js.map +1 -0
  33. package/package.json +44 -0
  34. package/src/before-end.test.ts +34 -0
  35. package/src/before-end.ts +96 -0
  36. package/src/cookie.ts +38 -0
  37. package/src/index.test.ts +628 -0
  38. package/src/index.ts +132 -0
  39. package/src/memory-store.ts +25 -0
  40. package/src/session.test.ts +122 -0
  41. package/src/session.ts +106 -0
  42. package/src/store.ts +10 -0
  43. package/src/test-utils.ts +42 -0
  44. package/tsconfig.json +11 -0
@@ -0,0 +1,506 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const express_1 = __importDefault(require("express"));
7
+ const chai_1 = require("chai");
8
+ const node_fetch_1 = __importDefault(require("node-fetch"));
9
+ const fetch_cookie_1 = __importDefault(require("fetch-cookie"));
10
+ const set_cookie_parser_1 = require("set-cookie-parser");
11
+ const express_async_handler_1 = __importDefault(require("express-async-handler"));
12
+ const index_1 = require("./index");
13
+ const memory_store_1 = require("./memory-store");
14
+ const test_utils_1 = require("./test-utils");
15
+ const TEST_SECRET = 'test-secret';
16
+ describe('session middleware', () => {
17
+ it('sets a session cookie', async () => {
18
+ const app = (0, express_1.default)();
19
+ app.use((0, index_1.createSessionMiddleware)({ secret: TEST_SECRET, store: new memory_store_1.MemoryStore() }));
20
+ app.get('/', (_req, res) => res.sendStatus(200));
21
+ await (0, test_utils_1.withServer)(app, async ({ url }) => {
22
+ const res = await (0, node_fetch_1.default)(url);
23
+ chai_1.assert.equal(res.status, 200);
24
+ const header = res.headers.get('set-cookie');
25
+ const cookies = (0, set_cookie_parser_1.parse)(header ?? '');
26
+ chai_1.assert.equal(cookies.length, 1);
27
+ chai_1.assert.equal(cookies[0].name, 'session');
28
+ chai_1.assert.equal(cookies[0].path, '/');
29
+ });
30
+ });
31
+ it('sets a session cookie with a custom name', async () => {
32
+ const app = (0, express_1.default)();
33
+ app.use((0, index_1.createSessionMiddleware)({
34
+ secret: TEST_SECRET,
35
+ store: new memory_store_1.MemoryStore(),
36
+ cookie: {
37
+ name: 'prairielearn_session',
38
+ },
39
+ }));
40
+ app.get('/', (_req, res) => res.sendStatus(200));
41
+ await (0, test_utils_1.withServer)(app, async ({ url }) => {
42
+ const res = await (0, node_fetch_1.default)(url);
43
+ chai_1.assert.equal(res.status, 200);
44
+ const header = res.headers.get('set-cookie');
45
+ const cookies = (0, set_cookie_parser_1.parse)(header ?? '');
46
+ chai_1.assert.equal(cookies.length, 1);
47
+ chai_1.assert.equal(cookies[0].name, 'prairielearn_session');
48
+ chai_1.assert.equal(cookies[0].path, '/');
49
+ });
50
+ });
51
+ it('sets a secure cookie for proxied HTTPS request', async () => {
52
+ const app = (0, express_1.default)();
53
+ app.enable('trust proxy');
54
+ app.use((0, index_1.createSessionMiddleware)({
55
+ secret: TEST_SECRET,
56
+ store: new memory_store_1.MemoryStore(),
57
+ cookie: {
58
+ secure: true,
59
+ },
60
+ }));
61
+ app.get('/', (_req, res) => res.sendStatus(200));
62
+ await (0, test_utils_1.withServer)(app, async ({ url }) => {
63
+ const res = await (0, node_fetch_1.default)(url, {
64
+ headers: {
65
+ 'X-Forwarded-Proto': 'https',
66
+ },
67
+ });
68
+ chai_1.assert.equal(res.status, 200);
69
+ const header = res.headers.get('set-cookie');
70
+ const cookies = (0, set_cookie_parser_1.parse)(header ?? '');
71
+ chai_1.assert.equal(cookies.length, 1);
72
+ chai_1.assert.equal(cookies[0].name, 'session');
73
+ chai_1.assert.equal(cookies[0].path, '/');
74
+ chai_1.assert.isTrue(cookies[0].secure);
75
+ });
76
+ });
77
+ it('does not set a secure cookie for proxied HTTP request', async () => {
78
+ const app = (0, express_1.default)();
79
+ app.enable('trust proxy');
80
+ app.use((0, index_1.createSessionMiddleware)({
81
+ secret: TEST_SECRET,
82
+ store: new memory_store_1.MemoryStore(),
83
+ cookie: {
84
+ secure: true,
85
+ },
86
+ }));
87
+ app.get('/', (_req, res) => res.sendStatus(200));
88
+ await (0, test_utils_1.withServer)(app, async ({ url }) => {
89
+ const res = await (0, node_fetch_1.default)(url, {
90
+ headers: {
91
+ 'X-Forwarded-Proto': 'http',
92
+ },
93
+ });
94
+ chai_1.assert.equal(res.status, 200);
95
+ const header = res.headers.get('set-cookie');
96
+ chai_1.assert.isNull(header);
97
+ });
98
+ });
99
+ it('automatically sets secure for proxied HTTPS request', async () => {
100
+ const app = (0, express_1.default)();
101
+ app.enable('trust proxy');
102
+ app.use((0, index_1.createSessionMiddleware)({
103
+ secret: TEST_SECRET,
104
+ store: new memory_store_1.MemoryStore(),
105
+ cookie: {
106
+ secure: 'auto',
107
+ },
108
+ }));
109
+ app.get('/', (_req, res) => res.sendStatus(200));
110
+ await (0, test_utils_1.withServer)(app, async ({ url }) => {
111
+ const res = await (0, node_fetch_1.default)(url, {
112
+ headers: {
113
+ 'X-Forwarded-Proto': 'https',
114
+ },
115
+ });
116
+ chai_1.assert.equal(res.status, 200);
117
+ const header = res.headers.get('set-cookie');
118
+ const cookies = (0, set_cookie_parser_1.parse)(header ?? '');
119
+ chai_1.assert.equal(cookies.length, 1);
120
+ chai_1.assert.equal(cookies[0].name, 'session');
121
+ chai_1.assert.equal(cookies[0].path, '/');
122
+ chai_1.assert.isTrue(cookies[0].secure);
123
+ });
124
+ });
125
+ it('automatically sets secure for proxied HTTP request', async () => {
126
+ const app = (0, express_1.default)();
127
+ app.enable('trust proxy');
128
+ app.use((0, index_1.createSessionMiddleware)({
129
+ secret: TEST_SECRET,
130
+ store: new memory_store_1.MemoryStore(),
131
+ cookie: {
132
+ secure: 'auto',
133
+ },
134
+ }));
135
+ app.get('/', (_req, res) => res.sendStatus(200));
136
+ await (0, test_utils_1.withServer)(app, async ({ url }) => {
137
+ const res = await (0, node_fetch_1.default)(url, {
138
+ headers: {
139
+ 'X-Forwarded-Proto': 'http',
140
+ },
141
+ });
142
+ chai_1.assert.equal(res.status, 200);
143
+ const header = res.headers.get('set-cookie');
144
+ const cookies = (0, set_cookie_parser_1.parse)(header ?? '');
145
+ chai_1.assert.equal(cookies.length, 1);
146
+ chai_1.assert.equal(cookies[0].name, 'session');
147
+ chai_1.assert.equal(cookies[0].path, '/');
148
+ chai_1.assert.isUndefined(cookies[0].secure);
149
+ });
150
+ });
151
+ it('sets secure cookie based on a function', async () => {
152
+ const app = (0, express_1.default)();
153
+ app.enable('trust proxy');
154
+ app.use((0, index_1.createSessionMiddleware)({
155
+ secret: TEST_SECRET,
156
+ store: new memory_store_1.MemoryStore(),
157
+ cookie: {
158
+ secure: (req) => req.hostname === 'example.com',
159
+ },
160
+ }));
161
+ app.get('/', (_req, res) => res.sendStatus(200));
162
+ await (0, test_utils_1.withServer)(app, async ({ url }) => {
163
+ const insecureRes = await (0, node_fetch_1.default)(url, {
164
+ headers: {
165
+ 'X-Forwarded-Host': 'subdomain.example.com',
166
+ 'X-Forwarded-Proto': 'http',
167
+ },
168
+ });
169
+ chai_1.assert.equal(insecureRes.status, 200);
170
+ const insecureHeader = insecureRes.headers.get('set-cookie');
171
+ const insecureCookie = (0, set_cookie_parser_1.parse)(insecureHeader ?? '');
172
+ chai_1.assert.equal(insecureCookie.length, 1);
173
+ chai_1.assert.equal(insecureCookie[0].name, 'session');
174
+ chai_1.assert.equal(insecureCookie[0].path, '/');
175
+ chai_1.assert.isUndefined(insecureCookie[0].secure);
176
+ const secureRes = await (0, node_fetch_1.default)(url, {
177
+ headers: {
178
+ 'X-Forwarded-Host': 'example.com',
179
+ 'X-Forwarded-Proto': 'https',
180
+ },
181
+ });
182
+ chai_1.assert.equal(secureRes.status, 200);
183
+ const secureHeader = secureRes.headers.get('set-cookie');
184
+ const secureCookies = (0, set_cookie_parser_1.parse)(secureHeader ?? '');
185
+ chai_1.assert.equal(secureCookies.length, 1);
186
+ chai_1.assert.equal(secureCookies[0].name, 'session');
187
+ chai_1.assert.equal(secureCookies[0].path, '/');
188
+ chai_1.assert.isTrue(secureCookies[0].secure);
189
+ });
190
+ });
191
+ it('persists session data across requests', async () => {
192
+ const app = (0, express_1.default)();
193
+ app.use((0, index_1.createSessionMiddleware)({
194
+ store: new memory_store_1.MemoryStore(),
195
+ secret: TEST_SECRET,
196
+ }));
197
+ app.get('/', (req, res) => {
198
+ req.session.count ??= 0;
199
+ req.session.count += 1;
200
+ res.send(req.session.count.toString());
201
+ });
202
+ await (0, test_utils_1.withServer)(app, async ({ url }) => {
203
+ const fetchWithCookies = (0, fetch_cookie_1.default)(node_fetch_1.default);
204
+ let res = await fetchWithCookies(url);
205
+ chai_1.assert.equal(res.status, 200);
206
+ chai_1.assert.equal(await res.text(), '1');
207
+ res = await fetchWithCookies(url);
208
+ chai_1.assert.equal(res.status, 200);
209
+ chai_1.assert.equal(await res.text(), '2');
210
+ });
211
+ });
212
+ it('commits the session before sending a redirect', async () => {
213
+ const app = (0, express_1.default)();
214
+ app.use((0, index_1.createSessionMiddleware)({
215
+ store: new memory_store_1.MemoryStore(),
216
+ secret: TEST_SECRET,
217
+ }));
218
+ app.post('/', (req, res) => {
219
+ req.session.test = 'test';
220
+ res.redirect(req.originalUrl);
221
+ });
222
+ app.get('/', (req, res) => {
223
+ res.send(req.session.test ?? 'NO VALUE');
224
+ });
225
+ await (0, test_utils_1.withServer)(app, async ({ url }) => {
226
+ const res = await (0, fetch_cookie_1.default)(node_fetch_1.default)(url, {
227
+ method: 'POST',
228
+ });
229
+ chai_1.assert.equal(res.status, 200);
230
+ const body = await res.text();
231
+ chai_1.assert.equal(body, 'test');
232
+ });
233
+ });
234
+ it('destroys session', async () => {
235
+ const store = new memory_store_1.MemoryStore();
236
+ const app = (0, express_1.default)();
237
+ app.use((0, index_1.createSessionMiddleware)({
238
+ store,
239
+ secret: TEST_SECRET,
240
+ }));
241
+ app.get('/', (_req, res) => res.sendStatus(200));
242
+ app.use('/destroy', (0, express_async_handler_1.default)(async (req, res) => {
243
+ await req.session.destroy();
244
+ res.sendStatus(200);
245
+ }));
246
+ await (0, test_utils_1.withServer)(app, async ({ url }) => {
247
+ const fetchWithCookies = (0, fetch_cookie_1.default)(node_fetch_1.default);
248
+ // Generate a new session.
249
+ await fetchWithCookies(url);
250
+ // Destroy the session.
251
+ const destroyRes = await fetchWithCookies(`${url}/destroy`);
252
+ chai_1.assert.equal(destroyRes.status, 200);
253
+ // Ensure the session cookie was cleared in the response.
254
+ const header = destroyRes.headers.get('set-cookie');
255
+ const cookies = (0, set_cookie_parser_1.parse)(header ?? '');
256
+ chai_1.assert.equal(cookies.length, 1);
257
+ chai_1.assert.equal(cookies[0].name, 'session');
258
+ chai_1.assert.equal(cookies[0].path, '/');
259
+ chai_1.assert.equal(cookies[0].expires?.getTime(), 0);
260
+ // Ensure the session was destroyed in the session store.
261
+ const sessionId = cookies[0].value.split('.')[0];
262
+ chai_1.assert.isNull(await store.get(sessionId));
263
+ });
264
+ });
265
+ it('regenerates session', async () => {
266
+ const store = new memory_store_1.MemoryStore();
267
+ const app = (0, express_1.default)();
268
+ app.use((0, index_1.createSessionMiddleware)({
269
+ store,
270
+ secret: TEST_SECRET,
271
+ }));
272
+ app.get('/', (req, res) => {
273
+ res.send(req.session.regenerated ? 'true' : 'false');
274
+ });
275
+ app.get('/regenerate', (0, express_async_handler_1.default)(async (req, res) => {
276
+ await req.session.regenerate();
277
+ req.session.regenerated = true;
278
+ res.sendStatus(200);
279
+ }));
280
+ await (0, test_utils_1.withServer)(app, async ({ url }) => {
281
+ const fetchWithCookies = (0, fetch_cookie_1.default)(node_fetch_1.default);
282
+ // Generate a new session.
283
+ let res = await fetchWithCookies(url);
284
+ chai_1.assert.equal(res.status, 200);
285
+ chai_1.assert.equal(await res.text(), 'false');
286
+ // Extract the original cookie value.
287
+ let header = res.headers.get('set-cookie');
288
+ let cookies = (0, set_cookie_parser_1.parse)(header ?? '');
289
+ chai_1.assert.equal(cookies.length, 1);
290
+ const originalCookieValue = cookies[0].value;
291
+ // Regenerate the session.
292
+ res = await fetchWithCookies(`${url}/regenerate`);
293
+ chai_1.assert.equal(res.status, 200);
294
+ // Ensure that the session cookie was changed.
295
+ header = res.headers.get('set-cookie');
296
+ cookies = (0, set_cookie_parser_1.parse)(header ?? '');
297
+ chai_1.assert.equal(cookies.length, 1);
298
+ const newCookieValue = cookies[0].value;
299
+ chai_1.assert.notEqual(newCookieValue, originalCookieValue);
300
+ // Ensure the original session is no longer present in the session store.
301
+ const originalSessionId = originalCookieValue.split('.')[0];
302
+ chai_1.assert.isNull(await store.get(originalSessionId));
303
+ // Ensure that the regenerated session data was persisted.
304
+ res = await fetchWithCookies(url);
305
+ chai_1.assert.equal(res.status, 200);
306
+ chai_1.assert.equal(await res.text(), 'true');
307
+ });
308
+ });
309
+ it('creates a new session if signature checks fail', async () => {
310
+ const store = new memory_store_1.MemoryStore();
311
+ const app = (0, express_1.default)();
312
+ app.use((0, index_1.createSessionMiddleware)({
313
+ store,
314
+ secret: TEST_SECRET,
315
+ }));
316
+ app.get('/', (req, res) => res.send(req.session.id));
317
+ await (0, test_utils_1.withServer)(app, async ({ url }) => {
318
+ const cookieJar = new fetch_cookie_1.default.toughCookie.CookieJar();
319
+ const fetchWithCookies = (0, fetch_cookie_1.default)(node_fetch_1.default, cookieJar);
320
+ // Generate a new session.
321
+ let res = await fetchWithCookies(url);
322
+ chai_1.assert.equal(res.status, 200);
323
+ const originalSessionId = await res.text();
324
+ // Tamper with the session cookie.
325
+ const cookie = cookieJar.getCookiesSync(url)[0];
326
+ cookie.value = 'tampered';
327
+ cookieJar.setCookieSync(cookie, url);
328
+ // Make sure we get a new session.
329
+ res = await fetchWithCookies(url);
330
+ chai_1.assert.equal(res.status, 200);
331
+ const newSessionId = await res.text();
332
+ chai_1.assert.notEqual(newSessionId, originalSessionId);
333
+ // Make sure the existing session is still present in the store. We don't
334
+ // want someone to be able to evict other sessions by submitting invalid
335
+ // cookies.
336
+ chai_1.assert.isNotNull(await store.get(originalSessionId));
337
+ });
338
+ });
339
+ it('does not re-set the cookie on subsequent requests', async () => {
340
+ const app = (0, express_1.default)();
341
+ app.use((0, index_1.createSessionMiddleware)({
342
+ store: new memory_store_1.MemoryStore(),
343
+ secret: TEST_SECRET,
344
+ }));
345
+ app.get('/', (_req, res) => res.sendStatus(200));
346
+ await (0, test_utils_1.withServer)(app, async ({ url }) => {
347
+ const fetchWithCookies = (0, fetch_cookie_1.default)(node_fetch_1.default);
348
+ // Generate a new session.
349
+ let res = await fetchWithCookies(url);
350
+ chai_1.assert.equal(res.status, 200);
351
+ // Make another request with the same session.
352
+ res = await fetchWithCookies(url);
353
+ chai_1.assert.equal(res.status, 200);
354
+ // Ensure that the cookie wasn't set again.
355
+ const header = res.headers.get('set-cookie');
356
+ chai_1.assert.isNull(header);
357
+ });
358
+ });
359
+ it('does not set the cookie if it is not supposed to', async () => {
360
+ const store = new memory_store_1.MemoryStore();
361
+ const app = (0, express_1.default)();
362
+ app.enable('trust proxy');
363
+ app.use((0, index_1.createSessionMiddleware)({
364
+ store,
365
+ secret: TEST_SECRET,
366
+ canSetCookie: (req) => req.hostname === 'example.com',
367
+ }));
368
+ app.get('/', (req, res) => {
369
+ req.session.count ??= 0;
370
+ req.session.count += 1;
371
+ res.send(req.session.id);
372
+ });
373
+ await (0, test_utils_1.withServer)(app, async ({ url }) => {
374
+ const fetchWithCookies = (0, fetch_cookie_1.default)(node_fetch_1.default);
375
+ // Fetch from a subdomain.
376
+ let res = await fetchWithCookies(url, {
377
+ headers: {
378
+ 'X-Forwarded-Host': 'subdomain.example.com',
379
+ },
380
+ });
381
+ chai_1.assert.equal(res.status, 200);
382
+ // There should not be a cookie.
383
+ chai_1.assert.isNull(res.headers.get('set-cookie'));
384
+ // Since the cookie wasn't set, the session should not have been persisted
385
+ // to the store.
386
+ const originalSessionId = await res.text();
387
+ chai_1.assert.isNull(await store.get(originalSessionId));
388
+ // Now fetch from the correct domain.
389
+ res = await fetchWithCookies(url, {
390
+ headers: {
391
+ 'X-Forwarded-Host': 'example.com',
392
+ },
393
+ });
394
+ chai_1.assert.equal(res.status, 200);
395
+ // There should be a cookie for this request.
396
+ const header = res.headers.get('set-cookie');
397
+ chai_1.assert.isNotNull(header);
398
+ const cookies = (0, set_cookie_parser_1.parse)(header ?? '');
399
+ chai_1.assert.equal(cookies.length, 1);
400
+ chai_1.assert.equal(cookies[0].name, 'session');
401
+ // The session should have been persisted.
402
+ const newSessionId = await res.text();
403
+ let session = await store.get(newSessionId);
404
+ chai_1.assert.isNotNull(session);
405
+ chai_1.assert.equal(session?.data.count, 1);
406
+ // Now, fetch from the subdomain again. This time, the session should
407
+ // work as normal.
408
+ res = await fetchWithCookies(url, {
409
+ headers: {
410
+ 'X-Forwarded-Host': 'subdomain.example.com',
411
+ },
412
+ });
413
+ chai_1.assert.equal(res.status, 200);
414
+ chai_1.assert.equal(await res.text(), newSessionId);
415
+ // Ensure that there was still no Set-Cookie header.
416
+ chai_1.assert.isNull(res.headers.get('set-cookie'));
417
+ // Ensure that the session was persisted.
418
+ session = await store.get(newSessionId);
419
+ chai_1.assert.isNotNull(session);
420
+ chai_1.assert.equal(session?.data.count, 2);
421
+ });
422
+ });
423
+ it('extends the expiration date of the cookie', async () => {
424
+ const store = new memory_store_1.MemoryStore();
425
+ const app = (0, express_1.default)();
426
+ app.use((0, index_1.createSessionMiddleware)({
427
+ store,
428
+ secret: TEST_SECRET,
429
+ cookie: {
430
+ maxAge: 1000,
431
+ },
432
+ }));
433
+ app.get('/', (_req, res) => res.sendStatus(200));
434
+ app.get('/extend', (req, res) => {
435
+ req.session.setExpiration(Date.now() + 10000);
436
+ res.sendStatus(200);
437
+ });
438
+ await (0, test_utils_1.withServer)(app, async ({ url }) => {
439
+ const fetchWithCookies = (0, fetch_cookie_1.default)(node_fetch_1.default);
440
+ // Generate a new session.
441
+ let res = await fetchWithCookies(url);
442
+ chai_1.assert.equal(res.status, 200);
443
+ // Grab the original expiration date.
444
+ let header = res.headers.get('set-cookie');
445
+ let cookies = (0, set_cookie_parser_1.parse)(header ?? '');
446
+ chai_1.assert.equal(cookies.length, 1);
447
+ chai_1.assert.isUndefined(cookies[0].maxAge);
448
+ const originalExpirationDate = cookies[0].expires;
449
+ (0, chai_1.assert)(originalExpirationDate);
450
+ // Also grab the expiration date from the store.
451
+ const sessionId = cookies[0].value.split('.')[0];
452
+ const session = await store.get(sessionId);
453
+ (0, chai_1.assert)(session);
454
+ const originalStoreExpirationDate = session.expiresAt;
455
+ // Ensure that the expiration dates are consistent.
456
+ chai_1.assert.equal(originalExpirationDate.getTime(), originalStoreExpirationDate.getTime());
457
+ // Make another request with the same session.
458
+ res = await fetchWithCookies(`${url}/extend`);
459
+ chai_1.assert.equal(res.status, 200);
460
+ // Ensure that the cookie was set again.
461
+ header = res.headers.get('set-cookie');
462
+ cookies = (0, set_cookie_parser_1.parse)(header ?? '');
463
+ chai_1.assert.equal(cookies.length, 1);
464
+ chai_1.assert.isUndefined(cookies[0].maxAge);
465
+ const newExpirationDate = cookies[0].expires;
466
+ (0, chai_1.assert)(newExpirationDate);
467
+ // Ensure that the expiration date was extended.
468
+ chai_1.assert.notEqual(newExpirationDate.getTime(), originalExpirationDate.getTime());
469
+ // Also grab the new expiration date from the store.
470
+ const newSession = await store.get(sessionId);
471
+ (0, chai_1.assert)(newSession);
472
+ const newStoreExpirationDate = newSession.expiresAt;
473
+ // Ensure that the expiration dates are consistent.
474
+ chai_1.assert.equal(newExpirationDate.getTime(), newStoreExpirationDate.getTime());
475
+ });
476
+ });
477
+ it('does not persist session data if the session did not change', async () => {
478
+ const store = new memory_store_1.MemoryStore();
479
+ let setCount = 0;
480
+ const originalStoreSet = store.set.bind(store);
481
+ store.set = async (...args) => {
482
+ setCount += 1;
483
+ await originalStoreSet(...args);
484
+ };
485
+ const app = (0, express_1.default)();
486
+ app.use((0, index_1.createSessionMiddleware)({
487
+ store,
488
+ secret: TEST_SECRET,
489
+ }));
490
+ app.get('/', (_req, res) => res.sendStatus(200));
491
+ await (0, test_utils_1.withServer)(app, async ({ url }) => {
492
+ const fetchWithCookies = (0, fetch_cookie_1.default)(node_fetch_1.default);
493
+ // Generate a new session.
494
+ let res = await fetchWithCookies(url);
495
+ chai_1.assert.equal(res.status, 200);
496
+ // Ensure the session was persisted.
497
+ chai_1.assert.equal(setCount, 1);
498
+ // Make another request with the same session.
499
+ res = await fetchWithCookies(url);
500
+ chai_1.assert.equal(res.status, 200);
501
+ // Ensure the session was not persisted.
502
+ chai_1.assert.equal(setCount, 1);
503
+ });
504
+ });
505
+ });
506
+ //# sourceMappingURL=index.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.test.js","sourceRoot":"","sources":["../src/index.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import { SessionStore, SessionStoreData } from './store';
2
+ export declare class MemoryStore implements SessionStore {
3
+ private sessions;
4
+ set(id: string, session: any, expiresAt: Date): Promise<void>;
5
+ get(id: string): Promise<SessionStoreData | null>;
6
+ destroy(id: string): Promise<void>;
7
+ }
@@ -0,0 +1,28 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.MemoryStore = void 0;
4
+ class MemoryStore {
5
+ constructor() {
6
+ this.sessions = new Map();
7
+ }
8
+ async set(id, session, expiresAt) {
9
+ this.sessions.set(id, {
10
+ expiresAt,
11
+ data: JSON.stringify(session),
12
+ });
13
+ }
14
+ async get(id) {
15
+ const value = this.sessions.get(id);
16
+ if (!value)
17
+ return null;
18
+ return {
19
+ expiresAt: value.expiresAt,
20
+ data: JSON.parse(value.data),
21
+ };
22
+ }
23
+ async destroy(id) {
24
+ this.sessions.delete(id);
25
+ }
26
+ }
27
+ exports.MemoryStore = MemoryStore;
28
+ //# sourceMappingURL=memory-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-store.js","sourceRoot":"","sources":["../src/memory-store.ts"],"names":[],"mappings":";;;AAEA,MAAa,WAAW;IAAxB;QACU,aAAQ,GAAG,IAAI,GAAG,EAA6C,CAAC;IAqB1E,CAAC;IAnBC,KAAK,CAAC,GAAG,CAAC,EAAU,EAAE,OAAY,EAAE,SAAe;QACjD,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,EAAE;YACpB,SAAS;YACT,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC;SAC9B,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,EAAU;QAClB,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACpC,IAAI,CAAC,KAAK;YAAE,OAAO,IAAI,CAAC;QACxB,OAAO;YACL,SAAS,EAAE,KAAK,CAAC,SAAS;YAC1B,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC;SAC7B,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,EAAU;QACtB,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IAC3B,CAAC;CACF;AAtBD,kCAsBC"}
@@ -0,0 +1,14 @@
1
+ import type { Request } from 'express';
2
+ import type { SessionStore } from './store';
3
+ export interface Session {
4
+ id: string;
5
+ destroy(): Promise<void>;
6
+ regenerate(): Promise<void>;
7
+ setExpiration(expiry: Date | number): void;
8
+ getExpirationDate(): Date;
9
+ [key: string]: any;
10
+ }
11
+ export declare function generateSessionId(): Promise<string>;
12
+ export declare function loadSession(sessionId: string, req: Request, store: SessionStore, maxAge: number): Promise<Session>;
13
+ export declare function makeSession(sessionId: string, req: Request, store: SessionStore, expirationDate: Date | null, maxAge: number): Session;
14
+ export declare function hashSession(session: Session): string;