exisjs 0.7.14 → 0.8.1

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 (210) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +1 -1
  3. package/dist/cli/commands/build.d.ts +2 -0
  4. package/dist/cli/commands/build.d.ts.map +1 -1
  5. package/dist/cli/commands/build.js +35 -2
  6. package/dist/cli/commands/build.js.map +1 -1
  7. package/dist/cli/commands/doctor.d.ts.map +1 -1
  8. package/dist/cli/commands/doctor.js +4 -37
  9. package/dist/cli/commands/doctor.js.map +1 -1
  10. package/dist/config/config.d.ts.map +1 -1
  11. package/dist/config/config.js +10 -0
  12. package/dist/config/config.js.map +1 -1
  13. package/dist/config/types.d.ts +9 -1
  14. package/dist/config/types.d.ts.map +1 -1
  15. package/dist/database/lifecycle.d.ts +7 -0
  16. package/dist/database/lifecycle.d.ts.map +1 -1
  17. package/dist/database/lifecycle.js +30 -7
  18. package/dist/database/lifecycle.js.map +1 -1
  19. package/dist/decorators/caching.d.ts +2 -5
  20. package/dist/decorators/caching.d.ts.map +1 -1
  21. package/dist/decorators/caching.js +7 -61
  22. package/dist/decorators/caching.js.map +1 -1
  23. package/dist/decorators/core.d.ts.map +1 -1
  24. package/dist/decorators/core.js +5 -0
  25. package/dist/decorators/core.js.map +1 -1
  26. package/dist/decorators/cron.d.ts +1 -0
  27. package/dist/decorators/cron.d.ts.map +1 -1
  28. package/dist/decorators/cron.js +4 -1
  29. package/dist/decorators/cron.js.map +1 -1
  30. package/dist/di/container.d.ts +1 -0
  31. package/dist/di/container.d.ts.map +1 -1
  32. package/dist/di/container.js +19 -3
  33. package/dist/di/container.js.map +1 -1
  34. package/dist/docs/ARCHITECTURE.md +11 -24
  35. package/dist/docs/BENCHMARKS.md +59 -26
  36. package/dist/docs/README.md +1 -1
  37. package/dist/docs/content/boundaries.mdx +2 -0
  38. package/dist/docs/content/cli/commands.mdx +4 -2
  39. package/dist/docs/content/cli/overview.mdx +1 -1
  40. package/dist/docs/content/config.mdx +22 -9
  41. package/dist/docs/content/cron.mdx +2 -2
  42. package/dist/docs/content/decorators.mdx +2 -2
  43. package/dist/docs/content/errors.mdx +22 -6
  44. package/dist/docs/content/installation.mdx +13 -8
  45. package/dist/docs/content/introduction.mdx +12 -12
  46. package/dist/docs/content/middleware.mdx +1 -1
  47. package/dist/docs/content/providers.mdx +4 -4
  48. package/dist/docs/content/requests.mdx +12 -1
  49. package/dist/docs/content/responses.mdx +44 -3
  50. package/dist/docs/content/routing.mdx +24 -0
  51. package/dist/docs/content/security.mdx +0 -1
  52. package/dist/docs/content/structure.mdx +4 -1
  53. package/dist/docs/content/testing.mdx +2 -0
  54. package/dist/docs/content/validation.mdx +16 -2
  55. package/dist/docs/reference/README.md +1 -1
  56. package/dist/docs/reference/config.mdx +1 -1
  57. package/dist/docs/reference/decorators.mdx +2 -2
  58. package/dist/docs/reference/di.mdx +1 -1
  59. package/dist/docs/reference/middleware.mdx +9 -5
  60. package/dist/docs/reference/sanitize.mdx +4 -4
  61. package/dist/docs/reference/validator.mdx +1 -1
  62. package/dist/error/errors.d.ts.map +1 -1
  63. package/dist/error/errors.js +31 -8
  64. package/dist/error/errors.js.map +1 -1
  65. package/dist/lib/start-server.js +5 -1
  66. package/dist/lib/start-server.js.map +1 -1
  67. package/dist/middleware/compression.d.ts +0 -12
  68. package/dist/middleware/compression.d.ts.map +1 -1
  69. package/dist/middleware/compression.js +52 -41
  70. package/dist/middleware/compression.js.map +1 -1
  71. package/dist/middleware/idempotency.d.ts +11 -6
  72. package/dist/middleware/idempotency.d.ts.map +1 -1
  73. package/dist/middleware/idempotency.js +5 -35
  74. package/dist/middleware/idempotency.js.map +1 -1
  75. package/dist/middleware/ip-filter.d.ts +4 -1
  76. package/dist/middleware/ip-filter.d.ts.map +1 -1
  77. package/dist/middleware/ip-filter.js +4 -29
  78. package/dist/middleware/ip-filter.js.map +1 -1
  79. package/dist/middleware/middleware.d.ts +2 -1
  80. package/dist/middleware/middleware.d.ts.map +1 -1
  81. package/dist/middleware/middleware.js +94 -57
  82. package/dist/middleware/middleware.js.map +1 -1
  83. package/dist/middleware/rate-limit.d.ts.map +1 -1
  84. package/dist/middleware/rate-limit.js +19 -38
  85. package/dist/middleware/rate-limit.js.map +1 -1
  86. package/dist/middleware/security.d.ts.map +1 -1
  87. package/dist/middleware/security.js +4 -28
  88. package/dist/middleware/security.js.map +1 -1
  89. package/dist/middleware/upload.d.ts.map +1 -1
  90. package/dist/middleware/upload.js +15 -7
  91. package/dist/middleware/upload.js.map +1 -1
  92. package/dist/response/index.d.ts +23 -0
  93. package/dist/response/index.d.ts.map +1 -1
  94. package/dist/response/index.js +28 -1
  95. package/dist/response/index.js.map +1 -1
  96. package/dist/router/index.d.ts +1 -1
  97. package/dist/router/index.d.ts.map +1 -1
  98. package/dist/router/index.js.map +1 -1
  99. package/dist/router/radix.d.ts +3 -16
  100. package/dist/router/radix.d.ts.map +1 -1
  101. package/dist/router/radix.js +135 -211
  102. package/dist/router/radix.js.map +1 -1
  103. package/dist/router/route-builder.d.ts +28 -0
  104. package/dist/router/route-builder.d.ts.map +1 -1
  105. package/dist/router/route-builder.js.map +1 -1
  106. package/dist/router/route-scanner.d.ts +2 -1
  107. package/dist/router/route-scanner.d.ts.map +1 -1
  108. package/dist/router/route-scanner.js +37 -44
  109. package/dist/router/route-scanner.js.map +1 -1
  110. package/dist/router/router.d.ts.map +1 -1
  111. package/dist/router/router.js +153 -126
  112. package/dist/router/router.js.map +1 -1
  113. package/dist/router/scanner/boundary-loader.d.ts.map +1 -1
  114. package/dist/router/scanner/boundary-loader.js +7 -2
  115. package/dist/router/scanner/boundary-loader.js.map +1 -1
  116. package/dist/router/scanner/functional-compiler.d.ts.map +1 -1
  117. package/dist/router/scanner/functional-compiler.js +9 -1
  118. package/dist/router/scanner/functional-compiler.js.map +1 -1
  119. package/dist/sanitize/index.d.ts +2 -3
  120. package/dist/sanitize/index.d.ts.map +1 -1
  121. package/dist/sanitize/index.js +15 -20
  122. package/dist/sanitize/index.js.map +1 -1
  123. package/dist/server/adapters/bun-adapter.d.ts +2 -1
  124. package/dist/server/adapters/bun-adapter.d.ts.map +1 -1
  125. package/dist/server/adapters/bun-adapter.js +22 -2
  126. package/dist/server/adapters/bun-adapter.js.map +1 -1
  127. package/dist/server/app.d.ts +2 -2
  128. package/dist/server/app.d.ts.map +1 -1
  129. package/dist/server/app.js +14 -7
  130. package/dist/server/app.js.map +1 -1
  131. package/dist/server/bootstrapper.d.ts +2 -2
  132. package/dist/server/bootstrapper.d.ts.map +1 -1
  133. package/dist/server/bootstrapper.js +2 -2
  134. package/dist/server/bootstrapper.js.map +1 -1
  135. package/dist/server/download.d.ts +22 -0
  136. package/dist/server/download.d.ts.map +1 -0
  137. package/dist/server/download.js +18 -0
  138. package/dist/server/download.js.map +1 -0
  139. package/dist/server/helpers/body-parser.d.ts +1 -1
  140. package/dist/server/helpers/body-parser.d.ts.map +1 -1
  141. package/dist/server/helpers/body-parser.js +126 -48
  142. package/dist/server/helpers/body-parser.js.map +1 -1
  143. package/dist/server/helpers/cookie.d.ts +6 -0
  144. package/dist/server/helpers/cookie.d.ts.map +1 -1
  145. package/dist/server/helpers/cookie.js +35 -0
  146. package/dist/server/helpers/cookie.js.map +1 -1
  147. package/dist/server/helpers/etag.d.ts.map +1 -1
  148. package/dist/server/helpers/etag.js +7 -2
  149. package/dist/server/helpers/etag.js.map +1 -1
  150. package/dist/server/helpers/index.d.ts +2 -1
  151. package/dist/server/helpers/index.d.ts.map +1 -1
  152. package/dist/server/helpers/index.js +5 -1
  153. package/dist/server/helpers/index.js.map +1 -1
  154. package/dist/server/helpers/ip.d.ts +13 -0
  155. package/dist/server/helpers/ip.d.ts.map +1 -1
  156. package/dist/server/helpers/ip.js +65 -54
  157. package/dist/server/helpers/ip.js.map +1 -1
  158. package/dist/server/helpers/json.d.ts +3 -0
  159. package/dist/server/helpers/json.d.ts.map +1 -0
  160. package/dist/server/helpers/json.js +43 -0
  161. package/dist/server/helpers/json.js.map +1 -0
  162. package/dist/server/helpers/upload-name.d.ts +9 -0
  163. package/dist/server/helpers/upload-name.d.ts.map +1 -0
  164. package/dist/server/helpers/upload-name.js +39 -0
  165. package/dist/server/helpers/upload-name.js.map +1 -0
  166. package/dist/server/request-handler.d.ts +0 -7
  167. package/dist/server/request-handler.d.ts.map +1 -1
  168. package/dist/server/request-handler.js +19 -46
  169. package/dist/server/request-handler.js.map +1 -1
  170. package/dist/server/request.d.ts +3 -2
  171. package/dist/server/request.d.ts.map +1 -1
  172. package/dist/server/request.js +22 -16
  173. package/dist/server/request.js.map +1 -1
  174. package/dist/server/response.d.ts +19 -10
  175. package/dist/server/response.d.ts.map +1 -1
  176. package/dist/server/response.js +98 -72
  177. package/dist/server/response.js.map +1 -1
  178. package/dist/testing/index.d.ts.map +1 -1
  179. package/dist/testing/index.js +8 -1
  180. package/dist/testing/index.js.map +1 -1
  181. package/dist/testing/reporter.d.mts.map +1 -1
  182. package/dist/testing/reporter.mjs +18 -0
  183. package/dist/testing/reporter.mjs.map +1 -1
  184. package/dist/utils/ttl-cache.d.ts +11 -0
  185. package/dist/utils/ttl-cache.d.ts.map +1 -0
  186. package/dist/utils/ttl-cache.js +42 -0
  187. package/dist/utils/ttl-cache.js.map +1 -0
  188. package/dist/validator/builder.d.ts +2 -2
  189. package/dist/validator/builder.js +2 -2
  190. package/dist/validator/compile.d.ts +3 -0
  191. package/dist/validator/compile.d.ts.map +1 -0
  192. package/dist/validator/compile.js +254 -0
  193. package/dist/validator/compile.js.map +1 -0
  194. package/dist/validator/engine.d.ts +1 -0
  195. package/dist/validator/engine.d.ts.map +1 -1
  196. package/dist/validator/engine.js +285 -317
  197. package/dist/validator/engine.js.map +1 -1
  198. package/dist/validator/error.d.ts +1 -0
  199. package/dist/validator/error.d.ts.map +1 -1
  200. package/dist/validator/error.js +11 -1
  201. package/dist/validator/error.js.map +1 -1
  202. package/dist/validator/rules.d.ts +64 -0
  203. package/dist/validator/rules.d.ts.map +1 -0
  204. package/dist/validator/rules.js +655 -0
  205. package/dist/validator/rules.js.map +1 -0
  206. package/dist/validator/text.d.ts +11 -0
  207. package/dist/validator/text.d.ts.map +1 -0
  208. package/dist/validator/text.js +69 -0
  209. package/dist/validator/text.js.map +1 -0
  210. package/package.json +56 -39
@@ -2,6 +2,7 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.serializeCookie = serializeCookie;
4
4
  exports.serializeClearCookie = serializeClearCookie;
5
+ exports.parseCookies = parseCookies;
5
6
  function serializeCookie(name, value, options = {}) {
6
7
  const parts = [
7
8
  `${encodeURIComponent(name)}=${encodeURIComponent(value)}`,
@@ -58,4 +59,38 @@ function serializeClearCookie(name, options = {}) {
58
59
  maxAge: 0,
59
60
  });
60
61
  }
62
+ /**
63
+ * Parses a Cookie header. The first occurrence of a name wins, values are
64
+ * percent-decoded when needed, and a malformed escape keeps the raw value
65
+ * rather than failing the request.
66
+ */
67
+ function parseCookies(header) {
68
+ const out = {};
69
+ let start = 0;
70
+ const len = header.length;
71
+ while (start < len) {
72
+ let end = header.indexOf(';', start);
73
+ if (end === -1)
74
+ end = len;
75
+ const eq = header.indexOf('=', start);
76
+ if (eq !== -1 && eq < end) {
77
+ const key = header.slice(start, eq).trim();
78
+ // "__proto__" would hit the prototype setter instead of a property
79
+ if (key !== '' && key !== '__proto__' && out[key] === undefined) {
80
+ let val = header.slice(eq + 1, end).trim();
81
+ if (val.indexOf('%') !== -1) {
82
+ try {
83
+ val = decodeURIComponent(val);
84
+ }
85
+ catch {
86
+ // keep raw value
87
+ }
88
+ }
89
+ out[key] = val;
90
+ }
91
+ }
92
+ start = end + 1;
93
+ }
94
+ return out;
95
+ }
61
96
  //# sourceMappingURL=cookie.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"cookie.js","sourceRoot":"","sources":["../../../src/server/helpers/cookie.ts"],"names":[],"mappings":";;AAEA,0CAyCC;AAED,oDAWC;AAtDD,SAAgB,eAAe,CAC7B,IAAY,EACZ,KAAa,EACb,UAAyB,EAAE;IAE3B,MAAM,KAAK,GAAa;QACtB,GAAG,kBAAkB,CAAC,IAAI,CAAC,IAAI,kBAAkB,CAAC,KAAK,CAAC,EAAE;KAC3D,CAAA;IAED,IAAI,OAAO,CAAC,MAAM,KAAK,SAAS;QAAE,KAAK,CAAC,IAAI,CAAC,WAAW,OAAO,CAAC,MAAM,EAAE,CAAC,CAAA;IACzE,IAAI,OAAO,CAAC,OAAO;QAAE,KAAK,CAAC,IAAI,CAAC,WAAW,OAAO,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,CAAA;IAC3E,IAAI,OAAO,CAAC,IAAI,IAAI,IAAI;QAAE,KAAK,CAAC,IAAI,CAAC,QAAQ,OAAO,CAAC,IAAI,IAAI,GAAG,EAAE,CAAC,CAAA;IACnE,IAAI,OAAO,CAAC,MAAM;QAAE,KAAK,CAAC,IAAI,CAAC,UAAU,OAAO,CAAC,MAAM,EAAE,CAAC,CAAA;IAC1D,IAAI,OAAO,CAAC,QAAQ;QAAE,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;IAC5C,IAAI,OAAO,CAAC,MAAM;QAAE,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;IAExC,IAAI,OAAO,CAAC,QAAQ,KAAK,SAAS,IAAI,OAAO,CAAC,QAAQ,KAAK,KAAK,EAAE,CAAC;QACjE,IAAI,OAAO,CAAC,QAAQ,KAAK,IAAI,EAAE,CAAC;YAC9B,KAAK,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAA;QAC/B,CAAC;aAAM,CAAC;YACN,MAAM,GAAG,GAAG,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE,CAAA;YAClD,IAAI,GAAG,KAAK,QAAQ;gBAAE,KAAK,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAA;iBAC9C,IAAI,GAAG,KAAK,KAAK;gBAAE,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,CAAA;iBAC7C,IAAI,GAAG,KAAK,MAAM,EAAE,CAAC;gBACxB,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,CAAA;gBAC3B,IAAI,CAAC,OAAO,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;oBACjD,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;gBACtB,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,IAAI,OAAO,CAAC,WAAW;QAAE,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,CAAA;IAClD,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;QACrB,MAAM,CAAC,GAAG,OAAO,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAA;QACxC,IAAI,CAAC,KAAK,KAAK;YAAE,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,CAAA;aACtC,IAAI,CAAC,KAAK,QAAQ;YAAE,KAAK,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAA;aACjD,IAAI,CAAC,KAAK,MAAM;YAAE,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,CAAA;IACpD,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AACzB,CAAC;AAED,SAAgB,oBAAoB,CAClC,IAAY,EACZ,UAAyB,EAAE;IAE3B,MAAM,EAAE,MAAM,EAAE,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,GAAG,IAAI,EAAE,GAAG,OAAO,CAAA;IACnD,OAAO,eAAe,CAAC,IAAI,EAAE,EAAE,EAAE;QAC/B,QAAQ,EAAE,IAAI;QACd,GAAG,IAAI;QACP,OAAO,EAAE,IAAI,IAAI,CAAC,CAAC,CAAC;QACpB,MAAM,EAAE,CAAC;KACV,CAAC,CAAA;AACJ,CAAC"}
1
+ {"version":3,"file":"cookie.js","sourceRoot":"","sources":["../../../src/server/helpers/cookie.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"etag.d.ts","sourceRoot":"","sources":["../../../src/server/helpers/etag.ts"],"names":[],"mappings":"AAEA,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAEpD;AAED,wBAAgB,YAAY,CAC1B,GAAG,EAAE,GAAG,EACR,SAAS,cAAoB,EAC7B,IAAI,SAAK,GACR,GAAG,CA+HL;AAuCD,wBAAgB,eAAe,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,GAAG,MAAM,CAyB9D"}
1
+ {"version":3,"file":"etag.d.ts","sourceRoot":"","sources":["../../../src/server/helpers/etag.ts"],"names":[],"mappings":"AAIA,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAIpD;AAED,wBAAgB,YAAY,CAC1B,GAAG,EAAE,GAAG,EACR,SAAS,cAAoB,EAC7B,IAAI,SAAK,GACR,GAAG,CA+HL;AAuCD,wBAAgB,eAAe,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,GAAG,MAAM,CAyB9D"}
@@ -3,9 +3,14 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.generateETag = generateETag;
4
4
  exports.safeSanitize = safeSanitize;
5
5
  exports.nativeStringify = nativeStringify;
6
- const rs_1 = require("@exisjs/rs");
6
+ const node_crypto_1 = require("node:crypto");
7
+ // Weak ETag in the `etag` package format: length in hex plus a truncated
8
+ // base64 SHA-1. SHA-1 is fine here; it only detects content changes.
7
9
  function generateETag(content) {
8
- return (0, rs_1.generateEtag)(content);
10
+ if (content.length === 0)
11
+ return 'W/"0-2jmj7l5rsw0yVb/vlWAYkK/YBwk"';
12
+ const hash = (0, node_crypto_1.createHash)('sha1').update(content).digest('base64').slice(0, 27);
13
+ return `W/"${content.length.toString(16)}-${hash}"`;
9
14
  }
10
15
  function safeSanitize(val, ancestors = new Set(), path = '') {
11
16
  if (val === null || val === undefined)
@@ -1 +1 @@
1
- {"version":3,"file":"etag.js","sourceRoot":"","sources":["../../../src/server/helpers/etag.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"etag.js","sourceRoot":"","sources":["../../../src/server/helpers/etag.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,7 @@
1
1
  export { normalizeIp, resolveIps, resolveProtocol, resolveHostname } from './ip';
2
2
  export { parseRawBody, parseMultipartFormData, streamMultipartUpload, } from './body-parser';
3
- export { serializeCookie, serializeClearCookie } from './cookie';
3
+ export { serializeCookie, serializeClearCookie, parseCookies } from './cookie';
4
4
  export { generateETag, nativeStringify } from './etag';
5
5
  export { streamToResponse } from './stream';
6
+ export { secureJsonParse, stripPrototype } from './json';
6
7
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/server/helpers/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,MAAM,CAAA;AAEhF,OAAO,EACL,YAAY,EACZ,sBAAsB,EACtB,qBAAqB,GACtB,MAAM,eAAe,CAAA;AAEtB,OAAO,EAAE,eAAe,EAAE,oBAAoB,EAAE,MAAM,UAAU,CAAA;AAEhE,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,QAAQ,CAAA;AAEtD,OAAO,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/server/helpers/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,MAAM,CAAA;AAEhF,OAAO,EACL,YAAY,EACZ,sBAAsB,EACtB,qBAAqB,GACtB,MAAM,eAAe,CAAA;AAEtB,OAAO,EAAE,eAAe,EAAE,oBAAoB,EAAE,YAAY,EAAE,MAAM,UAAU,CAAA;AAE9E,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,QAAQ,CAAA;AAEtD,OAAO,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAA;AAE3C,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,QAAQ,CAAA"}
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.streamToResponse = exports.nativeStringify = exports.generateETag = exports.serializeClearCookie = exports.serializeCookie = exports.streamMultipartUpload = exports.parseMultipartFormData = exports.parseRawBody = exports.resolveHostname = exports.resolveProtocol = exports.resolveIps = exports.normalizeIp = void 0;
3
+ exports.stripPrototype = exports.secureJsonParse = exports.streamToResponse = exports.nativeStringify = exports.generateETag = exports.parseCookies = exports.serializeClearCookie = exports.serializeCookie = exports.streamMultipartUpload = exports.parseMultipartFormData = exports.parseRawBody = exports.resolveHostname = exports.resolveProtocol = exports.resolveIps = exports.normalizeIp = void 0;
4
4
  var ip_1 = require("./ip");
5
5
  Object.defineProperty(exports, "normalizeIp", { enumerable: true, get: function () { return ip_1.normalizeIp; } });
6
6
  Object.defineProperty(exports, "resolveIps", { enumerable: true, get: function () { return ip_1.resolveIps; } });
@@ -13,9 +13,13 @@ Object.defineProperty(exports, "streamMultipartUpload", { enumerable: true, get:
13
13
  var cookie_1 = require("./cookie");
14
14
  Object.defineProperty(exports, "serializeCookie", { enumerable: true, get: function () { return cookie_1.serializeCookie; } });
15
15
  Object.defineProperty(exports, "serializeClearCookie", { enumerable: true, get: function () { return cookie_1.serializeClearCookie; } });
16
+ Object.defineProperty(exports, "parseCookies", { enumerable: true, get: function () { return cookie_1.parseCookies; } });
16
17
  var etag_1 = require("./etag");
17
18
  Object.defineProperty(exports, "generateETag", { enumerable: true, get: function () { return etag_1.generateETag; } });
18
19
  Object.defineProperty(exports, "nativeStringify", { enumerable: true, get: function () { return etag_1.nativeStringify; } });
19
20
  var stream_1 = require("./stream");
20
21
  Object.defineProperty(exports, "streamToResponse", { enumerable: true, get: function () { return stream_1.streamToResponse; } });
22
+ var json_1 = require("./json");
23
+ Object.defineProperty(exports, "secureJsonParse", { enumerable: true, get: function () { return json_1.secureJsonParse; } });
24
+ Object.defineProperty(exports, "stripPrototype", { enumerable: true, get: function () { return json_1.stripPrototype; } });
21
25
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/server/helpers/index.ts"],"names":[],"mappings":";;;AAAA,2BAAgF;AAAvE,iGAAA,WAAW,OAAA;AAAE,gGAAA,UAAU,OAAA;AAAE,qGAAA,eAAe,OAAA;AAAE,qGAAA,eAAe,OAAA;AAElE,6CAIsB;AAHpB,2GAAA,YAAY,OAAA;AACZ,qHAAA,sBAAsB,OAAA;AACtB,oHAAA,qBAAqB,OAAA;AAGvB,mCAAgE;AAAvD,yGAAA,eAAe,OAAA;AAAE,8GAAA,oBAAoB,OAAA;AAE9C,+BAAsD;AAA7C,oGAAA,YAAY,OAAA;AAAE,uGAAA,eAAe,OAAA;AAEtC,mCAA2C;AAAlC,0GAAA,gBAAgB,OAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/server/helpers/index.ts"],"names":[],"mappings":";;;AAAA,2BAAgF;AAAvE,iGAAA,WAAW,OAAA;AAAE,gGAAA,UAAU,OAAA;AAAE,qGAAA,eAAe,OAAA;AAAE,qGAAA,eAAe,OAAA;AAElE,6CAIsB;AAHpB,2GAAA,YAAY,OAAA;AACZ,qHAAA,sBAAsB,OAAA;AACtB,oHAAA,qBAAqB,OAAA;AAGvB,mCAA8E;AAArE,yGAAA,eAAe,OAAA;AAAE,8GAAA,oBAAoB,OAAA;AAAE,sGAAA,YAAY,OAAA;AAE5D,+BAAsD;AAA7C,oGAAA,YAAY,OAAA;AAAE,uGAAA,eAAe,OAAA;AAEtC,mCAA2C;AAAlC,0GAAA,gBAAgB,OAAA;AAEzB,+BAAwD;AAA/C,uGAAA,eAAe,OAAA;AAAE,sGAAA,cAAc,OAAA"}
@@ -1,5 +1,18 @@
1
1
  import type { IncomingMessage } from 'node:http';
2
2
  export declare function normalizeIp(ip: string): string;
3
+ /**
4
+ * Resolves the client IP.
5
+ *
6
+ * - `trustProxy: false` -> socket address only.
7
+ * - `trustProxy: true` -> trust every hop: CDN headers (CF-Connecting-IP,
8
+ * True-Client-IP, X-Real-IP, X-Client-IP), else the left-most
9
+ * X-Forwarded-For entry. Only safe when every request passes through a
10
+ * proxy that overwrites these headers.
11
+ * - `trustProxy: N` -> trust the N closest hops, counting the socket peer
12
+ * (Express semantics). The client is the entry N steps back from the
13
+ * socket, so values a client prepends to X-Forwarded-For are ignored.
14
+ * CDN headers are not consulted, since any client can send them.
15
+ */
3
16
  export declare function resolveIps(raw: IncomingMessage, trustProxy: boolean | number): {
4
17
  ips: string[];
5
18
  ip: string;
@@ -1 +1 @@
1
- {"version":3,"file":"ip.d.ts","sourceRoot":"","sources":["../../../src/server/helpers/ip.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,WAAW,CAAA;AAEhD,wBAAgB,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAQ9C;AAED,wBAAgB,UAAU,CACxB,GAAG,EAAE,eAAe,EACpB,UAAU,EAAE,OAAO,GAAG,MAAM,GAC3B;IAAE,GAAG,EAAE,MAAM,EAAE,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,CAoE/B;AAED,wBAAgB,eAAe,CAC7B,GAAG,EAAE,eAAe,EACpB,UAAU,EAAE,OAAO,GAAG,MAAM,GAC3B,MAAM,CAgCR;AAED,wBAAgB,eAAe,CAC7B,GAAG,EAAE,eAAe,EACpB,UAAU,EAAE,OAAO,GAAG,MAAM,GAC3B,MAAM,CAgBR"}
1
+ {"version":3,"file":"ip.d.ts","sourceRoot":"","sources":["../../../src/server/helpers/ip.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,WAAW,CAAA;AAEhD,wBAAgB,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAQ9C;AAwBD;;;;;;;;;;;;GAYG;AACH,wBAAgB,UAAU,CACxB,GAAG,EAAE,eAAe,EACpB,UAAU,EAAE,OAAO,GAAG,MAAM,GAC3B;IAAE,GAAG,EAAE,MAAM,EAAE,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,CA+C/B;AAED,wBAAgB,eAAe,CAC7B,GAAG,EAAE,eAAe,EACpB,UAAU,EAAE,OAAO,GAAG,MAAM,GAC3B,MAAM,CA6BR;AAED,wBAAgB,eAAe,CAC7B,GAAG,EAAE,eAAe,EACpB,UAAU,EAAE,OAAO,GAAG,MAAM,GAC3B,MAAM,CAaR"}
@@ -13,70 +13,83 @@ function normalizeIp(ip) {
13
13
  }
14
14
  return ip;
15
15
  }
16
+ // Env overrides are read once; process.env access is slow on the hot path.
17
+ let envTrust;
18
+ function envTrustsProxy() {
19
+ if (envTrust === undefined) {
20
+ envTrust =
21
+ process.env.TRUST_PROXY === 'true' ||
22
+ process.env.EXIS_TRUST_PROXY === 'true';
23
+ }
24
+ return envTrust;
25
+ }
26
+ function isProxyTrusted(trustProxy) {
27
+ return Boolean(trustProxy) || envTrustsProxy();
28
+ }
29
+ function firstHeader(val) {
30
+ const v = Array.isArray(val) ? val[0] : val;
31
+ if (typeof v !== 'string')
32
+ return undefined;
33
+ const t = v.trim();
34
+ return t === '' ? undefined : t;
35
+ }
36
+ /**
37
+ * Resolves the client IP.
38
+ *
39
+ * - `trustProxy: false` -> socket address only.
40
+ * - `trustProxy: true` -> trust every hop: CDN headers (CF-Connecting-IP,
41
+ * True-Client-IP, X-Real-IP, X-Client-IP), else the left-most
42
+ * X-Forwarded-For entry. Only safe when every request passes through a
43
+ * proxy that overwrites these headers.
44
+ * - `trustProxy: N` -> trust the N closest hops, counting the socket peer
45
+ * (Express semantics). The client is the entry N steps back from the
46
+ * socket, so values a client prepends to X-Forwarded-For are ignored.
47
+ * CDN headers are not consulted, since any client can send them.
48
+ */
16
49
  function resolveIps(raw, trustProxy) {
17
- const isTrusted = Boolean(trustProxy) ||
18
- process.env.TRUST_PROXY === 'true' ||
19
- process.env.EXIS_TRUST_PROXY === 'true';
20
50
  const rawRemote = raw.socket?.remoteAddress ?? '127.0.0.1';
21
51
  const remoteAddress = normalizeIp(rawRemote);
22
- if (!isTrusted) {
52
+ if (!isProxyTrusted(trustProxy)) {
23
53
  return { ips: [], ip: remoteAddress };
24
54
  }
25
- // 1. Direct Edge & CDN client IP headers
26
- const cfConnectingIp = raw.headers['cf-connecting-ip'];
27
- if (cfConnectingIp) {
28
- const rawVal = Array.isArray(cfConnectingIp)
29
- ? cfConnectingIp[0]
30
- : cfConnectingIp;
31
- if (typeof rawVal === 'string' && rawVal.trim() !== '') {
32
- const ip = normalizeIp(rawVal.trim());
55
+ const hops = typeof trustProxy === 'number' && trustProxy > 0 ? trustProxy : Infinity;
56
+ if (hops === Infinity) {
57
+ const h = raw.headers;
58
+ const direct = firstHeader(h['cf-connecting-ip']) ||
59
+ firstHeader(h['true-client-ip']) ||
60
+ firstHeader(h['x-real-ip']) ||
61
+ firstHeader(h['x-client-ip']);
62
+ if (direct) {
63
+ const ip = normalizeIp(direct);
33
64
  return { ips: [ip], ip };
34
65
  }
35
66
  }
36
- const trueClientIp = raw.headers['true-client-ip'];
37
- if (trueClientIp) {
38
- const rawVal = Array.isArray(trueClientIp) ? trueClientIp[0] : trueClientIp;
39
- if (typeof rawVal === 'string' && rawVal.trim() !== '') {
40
- const ip = normalizeIp(rawVal.trim());
41
- return { ips: [ip], ip };
42
- }
43
- }
44
- const xRealIp = raw.headers['x-real-ip'];
45
- if (xRealIp) {
46
- const rawVal = Array.isArray(xRealIp) ? xRealIp[0] : xRealIp;
47
- if (typeof rawVal === 'string' && rawVal.trim() !== '') {
48
- const ip = normalizeIp(rawVal.trim());
49
- return { ips: [ip], ip };
50
- }
51
- }
52
- const xClientIp = raw.headers['x-client-ip'];
53
- if (xClientIp) {
54
- const rawVal = Array.isArray(xClientIp) ? xClientIp[0] : xClientIp;
55
- if (typeof rawVal === 'string' && rawVal.trim() !== '') {
56
- const ip = normalizeIp(rawVal.trim());
57
- return { ips: [ip], ip };
58
- }
59
- }
60
- // 2. Parse standard X-Forwarded-For proxy chain
61
67
  const xForwardedFor = raw.headers['x-forwarded-for'];
62
- let ips = [];
63
- if (xForwardedFor) {
64
- const rawVal = Array.isArray(xForwardedFor)
65
- ? xForwardedFor.join(',')
66
- : xForwardedFor;
67
- ips = rawVal.split(',').map((item) => normalizeIp(item.trim()));
68
+ if (!xForwardedFor)
69
+ return { ips: [], ip: remoteAddress };
70
+ const rawVal = Array.isArray(xForwardedFor)
71
+ ? xForwardedFor.join(',')
72
+ : xForwardedFor;
73
+ const forwarded = [];
74
+ for (const part of rawVal.split(',')) {
75
+ const t = part.trim();
76
+ if (t !== '')
77
+ forwarded.push(normalizeIp(t));
68
78
  }
69
- let trustedIps = ips;
70
- if (typeof trustProxy === 'number' && trustProxy > 0) {
71
- trustedIps = ips.slice(-(trustProxy + 1));
79
+ if (forwarded.length === 0)
80
+ return { ips: [], ip: remoteAddress };
81
+ if (hops === Infinity) {
82
+ return { ips: forwarded, ip: forwarded[0] };
72
83
  }
73
- const ip = trustedIps.length > 0 ? trustedIps[0] : remoteAddress;
74
- return { ips: trustedIps, ip };
84
+ // Full chain as seen from the server: [...forwarded, socketPeer].
85
+ // Trusting N hops means the client sits at index (length - 1 - N).
86
+ const chainLen = forwarded.length + 1;
87
+ const clientIdx = Math.max(0, chainLen - 1 - hops);
88
+ const ips = forwarded.slice(clientIdx);
89
+ return { ips, ip: forwarded[clientIdx] };
75
90
  }
76
91
  function resolveProtocol(raw, trustProxy) {
77
- const isTrusted = Boolean(trustProxy) ||
78
- process.env.TRUST_PROXY === 'true' ||
79
- process.env.EXIS_TRUST_PROXY === 'true';
92
+ const isTrusted = isProxyTrusted(trustProxy);
80
93
  const connection = raw.socket;
81
94
  const isTls = connection?.encrypted || false;
82
95
  let protocol = isTls ? 'https' : 'http';
@@ -103,9 +116,7 @@ function resolveProtocol(raw, trustProxy) {
103
116
  return protocol;
104
117
  }
105
118
  function resolveHostname(raw, trustProxy) {
106
- const isTrusted = Boolean(trustProxy) ||
107
- process.env.TRUST_PROXY === 'true' ||
108
- process.env.EXIS_TRUST_PROXY === 'true';
119
+ const isTrusted = isProxyTrusted(trustProxy);
109
120
  let host = raw.headers['x-forwarded-host'];
110
121
  if (!host || !isTrusted) {
111
122
  host = raw.headers.host || '';
@@ -1 +1 @@
1
- {"version":3,"file":"ip.js","sourceRoot":"","sources":["../../../src/server/helpers/ip.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ip.js","sourceRoot":"","sources":["../../../src/server/helpers/ip.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export declare function stripPrototype<T>(value: T): T;
2
+ export declare function secureJsonParse<T = unknown>(text: string): T;
3
+ //# sourceMappingURL=json.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json.d.ts","sourceRoot":"","sources":["../../../src/server/helpers/json.ts"],"names":[],"mappings":"AA2BA,wBAAgB,cAAc,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,CAAC,CAG7C;AAED,wBAAgB,eAAe,CAAC,CAAC,GAAG,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,CAAC,CAM5D"}
@@ -0,0 +1,43 @@
1
+ "use strict";
2
+ // JSON body parsing with prototype-pollution protection.
3
+ //
4
+ // V8's JSON.parse is ~7x faster than round-tripping through the native
5
+ // binding (string -> serde Value -> JS object). JSON.parse never pollutes a
6
+ // prototype by itself: "__proto__" becomes an own property. The danger is a
7
+ // later merge (Object.assign, spread into defaults, deep merge) copying that
8
+ // key, so we drop "__proto__" and "constructor" keys the same way the native
9
+ // parser did. The full walk only runs when the raw text could contain either
10
+ // key; a \u escape could spell one out, so it also triggers the walk.
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.stripPrototype = stripPrototype;
13
+ exports.secureJsonParse = secureJsonParse;
14
+ const SUSPECT = /__proto__|constructor|\\u/;
15
+ function strip(value) {
16
+ if (value === null || typeof value !== 'object')
17
+ return;
18
+ if (Array.isArray(value)) {
19
+ for (const item of value)
20
+ strip(item);
21
+ return;
22
+ }
23
+ if (Object.prototype.hasOwnProperty.call(value, '__proto__')) {
24
+ delete value.__proto__;
25
+ }
26
+ if (Object.prototype.hasOwnProperty.call(value, 'constructor')) {
27
+ delete value.constructor;
28
+ }
29
+ for (const k in value)
30
+ strip(value[k]);
31
+ }
32
+ function stripPrototype(value) {
33
+ strip(value);
34
+ return value;
35
+ }
36
+ function secureJsonParse(text) {
37
+ const value = JSON.parse(text);
38
+ if (value !== null && typeof value === 'object' && SUSPECT.test(text)) {
39
+ strip(value);
40
+ }
41
+ return value;
42
+ }
43
+ //# sourceMappingURL=json.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json.js","sourceRoot":"","sources":["../../../src/server/helpers/json.ts"],"names":[],"mappings":";AAAA,yDAAyD;AACzD,EAAE;AACF,uEAAuE;AACvE,4EAA4E;AAC5E,4EAA4E;AAC5E,6EAA6E;AAC7E,6EAA6E;AAC7E,6EAA6E;AAC7E,sEAAsE;;AAmBtE,wCAGC;AAED,0CAMC;AA5BD,MAAM,OAAO,GAAG,2BAA2B,CAAA;AAE3C,SAAS,KAAK,CAAC,KAAU;IACvB,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAM;IACvD,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,KAAK,MAAM,IAAI,IAAI,KAAK;YAAE,KAAK,CAAC,IAAI,CAAC,CAAA;QACrC,OAAM;IACR,CAAC;IACD,IAAI,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,EAAE,WAAW,CAAC,EAAE,CAAC;QAC7D,OAAO,KAAK,CAAC,SAAS,CAAA;IACxB,CAAC;IACD,IAAI,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,EAAE,aAAa,CAAC,EAAE,CAAC;QAC/D,OAAO,KAAK,CAAC,WAAW,CAAA;IAC1B,CAAC;IACD,KAAK,MAAM,CAAC,IAAI,KAAK;QAAE,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAA;AACxC,CAAC;AAED,SAAgB,cAAc,CAAI,KAAQ;IACxC,KAAK,CAAC,KAAK,CAAC,CAAA;IACZ,OAAO,KAAK,CAAA;AACd,CAAC;AAED,SAAgB,eAAe,CAAc,IAAY;IACvD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;IAC9B,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QACtE,KAAK,CAAC,KAAK,CAAC,CAAA;IACd,CAAC;IACD,OAAO,KAAK,CAAA;AACd,CAAC"}
@@ -0,0 +1,9 @@
1
+ export declare function safeUploadName(fieldname: string, filename: string): string;
2
+ export declare function safeUploadPath(destDir: string, fieldname: string, filename: string): string;
3
+ export declare const DEFAULT_UPLOAD_LIMITS: {
4
+ files: number;
5
+ fields: number;
6
+ parts: number;
7
+ fieldSize: number;
8
+ };
9
+ //# sourceMappingURL=upload-name.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"upload-name.d.ts","sourceRoot":"","sources":["../../../src/server/helpers/upload-name.ts"],"names":[],"mappings":"AAOA,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAQ1E;AAGD,wBAAgB,cAAc,CAC5B,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,GACf,MAAM,CAOR;AAGD,eAAO,MAAM,qBAAqB;;;;;CAKjC,CAAA"}
@@ -0,0 +1,39 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.DEFAULT_UPLOAD_LIMITS = void 0;
7
+ exports.safeUploadName = safeUploadName;
8
+ exports.safeUploadPath = safeUploadPath;
9
+ const node_crypto_1 = require("node:crypto");
10
+ const node_path_1 = __importDefault(require("node:path"));
11
+ // The multipart field name and filename are client-controlled. Neither may
12
+ // reach the filesystem as-is: "../../x" in a field name used to escape the
13
+ // upload directory via path.join. Only a short alnum token of each survives,
14
+ // and the random part is a UUID instead of guessable Date.now()/Math.random().
15
+ function safeUploadName(fieldname, filename) {
16
+ const field = String(fieldname || 'file')
17
+ .replace(/[^A-Za-z0-9_-]/g, '_')
18
+ .slice(0, 64) || 'file';
19
+ const rawExt = node_path_1.default.extname(String(filename || '')).toLowerCase();
20
+ const ext = /^\.[a-z0-9]{1,16}$/.test(rawExt) ? rawExt : '';
21
+ return `${field}-${(0, node_crypto_1.randomUUID)()}${ext}`;
22
+ }
23
+ // Joins and verifies the result stays inside destDir
24
+ function safeUploadPath(destDir, fieldname, filename) {
25
+ const root = node_path_1.default.resolve(destDir);
26
+ const dest = node_path_1.default.resolve(root, safeUploadName(fieldname, filename));
27
+ if (node_path_1.default.dirname(dest) !== root) {
28
+ throw new Error('Refusing to write upload outside destination directory');
29
+ }
30
+ return dest;
31
+ }
32
+ // Applied when a route configures no limits of its own
33
+ exports.DEFAULT_UPLOAD_LIMITS = {
34
+ files: 10,
35
+ fields: 100,
36
+ parts: 200,
37
+ fieldSize: 1024 * 1024,
38
+ };
39
+ //# sourceMappingURL=upload-name.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"upload-name.js","sourceRoot":"","sources":["../../../src/server/helpers/upload-name.ts"],"names":[],"mappings":";;;;;;AAOA,wCAQC;AAGD,wCAWC;AA7BD,6CAAwC;AACxC,0DAA4B;AAE5B,2EAA2E;AAC3E,2EAA2E;AAC3E,6EAA6E;AAC7E,+EAA+E;AAC/E,SAAgB,cAAc,CAAC,SAAiB,EAAE,QAAgB;IAChE,MAAM,KAAK,GACT,MAAM,CAAC,SAAS,IAAI,MAAM,CAAC;SACxB,OAAO,CAAC,iBAAiB,EAAE,GAAG,CAAC;SAC/B,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,MAAM,CAAA;IAC3B,MAAM,MAAM,GAAG,mBAAI,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAA;IACjE,MAAM,GAAG,GAAG,oBAAoB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAA;IAC3D,OAAO,GAAG,KAAK,IAAI,IAAA,wBAAU,GAAE,GAAG,GAAG,EAAE,CAAA;AACzC,CAAC;AAED,qDAAqD;AACrD,SAAgB,cAAc,CAC5B,OAAe,EACf,SAAiB,EACjB,QAAgB;IAEhB,MAAM,IAAI,GAAG,mBAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAA;IAClC,MAAM,IAAI,GAAG,mBAAI,CAAC,OAAO,CAAC,IAAI,EAAE,cAAc,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC,CAAA;IACpE,IAAI,mBAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;QAChC,MAAM,IAAI,KAAK,CAAC,wDAAwD,CAAC,CAAA;IAC3E,CAAC;IACD,OAAO,IAAI,CAAA;AACb,CAAC;AAED,uDAAuD;AAC1C,QAAA,qBAAqB,GAAG;IACnC,KAAK,EAAE,EAAE;IACT,MAAM,EAAE,GAAG;IACX,KAAK,EAAE,GAAG;IACV,SAAS,EAAE,IAAI,GAAG,IAAI;CACvB,CAAA"}
@@ -7,14 +7,7 @@ export declare class RequestHandler {
7
7
  private app;
8
8
  private _compiledPipeline?;
9
9
  static activeRequests: number;
10
- private _reqPool;
11
- private _resPool;
12
- private static readonly MAX_POOL_SIZE;
13
10
  constructor(app: App<any>);
14
- private _acquireReq;
15
- private _acquireRes;
16
- private _releaseReq;
17
- private _releaseRes;
18
11
  getCompiledPipeline(): Handler[];
19
12
  inject(options: {
20
13
  method?: string;
@@ -1 +1 @@
1
- {"version":3,"file":"request-handler.d.ts","sourceRoot":"","sources":["../../src/server/request-handler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,OAAO,CAAA;AAChC,OAAa,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,WAAW,CAAA;AACjE,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAA;AACvC,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAIzC,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,UAAU,CAAA;AAMvC,qBAAa,cAAc;IAWb,OAAO,CAAC,GAAG;IAVvB,OAAO,CAAC,iBAAiB,CAAC,CAAW;IACrC,OAAc,cAAc,SAAI;IAKhC,OAAO,CAAC,QAAQ,CAAoB;IACpC,OAAO,CAAC,QAAQ,CAAqB;IACrC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAO;gBAExB,GAAG,EAAE,GAAG,CAAC,GAAG,CAAC;IAEjC,OAAO,CAAC,WAAW;IAanB,OAAO,CAAC,WAAW;IAQnB,OAAO,CAAC,WAAW;IAOnB,OAAO,CAAC,WAAW;IAOZ,mBAAmB,IAAI,OAAO,EAAE;IAoB1B,MAAM,CAAC,OAAO,EAAE;QAC3B,MAAM,CAAC,EAAE,MAAM,CAAA;QACf,GAAG,EAAE,MAAM,CAAA;QACX,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;QAChC,IAAI,CAAC,EAAE,GAAG,CAAA;QACV,OAAO,CAAC,EAAE,GAAG,CAAA;KACd,GAAG,OAAO,CAAC,OAAO,mBAAmB,EAAE,YAAY,CAAC;IAwF9C,mBAAmB,CACxB,GAAG,EAAE,WAAW,EAChB,GAAG,EAAE,YAAY,EACjB,SAAS,EAAE,MAAM,IAAI,GACpB,IAAI;IA6BA,MAAM,CAAC,MAAM,EAAE,eAAe,EAAE,MAAM,EAAE,cAAc,GAAG,IAAI;YA2DtD,gBAAgB;YAuChB,iBAAiB;CAuChC"}
1
+ {"version":3,"file":"request-handler.d.ts","sourceRoot":"","sources":["../../src/server/request-handler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,OAAO,CAAA;AAChC,OAAa,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,WAAW,CAAA;AACjE,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAA;AACvC,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAIzC,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,UAAU,CAAA;AAMvC,qBAAa,cAAc;IAIb,OAAO,CAAC,GAAG;IAHvB,OAAO,CAAC,iBAAiB,CAAC,CAAW;IACrC,OAAc,cAAc,SAAI;gBAEZ,GAAG,EAAE,GAAG,CAAC,GAAG,CAAC;IAE1B,mBAAmB,IAAI,OAAO,EAAE;IAsB1B,MAAM,CAAC,OAAO,EAAE;QAC3B,MAAM,CAAC,EAAE,MAAM,CAAA;QACf,GAAG,EAAE,MAAM,CAAA;QACX,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;QAChC,IAAI,CAAC,EAAE,GAAG,CAAA;QACV,OAAO,CAAC,EAAE,GAAG,CAAA;KACd,GAAG,OAAO,CAAC,OAAO,mBAAmB,EAAE,YAAY,CAAC;IAwF9C,mBAAmB,CACxB,GAAG,EAAE,WAAW,EAChB,GAAG,EAAE,YAAY,EACjB,SAAS,EAAE,MAAM,IAAI,GACpB,IAAI;IA6BA,MAAM,CAAC,MAAM,EAAE,eAAe,EAAE,MAAM,EAAE,cAAc,GAAG,IAAI;YAyDtD,gBAAgB;YAuChB,iBAAiB;CAuChC"}
@@ -49,37 +49,6 @@ const noop = () => {
49
49
  class RequestHandler {
50
50
  constructor(app) {
51
51
  this.app = app;
52
- // ─── Object Pools ───────────────────────────────────────────────────────────
53
- // Recycle ExisRequest and ExisResponse objects instead of allocating new ones
54
- // per request. This dramatically reduces V8 GC pressure under high load.
55
- this._reqPool = [];
56
- this._resPool = [];
57
- }
58
- _acquireReq(rawReq, res, trustProxy, bodyLimit) {
59
- const pooled = this._reqPool.pop();
60
- if (pooled) {
61
- return pooled.init(rawReq, res, trustProxy, bodyLimit);
62
- }
63
- return new request_1.ExisRequest(rawReq, res, trustProxy, bodyLimit);
64
- }
65
- _acquireRes(rawRes) {
66
- const pooled = this._resPool.pop();
67
- if (pooled) {
68
- return pooled.init(rawRes);
69
- }
70
- return new response_1.ExisResponse(rawRes);
71
- }
72
- _releaseReq(req) {
73
- req.cleanup();
74
- if (this._reqPool.length < RequestHandler.MAX_POOL_SIZE) {
75
- this._reqPool.push(req);
76
- }
77
- }
78
- _releaseRes(res) {
79
- res.req = undefined;
80
- if (this._resPool.length < RequestHandler.MAX_POOL_SIZE) {
81
- this._resPool.push(res);
82
- }
83
52
  }
84
53
  getCompiledPipeline() {
85
54
  if (this._compiledPipeline)
@@ -87,8 +56,12 @@ class RequestHandler {
87
56
  this.app.applyBuiltins();
88
57
  if (this.app.globalMiddleware.length === 0) {
89
58
  this._compiledPipeline = [
90
- (req, res) => this.app.getRouter().handle(req, res, () => {
91
- (0, middleware_1.notFound)(req, res, noop);
59
+ (req, res, next) => this.app.getRouter().handle(req, res, (err) => {
60
+ // Route errors must reach the error handlers, not become a 404
61
+ if (err)
62
+ next(err);
63
+ else
64
+ (0, middleware_1.notFound)(req, res, noop);
92
65
  }),
93
66
  ];
94
67
  }
@@ -209,31 +182,32 @@ class RequestHandler {
209
182
  }
210
183
  handle(rawReq, rawRes) {
211
184
  RequestHandler.activeRequests++;
212
- const res = this._acquireRes(rawRes);
213
- const req = this._acquireReq(rawReq, res, this.app.options.trustProxy, this.app.options.bodyLimit);
185
+ // Fresh objects per request. Pooling them is unsafe: a handler that is
186
+ // still awaiting after the client disconnects would observe the next
187
+ // request's data once the object is recycled. Short-lived objects are
188
+ // cheap for V8's young generation, so pooling buys nothing measurable.
189
+ const res = new response_1.ExisResponse(rawRes);
190
+ const req = new request_1.ExisRequest(rawReq, res, this.app.options.trustProxy, this.app.options.bodyLimit);
214
191
  res.req = req;
215
192
  res.etagEnabled = this.app.options.etag === true;
216
193
  req.log = this.app.log;
217
- // Recycle objects back to pool and decrement active request counter when the response is fully done
194
+ // Fired by res.end()'s completion callback, or by 'close' when the
195
+ // client disconnects before the response finished.
218
196
  let isDone = false;
219
197
  const onDone = () => {
220
198
  if (isDone)
221
199
  return;
222
200
  isDone = true;
223
- if (RequestHandler.activeRequests > 0) {
201
+ if (RequestHandler.activeRequests > 0)
224
202
  RequestHandler.activeRequests--;
225
- }
226
- this._releaseReq(req);
227
- this._releaseRes(res);
228
203
  };
229
204
  res._onDone = onDone;
230
- if (typeof rawRes.once === 'function') {
231
- rawRes.once('close', onDone);
232
- }
233
- else if (typeof rawRes.on === 'function') {
205
+ // Covers clients that disconnect before res.end(); 'close' fires at most
206
+ // once, so a plain listener avoids the once() wrapper allocation
207
+ if (typeof rawRes.on === 'function')
234
208
  rawRes.on('close', onDone);
235
- }
236
209
  const pipeline = this._compiledPipeline || this.getCompiledPipeline();
210
+ (0, middleware_1.assignRequestId)(req, res);
237
211
  this._executeWithContext(req, res, () => {
238
212
  if (this.app.hooks.request.length === 0 &&
239
213
  this.app.hooks.response.length === 0) {
@@ -310,5 +284,4 @@ class RequestHandler {
310
284
  }
311
285
  exports.RequestHandler = RequestHandler;
312
286
  RequestHandler.activeRequests = 0;
313
- RequestHandler.MAX_POOL_SIZE = 2048;
314
287
  //# sourceMappingURL=request-handler.js.map