@scefira/dfw 1.5.4 → 1.6.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 (55) hide show
  1. package/dist/cjs/lib/APIManager.d.ts.map +1 -1
  2. package/dist/cjs/lib/APIManager.js +103 -49
  3. package/dist/cjs/lib/APIManager.js.map +1 -1
  4. package/dist/cjs/lib/DFWSessionStore.d.ts +23 -6
  5. package/dist/cjs/lib/DFWSessionStore.d.ts.map +1 -1
  6. package/dist/cjs/lib/DFWSessionStore.js +214 -58
  7. package/dist/cjs/lib/DFWSessionStore.js.map +1 -1
  8. package/dist/cjs/modules/DFWSessionModule.d.ts.map +1 -1
  9. package/dist/cjs/modules/DFWSessionModule.js +9 -1
  10. package/dist/cjs/modules/DFWSessionModule.js.map +1 -1
  11. package/dist/cjs/prisma/internal/class.js +2 -2
  12. package/dist/cjs/prisma/internal/class.js.map +1 -1
  13. package/dist/cjs/prisma/internal/prismaNamespace.d.ts +1 -0
  14. package/dist/cjs/prisma/internal/prismaNamespace.d.ts.map +1 -1
  15. package/dist/cjs/prisma/internal/prismaNamespace.js +1 -0
  16. package/dist/cjs/prisma/internal/prismaNamespace.js.map +1 -1
  17. package/dist/cjs/prisma/internal/prismaNamespaceBrowser.d.ts +1 -0
  18. package/dist/cjs/prisma/internal/prismaNamespaceBrowser.d.ts.map +1 -1
  19. package/dist/cjs/prisma/internal/prismaNamespaceBrowser.js +1 -0
  20. package/dist/cjs/prisma/internal/prismaNamespaceBrowser.js.map +1 -1
  21. package/dist/cjs/prisma/models/dfw_session.d.ts +36 -1
  22. package/dist/cjs/prisma/models/dfw_session.d.ts.map +1 -1
  23. package/dist/cjs/test.repository.d.ts +2 -1
  24. package/dist/cjs/test.repository.d.ts.map +1 -1
  25. package/dist/cjs/types/DFWConfig.d.ts +6 -4
  26. package/dist/cjs/types/DFWConfig.d.ts.map +1 -1
  27. package/dist/esm/lib/APIManager.d.ts.map +1 -1
  28. package/dist/esm/lib/APIManager.js +102 -51
  29. package/dist/esm/lib/APIManager.js.map +1 -1
  30. package/dist/esm/lib/DFWSessionStore.d.ts +23 -6
  31. package/dist/esm/lib/DFWSessionStore.d.ts.map +1 -1
  32. package/dist/esm/lib/DFWSessionStore.js +200 -56
  33. package/dist/esm/lib/DFWSessionStore.js.map +1 -1
  34. package/dist/esm/modules/DFWSessionModule.d.ts.map +1 -1
  35. package/dist/esm/modules/DFWSessionModule.js +9 -1
  36. package/dist/esm/modules/DFWSessionModule.js.map +1 -1
  37. package/dist/esm/prisma/internal/class.js +2 -2
  38. package/dist/esm/prisma/internal/class.js.map +1 -1
  39. package/dist/esm/prisma/internal/prismaNamespace.d.ts +1 -0
  40. package/dist/esm/prisma/internal/prismaNamespace.d.ts.map +1 -1
  41. package/dist/esm/prisma/internal/prismaNamespace.js +1 -0
  42. package/dist/esm/prisma/internal/prismaNamespace.js.map +1 -1
  43. package/dist/esm/prisma/internal/prismaNamespaceBrowser.d.ts +1 -0
  44. package/dist/esm/prisma/internal/prismaNamespaceBrowser.d.ts.map +1 -1
  45. package/dist/esm/prisma/internal/prismaNamespaceBrowser.js +1 -0
  46. package/dist/esm/prisma/internal/prismaNamespaceBrowser.js.map +1 -1
  47. package/dist/esm/prisma/models/dfw_session.d.ts +36 -1
  48. package/dist/esm/prisma/models/dfw_session.d.ts.map +1 -1
  49. package/dist/esm/test.repository.d.ts +2 -1
  50. package/dist/esm/test.repository.d.ts.map +1 -1
  51. package/dist/esm/types/DFWConfig.d.ts +6 -4
  52. package/dist/esm/types/DFWConfig.d.ts.map +1 -1
  53. package/package.json +1 -1
  54. package/prisma/SESSION-STORE.md +41 -0
  55. package/prisma/schema/dfw.prisma +1 -0
@@ -1 +1 @@
1
- {"version":3,"file":"APIManager.d.ts","sourceRoot":"","sources":["../../../src/lib/APIManager.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAE5C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAWtD,qBAAa,UAAU,CAAC,IAAI,SAAS,OAAO,CAAC,GAAG,CAAC;IAC7C,OAAO,CAAC,GAAG,CAAM;gBAEL,GAAG,EAAE,IAAI;IAId,eAAe;IA8Ef,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW;CAkDvD"}
1
+ {"version":3,"file":"APIManager.d.ts","sourceRoot":"","sources":["../../../src/lib/APIManager.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAM5C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAWtD,qBAAa,UAAU,CAAC,IAAI,SAAS,OAAO,CAAC,GAAG,CAAC;IAC7C,OAAO,CAAC,GAAG,CAAO;gBAEN,GAAG,EAAE,IAAI;IAId,eAAe;IAsKf,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW;CA0GvD"}
@@ -31,30 +31,42 @@ class APIManager {
31
31
  const config = this.DFW.config;
32
32
  const APIRouter = this.DFW.routerAPILayer;
33
33
  //// PASSPORT AND SESSION ////
34
+ if (process.env.NODE_ENV === "production" &&
35
+ !((_a = config.session) === null || _a === void 0 ? void 0 : _a.secret)) {
36
+ DFWUtils_1.DFWUtils.log("[DFW] Warning: using the default session secret in production");
37
+ }
34
38
  APIRouter.use((0, express_session_1.default)({
35
- rolling: (_b = (_a = config.session) === null || _a === void 0 ? void 0 : _a.rolling) !== null && _b !== void 0 ? _b : false,
36
- name: 'stk',
37
- secret: (_d = (_c = config.session) === null || _c === void 0 ? void 0 : _c.secret) !== null && _d !== void 0 ? _d : 'default',
39
+ rolling: (_c = (_b = config.session) === null || _b === void 0 ? void 0 : _b.rolling) !== null && _c !== void 0 ? _c : false,
40
+ name: "stk",
41
+ secret: (_e = (_d = config.session) === null || _d === void 0 ? void 0 : _d.secret) !== null && _e !== void 0 ? _e : "default",
38
42
  genid: () => (0, uuid_1.v7)(),
39
43
  resave: false,
40
44
  saveUninitialized: false,
41
45
  store: new DFWSessionStore_1.DFWSessionStore(this.DFW),
42
- cookie: Object.assign({ secure: false, maxAge: 1000 * 60 * 60 * 24 * 180 }, (_e = config.session) === null || _e === void 0 ? void 0 : _e.cookieOptions)
46
+ cookie: (0, DFWSessionStore_1.sessionCookieOptions)(config)
43
47
  }));
44
48
  APIRouter.use(passport_1.default.initialize());
45
49
  APIRouter.use(passport_1.default.session());
46
50
  if (((_g = (_f = config.session) === null || _f === void 0 ? void 0 : _f.authenticators) === null || _g === void 0 ? void 0 : _g.dfw) !== false) {
47
- passport_1.default.use('dfw', (0, DFWPassportStrategy_1.DFWPassportStrategy)(this.DFW));
51
+ passport_1.default.use("dfw", (0, DFWPassportStrategy_1.DFWPassportStrategy)(this.DFW));
48
52
  }
49
- passport_1.default.serializeUser((_a, done_1) => __awaiter(this, [_a, done_1], void 0, function* ({ id }, done) {
53
+ passport_1.default.serializeUser(({ id }, done) => {
50
54
  done(null, id);
51
- }));
52
- passport_1.default.deserializeUser((idUser, done) => __awaiter(this, void 0, void 0, function* () {
55
+ });
56
+ passport_1.default.deserializeUser((idUser, done) => {
53
57
  done(null, { id: idUser });
54
- }));
58
+ });
55
59
  //// DFW API Schema ////
56
60
  APIRouter.use(((req, res, next) => {
57
61
  const callbackStack = [];
62
+ let responseFinished = false;
63
+ const runCallback = (callback) => {
64
+ void Promise.resolve()
65
+ .then(callback)
66
+ .catch((error) => {
67
+ console.error("[DFW] Callback error:", error);
68
+ });
69
+ };
58
70
  const dfw = {
59
71
  db: this.DFW.db,
60
72
  getSession: () => {
@@ -65,82 +77,124 @@ class APIManager {
65
77
  id: req.sessionID
66
78
  });
67
79
  },
68
- addCallback: (cb) => {
69
- callbackStack.push(cb);
80
+ addCallback: (callback) => {
81
+ // Run immediately if the response already finished.
82
+ if (responseFinished) {
83
+ runCallback(callback);
84
+ return;
85
+ }
86
+ callbackStack.push(callback);
70
87
  }
71
88
  };
72
89
  req.dfw = dfw;
90
+ // All post-response callbacks are handled in one place.
73
91
  res.once("finish", () => {
74
- callbackStack.forEach((cb) => {
75
- void Promise.resolve()
76
- .then(cb)
77
- .catch((error) => {
78
- console.error("[DFW] Callback error:", error);
79
- });
80
- });
92
+ responseFinished = true;
93
+ for (const callback of callbackStack.splice(0)) {
94
+ runCallback(callback);
95
+ }
81
96
  });
82
97
  next();
83
98
  }));
84
99
  APIRouter.use(this.DFW.routerAPIContainer);
85
- APIRouter.use((err, _1, res, _2) => {
86
- if (process.env.NODE_ENV == "development")
100
+ //// ERROR HANDLER ////
101
+ APIRouter.use((err, _req, res, next) => {
102
+ // Let Express handle errors after the response has started.
103
+ if (res.headersSent) {
104
+ return next(err);
105
+ }
106
+ if (process.env.NODE_ENV === "development") {
87
107
  DFWUtils_1.DFWUtils.log(err, true);
88
- const errorStatus = res.statusCode === 200 ? 500 : res.statusCode;
89
- if (typeof err === "object" && err.message) {
90
- res.status(errorStatus).json({ error: err.message, stack: process.env.NODE_ENV == "development" ? err.stack : null }).end();
91
108
  }
92
- else {
93
- res.status(errorStatus).json({ error: err }).end();
109
+ const explicitStatus = typeof (err === null || err === void 0 ? void 0 : err.status) === "number"
110
+ ? err.status
111
+ : typeof (err === null || err === void 0 ? void 0 : err.statusCode) === "number"
112
+ ? err.statusCode
113
+ : undefined;
114
+ const currentStatus = res.statusCode >= 400 &&
115
+ res.statusCode <= 599
116
+ ? res.statusCode
117
+ : undefined;
118
+ const errorStatus = explicitStatus >= 400 &&
119
+ explicitStatus <= 599
120
+ ? explicitStatus
121
+ : currentStatus !== null && currentStatus !== void 0 ? currentStatus : 500;
122
+ if (typeof err === "object" &&
123
+ err !== null &&
124
+ err.message) {
125
+ res.status(errorStatus).json({
126
+ error: err.message,
127
+ stack: process.env.NODE_ENV === "development"
128
+ ? err.stack
129
+ : null
130
+ });
131
+ return;
94
132
  }
133
+ res.status(errorStatus).json({
134
+ error: err
135
+ });
95
136
  });
96
137
  }
97
138
  addListener(path, params) {
98
139
  var _a;
99
140
  const APIContainer = this.DFW.routerAPIContainer;
100
- const method = (_a = params.method) !== null && _a !== void 0 ? _a : 'get';
141
+ const method = (_a = params.method) !== null && _a !== void 0 ? _a : "get";
101
142
  const mainFunction = params.fn;
102
143
  if (!params.middleware && !mainFunction) {
103
144
  DFWUtils_1.DFWUtils.log(`Unable to set listener for [${method}] ${path} listener and middleware are undefined`);
104
145
  return;
105
146
  }
106
- this.DFW.server[method](path, this.DFW.routerAPILayer); // Install api layer in this route
107
- // Body Parser
108
- if (['post', 'put', 'patch', 'delete'].includes(method) && params.disableBodyParser !== true)
147
+ // Install the API layer only for registered API routes.
148
+ this.DFW.server[method](path, this.DFW.routerAPILayer);
149
+ // Body parser
150
+ if (["post", "put", "patch", "delete"].includes(method) &&
151
+ params.disableBodyParser !== true) {
109
152
  APIContainer[method](path, body_parser_1.default.json());
110
- // file upload middleware
111
- if (params.upload)
112
- APIContainer[method](path, (0, express_fileupload_1.default)(typeof params.upload === 'boolean' ? {} : params.upload));
113
- // plugged middlewares and handlers
153
+ }
154
+ // File upload middleware
155
+ if (params.upload) {
156
+ APIContainer[method](path, (0, express_fileupload_1.default)(typeof params.upload === "boolean"
157
+ ? {}
158
+ : params.upload));
159
+ }
160
+ // Plugged middlewares and handlers
114
161
  if (params.middleware) {
115
- const middlewares = Array.isArray(params.middleware) ? params.middleware : [params.middleware];
162
+ const middlewares = Array.isArray(params.middleware)
163
+ ? params.middleware
164
+ : [params.middleware];
116
165
  APIContainer[method](path, ...middlewares);
117
166
  }
118
167
  if (mainFunction) {
119
168
  APIContainer[method](path, (req, res, next) => __awaiter(this, void 0, void 0, function* () {
120
169
  try {
121
- // calling the listener
122
- const data = yield mainFunction(req.dfw, req, res).catch(next);
170
+ const data = yield mainFunction(req.dfw, req, res);
123
171
  if (params.callback) {
124
- res.on('finish', () => {
125
- var _a;
126
- (_a = params.callback) === null || _a === void 0 ? void 0 : _a.call(params, req, data).catch((e) => {
127
- console.error('Error in callback:', e);
128
- });
129
- });
172
+ req.dfw.addCallback(() => params.callback(req, data));
130
173
  }
131
- if (!res.finished && !params.disableAutoSend) {
132
- if (data)
133
- res.json(data).end();
134
- else
174
+ if (!params.disableAutoSend &&
175
+ !res.writableEnded) {
176
+ /*
177
+ * If the handler already started the response,
178
+ * only finish it instead of trying to replace it.
179
+ */
180
+ if (res.headersSent) {
181
+ res.end();
182
+ return;
183
+ }
184
+ if (data !== undefined) {
185
+ res.json(data);
186
+ }
187
+ else {
135
188
  res.end();
189
+ }
136
190
  }
137
191
  }
138
- catch (e) {
139
- next(e);
192
+ catch (error) {
193
+ next(error);
140
194
  }
141
195
  }));
142
196
  }
143
- DFWUtils_1.DFWUtils.log(`${chalk_1.default.yellow(method.toUpperCase().padEnd(7, ' '))} ${chalk_1.default.green(path)}`);
197
+ DFWUtils_1.DFWUtils.log(`${chalk_1.default.yellow(method.toUpperCase().padEnd(7, " "))} ${chalk_1.default.green(path)}`);
144
198
  }
145
199
  }
146
200
  exports.APIManager = APIManager;
@@ -1 +1 @@
1
- {"version":3,"file":"APIManager.js","sourceRoot":"","sources":["../../../src/lib/APIManager.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"APIManager.js","sourceRoot":"","sources":["../../../src/lib/APIManager.ts"],"names":[],"mappings":"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"}
@@ -1,11 +1,28 @@
1
+ import type { Request } from "express";
2
+ import session, { type CookieOptions, type SessionData } from "express-session";
3
+ import type { DFWConfig } from "#types/DFWConfig";
1
4
  import type { DFWCore } from "./DFWCore.js";
2
- import { Store } from "express-session";
3
- export declare class DFWSessionStore extends Store {
4
- private db;
5
- private cache;
5
+ export declare function sessionCookieOptions(config: DFWConfig): CookieOptions;
6
+ export declare class DFWSessionStore extends session.Store {
7
+ private readonly db;
8
+ private readonly cookieOptions;
9
+ private readonly rolling;
10
+ private readonly loadedSessions;
11
+ private readonly cache;
12
+ private readonly pendingReads;
6
13
  constructor(DFW: DFWCore<any>);
7
- get(sid: string, callback: (err: any, session?: any) => void): void;
8
- set(sid: string, sessionData: any, callback?: (err?: any) => void): void;
14
+ private expiration;
15
+ private legacySession;
16
+ private readSession;
17
+ private serialize;
18
+ private findSession;
19
+ private invalidate;
20
+ get(sid: string, callback: (err: any, session?: SessionData | null) => void): void;
21
+ createSession(req: Request, sessionData: SessionData): session.Session & SessionData;
22
+ set(sid: string, sessionData: SessionData, callback?: (err?: any) => void): void;
23
+ touch(sid: string, sessionData: SessionData, callback?: (err?: any) => void): void;
24
+ private touchSession;
9
25
  destroy(sid: string, callback?: (err?: any) => void): void;
26
+ private reportError;
10
27
  }
11
28
  //# sourceMappingURL=DFWSessionStore.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"DFWSessionStore.d.ts","sourceRoot":"","sources":["../../../src/lib/DFWSessionStore.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAGxC,qBAAa,eAAgB,SAAQ,KAAK;IAEtC,OAAO,CAAC,EAAE,CAAc;IAExB,OAAO,CAAC,KAAK,CAA8B;gBAE/B,GAAG,EAAE,OAAO,CAAC,GAAG,CAAC;IAM7B,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,OAAO,CAAC,EAAE,GAAG,KAAK,IAAI,GAAG,IAAI;IA+BnE,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,WAAW,EAAE,GAAG,EAAE,QAAQ,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,GAAG,KAAK,IAAI,GAAG,IAAI;IAmBxE,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,GAAG,KAAK,IAAI,GAAG,IAAI;CAc7D"}
1
+ {"version":3,"file":"DFWSessionStore.d.ts","sourceRoot":"","sources":["../../../src/lib/DFWSessionStore.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,OAAO,EAAE,EAAE,KAAK,aAAa,EAAE,KAAK,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAGhF,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAe5C,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,SAAS,GAAG,aAAa,CAMrE;AAED,qBAAa,eAAgB,SAAQ,OAAO,CAAC,KAAK;IAC9C,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAe;IAClC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAgB;IAC9C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAU;IAClC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAA8B;IAC7D,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAsD;IAC5E,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAoD;gBAErE,GAAG,EAAE,OAAO,CAAC,GAAG,CAAC;IAQ7B,OAAO,CAAC,UAAU;IAIlB,OAAO,CAAC,aAAa;IAKrB,OAAO,CAAC,WAAW;IAmCnB,OAAO,CAAC,SAAS;IAQjB,OAAO,CAAC,WAAW;IA+BnB,OAAO,CAAC,UAAU;IAKlB,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG,IAAI,KAAK,IAAI,GAAG,IAAI;IAYlF,aAAa,CAAC,GAAG,EAAE,OAAO,EAAE,WAAW,EAAE,WAAW,GAAG,OAAO,CAAC,OAAO,GAAG,WAAW;IASpF,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,WAAW,EAAE,WAAW,EAAE,QAAQ,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,GAAG,KAAK,IAAI,GAAG,IAAI;IAiChF,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,WAAW,EAAE,WAAW,EAAE,QAAQ,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,GAAG,KAAK,IAAI,GAAG,IAAI;YAYpE,YAAY;IAmC1B,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,GAAG,KAAK,IAAI,GAAG,IAAI;IAY1D,OAAO,CAAC,WAAW;CAItB"}
@@ -1,81 +1,237 @@
1
1
  "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ var __importDefault = (this && this.__importDefault) || function (mod) {
12
+ return (mod && mod.__esModule) ? mod : { "default": mod };
13
+ };
2
14
  Object.defineProperty(exports, "__esModule", { value: true });
3
15
  exports.DFWSessionStore = void 0;
4
- const express_session_1 = require("express-session");
16
+ exports.sessionCookieOptions = sessionCookieOptions;
17
+ const express_session_1 = __importDefault(require("express-session"));
5
18
  const lru_min_1 = require("lru.min");
6
- class DFWSessionStore extends express_session_1.Store {
19
+ const SESSION_CACHE_IDLE_MS = 60 * 60 * 1000;
20
+ function sessionCookieOptions(config) {
21
+ var _a;
22
+ return Object.assign({ secure: false, maxAge: 1000 * 60 * 60 * 24 * 180 }, (_a = config.session) === null || _a === void 0 ? void 0 : _a.cookieOptions);
23
+ }
24
+ class DFWSessionStore extends express_session_1.default.Store {
7
25
  constructor(DFW) {
8
- var _a, _b;
26
+ var _a, _b, _c, _d;
9
27
  super();
28
+ this.loadedSessions = new WeakSet();
29
+ this.pendingReads = new Map();
10
30
  this.db = DFW.db;
11
- this.cache = (0, lru_min_1.createLRU)({ max: (_b = (_a = DFW.config.session) === null || _a === void 0 ? void 0 : _a.cacheSize) !== null && _b !== void 0 ? _b : 200 });
31
+ this.cookieOptions = sessionCookieOptions(DFW.config);
32
+ this.rolling = (_b = (_a = DFW.config.session) === null || _a === void 0 ? void 0 : _a.rolling) !== null && _b !== void 0 ? _b : false;
33
+ this.cache = (0, lru_min_1.createLRU)({ max: (_d = (_c = DFW.config.session) === null || _c === void 0 ? void 0 : _c.cacheSize) !== null && _d !== void 0 ? _d : 200 });
12
34
  }
13
- get(sid, callback) {
14
- if (this.cache.has(sid)) {
15
- if (process.env.NODE_ENV === 'development')
16
- console.log(`read session (cache) ${sid}`);
17
- callback(null, this.cache.get(sid));
18
- return;
35
+ expiration(sessionData) {
36
+ var _a;
37
+ return (_a = sessionData.cookie.expires) !== null && _a !== void 0 ? _a : null;
38
+ }
39
+ legacySession(idUser) {
40
+ const cookie = Object.assign(new express_session_1.default.Cookie(), this.cookieOptions);
41
+ return Object.assign({ cookie }, { passport: { user: idUser } });
42
+ }
43
+ readSession(record) {
44
+ if (record.data === null) {
45
+ return { data: this.legacySession(record.idUser), expiresAt: record.expiresAt };
19
46
  }
20
- if (process.env.NODE_ENV === 'development')
21
- console.log(`read session ${sid}`);
22
- this.db.dfw_session.findFirst({
23
- select: { idUser: true },
24
- where: {
25
- id: sid,
26
- OR: [
27
- { expiresAt: null },
28
- { expiresAt: { gt: new Date() } },
29
- ],
47
+ const stored = JSON.parse(record.data);
48
+ let data = stored;
49
+ let expiresAt = record.expiresAt;
50
+ if (typeof stored === "object" && stored !== null && "__dfwSessionStore" in stored) {
51
+ if (stored.__dfwSessionStore !== 1 || !("session" in stored) ||
52
+ !("expiresAt" in stored) ||
53
+ (typeof stored.expiresAt !== "string" && stored.expiresAt !== null)) {
54
+ throw new Error("Invalid stored session data");
30
55
  }
31
- }).then((sessionObj) => {
32
- if (sessionObj) {
33
- const passportSession = { cookie: {}, passport: { user: sessionObj.idUser } };
34
- this.cache.set(sid, passportSession);
35
- callback(null, passportSession);
56
+ data = stored.session;
57
+ expiresAt = stored.expiresAt === null ? null : new Date(stored.expiresAt);
58
+ if (expiresAt !== null && !Number.isFinite(expiresAt.getTime())) {
59
+ throw new Error("Invalid stored session data");
36
60
  }
37
- else {
38
- this.cache.set(sid, null);
39
- callback(null, null);
61
+ if (record.expiresAt !== null && (expiresAt === null ||
62
+ record.expiresAt.getTime() < Date.UTC(expiresAt.getUTCFullYear(), expiresAt.getUTCMonth(), expiresAt.getUTCDate()))) {
63
+ expiresAt = record.expiresAt;
40
64
  }
41
- }).catch((e) => {
42
- callback(e);
65
+ }
66
+ if (typeof data !== "object" || data === null || !("cookie" in data) ||
67
+ typeof data.cookie !== "object" || data.cookie === null ||
68
+ !("originalMaxAge" in data.cookie) ||
69
+ (typeof data.cookie.originalMaxAge !== "number" && data.cookie.originalMaxAge !== null)) {
70
+ throw new Error("Invalid stored session data");
71
+ }
72
+ return { data: data, expiresAt };
73
+ }
74
+ serialize(sessionData, expiresAt) {
75
+ var _a;
76
+ return JSON.stringify({
77
+ __dfwSessionStore: 1,
78
+ session: sessionData,
79
+ expiresAt: (_a = expiresAt === null || expiresAt === void 0 ? void 0 : expiresAt.toISOString()) !== null && _a !== void 0 ? _a : null
43
80
  });
44
81
  }
82
+ findSession(sid) {
83
+ const cached = this.cache.get(sid);
84
+ if (cached) {
85
+ const now = Date.now();
86
+ if (now - cached.lastAccess <= SESSION_CACHE_IDLE_MS) {
87
+ cached.lastAccess = now;
88
+ return Promise.resolve(cached.record);
89
+ }
90
+ this.cache.delete(sid);
91
+ }
92
+ const existing = this.pendingReads.get(sid);
93
+ if (existing)
94
+ return existing;
95
+ const pending = this.db.dfw_session.findFirst({
96
+ select: { idUser: true, data: true, expiresAt: true },
97
+ where: { id: sid }
98
+ }).then((record) => {
99
+ if (this.pendingReads.get(sid) === pending) {
100
+ this.pendingReads.delete(sid);
101
+ if (record)
102
+ this.cache.set(sid, { record, lastAccess: Date.now() });
103
+ }
104
+ return record;
105
+ }, (error) => {
106
+ if (this.pendingReads.get(sid) === pending)
107
+ this.pendingReads.delete(sid);
108
+ throw error;
109
+ });
110
+ this.pendingReads.set(sid, pending);
111
+ return pending;
112
+ }
113
+ invalidate(sid) {
114
+ this.cache.delete(sid);
115
+ this.pendingReads.delete(sid);
116
+ }
117
+ get(sid, callback) {
118
+ this.findSession(sid).then((record) => {
119
+ var _a;
120
+ if (!record)
121
+ return null;
122
+ const stored = this.readSession(record);
123
+ if (stored.expiresAt !== null && stored.expiresAt.getTime() <= Date.now()) {
124
+ if (((_a = this.cache.peek(sid)) === null || _a === void 0 ? void 0 : _a.record) === record)
125
+ this.invalidate(sid);
126
+ return null;
127
+ }
128
+ return stored.data;
129
+ }).then((data) => callback(null, data), (error) => callback(error));
130
+ }
131
+ createSession(req, sessionData) {
132
+ if (sessionData.cookie.secure === "auto") {
133
+ sessionData.cookie.secure = req.secure;
134
+ }
135
+ const result = super.createSession(req, sessionData);
136
+ this.loadedSessions.add(result);
137
+ return result;
138
+ }
45
139
  set(sid, sessionData, callback) {
46
- var _a, _b;
47
- if (process.env.NODE_ENV === 'development')
48
- console.log(`setting session ${sid} ${JSON.stringify(sessionData)}`);
49
- this.cache.set(sid, sessionData);
50
- this.db.dfw_session.upsert({
51
- create: {
52
- id: sid,
53
- idUser: (_a = sessionData.passport) === null || _a === void 0 ? void 0 : _a.user,
54
- },
55
- update: {
56
- idUser: (_b = sessionData.passport) === null || _b === void 0 ? void 0 : _b.user,
57
- },
58
- where: {
59
- id: sid
140
+ var _a;
141
+ try {
142
+ const passport = sessionData.passport;
143
+ const expiresAt = this.expiration(sessionData);
144
+ const values = {
145
+ idUser: (_a = passport === null || passport === void 0 ? void 0 : passport.user) !== null && _a !== void 0 ? _a : null,
146
+ data: this.serialize(sessionData, expiresAt),
147
+ expiresAt
148
+ };
149
+ const loaded = this.loadedSessions.has(sessionData);
150
+ this.loadedSessions.add(sessionData);
151
+ this.invalidate(sid);
152
+ const write = loaded
153
+ ? this.db.dfw_session.updateMany({ where: { id: sid }, data: values }).then((result) => {
154
+ if (result.count === 0)
155
+ throw new Error("Cannot save a destroyed session");
156
+ })
157
+ : this.db.dfw_session.upsert({
158
+ create: Object.assign({ id: sid }, values),
159
+ update: values,
160
+ where: { id: sid }
161
+ });
162
+ write.then(() => {
163
+ this.invalidate(sid);
164
+ callback === null || callback === void 0 ? void 0 : callback();
165
+ }, (error) => {
166
+ this.invalidate(sid);
167
+ this.reportError(error, callback);
168
+ });
169
+ }
170
+ catch (error) {
171
+ this.reportError(error, callback);
172
+ }
173
+ }
174
+ touch(sid, sessionData, callback) {
175
+ if (!this.rolling) {
176
+ callback === null || callback === void 0 ? void 0 : callback();
177
+ return;
178
+ }
179
+ this.touchSession(sid, sessionData)
180
+ .then(() => callback === null || callback === void 0 ? void 0 : callback(), (error) => {
181
+ this.invalidate(sid);
182
+ this.reportError(error, callback);
183
+ });
184
+ }
185
+ touchSession(sid, sessionData) {
186
+ return __awaiter(this, void 0, void 0, function* () {
187
+ var _a;
188
+ for (let attempt = 0; attempt < 5; attempt++) {
189
+ const record = yield this.findSession(sid);
190
+ if (!record)
191
+ return;
192
+ if (record.data === null)
193
+ return;
194
+ const stored = this.readSession(record);
195
+ if (stored.expiresAt !== null && stored.expiresAt.getTime() <= Date.now()) {
196
+ if (((_a = this.cache.peek(sid)) === null || _a === void 0 ? void 0 : _a.record) === record)
197
+ this.invalidate(sid);
198
+ return;
199
+ }
200
+ const expiresAt = this.expiration(sessionData);
201
+ const data = this.serialize(Object.assign(Object.assign({}, stored.data), { cookie: sessionData.cookie }), expiresAt);
202
+ const result = yield this.db.dfw_session.updateMany({
203
+ where: { id: sid, data: record.data, expiresAt: record.expiresAt },
204
+ data: { data, expiresAt }
205
+ });
206
+ if (result.count > 0) {
207
+ const cached = this.cache.peek(sid);
208
+ if ((cached === null || cached === void 0 ? void 0 : cached.record) === record) {
209
+ cached.record = Object.assign(Object.assign({}, record), { data, expiresAt: expiresAt === null ? null : new Date(Date.UTC(expiresAt.getUTCFullYear(), expiresAt.getUTCMonth(), expiresAt.getUTCDate())) });
210
+ }
211
+ return;
212
+ }
213
+ this.invalidate(sid);
60
214
  }
61
- }).then(() => {
62
- callback && callback();
63
- }).catch(e => callback && callback(e));
215
+ throw new Error("Could not update session expiration after concurrent changes");
216
+ });
64
217
  }
65
218
  destroy(sid, callback) {
66
- if (process.env.NODE_ENV === 'development')
67
- console.log(`deleting session ${sid}`);
68
- this.cache.delete(sid);
69
- this.db.dfw_session.deleteMany({
70
- where: {
71
- id: sid
72
- },
73
- }).then(() => {
74
- callback && callback();
75
- }).catch((e) => {
76
- callback && callback(e);
219
+ this.invalidate(sid);
220
+ this.db.dfw_session.deleteMany({ where: { id: sid } })
221
+ .then(() => {
222
+ this.invalidate(sid);
223
+ callback === null || callback === void 0 ? void 0 : callback();
224
+ }, (error) => {
225
+ this.invalidate(sid);
226
+ this.reportError(error, callback);
77
227
  });
78
228
  }
229
+ reportError(error, callback) {
230
+ if (callback)
231
+ callback(error);
232
+ else
233
+ console.error("[DFW] Session store error:", error);
234
+ }
79
235
  }
80
236
  exports.DFWSessionStore = DFWSessionStore;
81
237
  //# sourceMappingURL=DFWSessionStore.js.map