@scefira/dfw 1.5.2 → 1.5.5

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.
@@ -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;IAuEf,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW;CA8CvD"}
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;IA0Kf,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW;CA0GvD"}
@@ -27,33 +27,46 @@ class APIManager {
27
27
  this.DFW = DFW;
28
28
  }
29
29
  installAPILayer() {
30
- var _a, _b, _c, _d, _e;
30
+ var _a, _b, _c, _d, _e, _f, _g, _h;
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
- name: 'stk',
36
- secret: (_b = (_a = config.session) === null || _a === void 0 ? void 0 : _a.secret) !== null && _b !== void 0 ? _b : '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",
37
42
  genid: () => (0, uuid_1.v7)(),
38
43
  resave: false,
39
44
  saveUninitialized: false,
40
45
  store: new DFWSessionStore_1.DFWSessionStore(this.DFW),
41
- cookie: Object.assign({ secure: false, maxAge: 1000 * 60 * 60 * 24 * 180 }, (_c = config.session) === null || _c === void 0 ? void 0 : _c.cookieOptions)
46
+ cookie: Object.assign({ secure: false, maxAge: 1000 * 60 * 60 * 24 * 180 }, (_f = config.session) === null || _f === void 0 ? void 0 : _f.cookieOptions)
42
47
  }));
43
48
  APIRouter.use(passport_1.default.initialize());
44
49
  APIRouter.use(passport_1.default.session());
45
- if (((_e = (_d = config.session) === null || _d === void 0 ? void 0 : _d.authenticators) === null || _e === void 0 ? void 0 : _e.dfw) !== false) {
46
- passport_1.default.use('dfw', (0, DFWPassportStrategy_1.DFWPassportStrategy)(this.DFW));
50
+ if (((_h = (_g = config.session) === null || _g === void 0 ? void 0 : _g.authenticators) === null || _h === void 0 ? void 0 : _h.dfw) !== false) {
51
+ passport_1.default.use("dfw", (0, DFWPassportStrategy_1.DFWPassportStrategy)(this.DFW));
47
52
  }
48
- passport_1.default.serializeUser((_a, done_1) => __awaiter(this, [_a, done_1], void 0, function* ({ id }, done) {
53
+ passport_1.default.serializeUser(({ id }, done) => {
49
54
  done(null, id);
50
- }));
51
- passport_1.default.deserializeUser((idUser, done) => __awaiter(this, void 0, void 0, function* () {
55
+ });
56
+ passport_1.default.deserializeUser((idUser, done) => {
52
57
  done(null, { id: idUser });
53
- }));
58
+ });
54
59
  //// DFW API Schema ////
55
60
  APIRouter.use(((req, res, next) => {
56
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
+ };
57
70
  const dfw = {
58
71
  db: this.DFW.db,
59
72
  getSession: () => {
@@ -64,71 +77,124 @@ class APIManager {
64
77
  id: req.sessionID
65
78
  });
66
79
  },
67
- addCallback: (cb) => {
68
- 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);
69
87
  }
70
88
  };
71
89
  req.dfw = dfw;
72
- res.on('finish', () => {
73
- callbackStack.forEach((cb) => cb());
90
+ // All post-response callbacks are handled in one place.
91
+ res.once("finish", () => {
92
+ responseFinished = true;
93
+ for (const callback of callbackStack.splice(0)) {
94
+ runCallback(callback);
95
+ }
74
96
  });
75
97
  next();
76
98
  }));
77
99
  APIRouter.use(this.DFW.routerAPIContainer);
78
- APIRouter.use((err, _1, res, _2) => {
79
- 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") {
80
107
  DFWUtils_1.DFWUtils.log(err, true);
81
- const errorStatus = res.statusCode === 200 ? 500 : res.statusCode;
82
- if (typeof err === "object" && err.message) {
83
- res.status(errorStatus).json({ error: err.message, stack: process.env.NODE_ENV == "development" ? err.stack : null }).end();
84
108
  }
85
- else {
86
- 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;
87
132
  }
133
+ res.status(errorStatus).json({
134
+ error: err
135
+ });
88
136
  });
89
137
  }
90
138
  addListener(path, params) {
91
139
  var _a;
92
140
  const APIContainer = this.DFW.routerAPIContainer;
93
- const method = (_a = params.method) !== null && _a !== void 0 ? _a : 'get';
141
+ const method = (_a = params.method) !== null && _a !== void 0 ? _a : "get";
94
142
  const mainFunction = params.fn;
95
143
  if (!params.middleware && !mainFunction) {
96
144
  DFWUtils_1.DFWUtils.log(`Unable to set listener for [${method}] ${path} listener and middleware are undefined`);
97
145
  return;
98
146
  }
99
- this.DFW.server[method](path, this.DFW.routerAPILayer); // Install api layer in this route
100
- // Body Parser
101
- 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) {
102
152
  APIContainer[method](path, body_parser_1.default.json());
103
- // file upload middleware
104
- if (params.upload)
105
- APIContainer[method](path, (0, express_fileupload_1.default)(typeof params.upload === 'boolean' ? {} : params.upload));
106
- // 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
107
161
  if (params.middleware) {
108
- const middlewares = Array.isArray(params.middleware) ? params.middleware : [params.middleware];
162
+ const middlewares = Array.isArray(params.middleware)
163
+ ? params.middleware
164
+ : [params.middleware];
109
165
  APIContainer[method](path, ...middlewares);
110
166
  }
111
167
  if (mainFunction) {
112
168
  APIContainer[method](path, (req, res, next) => __awaiter(this, void 0, void 0, function* () {
113
169
  try {
114
- // calling the listener
115
170
  const data = yield mainFunction(req.dfw, req, res);
116
171
  if (params.callback) {
117
- res.on('finish', () => params.callback(req, data));
172
+ req.dfw.addCallback(() => params.callback(req, data));
118
173
  }
119
- if (!res.finished && !params.disableAutoSend) {
120
- if (data)
121
- res.json(data).end();
122
- 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 {
123
188
  res.end();
189
+ }
124
190
  }
125
191
  }
126
- catch (e) {
127
- next(e);
192
+ catch (error) {
193
+ next(error);
128
194
  }
129
195
  }));
130
196
  }
131
- 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)}`);
132
198
  }
133
199
  }
134
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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"}
@@ -6,6 +6,11 @@ export type DFWConfig = {
6
6
  trustProxy?: boolean | number;
7
7
  tmpDir?: string;
8
8
  session?: {
9
+ /**
10
+ * Force the session to be saved back to the session store, even if the session was never modified during the request.
11
+ * @default false
12
+ */
13
+ rolling?: boolean;
9
14
  /**
10
15
  * Passport auth config, by default dfw is always enabled unless you set it to false
11
16
  */
@@ -1 +1 @@
1
- {"version":3,"file":"DFWConfig.d.ts","sourceRoot":"","sources":["../../../src/types/DFWConfig.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,MAAM,CAAA;AACvC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AAEpD,MAAM,MAAM,SAAS,GAAG;IACpB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,IAAI,CAAC,EAAE,WAAW,CAAA;IAClB,UAAU,CAAC,EAAE,OAAO,GAAG,MAAM,CAAA;IAC7B,MAAM,CAAC,EAAE,MAAM,CAAA;IAEf,OAAO,CAAC,EAAE;QACN;;WAEG;QACH,cAAc,CAAC,EAAE;YACb,GAAG,CAAC,EAAE,KAAK,CAAA;SACd,CAAA;QAED;;WAEG;QACH,YAAY,CAAC,EAAE,MAAM,CAAC;QAEtB;;;WAGG;QACH,eAAe,CAAC,EAAE,OAAO,CAAA;QAEzB;;;WAGG;QACH,MAAM,CAAC,EAAE,MAAM,CAAA;QAEf;;;WAGG;QACH,UAAU,CAAC,EAAE,MAAM,CAAA;QAEnB;;WAEG;QACH,aAAa,CAAC,EAAE,aAAa,CAAA;QAE7B;;;WAGG;QACH,SAAS,CAAC,EAAE,MAAM,CAAA;KACrB,CAAA;CACJ,CAAA"}
1
+ {"version":3,"file":"DFWConfig.d.ts","sourceRoot":"","sources":["../../../src/types/DFWConfig.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,MAAM,CAAA;AACvC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AAEpD,MAAM,MAAM,SAAS,GAAG;IACpB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,IAAI,CAAC,EAAE,WAAW,CAAA;IAClB,UAAU,CAAC,EAAE,OAAO,GAAG,MAAM,CAAA;IAC7B,MAAM,CAAC,EAAE,MAAM,CAAA;IAEf,OAAO,CAAC,EAAE;QACN;;;WAGG;QACH,OAAO,CAAC,EAAE,OAAO,CAAA;QAEjB;;WAEG;QACH,cAAc,CAAC,EAAE;YACb,GAAG,CAAC,EAAE,KAAK,CAAA;SACd,CAAA;QAED;;WAEG;QACH,YAAY,CAAC,EAAE,MAAM,CAAC;QAEtB;;;WAGG;QACH,eAAe,CAAC,EAAE,OAAO,CAAA;QAEzB;;;WAGG;QACH,MAAM,CAAC,EAAE,MAAM,CAAA;QAEf;;;WAGG;QACH,UAAU,CAAC,EAAE,MAAM,CAAA;QAEnB;;WAEG;QACH,aAAa,CAAC,EAAE,aAAa,CAAA;QAE7B;;;WAGG;QACH,SAAS,CAAC,EAAE,MAAM,CAAA;KACrB,CAAA;CACJ,CAAA"}
@@ -16,7 +16,7 @@ export type DFWRequestSchema<TDatabase = any> = {
16
16
  * @param cb callback function or promise
17
17
  * @returns
18
18
  */
19
- addCallback: (cb: () => void) => void;
19
+ addCallback: (cb: () => (void | Promise<void>)) => void;
20
20
  [key: string]: any;
21
21
  };
22
22
  //# sourceMappingURL=DFWRequest.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"DFWRequest.d.ts","sourceRoot":"","sources":["../../../src/types/DFWRequest.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAEjD,MAAM,MAAM,UAAU,CAAC,SAAS,GAAG,GAAG,IAAI;IACtC,GAAG,EAAE,gBAAgB,CAAC,SAAS,CAAC,CAAC;CACpC,GAAG,OAAO,CAAA;AAEX,MAAM,MAAM,WAAW,GAAG,QAAQ,CAAA;AAElC,MAAM,MAAM,iBAAiB,GAAG;IAC5B,EAAE,EAAE,MAAM,CAAA;IACV,eAAe,EAAE,OAAO,CAAA;IACxB,IAAI,CAAC,EAAE,MAAM,CAAA;CAChB,CAAA;AAED,MAAM,MAAM,gBAAgB,CAAC,SAAS,GAAG,GAAG,IAAI;IAC5C,UAAU,EAAE,MAAM,iBAAiB,CAAA;IAEnC,EAAE,EAAE,SAAS,CAAA;IAEb;;;;OAIG;IACH,WAAW,EAAE,CAAC,EAAE,EAAE,MAAM,IAAI,KAAK,IAAI,CAAA;IAErC,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACtB,CAAA"}
1
+ {"version":3,"file":"DFWRequest.d.ts","sourceRoot":"","sources":["../../../src/types/DFWRequest.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAEjD,MAAM,MAAM,UAAU,CAAC,SAAS,GAAG,GAAG,IAAI;IACtC,GAAG,EAAE,gBAAgB,CAAC,SAAS,CAAC,CAAC;CACpC,GAAG,OAAO,CAAA;AAEX,MAAM,MAAM,WAAW,GAAG,QAAQ,CAAA;AAElC,MAAM,MAAM,iBAAiB,GAAG;IAC5B,EAAE,EAAE,MAAM,CAAA;IACV,eAAe,EAAE,OAAO,CAAA;IACxB,IAAI,CAAC,EAAE,MAAM,CAAA;CAChB,CAAA;AAED,MAAM,MAAM,gBAAgB,CAAC,SAAS,GAAG,GAAG,IAAI;IAC5C,UAAU,EAAE,MAAM,iBAAiB,CAAA;IAEnC,EAAE,EAAE,SAAS,CAAA;IAEb;;;;OAIG;IACH,WAAW,EAAE,CAAC,EAAE,EAAE,MAAM,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,IAAI,CAAA;IAEvD,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACtB,CAAA"}
@@ -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;IAuEf,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW;CA8CvD"}
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;IA0Kf,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW;CA0GvD"}
@@ -2,7 +2,7 @@ import chalk from "chalk";
2
2
  import passport from "passport";
3
3
  import session from "express-session";
4
4
  import fileUpload from "express-fileupload";
5
- import { v7 as uuid7 } from 'uuid';
5
+ import { v7 as uuid7 } from "uuid";
6
6
  import bodyParser from "body-parser";
7
7
  import { DFWPassportStrategy } from "#lib/DFWPassportStrategy";
8
8
  import { DFWSessionStore } from "#lib/DFWSessionStore";
@@ -15,33 +15,46 @@ export class APIManager {
15
15
  const config = this.DFW.config;
16
16
  const APIRouter = this.DFW.routerAPILayer;
17
17
  //// PASSPORT AND SESSION ////
18
+ if (process.env.NODE_ENV === "production" &&
19
+ !config.session?.secret) {
20
+ DFWUtils.log("[DFW] Warning: using the default session secret in production");
21
+ }
18
22
  APIRouter.use(session({
19
- name: 'stk',
20
- secret: config.session?.secret ?? 'default',
23
+ rolling: config.session?.rolling ?? false,
24
+ name: "stk",
25
+ secret: config.session?.secret ?? "default",
21
26
  genid: () => uuid7(),
22
27
  resave: false,
23
28
  saveUninitialized: false,
24
29
  store: new DFWSessionStore(this.DFW),
25
30
  cookie: {
26
31
  secure: false,
27
- maxAge: 1000 * 60 * 60 * 24 * 180, //6 Months
32
+ maxAge: 1000 * 60 * 60 * 24 * 180, // 6 months
28
33
  ...config.session?.cookieOptions
29
34
  }
30
35
  }));
31
36
  APIRouter.use(passport.initialize());
32
37
  APIRouter.use(passport.session());
33
38
  if (config.session?.authenticators?.dfw !== false) {
34
- passport.use('dfw', DFWPassportStrategy(this.DFW));
39
+ passport.use("dfw", DFWPassportStrategy(this.DFW));
35
40
  }
36
- passport.serializeUser(async ({ id }, done) => {
41
+ passport.serializeUser(({ id }, done) => {
37
42
  done(null, id);
38
43
  });
39
- passport.deserializeUser(async (idUser, done) => {
44
+ passport.deserializeUser((idUser, done) => {
40
45
  done(null, { id: idUser });
41
46
  });
42
47
  //// DFW API Schema ////
43
48
  APIRouter.use(((req, res, next) => {
44
49
  const callbackStack = [];
50
+ let responseFinished = false;
51
+ const runCallback = (callback) => {
52
+ void Promise.resolve()
53
+ .then(callback)
54
+ .catch((error) => {
55
+ console.error("[DFW] Callback error:", error);
56
+ });
57
+ };
45
58
  const dfw = {
46
59
  db: this.DFW.db,
47
60
  getSession: () => ({
@@ -49,70 +62,123 @@ export class APIManager {
49
62
  user: req.user?.id,
50
63
  id: req.sessionID
51
64
  }),
52
- addCallback: (cb) => {
53
- callbackStack.push(cb);
65
+ addCallback: (callback) => {
66
+ // Run immediately if the response already finished.
67
+ if (responseFinished) {
68
+ runCallback(callback);
69
+ return;
70
+ }
71
+ callbackStack.push(callback);
54
72
  }
55
73
  };
56
74
  req.dfw = dfw;
57
- res.on('finish', () => {
58
- callbackStack.forEach((cb) => cb());
75
+ // All post-response callbacks are handled in one place.
76
+ res.once("finish", () => {
77
+ responseFinished = true;
78
+ for (const callback of callbackStack.splice(0)) {
79
+ runCallback(callback);
80
+ }
59
81
  });
60
82
  next();
61
83
  }));
62
84
  APIRouter.use(this.DFW.routerAPIContainer);
63
- APIRouter.use((err, _1, res, _2) => {
64
- if (process.env.NODE_ENV == "development")
85
+ //// ERROR HANDLER ////
86
+ APIRouter.use((err, _req, res, next) => {
87
+ // Let Express handle errors after the response has started.
88
+ if (res.headersSent) {
89
+ return next(err);
90
+ }
91
+ if (process.env.NODE_ENV === "development") {
65
92
  DFWUtils.log(err, true);
66
- const errorStatus = res.statusCode === 200 ? 500 : res.statusCode;
67
- if (typeof err === "object" && err.message) {
68
- res.status(errorStatus).json({ error: err.message, stack: process.env.NODE_ENV == "development" ? err.stack : null }).end();
69
93
  }
70
- else {
71
- res.status(errorStatus).json({ error: err }).end();
94
+ const explicitStatus = typeof err?.status === "number"
95
+ ? err.status
96
+ : typeof err?.statusCode === "number"
97
+ ? err.statusCode
98
+ : undefined;
99
+ const currentStatus = res.statusCode >= 400 &&
100
+ res.statusCode <= 599
101
+ ? res.statusCode
102
+ : undefined;
103
+ const errorStatus = explicitStatus >= 400 &&
104
+ explicitStatus <= 599
105
+ ? explicitStatus
106
+ : currentStatus ?? 500;
107
+ if (typeof err === "object" &&
108
+ err !== null &&
109
+ err.message) {
110
+ res.status(errorStatus).json({
111
+ error: err.message,
112
+ stack: process.env.NODE_ENV === "development"
113
+ ? err.stack
114
+ : null
115
+ });
116
+ return;
72
117
  }
118
+ res.status(errorStatus).json({
119
+ error: err
120
+ });
73
121
  });
74
122
  }
75
123
  addListener(path, params) {
76
124
  const APIContainer = this.DFW.routerAPIContainer;
77
- const method = params.method ?? 'get';
125
+ const method = params.method ?? "get";
78
126
  const mainFunction = params.fn;
79
127
  if (!params.middleware && !mainFunction) {
80
128
  DFWUtils.log(`Unable to set listener for [${method}] ${path} listener and middleware are undefined`);
81
129
  return;
82
130
  }
83
- this.DFW.server[method](path, this.DFW.routerAPILayer); // Install api layer in this route
84
- // Body Parser
85
- if (['post', 'put', 'patch', 'delete'].includes(method) && params.disableBodyParser !== true)
131
+ // Install the API layer only for registered API routes.
132
+ this.DFW.server[method](path, this.DFW.routerAPILayer);
133
+ // Body parser
134
+ if (["post", "put", "patch", "delete"].includes(method) &&
135
+ params.disableBodyParser !== true) {
86
136
  APIContainer[method](path, bodyParser.json());
87
- // file upload middleware
88
- if (params.upload)
89
- APIContainer[method](path, fileUpload(typeof params.upload === 'boolean' ? {} : params.upload));
90
- // plugged middlewares and handlers
137
+ }
138
+ // File upload middleware
139
+ if (params.upload) {
140
+ APIContainer[method](path, fileUpload(typeof params.upload === "boolean"
141
+ ? {}
142
+ : params.upload));
143
+ }
144
+ // Plugged middlewares and handlers
91
145
  if (params.middleware) {
92
- const middlewares = Array.isArray(params.middleware) ? params.middleware : [params.middleware];
146
+ const middlewares = Array.isArray(params.middleware)
147
+ ? params.middleware
148
+ : [params.middleware];
93
149
  APIContainer[method](path, ...middlewares);
94
150
  }
95
151
  if (mainFunction) {
96
152
  APIContainer[method](path, async (req, res, next) => {
97
153
  try {
98
- // calling the listener
99
154
  const data = await mainFunction(req.dfw, req, res);
100
155
  if (params.callback) {
101
- res.on('finish', () => params.callback(req, data));
156
+ req.dfw.addCallback(() => params.callback(req, data));
102
157
  }
103
- if (!res.finished && !params.disableAutoSend) {
104
- if (data)
105
- res.json(data).end();
106
- else
158
+ if (!params.disableAutoSend &&
159
+ !res.writableEnded) {
160
+ /*
161
+ * If the handler already started the response,
162
+ * only finish it instead of trying to replace it.
163
+ */
164
+ if (res.headersSent) {
165
+ res.end();
166
+ return;
167
+ }
168
+ if (data !== undefined) {
169
+ res.json(data);
170
+ }
171
+ else {
107
172
  res.end();
173
+ }
108
174
  }
109
175
  }
110
- catch (e) {
111
- next(e);
176
+ catch (error) {
177
+ next(error);
112
178
  }
113
179
  });
114
180
  }
115
- DFWUtils.log(`${chalk.yellow(method.toUpperCase().padEnd(7, ' '))} ${chalk.green(path)}`);
181
+ DFWUtils.log(`${chalk.yellow(method.toUpperCase().padEnd(7, " "))} ${chalk.green(path)}`);
116
182
  }
117
183
  }
118
184
  //# sourceMappingURL=APIManager.js.map
@@ -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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"}
@@ -6,6 +6,11 @@ export type DFWConfig = {
6
6
  trustProxy?: boolean | number;
7
7
  tmpDir?: string;
8
8
  session?: {
9
+ /**
10
+ * Force the session to be saved back to the session store, even if the session was never modified during the request.
11
+ * @default false
12
+ */
13
+ rolling?: boolean;
9
14
  /**
10
15
  * Passport auth config, by default dfw is always enabled unless you set it to false
11
16
  */
@@ -1 +1 @@
1
- {"version":3,"file":"DFWConfig.d.ts","sourceRoot":"","sources":["../../../src/types/DFWConfig.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,MAAM,CAAA;AACvC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AAEpD,MAAM,MAAM,SAAS,GAAG;IACpB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,IAAI,CAAC,EAAE,WAAW,CAAA;IAClB,UAAU,CAAC,EAAE,OAAO,GAAG,MAAM,CAAA;IAC7B,MAAM,CAAC,EAAE,MAAM,CAAA;IAEf,OAAO,CAAC,EAAE;QACN;;WAEG;QACH,cAAc,CAAC,EAAE;YACb,GAAG,CAAC,EAAE,KAAK,CAAA;SACd,CAAA;QAED;;WAEG;QACH,YAAY,CAAC,EAAE,MAAM,CAAC;QAEtB;;;WAGG;QACH,eAAe,CAAC,EAAE,OAAO,CAAA;QAEzB;;;WAGG;QACH,MAAM,CAAC,EAAE,MAAM,CAAA;QAEf;;;WAGG;QACH,UAAU,CAAC,EAAE,MAAM,CAAA;QAEnB;;WAEG;QACH,aAAa,CAAC,EAAE,aAAa,CAAA;QAE7B;;;WAGG;QACH,SAAS,CAAC,EAAE,MAAM,CAAA;KACrB,CAAA;CACJ,CAAA"}
1
+ {"version":3,"file":"DFWConfig.d.ts","sourceRoot":"","sources":["../../../src/types/DFWConfig.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,MAAM,CAAA;AACvC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AAEpD,MAAM,MAAM,SAAS,GAAG;IACpB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,IAAI,CAAC,EAAE,WAAW,CAAA;IAClB,UAAU,CAAC,EAAE,OAAO,GAAG,MAAM,CAAA;IAC7B,MAAM,CAAC,EAAE,MAAM,CAAA;IAEf,OAAO,CAAC,EAAE;QACN;;;WAGG;QACH,OAAO,CAAC,EAAE,OAAO,CAAA;QAEjB;;WAEG;QACH,cAAc,CAAC,EAAE;YACb,GAAG,CAAC,EAAE,KAAK,CAAA;SACd,CAAA;QAED;;WAEG;QACH,YAAY,CAAC,EAAE,MAAM,CAAC;QAEtB;;;WAGG;QACH,eAAe,CAAC,EAAE,OAAO,CAAA;QAEzB;;;WAGG;QACH,MAAM,CAAC,EAAE,MAAM,CAAA;QAEf;;;WAGG;QACH,UAAU,CAAC,EAAE,MAAM,CAAA;QAEnB;;WAEG;QACH,aAAa,CAAC,EAAE,aAAa,CAAA;QAE7B;;;WAGG;QACH,SAAS,CAAC,EAAE,MAAM,CAAA;KACrB,CAAA;CACJ,CAAA"}
@@ -16,7 +16,7 @@ export type DFWRequestSchema<TDatabase = any> = {
16
16
  * @param cb callback function or promise
17
17
  * @returns
18
18
  */
19
- addCallback: (cb: () => void) => void;
19
+ addCallback: (cb: () => (void | Promise<void>)) => void;
20
20
  [key: string]: any;
21
21
  };
22
22
  //# sourceMappingURL=DFWRequest.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"DFWRequest.d.ts","sourceRoot":"","sources":["../../../src/types/DFWRequest.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAEjD,MAAM,MAAM,UAAU,CAAC,SAAS,GAAG,GAAG,IAAI;IACtC,GAAG,EAAE,gBAAgB,CAAC,SAAS,CAAC,CAAC;CACpC,GAAG,OAAO,CAAA;AAEX,MAAM,MAAM,WAAW,GAAG,QAAQ,CAAA;AAElC,MAAM,MAAM,iBAAiB,GAAG;IAC5B,EAAE,EAAE,MAAM,CAAA;IACV,eAAe,EAAE,OAAO,CAAA;IACxB,IAAI,CAAC,EAAE,MAAM,CAAA;CAChB,CAAA;AAED,MAAM,MAAM,gBAAgB,CAAC,SAAS,GAAG,GAAG,IAAI;IAC5C,UAAU,EAAE,MAAM,iBAAiB,CAAA;IAEnC,EAAE,EAAE,SAAS,CAAA;IAEb;;;;OAIG;IACH,WAAW,EAAE,CAAC,EAAE,EAAE,MAAM,IAAI,KAAK,IAAI,CAAA;IAErC,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACtB,CAAA"}
1
+ {"version":3,"file":"DFWRequest.d.ts","sourceRoot":"","sources":["../../../src/types/DFWRequest.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAEjD,MAAM,MAAM,UAAU,CAAC,SAAS,GAAG,GAAG,IAAI;IACtC,GAAG,EAAE,gBAAgB,CAAC,SAAS,CAAC,CAAC;CACpC,GAAG,OAAO,CAAA;AAEX,MAAM,MAAM,WAAW,GAAG,QAAQ,CAAA;AAElC,MAAM,MAAM,iBAAiB,GAAG;IAC5B,EAAE,EAAE,MAAM,CAAA;IACV,eAAe,EAAE,OAAO,CAAA;IACxB,IAAI,CAAC,EAAE,MAAM,CAAA;CAChB,CAAA;AAED,MAAM,MAAM,gBAAgB,CAAC,SAAS,GAAG,GAAG,IAAI;IAC5C,UAAU,EAAE,MAAM,iBAAiB,CAAA;IAEnC,EAAE,EAAE,SAAS,CAAA;IAEb;;;;OAIG;IACH,WAAW,EAAE,CAAC,EAAE,EAAE,MAAM,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,IAAI,CAAA;IAEvD,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACtB,CAAA"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@scefira/dfw",
3
- "version": "1.5.2",
3
+ "version": "1.5.5",
4
4
  "description": "NodeJS fast API prototiping framework",
5
5
  "main": "dist/cjs/index.js",
6
6
  "types": "dist/cjs/index.d.ts",