@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.
- package/dist/cjs/lib/APIManager.d.ts.map +1 -1
- package/dist/cjs/lib/APIManager.js +103 -49
- package/dist/cjs/lib/APIManager.js.map +1 -1
- package/dist/cjs/lib/DFWSessionStore.d.ts +23 -6
- package/dist/cjs/lib/DFWSessionStore.d.ts.map +1 -1
- package/dist/cjs/lib/DFWSessionStore.js +214 -58
- package/dist/cjs/lib/DFWSessionStore.js.map +1 -1
- package/dist/cjs/modules/DFWSessionModule.d.ts.map +1 -1
- package/dist/cjs/modules/DFWSessionModule.js +9 -1
- package/dist/cjs/modules/DFWSessionModule.js.map +1 -1
- package/dist/cjs/prisma/internal/class.js +2 -2
- package/dist/cjs/prisma/internal/class.js.map +1 -1
- package/dist/cjs/prisma/internal/prismaNamespace.d.ts +1 -0
- package/dist/cjs/prisma/internal/prismaNamespace.d.ts.map +1 -1
- package/dist/cjs/prisma/internal/prismaNamespace.js +1 -0
- package/dist/cjs/prisma/internal/prismaNamespace.js.map +1 -1
- package/dist/cjs/prisma/internal/prismaNamespaceBrowser.d.ts +1 -0
- package/dist/cjs/prisma/internal/prismaNamespaceBrowser.d.ts.map +1 -1
- package/dist/cjs/prisma/internal/prismaNamespaceBrowser.js +1 -0
- package/dist/cjs/prisma/internal/prismaNamespaceBrowser.js.map +1 -1
- package/dist/cjs/prisma/models/dfw_session.d.ts +36 -1
- package/dist/cjs/prisma/models/dfw_session.d.ts.map +1 -1
- package/dist/cjs/test.repository.d.ts +2 -1
- package/dist/cjs/test.repository.d.ts.map +1 -1
- package/dist/cjs/types/DFWConfig.d.ts +6 -4
- package/dist/cjs/types/DFWConfig.d.ts.map +1 -1
- package/dist/esm/lib/APIManager.d.ts.map +1 -1
- package/dist/esm/lib/APIManager.js +102 -51
- package/dist/esm/lib/APIManager.js.map +1 -1
- package/dist/esm/lib/DFWSessionStore.d.ts +23 -6
- package/dist/esm/lib/DFWSessionStore.d.ts.map +1 -1
- package/dist/esm/lib/DFWSessionStore.js +200 -56
- package/dist/esm/lib/DFWSessionStore.js.map +1 -1
- package/dist/esm/modules/DFWSessionModule.d.ts.map +1 -1
- package/dist/esm/modules/DFWSessionModule.js +9 -1
- package/dist/esm/modules/DFWSessionModule.js.map +1 -1
- package/dist/esm/prisma/internal/class.js +2 -2
- package/dist/esm/prisma/internal/class.js.map +1 -1
- package/dist/esm/prisma/internal/prismaNamespace.d.ts +1 -0
- package/dist/esm/prisma/internal/prismaNamespace.d.ts.map +1 -1
- package/dist/esm/prisma/internal/prismaNamespace.js +1 -0
- package/dist/esm/prisma/internal/prismaNamespace.js.map +1 -1
- package/dist/esm/prisma/internal/prismaNamespaceBrowser.d.ts +1 -0
- package/dist/esm/prisma/internal/prismaNamespaceBrowser.d.ts.map +1 -1
- package/dist/esm/prisma/internal/prismaNamespaceBrowser.js +1 -0
- package/dist/esm/prisma/internal/prismaNamespaceBrowser.js.map +1 -1
- package/dist/esm/prisma/models/dfw_session.d.ts +36 -1
- package/dist/esm/prisma/models/dfw_session.d.ts.map +1 -1
- package/dist/esm/test.repository.d.ts +2 -1
- package/dist/esm/test.repository.d.ts.map +1 -1
- package/dist/esm/types/DFWConfig.d.ts +6 -4
- package/dist/esm/types/DFWConfig.d.ts.map +1 -1
- package/package.json +1 -1
- package/prisma/SESSION-STORE.md +41 -0
- 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;
|
|
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: (
|
|
36
|
-
name:
|
|
37
|
-
secret: (
|
|
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:
|
|
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(
|
|
51
|
+
passport_1.default.use("dfw", (0, DFWPassportStrategy_1.DFWPassportStrategy)(this.DFW));
|
|
48
52
|
}
|
|
49
|
-
passport_1.default.serializeUser((
|
|
53
|
+
passport_1.default.serializeUser(({ id }, done) => {
|
|
50
54
|
done(null, id);
|
|
51
|
-
})
|
|
52
|
-
passport_1.default.deserializeUser((idUser, done) =>
|
|
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: (
|
|
69
|
-
|
|
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
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
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
|
-
|
|
86
|
-
|
|
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
|
-
|
|
93
|
-
|
|
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 :
|
|
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
|
-
|
|
107
|
-
|
|
108
|
-
|
|
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
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
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)
|
|
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
|
-
|
|
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
|
-
|
|
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 (!
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
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 (
|
|
139
|
-
next(
|
|
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,
|
|
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":";;;;;;;;;;;;;;;
|
|
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
|
-
|
|
3
|
-
export declare class DFWSessionStore extends Store {
|
|
4
|
-
private db;
|
|
5
|
-
private
|
|
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
|
-
|
|
8
|
-
|
|
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":"
|
|
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
|
-
|
|
16
|
+
exports.sessionCookieOptions = sessionCookieOptions;
|
|
17
|
+
const express_session_1 = __importDefault(require("express-session"));
|
|
5
18
|
const lru_min_1 = require("lru.min");
|
|
6
|
-
|
|
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.
|
|
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
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
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
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
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
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
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
|
-
|
|
38
|
-
|
|
39
|
-
|
|
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
|
-
}
|
|
42
|
-
|
|
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
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
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
|
-
|
|
62
|
-
|
|
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
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
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
|