@spinajs/http 2.0.481 → 2.0.484

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 (189) hide show
  1. package/lib/cjs/config/http.d.ts +15 -7
  2. package/lib/cjs/config/http.d.ts.map +1 -1
  3. package/lib/cjs/config/http.js +28 -9
  4. package/lib/cjs/config/http.js.map +1 -1
  5. package/lib/cjs/controllers.d.ts.map +1 -1
  6. package/lib/cjs/controllers.js +48 -12
  7. package/lib/cjs/controllers.js.map +1 -1
  8. package/lib/cjs/cookie.d.ts +8 -0
  9. package/lib/cjs/cookie.d.ts.map +1 -0
  10. package/lib/cjs/cookie.js +40 -0
  11. package/lib/cjs/cookie.js.map +1 -0
  12. package/lib/cjs/decorators.d.ts +46 -4
  13. package/lib/cjs/decorators.d.ts.map +1 -1
  14. package/lib/cjs/decorators.js +127 -23
  15. package/lib/cjs/decorators.js.map +1 -1
  16. package/lib/cjs/error.js +3 -3
  17. package/lib/cjs/error.js.map +1 -1
  18. package/lib/cjs/file-middlewares/validation.d.ts +11 -0
  19. package/lib/cjs/file-middlewares/validation.d.ts.map +1 -1
  20. package/lib/cjs/file-middlewares/validation.js +52 -9
  21. package/lib/cjs/file-middlewares/validation.js.map +1 -1
  22. package/lib/cjs/file-middlewares/zip.d.ts.map +1 -1
  23. package/lib/cjs/file-middlewares/zip.js +6 -1
  24. package/lib/cjs/file-middlewares/zip.js.map +1 -1
  25. package/lib/cjs/index.d.ts +1 -0
  26. package/lib/cjs/index.d.ts.map +1 -1
  27. package/lib/cjs/index.js +1 -0
  28. package/lib/cjs/index.js.map +1 -1
  29. package/lib/cjs/interfaces.d.ts +95 -1
  30. package/lib/cjs/interfaces.d.ts.map +1 -1
  31. package/lib/cjs/interfaces.js +100 -4
  32. package/lib/cjs/interfaces.js.map +1 -1
  33. package/lib/cjs/middlewares/PerfRollup.d.ts +19 -0
  34. package/lib/cjs/middlewares/PerfRollup.d.ts.map +1 -0
  35. package/lib/cjs/middlewares/PerfRollup.js +61 -0
  36. package/lib/cjs/middlewares/PerfRollup.js.map +1 -0
  37. package/lib/cjs/middlewares/RequestId.d.ts +1 -2
  38. package/lib/cjs/middlewares/RequestId.d.ts.map +1 -1
  39. package/lib/cjs/middlewares/RequestId.js +19 -5
  40. package/lib/cjs/middlewares/RequestId.js.map +1 -1
  41. package/lib/cjs/middlewares/ResponseTime.d.ts +1 -2
  42. package/lib/cjs/middlewares/ResponseTime.d.ts.map +1 -1
  43. package/lib/cjs/middlewares/ResponseTime.js +29 -11
  44. package/lib/cjs/middlewares/ResponseTime.js.map +1 -1
  45. package/lib/cjs/response-methods/file.d.ts.map +1 -1
  46. package/lib/cjs/response-methods/file.js +47 -21
  47. package/lib/cjs/response-methods/file.js.map +1 -1
  48. package/lib/cjs/response-methods/index.d.ts +3 -0
  49. package/lib/cjs/response-methods/index.d.ts.map +1 -1
  50. package/lib/cjs/response-methods/index.js +3 -0
  51. package/lib/cjs/response-methods/index.js.map +1 -1
  52. package/lib/cjs/response-methods/redirect.d.ts +11 -4
  53. package/lib/cjs/response-methods/redirect.d.ts.map +1 -1
  54. package/lib/cjs/response-methods/redirect.js +14 -4
  55. package/lib/cjs/response-methods/redirect.js.map +1 -1
  56. package/lib/cjs/response-methods/xml.d.ts +17 -0
  57. package/lib/cjs/response-methods/xml.d.ts.map +1 -0
  58. package/lib/cjs/response-methods/xml.js +26 -0
  59. package/lib/cjs/response-methods/xml.js.map +1 -0
  60. package/lib/cjs/responses.d.ts +10 -0
  61. package/lib/cjs/responses.d.ts.map +1 -1
  62. package/lib/cjs/responses.js +94 -35
  63. package/lib/cjs/responses.js.map +1 -1
  64. package/lib/cjs/route-args/FromBody.d.ts.map +1 -1
  65. package/lib/cjs/route-args/FromBody.js +6 -1
  66. package/lib/cjs/route-args/FromBody.js.map +1 -1
  67. package/lib/cjs/route-args/FromForm.d.ts +1 -1
  68. package/lib/cjs/route-args/FromForm.d.ts.map +1 -1
  69. package/lib/cjs/route-args/FromForm.js +116 -37
  70. package/lib/cjs/route-args/FromForm.js.map +1 -1
  71. package/lib/cjs/route-args/FromXml.d.ts +17 -0
  72. package/lib/cjs/route-args/FromXml.d.ts.map +1 -0
  73. package/lib/cjs/route-args/FromXml.js +55 -0
  74. package/lib/cjs/route-args/FromXml.js.map +1 -0
  75. package/lib/cjs/route-args/RequestContext.d.ts +43 -0
  76. package/lib/cjs/route-args/RequestContext.d.ts.map +1 -0
  77. package/lib/cjs/route-args/RequestContext.js +94 -0
  78. package/lib/cjs/route-args/RequestContext.js.map +1 -0
  79. package/lib/cjs/route-args/RequestFields.d.ts +1 -1
  80. package/lib/cjs/route-args/RequestFields.d.ts.map +1 -1
  81. package/lib/cjs/route-args/RequestFields.js +1 -0
  82. package/lib/cjs/route-args/RequestFields.js.map +1 -1
  83. package/lib/cjs/route-args/RouteArgs.d.ts.map +1 -1
  84. package/lib/cjs/route-args/RouteArgs.js +50 -10
  85. package/lib/cjs/route-args/RouteArgs.js.map +1 -1
  86. package/lib/cjs/route-args/index.d.ts +2 -0
  87. package/lib/cjs/route-args/index.d.ts.map +1 -1
  88. package/lib/cjs/route-args/index.js +2 -0
  89. package/lib/cjs/route-args/index.js.map +1 -1
  90. package/lib/cjs/server.d.ts +36 -3
  91. package/lib/cjs/server.d.ts.map +1 -1
  92. package/lib/cjs/server.js +131 -42
  93. package/lib/cjs/server.js.map +1 -1
  94. package/lib/mjs/config/http.d.ts +15 -7
  95. package/lib/mjs/config/http.d.ts.map +1 -1
  96. package/lib/mjs/config/http.js +28 -9
  97. package/lib/mjs/config/http.js.map +1 -1
  98. package/lib/mjs/controllers.d.ts.map +1 -1
  99. package/lib/mjs/controllers.js +46 -10
  100. package/lib/mjs/controllers.js.map +1 -1
  101. package/lib/mjs/cookie.d.ts +8 -0
  102. package/lib/mjs/cookie.d.ts.map +1 -0
  103. package/lib/mjs/cookie.js +32 -0
  104. package/lib/mjs/cookie.js.map +1 -0
  105. package/lib/mjs/decorators.d.ts +46 -4
  106. package/lib/mjs/decorators.d.ts.map +1 -1
  107. package/lib/mjs/decorators.js +121 -24
  108. package/lib/mjs/decorators.js.map +1 -1
  109. package/lib/mjs/error.js +3 -3
  110. package/lib/mjs/error.js.map +1 -1
  111. package/lib/mjs/file-middlewares/validation.d.ts +11 -0
  112. package/lib/mjs/file-middlewares/validation.d.ts.map +1 -1
  113. package/lib/mjs/file-middlewares/validation.js +53 -10
  114. package/lib/mjs/file-middlewares/validation.js.map +1 -1
  115. package/lib/mjs/file-middlewares/zip.d.ts.map +1 -1
  116. package/lib/mjs/file-middlewares/zip.js +6 -1
  117. package/lib/mjs/file-middlewares/zip.js.map +1 -1
  118. package/lib/mjs/index.d.ts +1 -0
  119. package/lib/mjs/index.d.ts.map +1 -1
  120. package/lib/mjs/index.js +1 -0
  121. package/lib/mjs/index.js.map +1 -1
  122. package/lib/mjs/interfaces.d.ts +95 -1
  123. package/lib/mjs/interfaces.d.ts.map +1 -1
  124. package/lib/mjs/interfaces.js +65 -2
  125. package/lib/mjs/interfaces.js.map +1 -1
  126. package/lib/mjs/middlewares/PerfRollup.d.ts +19 -0
  127. package/lib/mjs/middlewares/PerfRollup.d.ts.map +1 -0
  128. package/lib/mjs/middlewares/PerfRollup.js +58 -0
  129. package/lib/mjs/middlewares/PerfRollup.js.map +1 -0
  130. package/lib/mjs/middlewares/RequestId.d.ts +1 -2
  131. package/lib/mjs/middlewares/RequestId.d.ts.map +1 -1
  132. package/lib/mjs/middlewares/RequestId.js +19 -5
  133. package/lib/mjs/middlewares/RequestId.js.map +1 -1
  134. package/lib/mjs/middlewares/ResponseTime.d.ts +1 -2
  135. package/lib/mjs/middlewares/ResponseTime.d.ts.map +1 -1
  136. package/lib/mjs/middlewares/ResponseTime.js +29 -11
  137. package/lib/mjs/middlewares/ResponseTime.js.map +1 -1
  138. package/lib/mjs/response-methods/file.d.ts.map +1 -1
  139. package/lib/mjs/response-methods/file.js +41 -15
  140. package/lib/mjs/response-methods/file.js.map +1 -1
  141. package/lib/mjs/response-methods/index.d.ts +3 -0
  142. package/lib/mjs/response-methods/index.d.ts.map +1 -1
  143. package/lib/mjs/response-methods/index.js +3 -0
  144. package/lib/mjs/response-methods/index.js.map +1 -1
  145. package/lib/mjs/response-methods/redirect.d.ts +11 -4
  146. package/lib/mjs/response-methods/redirect.d.ts.map +1 -1
  147. package/lib/mjs/response-methods/redirect.js +15 -5
  148. package/lib/mjs/response-methods/redirect.js.map +1 -1
  149. package/lib/mjs/response-methods/xml.d.ts +17 -0
  150. package/lib/mjs/response-methods/xml.d.ts.map +1 -0
  151. package/lib/mjs/response-methods/xml.js +22 -0
  152. package/lib/mjs/response-methods/xml.js.map +1 -0
  153. package/lib/mjs/responses.d.ts +10 -0
  154. package/lib/mjs/responses.d.ts.map +1 -1
  155. package/lib/mjs/responses.js +93 -35
  156. package/lib/mjs/responses.js.map +1 -1
  157. package/lib/mjs/route-args/FromBody.d.ts.map +1 -1
  158. package/lib/mjs/route-args/FromBody.js +6 -1
  159. package/lib/mjs/route-args/FromBody.js.map +1 -1
  160. package/lib/mjs/route-args/FromForm.d.ts +1 -1
  161. package/lib/mjs/route-args/FromForm.d.ts.map +1 -1
  162. package/lib/mjs/route-args/FromForm.js +114 -38
  163. package/lib/mjs/route-args/FromForm.js.map +1 -1
  164. package/lib/mjs/route-args/FromXml.d.ts +17 -0
  165. package/lib/mjs/route-args/FromXml.d.ts.map +1 -0
  166. package/lib/mjs/route-args/FromXml.js +52 -0
  167. package/lib/mjs/route-args/FromXml.js.map +1 -0
  168. package/lib/mjs/route-args/RequestContext.d.ts +43 -0
  169. package/lib/mjs/route-args/RequestContext.d.ts.map +1 -0
  170. package/lib/mjs/route-args/RequestContext.js +91 -0
  171. package/lib/mjs/route-args/RequestContext.js.map +1 -0
  172. package/lib/mjs/route-args/RequestFields.d.ts +1 -1
  173. package/lib/mjs/route-args/RequestFields.d.ts.map +1 -1
  174. package/lib/mjs/route-args/RequestFields.js +1 -0
  175. package/lib/mjs/route-args/RequestFields.js.map +1 -1
  176. package/lib/mjs/route-args/RouteArgs.d.ts.map +1 -1
  177. package/lib/mjs/route-args/RouteArgs.js +51 -11
  178. package/lib/mjs/route-args/RouteArgs.js.map +1 -1
  179. package/lib/mjs/route-args/index.d.ts +2 -0
  180. package/lib/mjs/route-args/index.d.ts.map +1 -1
  181. package/lib/mjs/route-args/index.js +2 -0
  182. package/lib/mjs/route-args/index.js.map +1 -1
  183. package/lib/mjs/server.d.ts +36 -3
  184. package/lib/mjs/server.d.ts.map +1 -1
  185. package/lib/mjs/server.js +132 -43
  186. package/lib/mjs/server.js.map +1 -1
  187. package/lib/tsconfig.cjs.tsbuildinfo +1 -1
  188. package/lib/tsconfig.mjs.tsbuildinfo +1 -1
  189. package/package.json +17 -12
@@ -43,6 +43,21 @@ function extractSchemaFromRuntimeType(runtimeType, validator) {
43
43
  }
44
44
  class RouteArgs {
45
45
  async tryHydrateParam(arg, routeParameter, route) {
46
+ // Enforce presence for params explicitly marked `{ required: true }` BEFORE
47
+ // the null/undefined skip below (absent optional params are intentionally
48
+ // not validated). Params without the flag keep the old optional behavior.
49
+ if (routeParameter.Options?.required === true && (arg === undefined || arg === null || arg === '')) {
50
+ throw new validation_1.ValidationFailed(`Parameter '${routeParameter.Name}' is required`, [
51
+ {
52
+ propertyName: routeParameter.Name,
53
+ message: `Parameter '${routeParameter.Name}' is required`,
54
+ keyword: 'required',
55
+ params: { missingParameter: routeParameter.Name },
56
+ schemaPath: '#/required',
57
+ instancePath: routeParameter.Name,
58
+ },
59
+ ]);
60
+ }
46
61
  let result = null;
47
62
  let schema = null;
48
63
  let hydrator = null;
@@ -61,14 +76,16 @@ class RouteArgs {
61
76
  }
62
77
  if (this.isRuntimeType(routeParameter)) {
63
78
  result = this.fromRuntimeType(routeParameter, arg);
64
- if (schema) {
79
+ // absent optional params are not validated - validator treats null / undefined data as failure
80
+ if (schema && result !== null && result !== undefined) {
65
81
  this.Validator.validate(schema, result);
66
82
  }
67
83
  }
68
84
  else {
69
85
  hydrator = this.getHydrator(routeParameter);
70
86
  result = hydrator ? arg : this.tryExtractObject(arg, routeParameter);
71
- if (schema) {
87
+ // absent optional params are not validated - validator treats null / undefined data as failure
88
+ if (schema && result !== null && result !== undefined) {
72
89
  this.Validator.validate(schema, result);
73
90
  }
74
91
  if (hydrator) {
@@ -93,13 +110,24 @@ class RouteArgs {
93
110
  }
94
111
  tryExtractObject(arg, param) {
95
112
  try {
96
- if ((0, di_1.isClass)(param.RuntimeType)) {
97
- return new param.RuntimeType(lodash_1.default.isString(arg) ? JSON.parse(arg) : arg);
98
- }
99
- else if (param.RuntimeType instanceof di_1.TypedArray) {
113
+ // TypedArray must be checked BEFORE isClass: a TypedArray instance's
114
+ // constructor is `class TypedArray`, so isClass() reports true for it and
115
+ // would (wrongly) try `new <instance>()`. Handle the typed-array case here.
116
+ if (param.RuntimeType instanceof di_1.TypedArray) {
100
117
  const type = param.RuntimeType.Type;
101
118
  const arrData = lodash_1.default.isString(arg) ? JSON.parse(arg) : arg;
102
- return arrData ? arrData.map((x) => new type(x)) : [];
119
+ if (arrData === null || arrData === undefined) {
120
+ return [];
121
+ }
122
+ if (!Array.isArray(arrData)) {
123
+ // A typed-array param requires a JSON array; a non-array value is a
124
+ // client error (400), not an uncaught TypeError from .map (500).
125
+ throw new exceptions_1.InvalidArgument(`Parameter '${param.Name}' must be a JSON array`, param.Name);
126
+ }
127
+ return arrData.map((x) => new type(x));
128
+ }
129
+ else if ((0, di_1.isClass)(param.RuntimeType)) {
130
+ return new param.RuntimeType(lodash_1.default.isString(arg) ? JSON.parse(arg) : arg);
103
131
  }
104
132
  else if (param.RuntimeType.name === 'Object' || param.RuntimeType.name === 'Array') {
105
133
  return lodash_1.default.isString(arg) ? JSON.parse(arg) : arg;
@@ -124,11 +152,23 @@ class RouteArgs {
124
152
  case 'String':
125
153
  return arg;
126
154
  case 'Number':
127
- return arg ? Number(arg) : undefined;
155
+ // Only treat truly-absent values as undefined — `0` is a valid number
156
+ // and must not be coerced away (JSON body can carry a literal 0).
157
+ return arg === undefined || arg === null || arg === '' ? undefined : Number(arg);
128
158
  case 'BigInt':
129
- return BigInt(arg);
159
+ try {
160
+ return BigInt(arg);
161
+ }
162
+ catch (err) {
163
+ throw new exceptions_1.InvalidArgument(`Argument '${param.Name}' is not a valid integer`, err);
164
+ }
130
165
  case 'Boolean':
131
- return arg ? (arg === 1 ? true : arg.toLowerCase() === 'true' ? true : false) : false;
166
+ // A JSON body can deliver a real boolean; return it as-is instead of
167
+ // calling String.toLowerCase on it (which threw). Query/param values
168
+ // arrive as strings and are matched case-insensitively.
169
+ if (typeof arg === 'boolean')
170
+ return arg;
171
+ return arg ? arg === 1 || String(arg).toLowerCase() === 'true' : false;
132
172
  case 'Undefined':
133
173
  return undefined;
134
174
  case 'Null':
@@ -1 +1 @@
1
- {"version":3,"file":"RouteArgs.js","sourceRoot":"","sources":["../../../src/route-args/RouteArgs.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"RouteArgs.js","sourceRoot":"","sources":["../../../src/route-args/RouteArgs.ts"],"names":[],"mappings":"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"}
@@ -8,6 +8,8 @@ export * from './FromForm.js';
8
8
  export * from './FromHeaderArg.js';
9
9
  export * from './FromParams.js';
10
10
  export * from './FromQuery.js';
11
+ export * from './FromXml.js';
12
+ export * from './RequestContext.js';
11
13
  export * from './RouteArgs.js';
12
14
  export * from './RequestFields.js';
13
15
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/route-args/index.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAC;AAClC,cAAc,oBAAoB,CAAC;AACnC,cAAc,kBAAkB,CAAC;AACjC,cAAc,eAAe,CAAC;AAC9B,cAAc,iBAAiB,CAAC;AAChC,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,cAAc,oBAAoB,CAAC;AACnC,cAAc,iBAAiB,CAAC;AAChC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,oBAAoB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/route-args/index.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAC;AAClC,cAAc,oBAAoB,CAAC;AACnC,cAAc,kBAAkB,CAAC;AACjC,cAAc,eAAe,CAAC;AAC9B,cAAc,iBAAiB,CAAC;AAChC,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,cAAc,oBAAoB,CAAC;AACnC,cAAc,iBAAiB,CAAC;AAChC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,cAAc,CAAC;AAC7B,cAAc,qBAAqB,CAAC;AACpC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,oBAAoB,CAAC"}
@@ -24,6 +24,8 @@ __exportStar(require("./FromForm.js"), exports);
24
24
  __exportStar(require("./FromHeaderArg.js"), exports);
25
25
  __exportStar(require("./FromParams.js"), exports);
26
26
  __exportStar(require("./FromQuery.js"), exports);
27
+ __exportStar(require("./FromXml.js"), exports);
28
+ __exportStar(require("./RequestContext.js"), exports);
27
29
  __exportStar(require("./RouteArgs.js"), exports);
28
30
  __exportStar(require("./RequestFields.js"), exports);
29
31
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/route-args/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,oDAAkC;AAClC,qDAAmC;AACnC,mDAAiC;AACjC,gDAA8B;AAC9B,kDAAgC;AAChC,8CAA4B;AAC5B,gDAA8B;AAC9B,qDAAmC;AACnC,kDAAgC;AAChC,iDAA+B;AAC/B,iDAA+B;AAC/B,qDAAmC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/route-args/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,oDAAkC;AAClC,qDAAmC;AACnC,mDAAiC;AACjC,gDAA8B;AAC9B,kDAAgC;AAChC,8CAA4B;AAC5B,gDAA8B;AAC9B,qDAAmC;AACnC,kDAAgC;AAChC,iDAA+B;AAC/B,+CAA6B;AAC7B,sDAAoC;AACpC,iDAA+B;AAC/B,qDAAmC"}
@@ -5,7 +5,7 @@ import '@spinajs/templates-pug';
5
5
  import { Server as Http } from 'http';
6
6
  import { Server as Https } from 'https';
7
7
  import Express, { ErrorRequestHandler, RequestHandler } from 'express';
8
- import { ServerMiddleware, IHttpServerConfiguration } from './interfaces.js';
8
+ import { ServerMiddleware, IHttpServerConfiguration, LifecycleState } from './interfaces.js';
9
9
  import './transformers/index.js';
10
10
  import './middlewares/ResponseTime.js';
11
11
  import './middlewares/RequestId.js';
@@ -25,6 +25,7 @@ export declare class HttpServer extends AsyncService {
25
25
  protected HttpConfig: IHttpServerConfiguration;
26
26
  protected HttpsEnabled: boolean;
27
27
  protected AppEnv: string;
28
+ protected ShutdownTimeout: number;
28
29
  /**
29
30
  * Express app instance
30
31
  */
@@ -38,6 +39,23 @@ export declare class HttpServer extends AsyncService {
38
39
  * Track active connections for cleanup
39
40
  */
40
41
  protected _connections: Set<any>;
42
+ /**
43
+ * Lifecycle state. All three public entry points ( start / stop / dispose )
44
+ * transition through it so double-close, restart and idempotency are decided
45
+ * in one place.
46
+ */
47
+ protected _state: LifecycleState;
48
+ /**
49
+ * The in-flight close promise, so concurrent / repeated stop() calls share one
50
+ * shutdown rather than each issuing a second Server.close().
51
+ */
52
+ protected _closePromise: Promise<void> | null;
53
+ /**
54
+ * After-middlewares ( NotFound / ErrorHandler / ServerTiming ... ) attach to
55
+ * the Express app exactly once per instance. Restart must not re-stack them.
56
+ */
57
+ protected _afterAttached: boolean;
58
+ get State(): LifecycleState;
41
59
  get Server(): Http | Https;
42
60
  /**
43
61
  * Logger for this module
@@ -57,11 +75,26 @@ export declare class HttpServer extends AsyncService {
57
75
  * Starts http server & express
58
76
  */
59
77
  start(): Promise<void>;
60
- stop(): void;
61
78
  /**
62
- * Enhanced dispose method with proper connection cleanup and timeout handling
79
+ * Emit a lifecycle event on the DI bus, isolating the state machine from a
80
+ * throwing subscriber. Container.emit is synchronous, so without this guard a
81
+ * listener that throws would pre-empt the caller - eg. a throwing
82
+ * `http.server.listening` listener runs before res() and would hang start(),
83
+ * and a throwing `http.server.closing` listener would escape stop().
84
+ */
85
+ protected _emit(event: string): void;
86
+ stop(): Promise<void>;
87
+ /**
88
+ * AsyncService teardown. HttpServer holds no resources beyond the socket
89
+ * server and its tracked connections, both released by stop(); this awaits it.
63
90
  */
64
91
  dispose(): Promise<void>;
92
+ /**
93
+ * Single shutdown path for both stop() and dispose(). Idempotent: repeated or
94
+ * concurrent calls share one Server.close() instead of issuing a second one
95
+ * ( which would reject with ERR_SERVER_NOT_RUNNING ).
96
+ */
97
+ protected _close(): Promise<void>;
65
98
  /**
66
99
  * Force close all tracked connections
67
100
  */
@@ -1 +1 @@
1
- {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,UAAU,EAAiD,MAAM,aAAa,CAAC;AACtG,OAAO,EAAU,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAC/D,OAAO,EAAU,GAAG,EAAE,MAAM,cAAc,CAAC;AAG3C,OAAO,wBAAwB,CAAC;AAEhC,OAAO,EAAE,MAAM,IAAI,IAAI,EAAoC,MAAM,MAAM,CAAC;AACxE,OAAO,EAAE,MAAM,IAAI,KAAK,EAAqC,MAAM,OAAO,CAAC;AAE3E,OAAO,OAAO,EAAE,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAIvE,OAAO,EAAE,gBAAgB,EAAE,wBAAwB,EAAE,MAAM,iBAAiB,CAAC;AAC7E,OAAO,yBAAyB,CAAC;AACjC,OAAO,+BAA+B,CAAC;AACvC,OAAO,4BAA4B,CAAC;AACpC,OAAO,yBAAyB,CAAC;AACjC,OAAO,6BAA6B,CAAC;AACrC,OAAO,2BAA2B,CAAC;AACnC,OAAO,+BAA+B,CAAC;AACvC,OAAO,4BAA4B,CAAC;AACpC,OAAO,8BAA8B,CAAC;AACtC,OAAO,uBAAuB,CAAC;AAC/B,OAAO,qCAAqC,CAAC;AAC7C,OAAO,+BAA+B,CAAC;AAEvC,qBAEa,UAAW,SAAQ,YAAY;IAE1C,SAAS,CAAC,aAAa,EAAG,aAAa,CAAC;IAGxC,SAAS,CAAC,SAAS,EAAG,UAAU,CAAC;IAGjC,SAAS,CAAC,WAAW,EAAG,gBAAgB,EAAE,CAAC;IAG3C,SAAS,CAAC,UAAU,EAAG,wBAAwB,CAAC;IAGhD,SAAS,CAAC,YAAY,EAAG,OAAO,CAAC;IAKjC,SAAS,CAAC,MAAM,EAAG,MAAM,CAAC;IAE1B;;OAEG;IACH,SAAS,CAAC,OAAO,EAAG,OAAO,CAAC,OAAO,CAAC;IAEpC;;OAEG;IACH,SAAS,CAAC,WAAW,EAAG,IAAI,CAAC;IAC7B,SAAS,CAAC,YAAY,EAAG,KAAK,CAAC;IAE/B;;OAEG;IACH,SAAS,CAAC,YAAY,WAAkB;IAExC,IAAW,MAAM,IAAI,IAAI,GAAG,KAAK,CAEhC;IAED;;OAEG;IAEH,SAAS,CAAC,GAAG,EAAG,GAAG,CAAC;;IAMP,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAsCrC;;OAEG;IACH,OAAO,CAAC,aAAa;IAuCrB;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAc1B;;OAEG;IACI,KAAK;IAwBL,IAAI;IAMX;;OAEG;IACU,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IA4CrC;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAW9B;;;;OAIG;IACI,GAAG,CAAC,UAAU,EAAE,cAAc,GAAG,mBAAmB,GAAG,IAAI;CAGnE"}
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,UAAU,EAAiD,MAAM,aAAa,CAAC;AACtG,OAAO,EAAU,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAC/D,OAAO,EAAU,GAAG,EAAE,MAAM,cAAc,CAAC;AAG3C,OAAO,wBAAwB,CAAC;AAEhC,OAAO,EAAE,MAAM,IAAI,IAAI,EAAoC,MAAM,MAAM,CAAC;AACxE,OAAO,EAAE,MAAM,IAAI,KAAK,EAAqC,MAAM,OAAO,CAAC;AAE3E,OAAO,OAAO,EAAE,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAIvE,OAAO,EAAE,gBAAgB,EAAE,wBAAwB,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAC7F,OAAO,yBAAyB,CAAC;AACjC,OAAO,+BAA+B,CAAC;AACvC,OAAO,4BAA4B,CAAC;AACpC,OAAO,yBAAyB,CAAC;AACjC,OAAO,6BAA6B,CAAC;AACrC,OAAO,2BAA2B,CAAC;AACnC,OAAO,+BAA+B,CAAC;AACvC,OAAO,4BAA4B,CAAC;AACpC,OAAO,8BAA8B,CAAC;AACtC,OAAO,uBAAuB,CAAC;AAC/B,OAAO,qCAAqC,CAAC;AAC7C,OAAO,+BAA+B,CAAC;AAEvC,qBAEa,UAAW,SAAQ,YAAY;IAE1C,SAAS,CAAC,aAAa,EAAG,aAAa,CAAC;IAGxC,SAAS,CAAC,SAAS,EAAG,UAAU,CAAC;IAGjC,SAAS,CAAC,WAAW,EAAG,gBAAgB,EAAE,CAAC;IAG3C,SAAS,CAAC,UAAU,EAAG,wBAAwB,CAAC;IAGhD,SAAS,CAAC,YAAY,EAAG,OAAO,CAAC;IAKjC,SAAS,CAAC,MAAM,EAAG,MAAM,CAAC;IAK1B,SAAS,CAAC,eAAe,EAAG,MAAM,CAAC;IAEnC;;OAEG;IACH,SAAS,CAAC,OAAO,EAAG,OAAO,CAAC,OAAO,CAAC;IAEpC;;OAEG;IACH,SAAS,CAAC,WAAW,EAAG,IAAI,CAAC;IAC7B,SAAS,CAAC,YAAY,EAAG,KAAK,CAAC;IAE/B;;OAEG;IACH,SAAS,CAAC,YAAY,WAAkB;IAExC;;;;OAIG;IACH,SAAS,CAAC,MAAM,EAAE,cAAc,CAA0B;IAE1D;;;OAGG;IACH,SAAS,CAAC,aAAa,EAAE,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAQ;IAErD;;;OAGG;IACH,SAAS,CAAC,cAAc,UAAS;IAEjC,IAAW,KAAK,IAAI,cAAc,CAEjC;IAED,IAAW,MAAM,IAAI,IAAI,GAAG,KAAK,CAEhC;IAED;;OAEG;IAEH,SAAS,CAAC,GAAG,EAAG,GAAG,CAAC;;IAMP,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAsCrC;;OAEG;IACH,OAAO,CAAC,aAAa;IAuDrB;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAgB1B;;OAEG;IACU,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IA+CnC;;;;;;OAMG;IACH,SAAS,CAAC,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAQ7B,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAI5B;;;OAGG;IACU,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAIrC;;;;OAIG;IACH,SAAS,CAAC,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAoDjC;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAW9B;;;;OAIG;IACI,GAAG,CAAC,UAAU,EAAE,cAAc,GAAG,mBAAmB,GAAG,IAAI;CAGnE"}
package/lib/cjs/server.js CHANGED
@@ -38,6 +38,9 @@ require("./middlewares/Cors.js");
38
38
  require("./middlewares/SlowRequestWarning.js");
39
39
  require("./middlewares/ServerTiming.js");
40
40
  let HttpServer = class HttpServer extends di_1.AsyncService {
41
+ get State() {
42
+ return this._state;
43
+ }
41
44
  get Server() {
42
45
  return this.HttpsEnabled ? this._httpsServer : this._httpServer;
43
46
  }
@@ -47,6 +50,22 @@ let HttpServer = class HttpServer extends di_1.AsyncService {
47
50
  * Track active connections for cleanup
48
51
  */
49
52
  this._connections = new Set();
53
+ /**
54
+ * Lifecycle state. All three public entry points ( start / stop / dispose )
55
+ * transition through it so double-close, restart and idempotency are decided
56
+ * in one place.
57
+ */
58
+ this._state = interfaces_js_1.LifecycleState.Created;
59
+ /**
60
+ * The in-flight close promise, so concurrent / repeated stop() calls share one
61
+ * shutdown rather than each issuing a second Server.close().
62
+ */
63
+ this._closePromise = null;
64
+ /**
65
+ * After-middlewares ( NotFound / ErrorHandler / ServerTiming ... ) attach to
66
+ * the Express app exactly once per instance. Restart must not re-stack them.
67
+ */
68
+ this._afterAttached = false;
50
69
  }
51
70
  async resolve() {
52
71
  await super.resolve();
@@ -99,6 +118,13 @@ let HttpServer = class HttpServer extends di_1.AsyncService {
99
118
  this._connections.delete(socket);
100
119
  });
101
120
  });
121
+ // Persistent, log-only 'error' handler attached once per server ( same place
122
+ // as 'connection', so it never accumulates ). start()'s per-start .once is
123
+ // removed on listen success, so without this a server-level 'error' emitted
124
+ // AFTER listening would be unhandled and crash the process.
125
+ this._httpsServer.on('error', (err) => {
126
+ this.Log.error(`Server error: ${err?.message ?? err}`);
127
+ });
102
128
  }
103
129
  else {
104
130
  this.Log.info(`HTTP enabled !`);
@@ -110,13 +136,22 @@ let HttpServer = class HttpServer extends di_1.AsyncService {
110
136
  this._connections.delete(socket);
111
137
  });
112
138
  });
139
+ // Persistent, log-only 'error' handler attached once per server ( same place
140
+ // as 'connection', so it never accumulates ). start()'s per-start .once is
141
+ // removed on listen success, so without this a server-level 'error' emitted
142
+ // AFTER listening would be unhandled and crash the process.
143
+ this._httpServer.on('error', (err) => {
144
+ this.Log.error(`Server error: ${err?.message ?? err}`);
145
+ });
113
146
  }
114
147
  }
115
148
  /**
116
149
  * Server static files
117
150
  */
118
151
  _serverStaticFiles() {
119
- lodash_1.default.uniq(this.HttpConfig.Static).forEach((s) => {
152
+ // uniqBy Path — Static entries are objects, so plain _.uniq (reference
153
+ // equality) would never dedupe two config entries pointing at the same dir.
154
+ lodash_1.default.uniqBy(this.HttpConfig.Static, (s) => s.Path).forEach((s) => {
120
155
  if (!(0, fs_1.existsSync)(s.Path)) {
121
156
  this.Log.warn(`static file path ${s.Path} not exists`);
122
157
  return;
@@ -129,71 +164,119 @@ let HttpServer = class HttpServer extends di_1.AsyncService {
129
164
  /**
130
165
  * Starts http server & express
131
166
  */
132
- start() {
133
- return new Promise((res, rej) => {
134
- // add all middlewares to execute after
135
- this.Middlewares.reverse().forEach((m) => {
167
+ async start() {
168
+ // Idempotent: already serving -> nothing to do. This is what stops a
169
+ // repeated start() ( HttpServer is a DI singleton ) re-stacking middleware.
170
+ if (this._state === interfaces_js_1.LifecycleState.Listening) {
171
+ return;
172
+ }
173
+ // A start() racing a shutdown waits for the close to finish, then re-listens.
174
+ if (this._state === interfaces_js_1.LifecycleState.Closing && this._closePromise) {
175
+ await this._closePromise;
176
+ }
177
+ // add all after-middlewares once per instance ( not once per start ).
178
+ if (!this._afterAttached) {
179
+ // Copy before reversing so we don't mutate the shared, already-sorted
180
+ // Middlewares array in place.
181
+ [...this.Middlewares].reverse().forEach((m) => {
136
182
  const f = m.after();
137
183
  if (f) {
138
184
  this.Log.info(`Using server middleware::after() - ${m.constructor.name}`);
139
185
  this.use(f);
140
186
  }
141
187
  });
142
- this.Server.listen(this.HttpConfig.port, () => {
143
- this.Log.info(`Server started at port ${this.HttpConfig.port}`);
144
- res();
145
- }).on('error', (err) => {
146
- if (err.errno === 'EADDRINUSE') {
188
+ this._afterAttached = true;
189
+ }
190
+ await new Promise((res, rej) => {
191
+ // .once, removed on success, so repeated start()/restart never accumulates
192
+ // 'error' listeners on the reused server object.
193
+ const onError = (err) => {
194
+ if (err.code === 'EADDRINUSE') {
147
195
  this.Log.error(`----- Port ${this.HttpConfig.port} is busy -----`);
148
196
  }
149
197
  rej(err);
198
+ };
199
+ this.Server.once('error', onError);
200
+ this.Server.listen(this.HttpConfig.port, () => {
201
+ this.Server.removeListener('error', onError);
202
+ this._state = interfaces_js_1.LifecycleState.Listening;
203
+ this._emit('http.server.listening');
204
+ this.Log.info(`Server started at port ${this.HttpConfig.port}`);
205
+ res();
150
206
  });
151
207
  });
152
208
  }
153
- stop() {
154
- if (this.Server) {
155
- this.Server.close();
209
+ /**
210
+ * Emit a lifecycle event on the DI bus, isolating the state machine from a
211
+ * throwing subscriber. Container.emit is synchronous, so without this guard a
212
+ * listener that throws would pre-empt the caller - eg. a throwing
213
+ * `http.server.listening` listener runs before res() and would hang start(),
214
+ * and a throwing `http.server.closing` listener would escape stop().
215
+ */
216
+ _emit(event) {
217
+ try {
218
+ this.Container.emit(event, this);
156
219
  }
220
+ catch (err) {
221
+ this.Log.warn(`Listener for ${event} threw: ${err?.message ?? err}`);
222
+ }
223
+ }
224
+ stop() {
225
+ return this._close();
157
226
  }
158
227
  /**
159
- * Enhanced dispose method with proper connection cleanup and timeout handling
228
+ * AsyncService teardown. HttpServer holds no resources beyond the socket
229
+ * server and its tracked connections, both released by stop(); this awaits it.
160
230
  */
161
231
  async dispose() {
162
- if (!this.Server) {
163
- return;
232
+ await this.stop();
233
+ }
234
+ /**
235
+ * Single shutdown path for both stop() and dispose(). Idempotent: repeated or
236
+ * concurrent calls share one Server.close() instead of issuing a second one
237
+ * ( which would reject with ERR_SERVER_NOT_RUNNING ).
238
+ */
239
+ _close() {
240
+ if (this._state === interfaces_js_1.LifecycleState.Closing) {
241
+ return this._closePromise;
164
242
  }
165
- return new Promise((resolve, reject) => {
166
- // Set a timeout for graceful shutdown
167
- const timeout = setTimeout(() => {
168
- this.Log.warn('Server shutdown timeout, forcing close');
169
- // Force close all tracked connections
243
+ if (this._state !== interfaces_js_1.LifecycleState.Listening || !this.Server) {
244
+ // Created or Closed - nothing to close
245
+ return Promise.resolve();
246
+ }
247
+ this._state = interfaces_js_1.LifecycleState.Closing;
248
+ this._closePromise = new Promise((resolve) => {
249
+ // One watchdog, unref'd so it can never hold the event loop open, and
250
+ // cleared on every close-callback path. The old code leaked a second,
251
+ // never-cleared 5s timer here.
252
+ const watchdog = setTimeout(() => {
253
+ this.Log.warn('Server shutdown grace period expired, forcing connections closed');
254
+ this.Server.closeAllConnections?.();
170
255
  this._forceCloseConnections();
171
- // Force close connections if available (Node.js 18.2+)
172
- if (typeof this.Server.closeAllConnections === 'function') {
173
- this.Server.closeAllConnections();
174
- }
175
- // Still resolve as we've done our best to clean up
176
- resolve();
177
- }, 10000);
256
+ }, this.ShutdownTimeout);
257
+ watchdog.unref();
178
258
  this.Server.close((err) => {
179
- clearTimeout(timeout);
259
+ clearTimeout(watchdog);
260
+ this._forceCloseConnections();
261
+ this._state = interfaces_js_1.LifecycleState.Closed;
180
262
  if (err) {
181
- this.Log.error('Error during server close:', err);
182
- reject(err);
183
- }
184
- else {
185
- this.Log.info('Server closed successfully');
186
- resolve();
263
+ // Unexpected given the guards above; log rather than reject so shutdown
264
+ // always settles.
265
+ this.Log.warn(`Error during server close: ${err.message}`);
187
266
  }
267
+ this._emit('http.server.closed');
268
+ resolve();
188
269
  });
189
- // For tracked connections, manually close them after grace period
190
- setTimeout(() => {
191
- if (this._connections.size > 0) {
192
- this.Log.warn(`Forcing closure of ${this._connections.size} remaining connections`);
193
- this._forceCloseConnections();
194
- }
195
- }, 5000);
270
+ // Free IDLE keep-alive sockets right away so the port releases promptly,
271
+ // while any in-flight request keeps the grace window above.
272
+ this.Server.closeIdleConnections?.();
196
273
  });
274
+ // Emit AFTER _closePromise is assigned. Container.emit is fully synchronous,
275
+ // so a listener that re-enters stop() during this emit hits the Closing guard
276
+ // and must find the shared promise already in place ( emitting before the
277
+ // assignment would hand that re-entrant caller a null instead of a thenable ).
278
+ this._emit('http.server.closing');
279
+ return this._closePromise;
197
280
  }
198
281
  /**
199
282
  * Force close all tracked connections
@@ -245,6 +328,12 @@ __decorate([
245
328
  }),
246
329
  __metadata("design:type", String)
247
330
  ], HttpServer.prototype, "AppEnv", void 0);
331
+ __decorate([
332
+ (0, configuration_1.Config)('http.shutdownTimeout', {
333
+ defaultValue: 10000,
334
+ }),
335
+ __metadata("design:type", Number)
336
+ ], HttpServer.prototype, "ShutdownTimeout", void 0);
248
337
  __decorate([
249
338
  (0, log_1.Logger)('http'),
250
339
  __metadata("design:type", log_1.Log)
@@ -1 +1 @@
1
- {"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/server.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/server.ts"],"names":[],"mappings":"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"}
@@ -6,13 +6,6 @@ declare const http: {
6
6
  cli: string[];
7
7
  };
8
8
  };
9
- cookie: {
10
- secret: string;
11
- options: {
12
- maxAge: number;
13
- httpOnly: boolean;
14
- };
15
- };
16
9
  fs: {
17
10
  providers: {
18
11
  service: string;
@@ -21,6 +14,21 @@ declare const http: {
21
14
  }[];
22
15
  };
23
16
  http: {
17
+ /**
18
+ * Cookie defaults. This MUST live under `http.` - every consumer reads
19
+ * `http.cookie.secret` ( responses, @FromCookie, the rbac session middleware ),
20
+ * and the parser that makes signed cookies work is bound to it.
21
+ *
22
+ * Override the secret per app: this default is public, and signed cookies are
23
+ * only as trustworthy as the key that signs them.
24
+ */
25
+ cookie: {
26
+ secret: string;
27
+ options: {
28
+ maxAge: number;
29
+ httpOnly: boolean;
30
+ };
31
+ };
24
32
  /**
25
33
  * File upload default middlewares
26
34
  */
@@ -1 +1 @@
1
- {"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../../../src/config/http.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,SAAS,CAAC;AA0B9B,QAAA,MAAM,IAAI;;;;;;;;;;;;;;;;;;;;;;QAuCN;;WAEG;;;;;;;;;;;;;;;QA6BH;;WAEG;;YAGC;;eAEG;;YAGH;;eAEG;;;QAKP;;WAEG;;QAGH;;;WAGG;;;CAgBN,CAAC;AAEF,eAAe,IAAI,CAAC"}
1
+ {"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../../../src/config/http.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,SAAS,CAAC;AA0B9B,QAAA,MAAM,IAAI;;;;;;;;;;;;;;;QAgCN;;;;;;;WAOG;;;;;;;;QASH;;WAEG;;;;;;;;;;;;;;;QAwCH;;WAEG;;YAGC;;eAEG;;YAGH;;eAEG;;;QAKP;;WAEG;;QAGH;;;WAGG;;;CAgBN,CAAC;AAEF,eAAe,IAAI,CAAC"}
@@ -1,6 +1,6 @@
1
1
  import express from 'express';
2
2
  import helmet from 'helmet';
3
- import cookieParser from 'cookie-parser';
3
+ import { configuredCookieParser } from '../cookie.js';
4
4
  import compression from 'compression';
5
5
  import { join, normalize, resolve } from 'path';
6
6
  import os from 'os';
@@ -25,13 +25,6 @@ const http = {
25
25
  cli: [...dir('cli')],
26
26
  },
27
27
  },
28
- cookie: {
29
- secret: '1234adreewD',
30
- options: {
31
- maxAge: 900000,
32
- httpOnly: true,
33
- },
34
- },
35
28
  fs: {
36
29
  providers: [
37
30
  // formidable default file provider, incoming
@@ -55,6 +48,21 @@ const http = {
55
48
  ],
56
49
  },
57
50
  http: {
51
+ /**
52
+ * Cookie defaults. This MUST live under `http.` - every consumer reads
53
+ * `http.cookie.secret` ( responses, @FromCookie, the rbac session middleware ),
54
+ * and the parser that makes signed cookies work is bound to it.
55
+ *
56
+ * Override the secret per app: this default is public, and signed cookies are
57
+ * only as trustworthy as the key that signs them.
58
+ */
59
+ cookie: {
60
+ secret: '1234adreewD',
61
+ options: {
62
+ maxAge: 900000,
63
+ httpOnly: true,
64
+ },
65
+ },
58
66
  /**
59
67
  * File upload default middlewares
60
68
  */
@@ -76,11 +84,22 @@ const http = {
76
84
  helmet(),
77
85
  express.json({
78
86
  limit: '5mb',
87
+ // Capture the exact received bytes for the @RawBody() route arg
88
+ // (webhook signature verification needs the unmodified body).
89
+ verify: (req, _res, buf) => {
90
+ req.rawBody = buf;
91
+ },
79
92
  }),
80
93
  express.urlencoded({
81
94
  extended: true,
82
95
  }),
83
- cookieParser(),
96
+ // Parse XML request bodies as text so the @FromXml() route arg can read
97
+ // and parse them. Covers application/xml, text/xml and *+xml types.
98
+ express.text({
99
+ type: ['application/xml', 'text/xml', 'application/*+xml'],
100
+ limit: '5mb',
101
+ }),
102
+ configuredCookieParser,
84
103
  compression(),
85
104
  ],
86
105
  /**