elysia 2.0.0-beta.2 → 2.0.0-beta.21

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 (339) hide show
  1. package/dist/adapter/bun/index.d.ts +18 -2
  2. package/dist/adapter/bun/index.js +467 -110
  3. package/dist/adapter/bun/index.mjs +467 -112
  4. package/dist/adapter/types.d.ts +2 -21
  5. package/dist/adapter/utils.d.ts +14 -3
  6. package/dist/adapter/utils.js +146 -87
  7. package/dist/adapter/utils.mjs +148 -90
  8. package/dist/adapter/web-standard/handler.d.ts +1 -1
  9. package/dist/adapter/web-standard/handler.js +47 -36
  10. package/dist/adapter/web-standard/handler.mjs +48 -37
  11. package/dist/adapter/web-standard/index.js +2 -30
  12. package/dist/adapter/web-standard/index.mjs +2 -30
  13. package/dist/adapter/web-standard/utils.js +5 -18
  14. package/dist/adapter/web-standard/utils.mjs +5 -18
  15. package/dist/base.d.ts +99 -67
  16. package/dist/base.js +678 -510
  17. package/dist/base.mjs +682 -514
  18. package/dist/compile/aot-capture.d.ts +2 -13
  19. package/dist/compile/aot-capture.js +26 -69
  20. package/dist/compile/aot-capture.mjs +28 -67
  21. package/dist/compile/aot-emit.d.ts +9 -7
  22. package/dist/compile/aot-emit.js +42 -19
  23. package/dist/compile/aot-emit.mjs +42 -20
  24. package/dist/compile/aot.d.ts +17 -19
  25. package/dist/compile/aot.js +41 -51
  26. package/dist/compile/aot.mjs +39 -49
  27. package/dist/compile/handler/descriptor.d.ts +9 -12
  28. package/dist/compile/handler/descriptor.js +19 -44
  29. package/dist/compile/handler/descriptor.mjs +20 -42
  30. package/dist/compile/handler/frozen-validator.d.ts +5 -10
  31. package/dist/compile/handler/frozen-validator.js +55 -105
  32. package/dist/compile/handler/frozen-validator.mjs +53 -105
  33. package/dist/compile/handler/index.d.ts +7 -5
  34. package/dist/compile/handler/index.js +270 -111
  35. package/dist/compile/handler/index.mjs +270 -113
  36. package/dist/compile/handler/jit.d.ts +19 -17
  37. package/dist/compile/handler/jit.js +222 -149
  38. package/dist/compile/handler/jit.mjs +224 -152
  39. package/dist/compile/handler/params.d.ts +1 -4
  40. package/dist/compile/handler/params.js +10 -5
  41. package/dist/compile/handler/params.mjs +14 -8
  42. package/dist/compile/handler/reconstruct.d.ts +2 -2
  43. package/dist/compile/handler/reconstruct.js +6 -4
  44. package/dist/compile/handler/reconstruct.mjs +6 -4
  45. package/dist/compile/handler/static-clone-resolver.d.ts +6 -0
  46. package/dist/compile/handler/static-clone-resolver.js +8 -0
  47. package/dist/compile/handler/static-clone-resolver.mjs +7 -0
  48. package/dist/compile/handler/utils.d.ts +22 -11
  49. package/dist/compile/handler/utils.js +159 -253
  50. package/dist/compile/handler/utils.mjs +155 -252
  51. package/dist/compile/jit-probe.d.ts +2 -2
  52. package/dist/compile/jit-probe.js +2 -3
  53. package/dist/compile/jit-probe.mjs +2 -3
  54. package/dist/compile/lexer.d.ts +7 -4
  55. package/dist/compile/lexer.js +268 -6
  56. package/dist/compile/lexer.mjs +268 -4
  57. package/dist/compile/utils.js +7 -4
  58. package/dist/compile/utils.mjs +7 -4
  59. package/dist/compiled.d.ts +0 -1
  60. package/dist/compiled.js +0 -1
  61. package/dist/compiled.mjs +0 -1
  62. package/dist/context.d.ts +14 -4
  63. package/dist/context.js +17 -32
  64. package/dist/context.mjs +19 -34
  65. package/dist/cookie/config.d.ts +7 -2
  66. package/dist/cookie/config.js +76 -16
  67. package/dist/cookie/config.mjs +77 -18
  68. package/dist/cookie/cookie.d.ts +1 -1
  69. package/dist/cookie/cookie.js +8 -10
  70. package/dist/cookie/cookie.mjs +8 -10
  71. package/dist/cookie/crypto.d.ts +8 -7
  72. package/dist/cookie/crypto.js +51 -40
  73. package/dist/cookie/crypto.mjs +51 -41
  74. package/dist/cookie/error.d.ts +1 -2
  75. package/dist/cookie/error.js +6 -4
  76. package/dist/cookie/error.mjs +6 -4
  77. package/dist/cookie/lib.js +7 -2
  78. package/dist/cookie/lib.mjs +7 -2
  79. package/dist/cookie/serialize.js +1 -1
  80. package/dist/cookie/serialize.mjs +1 -1
  81. package/dist/cookie/types.d.ts +10 -0
  82. package/dist/cookie/utils.d.ts +4 -8
  83. package/dist/cookie/utils.js +86 -52
  84. package/dist/cookie/utils.mjs +89 -54
  85. package/dist/error.d.ts +113 -103
  86. package/dist/error.js +181 -117
  87. package/dist/error.mjs +179 -118
  88. package/dist/generation.d.ts +2 -2
  89. package/dist/handler/error.d.ts +26 -15
  90. package/dist/handler/error.js +77 -96
  91. package/dist/handler/error.mjs +74 -97
  92. package/dist/handler/fetch.js +87 -108
  93. package/dist/handler/fetch.mjs +89 -110
  94. package/dist/handler/utils.d.ts +12 -6
  95. package/dist/handler/utils.js +84 -28
  96. package/dist/handler/utils.mjs +80 -28
  97. package/dist/index.d.ts +12 -12
  98. package/dist/index.js +2 -9
  99. package/dist/index.mjs +1 -1
  100. package/dist/memory.js +1 -1
  101. package/dist/memory.mjs +1 -1
  102. package/dist/package.js +1 -1
  103. package/dist/package.mjs +1 -1
  104. package/dist/plugin/aot/bun.d.ts +8 -1
  105. package/dist/plugin/aot/bun.js +16 -9
  106. package/dist/plugin/aot/bun.mjs +17 -10
  107. package/dist/plugin/aot/core.d.ts +52 -60
  108. package/dist/plugin/aot/core.js +208 -109
  109. package/dist/plugin/aot/core.mjs +205 -111
  110. package/dist/plugin/aot/esbuild.js +8 -5
  111. package/dist/plugin/aot/esbuild.mjs +9 -6
  112. package/dist/plugin/aot/hooks.d.ts +6 -17
  113. package/dist/plugin/aot/hooks.js +36 -14
  114. package/dist/plugin/aot/hooks.mjs +37 -16
  115. package/dist/plugin/aot/rspack-loader.d.ts +1 -5
  116. package/dist/plugin/aot/rspack-loader.js +1 -10
  117. package/dist/plugin/aot/rspack-loader.mjs +1 -10
  118. package/dist/plugin/aot/rspack.js +2 -5
  119. package/dist/plugin/aot/rspack.mjs +3 -6
  120. package/dist/plugin/aot/source.d.ts +6 -42
  121. package/dist/plugin/aot/source.js +71 -71
  122. package/dist/plugin/aot/source.mjs +72 -72
  123. package/dist/plugin/aot/treeshake.js +2 -6
  124. package/dist/plugin/aot/treeshake.mjs +2 -6
  125. package/dist/plugin/aot/unplugin.d.ts +1 -4
  126. package/dist/plugin/aot/unplugin.js +4 -13
  127. package/dist/plugin/aot/unplugin.mjs +4 -13
  128. package/dist/plugin/aot/vite.d.ts +2 -6
  129. package/dist/plugin/aot/worker.js +2 -2
  130. package/dist/plugin/aot/worker.mjs +2 -2
  131. package/dist/plugin/auto-head.js +1 -10
  132. package/dist/plugin/auto-head.mjs +1 -10
  133. package/dist/plugin/trace.d.ts +2 -1
  134. package/dist/route-table.d.ts +3 -0
  135. package/dist/route-table.js +16 -11
  136. package/dist/route-table.mjs +16 -11
  137. package/dist/schema-snapshot.d.ts +0 -4
  138. package/dist/schema-snapshot.js +32 -49
  139. package/dist/schema-snapshot.mjs +32 -49
  140. package/dist/sucrose.d.ts +6 -55
  141. package/dist/sucrose.js +103 -731
  142. package/dist/sucrose.mjs +102 -724
  143. package/dist/trace.d.ts +5 -8
  144. package/dist/trace.js +23 -134
  145. package/dist/trace.mjs +24 -135
  146. package/dist/type/bridge-live.d.ts +4 -2
  147. package/dist/type/bridge-live.js +6 -3
  148. package/dist/type/bridge-live.mjs +4 -2
  149. package/dist/type/bridge.d.ts +6 -4
  150. package/dist/type/bridge.js +17 -9
  151. package/dist/type/bridge.mjs +5 -3
  152. package/dist/type/coerce-plan.d.ts +5 -5
  153. package/dist/type/coerce-plan.js +41 -39
  154. package/dist/type/coerce-plan.mjs +43 -39
  155. package/dist/type/coerce.d.ts +3 -7
  156. package/dist/type/coerce.js +18 -75
  157. package/dist/type/coerce.mjs +19 -76
  158. package/dist/type/compat.d.ts +3 -0
  159. package/dist/type/compat.js +23 -14
  160. package/dist/type/compat.mjs +20 -10
  161. package/dist/type/elysia/array-buffer.d.ts +4 -1
  162. package/dist/type/elysia/array-buffer.js +17 -17
  163. package/dist/type/elysia/array-buffer.mjs +17 -17
  164. package/dist/type/elysia/array-string.js +2 -40
  165. package/dist/type/elysia/array-string.mjs +2 -39
  166. package/dist/type/elysia/array.js +5 -9
  167. package/dist/type/elysia/array.mjs +5 -9
  168. package/dist/type/elysia/boolean-string.js +2 -3
  169. package/dist/type/elysia/boolean-string.mjs +1 -1
  170. package/dist/type/elysia/boolean.js +3 -12
  171. package/dist/type/elysia/boolean.mjs +3 -11
  172. package/dist/type/elysia/cookie.d.ts +3 -4
  173. package/dist/type/elysia/cookie.js +5 -15
  174. package/dist/type/elysia/cookie.mjs +5 -15
  175. package/dist/type/elysia/date.js +13 -20
  176. package/dist/type/elysia/date.mjs +10 -16
  177. package/dist/type/elysia/file-type.d.ts +11 -4
  178. package/dist/type/elysia/file-type.js +17 -2
  179. package/dist/type/elysia/file-type.mjs +17 -3
  180. package/dist/type/elysia/file.d.ts +1 -3
  181. package/dist/type/elysia/file.js +11 -27
  182. package/dist/type/elysia/file.mjs +11 -12
  183. package/dist/type/elysia/files.js +7 -11
  184. package/dist/type/elysia/files.mjs +7 -10
  185. package/dist/type/elysia/form.js +2 -3
  186. package/dist/type/elysia/form.mjs +3 -3
  187. package/dist/type/elysia/integer-string.d.ts +1 -1
  188. package/dist/type/elysia/integer-string.js +4 -30
  189. package/dist/type/elysia/integer-string.mjs +5 -30
  190. package/dist/type/elysia/integer.js +3 -12
  191. package/dist/type/elysia/integer.mjs +3 -11
  192. package/dist/type/elysia/intersect.js +0 -5
  193. package/dist/type/elysia/intersect.mjs +0 -5
  194. package/dist/type/elysia/json-string.d.ts +7 -0
  195. package/dist/type/elysia/json-string.js +47 -0
  196. package/dist/type/elysia/json-string.mjs +46 -0
  197. package/dist/type/elysia/keep-config.d.ts +14 -0
  198. package/dist/type/elysia/keep-config.js +62 -0
  199. package/dist/type/elysia/keep-config.mjs +53 -0
  200. package/dist/type/elysia/maybe-empty.js +3 -4
  201. package/dist/type/elysia/maybe-empty.mjs +1 -1
  202. package/dist/type/elysia/nullable.js +2 -3
  203. package/dist/type/elysia/nullable.mjs +1 -1
  204. package/dist/type/elysia/number.d.ts +2 -1
  205. package/dist/type/elysia/number.js +19 -11
  206. package/dist/type/elysia/number.mjs +18 -10
  207. package/dist/type/elysia/numeric-enum.d.ts +1 -1
  208. package/dist/type/elysia/numeric-enum.js +4 -5
  209. package/dist/type/elysia/numeric-enum.mjs +3 -3
  210. package/dist/type/elysia/numeric.d.ts +4 -2
  211. package/dist/type/elysia/numeric.js +20 -17
  212. package/dist/type/elysia/numeric.mjs +19 -16
  213. package/dist/type/elysia/object-string.js +2 -37
  214. package/dist/type/elysia/object-string.mjs +2 -36
  215. package/dist/type/elysia/object.js +5 -9
  216. package/dist/type/elysia/object.mjs +5 -9
  217. package/dist/type/elysia/optional.js +8 -8
  218. package/dist/type/elysia/optional.mjs +7 -7
  219. package/dist/type/elysia/problem.d.ts +20 -0
  220. package/dist/type/elysia/problem.js +25 -0
  221. package/dist/type/elysia/problem.mjs +24 -0
  222. package/dist/type/elysia/string.js +4 -3
  223. package/dist/type/elysia/string.mjs +4 -2
  224. package/dist/type/elysia/uint8-array.d.ts +1 -1
  225. package/dist/type/elysia/uint8-array.js +5 -20
  226. package/dist/type/elysia/uint8-array.mjs +5 -19
  227. package/dist/type/elysia/union-enum.js +7 -8
  228. package/dist/type/elysia/union-enum.mjs +6 -6
  229. package/dist/type/elysia/union.js +0 -5
  230. package/dist/type/elysia/union.mjs +0 -5
  231. package/dist/type/elysia/utils.d.ts +2 -4
  232. package/dist/type/elysia/utils.js +10 -21
  233. package/dist/type/elysia/utils.mjs +7 -15
  234. package/dist/type/exports.d.ts +4 -2
  235. package/dist/type/exports.js +23 -2
  236. package/dist/type/exports.mjs +11 -2
  237. package/dist/type/index.d.ts +10 -2
  238. package/dist/type/index.js +62 -15
  239. package/dist/type/index.mjs +65 -11
  240. package/dist/type/shared.d.ts +3 -9
  241. package/dist/type/shared.js +44 -97
  242. package/dist/type/shared.mjs +43 -97
  243. package/dist/type/sync-require.d.ts +11 -0
  244. package/dist/type/sync-require.js +14 -0
  245. package/dist/type/sync-require.mjs +12 -0
  246. package/dist/type/typebox-system-lite.d.ts +2 -0
  247. package/dist/type/typebox-system-lite.js +34 -0
  248. package/dist/type/typebox-system-lite.mjs +3 -0
  249. package/dist/type/typebox-system-require.d.ts +7 -0
  250. package/dist/type/typebox-system-require.js +24 -0
  251. package/dist/type/typebox-system-require.mjs +23 -0
  252. package/dist/type/typebox-type-live.d.ts +11 -0
  253. package/dist/type/typebox-type-live.js +45 -0
  254. package/dist/type/typebox-type-live.mjs +20 -0
  255. package/dist/type/typebox-type.d.ts +34 -0
  256. package/dist/type/typebox-type.js +199 -0
  257. package/dist/type/typebox-type.mjs +86 -0
  258. package/dist/type/typebox-value-live.d.ts +11 -0
  259. package/dist/type/typebox-value-live.js +31 -0
  260. package/dist/type/typebox-value-live.mjs +13 -0
  261. package/dist/type/typebox-value-ops.d.ts +4 -0
  262. package/dist/type/typebox-value-ops.js +90 -0
  263. package/dist/type/typebox-value-ops.mjs +5 -0
  264. package/dist/type/typebox-value-require.d.ts +8 -0
  265. package/dist/type/typebox-value-require.js +28 -0
  266. package/dist/type/typebox-value-require.mjs +25 -0
  267. package/dist/type/typebox-value.d.ts +35 -0
  268. package/dist/type/typebox-value.js +161 -0
  269. package/dist/type/typebox-value.mjs +74 -0
  270. package/dist/type/utils.js +1 -10
  271. package/dist/type/utils.mjs +1 -10
  272. package/dist/type/validator/clean-safe.d.ts +2 -4
  273. package/dist/type/validator/clean-safe.js +15 -11
  274. package/dist/type/validator/clean-safe.mjs +16 -10
  275. package/dist/type/validator/custom-error.js +12 -16
  276. package/dist/type/validator/custom-error.mjs +11 -14
  277. package/dist/type/validator/default-precompute.d.ts +9 -1
  278. package/dist/type/validator/default-precompute.js +40 -77
  279. package/dist/type/validator/default-precompute.mjs +37 -74
  280. package/dist/type/validator/exact-mirror-live.d.ts +8 -0
  281. package/dist/type/validator/exact-mirror-live.js +22 -0
  282. package/dist/type/validator/exact-mirror-live.mjs +17 -0
  283. package/dist/type/validator/exact-mirror-require.d.ts +4 -0
  284. package/dist/type/validator/exact-mirror-require.js +11 -0
  285. package/dist/type/validator/exact-mirror-require.mjs +9 -0
  286. package/dist/type/validator/exact-mirror.js +8 -8
  287. package/dist/type/validator/exact-mirror.mjs +9 -8
  288. package/dist/type/validator/frozen-check.js +5 -6
  289. package/dist/type/validator/frozen-check.mjs +6 -7
  290. package/dist/type/validator/index.d.ts +1 -0
  291. package/dist/type/validator/index.js +169 -166
  292. package/dist/type/validator/index.mjs +162 -158
  293. package/dist/type/validator/string-codec-aot.d.ts +2 -1
  294. package/dist/type/validator/string-codec-aot.js +8 -2
  295. package/dist/type/validator/string-codec-aot.mjs +7 -2
  296. package/dist/type/validator/validator-cache.d.ts +5 -4
  297. package/dist/type/validator/validator-cache.js +41 -24
  298. package/dist/type/validator/validator-cache.mjs +40 -22
  299. package/dist/types.d.ts +263 -95
  300. package/dist/universal/constants.d.ts +2 -1
  301. package/dist/universal/constants.js +3 -1
  302. package/dist/universal/constants.mjs +2 -1
  303. package/dist/universal/env.js +2 -3
  304. package/dist/universal/env.mjs +2 -3
  305. package/dist/universal/file.d.ts +6 -4
  306. package/dist/universal/file.js +11 -16
  307. package/dist/universal/file.mjs +12 -16
  308. package/dist/universal/index.d.ts +2 -2
  309. package/dist/universal/is-production.d.ts +1 -2
  310. package/dist/universal/is-production.js +1 -3
  311. package/dist/universal/is-production.mjs +2 -3
  312. package/dist/universal/server.d.ts +0 -272
  313. package/dist/utils.d.ts +43 -7
  314. package/dist/utils.js +181 -126
  315. package/dist/utils.mjs +168 -126
  316. package/dist/validator/index.d.ts +1 -1
  317. package/dist/validator/index.js +17 -30
  318. package/dist/validator/index.mjs +18 -31
  319. package/dist/validator/route.js +2 -1
  320. package/dist/validator/route.mjs +2 -1
  321. package/dist/ws/context.d.ts +8 -1
  322. package/dist/ws/context.js +68 -44
  323. package/dist/ws/context.mjs +67 -44
  324. package/dist/ws/parser.js +10 -20
  325. package/dist/ws/parser.mjs +10 -20
  326. package/dist/ws/route.d.ts +2 -2
  327. package/dist/ws/route.js +249 -141
  328. package/dist/ws/route.mjs +254 -146
  329. package/dist/ws/types.d.ts +2 -2
  330. package/package.json +23 -49
  331. package/dist/compile/analysis-cache.d.ts +0 -6
  332. package/dist/compile/analysis-cache.js +0 -12
  333. package/dist/compile/analysis-cache.mjs +0 -11
  334. package/dist/cookie/index.d.ts +0 -7
  335. package/dist/cookie/index.js +0 -13
  336. package/dist/cookie/index.mjs +0 -7
  337. package/dist/handler/index.d.ts +0 -2
  338. package/dist/handler/index.js +0 -5
  339. package/dist/handler/index.mjs +0 -3
@@ -13,8 +13,8 @@ let deuri = require("deuri");
13
13
  deuri = require_runtime.__toESM(deuri);
14
14
 
15
15
  //#region src/handler/fetch.ts
16
- function extractPath(url, context, pathStart) {
17
- const s = url.indexOf("/", pathStart);
16
+ function extractPath(url, context) {
17
+ const s = url.indexOf("/", require_utils.authorityEnd(url));
18
18
  const q = context.qi = url.indexOf("?", s);
19
19
  return context.path = q === -1 ? url.slice(s) : url.substring(s, q);
20
20
  }
@@ -23,7 +23,7 @@ function notFound(context) {
23
23
  if (set.cookie || require_utils.isNotEmpty(set.headers)) {
24
24
  require_adapter_utils.handleSet(set);
25
25
  if (!set.headers["content-type"]) require_adapter_utils.materializeSetHeaders(set)["content-type"] = require_error.PROBLEM_JSON;
26
- return new Response(require_handler_utils.NOT_FOUND_BODY, {
26
+ return new Response(require_handler_utils.getNotFoundBody(), {
27
27
  status: 404,
28
28
  headers: set.headers
29
29
  });
@@ -37,12 +37,16 @@ function decodeParams(params) {
37
37
  }
38
38
  return params;
39
39
  }
40
- const notFoundBody = Object.freeze({ code: "NOT_FOUND" });
41
- function finalizeError(context, handleError, afterResponse, error) {
42
- if (error === notFoundBody) error = new require_error.NotFound();
40
+ const warnedPathMutation = /* @__PURE__ */ new WeakSet();
41
+ function warnPathMutation(app) {
42
+ if (warnedPathMutation.has(app)) return;
43
+ warnedPathMutation.add(app);
44
+ console.warn("[elysia] context.path is readonly; request-hook rerouting will stop working in a future release.");
45
+ }
46
+ function finalizeError(context, handleError, afterResponse, error, sign) {
43
47
  let resp;
44
48
  try {
45
- resp = handleError(context, error);
49
+ resp = handleError(context, error, sign);
46
50
  } catch (errorPipelineThrow) {
47
51
  if (!require_universal_is_production.isProduction()) console.error(errorPipelineThrow);
48
52
  resp = require_error.internalServerErrorResponse(error);
@@ -67,23 +71,19 @@ function dispatchResult(result, context, handleError, afterResponse) {
67
71
  }
68
72
  function findRoute(context, request, map, router, hasError, handleError, afterResponse, strictPath, hasWS, hasDynamicWS) {
69
73
  const path = context.path;
70
- if (hasWS && request.method === "GET") {
74
+ const method = request.method;
75
+ if (hasWS && method === "GET") {
71
76
  const handler = map["WS"]?.[path];
72
77
  const found = handler === void 0 && hasDynamicWS ? router?.find("WS", path) : void 0;
73
78
  if (handler !== void 0 || found) {
74
79
  const upgrade = request.headers.get("upgrade");
75
80
  if (upgrade && upgrade.toLowerCase() === "websocket") {
76
- if (handler) {
77
- const r = handler(context);
78
- return r instanceof Promise ? r.catch(catchError(context, handleError, afterResponse)) : r;
79
- }
81
+ if (handler) return dispatchResult(handler(context), context, handleError, afterResponse);
80
82
  context.params = path.indexOf("%") === -1 ? found.params : decodeParams(found.params);
81
- const r = found.store(context);
82
- return r instanceof Promise ? r.catch(catchError(context, handleError, afterResponse)) : r;
83
+ return dispatchResult(found.store(context), context, handleError, afterResponse);
83
84
  }
84
85
  }
85
86
  }
86
- const method = request.method;
87
87
  const methodMap = map[method];
88
88
  let handler = methodMap?.[path];
89
89
  if (!handler) if (!strictPath && path.length > 1 && path.charCodeAt(path.length - 1) === 47) {
@@ -100,7 +100,7 @@ function findRoute(context, request, map, router, hasError, handleError, afterRe
100
100
  context.params = path.indexOf("%") === -1 ? found.params : decodeParams(found.params);
101
101
  return dispatchResult(found.store(context), context, handleError, afterResponse);
102
102
  }
103
- if (hasError) return finalizeError(context, handleError, afterResponse, notFoundBody);
103
+ if (hasError) return finalizeError(context, handleError, afterResponse, new require_error.NotFound());
104
104
  afterResponse?.(context, 404);
105
105
  return notFound(context);
106
106
  }
@@ -111,10 +111,10 @@ function createFetchHandler(app) {
111
111
  const hasWS = !!app["~hasWS"];
112
112
  const hasDynamicWS = hasWS && !!app["~hasDynamicWS"];
113
113
  const strictPath = !!app["~config"]?.strictPath;
114
- const pathStart = app["~config"]?.handler?.standardHostname === false ? 7 : 11;
115
114
  const hook = require_utils.flattenChain(app["~hookChain"]);
116
115
  const hasError = !!hook?.error;
117
116
  const abortSignal = app["~config"]?.abortSignal !== false;
117
+ const watchPath = !require_universal_is_production.isProduction();
118
118
  /**
119
119
  * Arm `context['~sig']` unless this request is provably the untouched
120
120
  * `Request` the Bun adapter received, in which case materializing
@@ -130,31 +130,38 @@ function createFetchHandler(app) {
130
130
  return (context["~sig"] = request.signal).aborted;
131
131
  };
132
132
  /**
133
- * Post-suspension check: arm if nobody has yet, then read. Only emitted on
134
- * lanes that actually awaited, so a deferred request that never suspends
135
- * never reaches it.
133
+ * Peek after each callback. The actual await branch arms deferred requests;
134
+ * immediate callbacks must not materialize a signal just for this check.
136
135
  */
137
- const armedAbort = (request, context) => abortSignal && (context["~sig"] ??= request.signal).aborted === true;
136
+ const armedAbort = (context) => abortSignal && context["~sig"]?.aborted === true;
138
137
  const baseMapResponse = (app["~config"]?.adapter ?? require_adapter_constants.defaultAdapter).response.map;
138
+ function finalMap(response, set, request, sign) {
139
+ if (!sign) return baseMapResponse(response, set, request, true);
140
+ let pending;
141
+ try {
142
+ pending = sign(set);
143
+ } catch {}
144
+ return pending ? pending.then(() => baseMapResponse(response, set, request, true), () => baseMapResponse(response, set, request, true)) : baseMapResponse(response, set, request, true);
145
+ }
139
146
  const mapResponseHooks = hook?.mapResponse;
140
- const mapResponse = mapResponseHooks?.length ? (response, set, context) => {
147
+ const mapResponse = mapResponseHooks?.length ? (response, set, context, sign) => {
141
148
  if (!context) return baseMapResponse(response, set, void 0, true);
142
149
  context.responseValue = response;
143
150
  const request = context.request;
144
151
  const run = (i) => {
145
152
  for (; i < mapResponseHooks.length; i++) {
146
153
  const result = mapResponseHooks[i](context);
147
- if (result instanceof Promise) return result.then((resolved) => {
148
- if (resolved !== void 0) return baseMapResponse(resolved, set, request, true);
154
+ if (typeof result?.then === "function") return Promise.resolve(result).then((resolved) => {
155
+ if (resolved !== void 0) return finalMap(resolved, set, request, sign);
149
156
  return run(i + 1);
150
157
  });
151
- if (result !== void 0) return baseMapResponse(result, set, request, true);
158
+ if (result !== void 0) return finalMap(result, set, request, sign);
152
159
  }
153
- return baseMapResponse(response, set, request, true);
160
+ return finalMap(response, set, request, sign);
154
161
  };
155
162
  return run(0);
156
- } : (response, set, context) => baseMapResponse(response, set, context?.request, true);
157
- const handleError = require_handler_error.createErrorHandler(hook?.error, mapResponse, void 0, app["~config"]?.allowUnsafeValidationDetails);
163
+ } : (response, set, context, sign) => finalMap(response, set, context?.request, sign);
164
+ const handleError = require_handler_error.createErrorHandler(hook?.error, mapResponse, app["~config"]?.allowUnsafeValidationDetails);
158
165
  const traceHandlers = hook?.trace;
159
166
  const hasTrace = !!traceHandlers?.length;
160
167
  const traceProvider = hasTrace ? app["~resolvedCapability"]("trace") : void 0;
@@ -166,11 +173,32 @@ function createFetchHandler(app) {
166
173
  const afterResponse = (context, status) => {
167
174
  if (context._arf) return;
168
175
  const queue = context["~afterResponse"];
169
- if (!afterResponses?.length && !traceAfterResponsePhase && !queue?.length) return;
176
+ if (!afterResponses?.length && !traceAfterResponsePhase && !queue?.length && !context["~dispose"]) return;
170
177
  context._arf = true;
171
178
  if (status !== void 0) context.set.status = status;
172
179
  queueMicrotask(async () => {
173
180
  if (afterResponses?.length || queue?.length) require_adapter_utils.materializeSetHeaders(context.set);
181
+ let cache;
182
+ let reports;
183
+ if (traceAfterResponsePhase) {
184
+ cache = context.trace;
185
+ if (!cache && tracerFactories) {
186
+ context.rid ??= require_utils.requestId();
187
+ cache = tracerFactories.map((f) => f(context));
188
+ context.trace = cache;
189
+ }
190
+ if (cache) {
191
+ const total = afterResponses?.length ?? 0;
192
+ reports = new Array(cache.length);
193
+ for (let i = 0; i < cache.length; i++) reports[i] = cache[i].b(7, total) || cache[i].begin(7, {
194
+ id: context.rid ?? "",
195
+ event: "afterResponse",
196
+ name: "afterResponse",
197
+ begin: performance.now(),
198
+ total
199
+ });
200
+ }
201
+ }
174
202
  if (afterResponses) for (let i = 0; i < afterResponses.length; i++) try {
175
203
  await afterResponses[i](context);
176
204
  } catch (e) {
@@ -185,39 +213,19 @@ function createFetchHandler(app) {
185
213
  console.error(e);
186
214
  }
187
215
  }
188
- if (traceAfterResponsePhase) {
189
- let cache = context.trace;
190
- if (!cache && tracerFactories) {
191
- context.rid ??= require_utils.requestId();
192
- cache = tracerFactories.map((f) => f(context));
193
- context.trace = cache;
194
- }
195
- if (cache) for (let i = 0; i < cache.length; i++) {
196
- const fast = cache[i].b(7, afterResponses?.length ?? 0);
197
- if (fast) {
198
- cache[i].r(fast);
199
- continue;
200
- }
201
- cache[i].begin(7, {
202
- id: context.rid ?? "",
203
- event: "afterResponse",
204
- name: "afterResponse",
205
- begin: performance.now(),
206
- total: afterResponses?.length ?? 0
207
- }).resolve();
208
- }
209
- }
216
+ await require_handler_utils.drainDisposables(context);
217
+ if (reports) for (let i = 0; i < reports.length; i++) cache[i].r(reports[i]);
210
218
  });
211
219
  };
212
- app["~finalizeError"] = (context, error) => finalizeError(context, handleError, afterResponse, error);
220
+ const fail = (context, error, sign) => finalizeError(context, handleError, afterResponse, error, sign);
221
+ app["~finalizeError"] = fail;
213
222
  if (traceRequestPhase) {
214
223
  const onRequests = hook?.request ?? [];
215
- const asyncIndexes = onRequests.length ? require_handler_utils.getAsyncIndexes(onRequests) : void 0;
216
224
  return async (request, server) => {
217
225
  const context = new Context(request);
218
226
  require_adapter_utils.materializeSetHeaders(context.set);
219
227
  if (armEager(request, context)) return require_handler_utils.emptyResponse.clone();
220
- extractPath(request.url, context, pathStart);
228
+ const path = extractPath(request.url, context);
221
229
  context.server = server ?? null;
222
230
  context.rid = require_utils.requestId();
223
231
  const traceLength = tracerFactories.length;
@@ -235,15 +243,20 @@ function createFetchHandler(app) {
235
243
  try {
236
244
  const endReports = new Array(traceLength);
237
245
  for (let i = 0; i < onRequests.length; i++) {
238
- for (let j = 0; j < traceLength; j++) endReports[j] = requestReports[j].resolveChild?.shift?.()?.({
246
+ for (let j = 0; j < traceLength; j++) endReports[j] = requestReports[j].shift?.()?.({
239
247
  id: context.rid,
240
248
  event: "request",
241
249
  name: onRequests[i].name || "anonymous",
242
250
  begin: performance.now()
243
251
  });
244
- const result = asyncIndexes?.[i] ? await onRequests[i](context) : onRequests[i](context);
252
+ let result = onRequests[i](context);
253
+ if (typeof result?.then === "function") {
254
+ if (abortSignal) context["~sig"] ??= request.signal;
255
+ result = await result;
256
+ }
257
+ if (watchPath && context.path !== path) warnPathMutation(app);
245
258
  for (let i = 0; i < traceLength; i++) endReports[i]?.();
246
- if (armedAbort(request, context)) {
259
+ if (armedAbort(context)) {
247
260
  for (let j = 0; j < traceLength; j++) trace[j].r(requestReports[j]);
248
261
  return require_handler_utils.emptyResponse.clone();
249
262
  }
@@ -258,24 +271,27 @@ function createFetchHandler(app) {
258
271
  return await findRoute(context, request, map, router, hasError, handleError, afterResponse, strictPath, hasWS, hasDynamicWS);
259
272
  } catch (error) {
260
273
  for (let i = 0; i < traceLength; i++) trace[i].r(requestReports[i], error);
261
- return finalizeError(context, handleError, afterResponse, error);
274
+ return fail(context, error);
262
275
  }
263
276
  };
264
277
  }
265
278
  if (hook?.request) {
266
279
  const onRequests = hook.request;
267
- const asyncIndexes = require_handler_utils.getAsyncIndexes(onRequests);
268
- if (asyncIndexes) return async (request, server) => {
280
+ if (require_handler_utils.hasAsync(onRequests)) return async (request, server) => {
269
281
  const context = new Context(request);
270
282
  require_adapter_utils.materializeSetHeaders(context.set);
271
283
  if (armEager(request, context)) return require_handler_utils.emptyResponse.clone();
272
- extractPath(request.url, context, pathStart);
284
+ const path = extractPath(request.url, context);
273
285
  context.server = server ?? null;
274
286
  try {
275
287
  for (let i = 0; i < onRequests.length; i++) {
276
- let result = asyncIndexes?.[i] ? await onRequests[i](context) : onRequests[i](context);
277
- if (result instanceof Promise) result = await result;
278
- if (armedAbort(request, context)) return require_handler_utils.emptyResponse.clone();
288
+ let result = onRequests[i](context);
289
+ if (typeof result?.then === "function") {
290
+ if (abortSignal) context["~sig"] ??= request.signal;
291
+ result = await result;
292
+ }
293
+ if (watchPath && context.path !== path) warnPathMutation(app);
294
+ if (armedAbort(context)) return require_handler_utils.emptyResponse.clone();
279
295
  if (result !== void 0) {
280
296
  const response = await mapResponse(result, context.set, context);
281
297
  afterResponse?.(context);
@@ -284,18 +300,19 @@ function createFetchHandler(app) {
284
300
  }
285
301
  return findRoute(context, request, map, router, hasError, handleError, afterResponse, strictPath, hasWS, hasDynamicWS);
286
302
  } catch (error) {
287
- return finalizeError(context, handleError, afterResponse, error);
303
+ return fail(context, error);
288
304
  }
289
305
  };
290
306
  return (request, server) => {
291
307
  const context = new Context(request);
292
308
  require_adapter_utils.materializeSetHeaders(context.set);
293
309
  if (armEager(request, context)) return require_handler_utils.emptyResponse.clone();
294
- extractPath(request.url, context, pathStart);
310
+ const path = extractPath(request.url, context);
295
311
  context.server = server ?? null;
296
312
  try {
297
313
  for (let i = 0; i < onRequests.length; i++) {
298
314
  const result = onRequests[i](context);
315
+ if (watchPath && context.path !== path) warnPathMutation(app);
299
316
  if (abortSignal && context["~sig"]?.aborted) return require_handler_utils.emptyResponse.clone();
300
317
  if (result !== void 0) {
301
318
  const response = mapResponse(result, context.set, context);
@@ -309,57 +326,19 @@ function createFetchHandler(app) {
309
326
  }
310
327
  return findRoute(context, request, map, router, hasError, handleError, afterResponse, strictPath, hasWS, hasDynamicWS);
311
328
  } catch (error) {
312
- return finalizeError(context, handleError, afterResponse, error);
329
+ return fail(context, error);
313
330
  }
314
331
  };
315
332
  }
316
333
  return (request, server) => {
317
334
  const context = new Context(request);
318
- const path = extractPath(request.url, context, pathStart);
335
+ extractPath(request.url, context);
319
336
  context.server = server ?? null;
320
- const method = request.method;
321
- if (hasWS && method === "GET") {
322
- const handler = map["WS"]?.[path];
323
- const found = handler === void 0 && hasDynamicWS ? router?.find("WS", path) : void 0;
324
- if (handler !== void 0 || found) {
325
- const upgrade = request.headers.get("upgrade");
326
- if (upgrade && upgrade.toLowerCase() === "websocket") try {
327
- if (handler) {
328
- const r = handler(context);
329
- return r instanceof Promise ? r.catch(catchError(context, handleError, afterResponse)) : r;
330
- }
331
- context.params = path.indexOf("%") === -1 ? found.params : decodeParams(found.params);
332
- const r = found.store(context);
333
- return r instanceof Promise ? r.catch(catchError(context, handleError, afterResponse)) : r;
334
- } catch (error) {
335
- return finalizeError(context, handleError, afterResponse, error);
336
- }
337
- }
338
- }
339
337
  try {
340
- const methodMap = map[method];
341
- let handler = methodMap?.[path];
342
- if (handler) return dispatchResult(handler(context), context, handleError, afterResponse);
343
- if (!strictPath && path.length > 1 && path.charCodeAt(path.length - 1) === 47) {
344
- const loose = path.slice(0, -1);
345
- handler = methodMap?.[loose];
346
- if (!handler) {
347
- const anyMap = map["*"];
348
- handler = anyMap?.[path] ?? anyMap?.[loose];
349
- }
350
- } else handler = map["*"]?.[path];
351
- if (handler) return dispatchResult(handler(context), context, handleError, afterResponse);
352
- const result = router?.find(method, path) ?? router?.find("*", path);
353
- if (result) {
354
- context.params = path.indexOf("%") === -1 ? result.params : decodeParams(result.params);
355
- return dispatchResult(result.store(context), context, handleError, afterResponse);
356
- }
338
+ return findRoute(context, request, map, router, hasError, handleError, afterResponse, strictPath, hasWS, hasDynamicWS);
357
339
  } catch (error) {
358
- return finalizeError(context, handleError, afterResponse, error);
340
+ return fail(context, error);
359
341
  }
360
- if (hasError) return finalizeError(context, handleError, afterResponse, notFoundBody);
361
- afterResponse?.(context, 404);
362
- return notFound(context);
363
342
  };
364
343
  }
365
344
  function applyHoc(app, fetch) {