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
@@ -10,53 +10,70 @@ const require_parse_query = require('../../parse-query.js');
10
10
  const require_compile_aot = require('../aot.js');
11
11
  const require_generation = require('../../generation.js');
12
12
  const require_cookie_utils = require('../../cookie/utils.js');
13
- const require_compile_utils = require('../utils.js');
14
13
  const require_handler_utils = require('../../handler/utils.js');
15
14
  const require_handler_error = require('../../handler/error.js');
16
15
  const require_compile_handler_utils = require('./utils.js');
17
16
  const require_compile_jit_probe = require('../jit-probe.js');
18
17
 
19
18
  //#region src/compile/handler/jit.ts
20
- const parseFormData = "c.body=await pf(c)\n";
19
+ const awaitValue = (value, arm = "") => arm ? `await (_av=(${value}),${arm},_av)` : `await ${value}`;
21
20
  let captureHeaderShorthand;
21
+ /**
22
+ * @internal test hook: receives each route's emitted source. A sync-first
23
+ * route's async tail is a helper beside it, so `toString()` of the compiled
24
+ * handler does not show the whole pipeline
25
+ */
26
+ let onEmit;
27
+ const setOnEmit = (fn) => {
28
+ onEmit = fn;
29
+ };
30
+ /**
31
+ * @internal test hook: `false` compiles sync-first routes on the `async`
32
+ * lane instead, the reference the async tail is differentially tested
33
+ * against. `undefined` restores the default (see `tail` below)
34
+ */
35
+ let asyncTailOn;
36
+ const setAsyncTail = (on) => {
37
+ asyncTailOn = on;
38
+ };
22
39
  const setCaptureHeaderShorthand = (value) => {
23
40
  captureHeaderShorthand = value;
24
41
  };
25
- function builtinParser(adapter, parse, link) {
42
+ function builtinParser(adapter, parse, link, arm) {
26
43
  switch (parse) {
27
44
  case "formdata":
28
45
  case "multipart/form-data":
29
46
  link(adapter.formData, "pf");
30
- return parseFormData;
47
+ return `c.body=${awaitValue("pf(c)", arm)}\n`;
31
48
  case "json":
32
49
  case "application/json":
33
50
  link(adapter.json, "pj");
34
- return "c.body=await pj(c)\n";
51
+ return `c.body=${awaitValue("pj(c)", arm)}\n`;
35
52
  case "urlencoded":
36
53
  case "application/x-www-form-urlencoded":
37
54
  link(adapter.urlencoded, "pu");
38
- return "c.body=await pu(c)\n";
55
+ return `c.body=${awaitValue("pu(c)", arm)}\n`;
39
56
  case "arrayBuffer":
40
57
  case "application/octet-stream":
41
58
  link(adapter.arrayBuffer, "pa");
42
- return "c.body=await pa(c)\n";
59
+ return `c.body=${awaitValue("pa(c)", arm)}\n`;
43
60
  case "text":
44
61
  case "text/plain":
45
62
  link(adapter.text, "pt");
46
- return "c.body=await pt(c)\n";
63
+ return `c.body=${awaitValue("pt(c)", arm)}\n`;
47
64
  case "none": return "";
48
65
  default: throw new Error(`Unsupported content type: ${parse}`);
49
66
  }
50
67
  }
51
- function parse(adapter, parsers, bodyVali, hasHeaders, link, report) {
52
- if (parsers && typeof parsers === "function") parsers = [parsers];
68
+ function parse(adapter, hook, bodyVali, hasHeaders, link, report, arm) {
69
+ let parsers = hook?.parse;
53
70
  if (typeof parsers === "string" || parsers?.length === 1 && typeof parsers[0] === "string") {
54
71
  if (parsers.length === 1) parsers = parsers[0];
55
72
  const builtinName = parsers;
56
73
  const child = report?.resolveChild(builtinName);
57
74
  const begin = child ? child.begin : "";
58
75
  const end = child ? child.end() : "";
59
- return begin + builtinParser(adapter, parsers, link) + end;
76
+ return begin + builtinParser(adapter, parsers, link, arm) + end;
60
77
  }
61
78
  let hasFn = false;
62
79
  let hasType = false;
@@ -66,18 +83,18 @@ function parse(adapter, parsers, bodyVali, hasHeaders, link, report) {
66
83
  break;
67
84
  }
68
85
  }
69
- const bodyKind = hasFn ? void 0 : bodyMediaKind(bodyVali);
86
+ const bodyKind = hasFn ? void 0 : schemaMediaKind(bodyVali?.schema);
70
87
  let code = `let ct=((${hasHeaders ? "c.headers['content-type']" : "c.request.headers.get('content-type')"})||'')\nlet cti=ct.indexOf(";")
71
88
  if(cti!==-1)ct=ct.slice(0,cti)
72
89
  ` + (hasFn ? "c.contentType=ct\n" : "");
73
90
  if (parsers) for (let i = 0; i < parsers.length; i++) {
74
91
  const parser = parsers[i];
75
92
  if (typeof parser === "function") {
76
- link(0, "");
93
+ link(hook, "ho");
77
94
  const child = report?.resolveChild(parser.name || "anonymous");
78
95
  if (i) code += "if(!hasBody){";
79
96
  if (child) code += child.begin;
80
- code += require_compile_utils.isAsyncFunction(parser) ? `c.body=await ho.parse[${i}](c,ct)\n` : `_bp=ho.parse[${i}](c,ct)\nif(_bp instanceof Promise)_bp=await _bp\nc.body=_bp\n`;
97
+ code += `_bp=ho.parse[${i}](c,ct)\n` + require_compile_handler_utils.awaitGuard(parser, true, "_bp", arm) + `c.body=_bp\n`;
81
98
  code += "hasBody=c.body!==undefined\n";
82
99
  if (child) code += child.end();
83
100
  if (i) code += "}\n";
@@ -86,7 +103,7 @@ if(cti!==-1)ct=ct.slice(0,cti)
86
103
  const child = report?.resolveChild(parser);
87
104
  if (i) code += "if(!hasBody){\n";
88
105
  if (child) code += child.begin;
89
- code += builtinParser(adapter, parser, link);
106
+ code += builtinParser(adapter, parser, link, arm);
90
107
  if (child) code += child.end();
91
108
  if (i) code += "}\n";
92
109
  break;
@@ -104,14 +121,14 @@ if(cti!==-1)ct=ct.slice(0,cti)
104
121
  code += `if(ct&&!(${mediaGuard}))throw new es(415,'Unsupported Media Type')\n`;
105
122
  link(require_error.ElysiaStatus, "es");
106
123
  }
107
- code += hasFn ? `if(!hasBody&&${guard}){${begin}c.body=cj?await pj(c):await pd(c,ce,true)\n${end}}\n` : `if(${guard}){${begin}c.body=cj?await pj(c):await pd(c,ce,true)\n${end}}\n`;
124
+ const value = `c.body=cj?${awaitValue("pj(c)", arm)}:${awaitValue("pd(c,ce)", arm)}\n`;
125
+ code += hasFn ? `if(!hasBody&&${guard}){${begin}${value}${end}}\n` : `if(${guard}){${begin}${value}${end}}\n`;
108
126
  if (!bodyVali) link(require_compile_handler_utils.hasRequestBody, "hb");
109
127
  link(adapter.json, "pj");
110
128
  link(adapter.default, "pd");
111
129
  }
112
130
  return hasFn ? "let hasBody=false,_bp\n" + code : code;
113
131
  }
114
- const bodyMediaKind = (bodyVali) => schemaMediaKind(bodyVali?.schema);
115
132
  function schemaMediaKind(schema) {
116
133
  if (!schema || typeof schema !== "object" || "~standard" in schema) return;
117
134
  const elyType = schema["~elyTyp"];
@@ -141,55 +158,45 @@ const fromArgs = (type, isAsync) => `'${type}'${isAsync ? ",true" : ""}`;
141
158
  const createInlineHandler = (map, h) => ((c) => {
142
159
  const r = h(c);
143
160
  if (r instanceof Error) throw r;
144
- if (r instanceof Promise) return r.then((v) => map(require_handler_utils.forwardError(v), c.request, true));
161
+ if (typeof r?.then === "function") return Promise.resolve(r).then((v) => map(require_handler_utils.forwardError(v), c.request, true));
145
162
  return map(r, c.request, true);
146
163
  });
147
- const createInlineHandlerWithSet = (map, h) => ((c) => {
148
- const r = h(c);
149
- if (r instanceof Error) throw r;
150
- if (r instanceof Promise) return r.then((v) => map(require_handler_utils.forwardError(v), c.set, c.request, true));
151
- return map(r, c.set, c.request, true);
152
- });
153
- const createInlineHandlerWithDefaultHeaders = (map, h) => ((c) => {
154
- require_adapter_utils.materializeSetHeaders(c.set);
155
- const r = h(c);
156
- if (r instanceof Error) throw r;
157
- if (r instanceof Promise) return r.then((v) => map(require_handler_utils.forwardError(v), c.set, c.request, true));
158
- return map(r, c.set, c.request, true);
159
- });
160
- function compileHandlerJit({ method, path, handler, root, errorRoot, hook, adapter, isHandleFunction, isStaticResponse, isPromiseHandler, state }) {
161
- const { vali, inference, cookieConfig, beforeHandlePrefix, traceHandlers, tracePhases, hasAnyPhase, traceHandleOn, descriptor: { async: isAsync, responseMode, hasBody, bodyValiIsAsync, headersValiIsAsync, paramsValiIsAsync, queryValiIsAsync, cookieValiIsAsync: cookieValidIsAsync, responseValiAsync, hasCookieSign, syncCookieSign, asyncCookieSign, lazyCookieVerify, hasErrorHook, hasAfterResponse, hasBeforeHandle, hasAfterHandle, hasMapResponse, hasResponseValidator, hasTrace, traceCount, hasLifecycleHook, callHandlerSyncOnAsync, syncErrorHook, syncAfterResponse } } = state;
164
+ function compileHandlerJit(options, tailPass) {
165
+ const { method, path, handler, root, errorRoot, hook, adapter, isHandleFunction, isStaticResponse, isPromiseHandler, errorClasses, state, shape } = options;
166
+ const { vali, inference, cookieConfig, beforeHandlePrefix, traceHandlers, tracePhases, hasAnyPhase, traceHandleOn, descriptor: { async: isAsync, tail: tailRoute, responseMode, hasBody, bodyValiIsAsync, headersValiIsAsync, paramsValiIsAsync, queryValiIsAsync, cookieValiIsAsync: cookieValidIsAsync, responseValiAsync, hasCookieSign, syncCookieSign, asyncCookieSign, lazyCookieVerify, hasErrorHook, hasAfterResponse, hasBeforeHandle, hasAfterHandle, hasMapResponse, hasResponseValidator, hasTrace, traceCount, hasLifecycleHook, syncErrorHook, syncAfterResponse } } = state;
162
167
  const hasStaticAfterResponse = !!hook?.afterResponse?.length;
163
- const hasDynamicAfterResponse = !!inference.afterResponse;
168
+ const hasDeriveDispose = !!hook?.["~deriveEntries"]?.length;
169
+ const hasDynamicAfterResponse = !!inference.afterResponse || hasDeriveDispose;
170
+ const hasStl = (hasAfterResponse || hasTrace || hasDeriveDispose) && !syncAfterResponse;
171
+ const tail = tailRoute && (asyncTailOn ?? captureHeaderShorthand ?? require_universal_constants.isBun);
172
+ const asyncMode = tail ? tailPass ?? {
173
+ async: false,
174
+ n: 0,
175
+ live: hasStl ? ",_stl,_sv" : "",
176
+ sites: []
177
+ } : isAsync;
178
+ const plain = (code) => require_compile_handler_utils.tailPlain(asyncMode, code);
164
179
  const seenKeys = new Set(["rt", "fre"]);
165
180
  const paramValues = [errorRoot, require_handler_utils.finalizeRouteError];
166
181
  const aliasKeys = [];
167
182
  function link(v, key) {
168
- if (v === 0) {
169
- if (!seenKeys.has("ho")) {
170
- seenKeys.add("ho");
171
- paramValues.push(hook);
172
- aliasKeys.push("ho");
173
- }
174
- return;
175
- }
176
183
  if (!seenKeys.has(key)) {
177
184
  seenKeys.add(key);
178
185
  paramValues.push(v);
179
186
  aliasKeys.push(key);
180
187
  }
181
188
  }
189
+ if (errorClasses) link(require_handler_utils.forwardErrorOf(errorClasses), "ie");
190
+ const fwd = errorClasses ? "ie" : "fe";
191
+ const rethrow = (v) => errorClasses ? `ie(${v})\n` : `if(${v} instanceof Error)throw ${v}\n`;
182
192
  const abortOn = hasLifecycleHook && root["~config"]?.abortSignal !== false;
183
193
  const abortPeek = "c['~sig']?.aborted";
184
- const abortArm = "(_as??=(c['~sig']??=c.request.signal)).aborted";
185
- let suspended = false;
186
- const abortExpression = () => {
187
- if (!suspended && code.includes("await ")) suspended = true;
188
- return suspended ? abortArm : abortPeek;
189
- };
190
- const abortCheck = () => abortOn ? `if(${abortExpression()})return emp.clone()\n` : "";
191
- const abortChainGuard = () => abortOn ? isAsync ? abortArm : abortExpression() : void 0;
192
- const abortCatch = abortOn ? `if(${abortArm})return emp.clone()\n` : "";
194
+ const arm = abortOn ? "_as??=(c['~sig']??=c.request.signal)" : "";
195
+ let abortSchedule = "";
196
+ let discard = "";
197
+ const abortCheck = () => abortOn ? plain(abortSchedule || discard ? `if(${abortPeek}){${discard}${abortSchedule}return emp.clone()}\n` : `if(${abortPeek})return emp.clone()\n`) : "";
198
+ const abortChainGuard = () => abortOn ? abortPeek : void 0;
199
+ const abortCatch = abortOn ? `if((${arm}).aborted)return emp.clone()\n` : "";
193
200
  const phaseOn = (phase) => hasTrace && (tracePhases === null || tracePhases.has(phase));
194
201
  const beginTrace = (phase, total, name = phase) => {
195
202
  if (!phaseOn(phase)) return "";
@@ -208,7 +215,7 @@ function compileHandlerJit({ method, path, handler, root, errorRoot, hook, adapt
208
215
  if (!phaseOn(phase)) return;
209
216
  return { resolveChild(name) {
210
217
  let begin = "";
211
- for (let i = 0; i < traceCount; i++) begin += `rpc${i}=rp${i}.resolveChild?.shift?.()?.({id:c.rid,event:'${phase}',name:${JSON.stringify(name)},begin:performance.now()})\n`;
218
+ for (let i = 0; i < traceCount; i++) begin += `rpc${i}=rp${i}.shift?.()?.({id:c.rid,event:'${phase}',name:${JSON.stringify(name)},begin:performance.now()})\n`;
212
219
  return {
213
220
  begin,
214
221
  end(errBinding) {
@@ -220,14 +227,17 @@ function compileHandlerJit({ method, path, handler, root, errorRoot, hook, adapt
220
227
  };
221
228
  } };
222
229
  };
223
- const callHandler = isHandleFunction ? callHandlerSyncOnAsync ? `_r=h(c)\nif(_r instanceof Promise)_r=await _r\n` : `_r=${isAsync ? "await " : ""}h(c)\n` : isStaticResponse ? `_r=cr(h)\n` : isPromiseHandler ? `_r=h.then(cr)\n` : `_r=h\n`;
224
- let code = `${isAsync ? "async " : ""}function route(c){\n`;
230
+ const needsStaticClone = !isHandleFunction && !isStaticResponse && !isPromiseHandler && (hasAfterHandle || hasMapResponse) && typeof handler === "object" && handler !== null;
231
+ if (needsStaticClone) link(require_compile_handler_utils.cloneStaticValue, "scl");
232
+ const callHandler = () => isHandleFunction ? require_compile_handler_utils.awaitSite("h(c)", handler, asyncMode, "_r", arm) : isStaticResponse ? `_r=cr(h)\n` : isPromiseHandler ? `_r=h.then(cr)\n` : needsStaticClone ? `_r=scl(h)\n` : `_r=h\n`;
233
+ const stageSite = (call, target, fn, at = "") => require_compile_handler_utils.asyncTail(asyncMode) ? require_compile_handler_utils.tailStage(require_compile_handler_utils.asyncTail(asyncMode)) + require_compile_handler_utils.awaitSite(call, fn, asyncMode, target, at) + "}\n" : require_compile_handler_utils.awaitSite(call, fn, asyncMode, target, at);
234
+ let code = `${isAsync && !tail ? "async " : ""}function route(c){\n`;
225
235
  if (abortOn) {
226
236
  link(require_handler_utils.emptyResponse, "emp");
227
237
  link(require_compile_handler_utils.armEntryAbort, "ea");
228
238
  code += `if(ea(c))return emp.clone()\n`;
229
239
  }
230
- if ((hasAfterResponse || hasTrace) && !syncAfterResponse) code += "let _stl\n";
240
+ if (hasStl) code += "let _stl,_sv\n";
231
241
  if (asyncCookieSign) code += "let _sg\n";
232
242
  if (hasTrace) {
233
243
  const traceProvider = require_generation.resolvedTraceOf(root) ?? require_generation.resolvedTraceOf(errorRoot);
@@ -252,7 +262,7 @@ function compileHandlerJit({ method, path, handler, root, errorRoot, hook, adapt
252
262
  code += "try{\n";
253
263
  if (responseMode === "set-with-default-headers" && (inference.set || hasTrace)) {
254
264
  link(require_adapter_utils.materializeSetHeaders, "msh");
255
- code += `msh(c.set)\n`;
265
+ code += plain(`msh(c.set)\n`);
256
266
  }
257
267
  const hasHeaders = inference.headers || !!vali?.headers;
258
268
  if (inference.query || vali?.query) {
@@ -266,18 +276,18 @@ function compileHandlerJit({ method, path, handler, root, errorRoot, hook, adapt
266
276
  link(channels.object, "qo");
267
277
  parseArgs += `${channels.array ? "" : ",undefined"},qo`;
268
278
  }
269
- code += `c.query=pq(c.request.url,c.qi${parseArgs})\n`;
279
+ code += plain(`c.query=pq(c.request.url,c.qi${parseArgs})\n`);
270
280
  link(require_parse_query.parseQueryFromURL, "pq");
271
281
  }
272
282
  if (hasHeaders) {
273
- if (captureHeaderShorthand === void 0 && require_compile_aot.Capture.isCapturing()) code += `c.headers=c.request.headers.toJSON?.()??Object.fromEntries(c.request.headers)\n`;
274
- else code += `c.headers=${captureHeaderShorthand ?? require_universal_constants.hasHeaderShorthand ? "c.request.headers.toJSON()" : "Object.fromEntries(c.request.headers)"}\n`;
283
+ if (captureHeaderShorthand === void 0 && require_compile_aot.Capture.isCapturing()) code += plain(`c.headers=c.request.headers.toJSON?.()??Object.fromEntries(c.request.headers)\n`);
284
+ else code += plain(`c.headers=${captureHeaderShorthand ?? require_universal_constants.hasHeaderShorthand ? "c.request.headers.toJSON()" : "Object.fromEntries(c.request.headers)"}\n`);
275
285
  inlineUnsafe = true;
276
286
  }
277
287
  if (hasBody) {
278
288
  const parseLen = Array.isArray(hook?.parse) ? hook.parse.length : 0;
279
289
  if (hasTrace) code += beginTrace("parse", parseLen);
280
- const parseCode = parse(adapter.parse, hook?.parse, vali?.body, hasHeaders, link, buildReport("parse"));
290
+ const parseCode = parse(adapter.parse, hook, vali?.body, hasHeaders, link, buildReport("parse"), arm);
281
291
  const preserveParseStatus = seenKeys.has("es");
282
292
  link(require_error.ParseError, "pe");
283
293
  code += "try{\n" + parseCode + `}catch(e){${preserveParseStatus ? "if(e instanceof es)throw e\n" : ""}throw new pe(e)}\n`;
@@ -290,30 +300,30 @@ function compileHandlerJit({ method, path, handler, root, errorRoot, hook, adapt
290
300
  if (transformLen) {
291
301
  link(hook.transform, "tf");
292
302
  if (isAsync) code += "let _tf\n";
293
- code += require_compile_handler_utils.mapTransform(hook.transform, [isAsync, buildReport("transform")], abortChainGuard());
303
+ code += require_compile_handler_utils.mapTransform(hook.transform, [
304
+ asyncMode,
305
+ buildReport("transform"),
306
+ arm
307
+ ], abortChainGuard(), require_compile_handler_utils.asyncTail(asyncMode));
294
308
  }
295
309
  code += endTrace("transform");
296
310
  if (transformLen) code += abortCheck();
297
311
  }
298
- if (vali?.body) {
299
- link(vali, "va");
300
- code += `c.body=${bodyValiIsAsync ? "await " : ""}va.body.From(c.body,${fromArgs("body", bodyValiIsAsync)})\n`;
301
- }
302
- if (vali?.headers) {
312
+ for (const [slot, slotIsAsync] of [
313
+ ["body", bodyValiIsAsync],
314
+ ["headers", headersValiIsAsync],
315
+ ["params", paramsValiIsAsync],
316
+ ["query", queryValiIsAsync]
317
+ ]) if (vali?.[slot]) {
303
318
  link(vali, "va");
304
- code += `c.headers=${headersValiIsAsync ? "await " : ""}va.headers.From(c.headers,${fromArgs("headers", !!headersValiIsAsync)})\n`;
305
- }
306
- if (vali?.params) {
307
- link(vali, "va");
308
- code += `c.params=${paramsValiIsAsync ? "await " : ""}va.params.From(c.params,${fromArgs("params", !!paramsValiIsAsync)})\n`;
309
- }
310
- if (vali?.query) {
311
- link(vali, "va");
312
- code += `c.query=${queryValiIsAsync ? "await " : ""}va.query.From(c.query,${fromArgs("query", !!queryValiIsAsync)})\n`;
319
+ const value = `va.${slot}.From(c.${slot},${fromArgs(slot, slotIsAsync)})`;
320
+ code += plain(`c.${slot}=${slotIsAsync ? awaitValue(value, arm) : value}\n`);
313
321
  }
314
322
  if (cookieConfig) {
323
+ const cookieStart = code.length;
315
324
  link(require_cookie_utils.buildCookieJar, "bcj");
316
325
  link(cookieConfig, "cc");
326
+ const asyncLazyVerify = asyncCookieSign && cookieConfig.verify === "lazy" && !vali?.cookie;
317
327
  const cookieHeaderExpr = hasHeaders && !vali?.headers ? "c.headers['cookie']" : "c.request.headers.get('cookie')";
318
328
  if (lazyCookieVerify) {
319
329
  link(require_cookie_utils.parseCookieRawLazy, "pcrl");
@@ -334,42 +344,57 @@ function compileHandlerJit({ method, path, handler, root, errorRoot, hook, adapt
334
344
  code += `let _ck=pcrsg(${cookieHeaderExpr},cc)\n`;
335
345
  } else {
336
346
  link(require_cookie_utils.parseCookieRaw, "pcr");
337
- code += `let _ck=await pcr(${cookieHeaderExpr},cc)\n`;
347
+ code += `let _ck=${awaitValue(`pcr(${cookieHeaderExpr},cc${asyncLazyVerify ? ",1" : ""})`, arm)}\n`;
338
348
  }
339
349
  if (vali?.cookie) {
340
350
  link(vali, "va");
341
351
  const cookieIsOptional = !!(hook?.cookie)?.["~optional"];
342
- const validateExpr = `_ck=${cookieValidIsAsync ? "await " : ""}va.cookie.From(_ck,${fromArgs("cookie", !!cookieValidIsAsync)})\n`;
352
+ const value = `va.cookie.From(_ck,${fromArgs("cookie", !!cookieValidIsAsync)})`;
353
+ const validateExpr = `_ck=${cookieValidIsAsync ? awaitValue(value, arm) : value}\n`;
343
354
  if (cookieIsOptional) code += `if(Object.keys(_ck).length){${validateExpr}}\n`;
344
355
  else code += validateExpr;
345
356
  }
346
357
  code += `c.cookie=bcj(c.set,_ck,cc${deferDecode ? ",undefined,1" : ""})\n`;
347
358
  }
359
+ code = code.slice(0, cookieStart) + plain(code.slice(cookieStart));
348
360
  }
349
- const hasSet = responseMode !== "compact";
361
+ const compactEligible = responseMode === "compact";
350
362
  const res = adapter.response;
351
363
  const responseMap = res.map;
352
- const map = hasSet ? link(res.map, "rm") ?? "rm" : link(res.compact ?? res.map, "rc") ?? "rc";
364
+ const responseCompact = compactEligible ? res.compact : void 0;
365
+ const portableCompact = compactEligible && (require_compile_aot.Capture.isAotBuildEnv() || require_compile_aot.Capture.isCapturing());
366
+ const hasSet = !compactEligible || !responseCompact && !portableCompact;
367
+ if (hasSet) link(responseMap, "rm");
368
+ else link(responseCompact, "rc");
369
+ const map = hasSet ? "rm" : "rc";
370
+ if (portableCompact) link(responseMap, "rm");
371
+ const mapValue = (value) => portableCompact ? `(rc?rc(${value},c.request,true):rm(${value},c.set,c.request,true))` : hasSet ? `${map}(${value},c.set,c.request,true)` : `${map}(${value},c.request,true)`;
353
372
  if (isStaticResponse || isPromiseHandler) link(require_compile_handler_utils.cloneResponse, "cr");
354
- const handleInstruction = isHandleFunction ? "h(c)" : isStaticResponse ? "cr(h)" : isPromiseHandler ? "h.then(cr)" : "h";
355
- const mapReturn = hasSet ? `rm(${handleInstruction},c.set,c.request,true)\n` : `rc(${handleInstruction},c.request,true)\n`;
356
373
  if (hasStaticAfterResponse) link(hook.afterResponse, "ar");
357
374
  const drainTraceStream = traceHandleOn ? `let _ser\nif(_trs){try{for await(const v of _trs){}}catch(_te){_ser=_te}}\n` : "";
358
- const resolveHandlePostDrain = traceHandleOn ? (() => {
359
- let s = "";
360
- for (let i = 0; i < traceCount; i++) s += `tr${i}.r(_hr${i},_ser)\n`;
361
- return s;
362
- })() : "";
375
+ let resolveHandlePostDrain = "";
376
+ if (traceHandleOn) for (let i = 0; i < traceCount; i++) resolveHandlePostDrain += `tr${i}.r(_hr${i},_ser)\n`;
363
377
  const traceNeedsSchedule = traceHandleOn || phaseOn("afterResponse");
364
- const scheduleAfterResponse = hasAfterResponse || traceNeedsSchedule ? "c._arf=true\nqueueMicrotask(async()=>{if(_stl){try{for await(const v of _stl){}}catch{}}\n" + drainTraceStream + resolveHandlePostDrain + beginTrace("afterResponse", hook?.afterResponse?.length ?? 0) + (hasStaticAfterResponse ? require_compile_handler_utils.mapAfterResponse(hook.afterResponse, [buildReport("afterResponse")]) : "") + (hasDynamicAfterResponse ? "let _q=c['~afterResponse']\nif(_q){let _l=_q.length\nfor(let _i=0;_i<_l;_i++){try{await _q[_i](c)}catch{}}\n" + (!require_universal_is_production.isProduction() ? `if(_q.length!==_l)console.warn('[elysia] defer() called from inside the afterResponse drain is ignored')\n` : "") + `}\n` : "") + endTrace("afterResponse") + `})\n` : "";
365
- const dedupSchedule = !!scheduleAfterResponse && (hasErrorHook || hasTrace) && !syncAfterResponse && !syncErrorHook;
366
- const scheduleDecl = dedupSchedule ? `function _sc(){\n${scheduleAfterResponse}}\n` : "";
367
- const schedule = dedupSchedule ? `_sc()\n` : scheduleAfterResponse;
368
- const signPrefix = syncCookieSign ? `scv(c.set.cookie,cc)\n` : asyncCookieSign ? `_sg=scv(c.set.cookie,cc)\nif(_sg)await _sg\n` : "";
378
+ if (hasDeriveDispose) link(require_handler_utils.drainDisposables, "dds");
379
+ const deriveDisposeOnly = hasDeriveDispose && !hasAfterResponse && !hasTrace;
380
+ const disposeGuard = deriveDisposeOnly ? "c['~dispose']&&" : "";
381
+ const scheduleAfterResponse = hasAfterResponse || traceNeedsSchedule || hasDeriveDispose ? (deriveDisposeOnly ? `if(c['~dispose']){\n` : "") + "c._arf=true\nqueueMicrotask(async()=>{if(_stl){try{for await(const v of _stl){}}catch{}}\n" + drainTraceStream + resolveHandlePostDrain + beginTrace("afterResponse", hook?.afterResponse?.length ?? 0) + (hasStaticAfterResponse ? require_compile_handler_utils.mapAfterResponse(hook.afterResponse, [buildReport("afterResponse")]) : "") + (hasDynamicAfterResponse ? "let _q=c['~afterResponse']\nif(_q){let _l=_q.length\nfor(let _i=0;_i<_l;_i++){try{await _q[_i](c)}catch(_e){console.error(_e)}}\n" + (!require_universal_is_production.isProduction() ? `if(_q.length!==_l)console.warn('[elysia] defer() called from inside the afterResponse drain is ignored')\n` : "") + `}\n` : "") + (hasDeriveDispose ? `await dds(c)\n` : "") + endTrace("afterResponse") + `})\n` + (deriveDisposeOnly ? `}\n` : "") : "";
382
+ const dedupSchedule = !!scheduleAfterResponse && !syncAfterResponse && !syncErrorHook;
383
+ const scheduleArgs = tail ? "c,_stl" : "";
384
+ const scheduleDecl = dedupSchedule ? `function _sc(${scheduleArgs}){\n${scheduleAfterResponse}}\n` : "";
385
+ const schedule = dedupSchedule ? `_sc(${scheduleArgs})\n` : scheduleAfterResponse;
386
+ const syncScheduleDecl = syncAfterResponse && scheduleAfterResponse ? `function _scf(c,_stl){\n${scheduleAfterResponse}}\n` : "";
387
+ const catchSchedule = dedupSchedule ? `_sc(${scheduleArgs})\n` : syncScheduleDecl ? `_scf(c)\n` : "";
388
+ abortSchedule = hasDeriveDispose ? syncAfterResponse ? catchSchedule : schedule : "";
389
+ const freThenSchedule = (arg) => catchSchedule ? `if(c._arf)return fre(rt,c,${arg})\n${deriveDisposeOnly ? `if(c['~dispose'])` : ""}c._arf=true\nconst _fr=fre(rt,c,${arg})\nreturn typeof _fr?.then==='function'?_fr.then((_v)=>{${catchSchedule}return _v\n}):(${catchSchedule.trim()},_fr)\n` : `return fre(rt,c,${arg})\n`;
390
+ const mapThenSchedule = (s, onReject) => `if(typeof _m?.then==='function')return Promise.resolve(_m).then((_v)=>{\n${s}return _v\n},${onReject})\n` + s + `return _m\n`;
391
+ const signPrefix = syncCookieSign ? `scv(c.set.cookie,cc)\n` : asyncCookieSign ? `_sg=scv(c.set.cookie,cc)\nif(_sg){${arm ? `${arm}\n` : ""}await _sg}\n` : "";
369
392
  if (syncCookieSign || asyncCookieSign) link(require_cookie_utils.signCookieValues, "scv");
370
393
  let factoryHelpers = "";
394
+ let tailCatch = -1;
371
395
  if (hasBeforeHandle || hasAfterHandle || hasMapResponse || hasAfterResponse || hasResponseValidator || hasCookieSign || hasTrace) {
372
- code += `let _r,tmp\n`;
396
+ code += `let _r${require_compile_handler_utils.asyncTail(asyncMode) ? "=_lr" : ""},tmp${hasDeriveDispose ? ",_v" : ""}\n`;
397
+ if (typeof asyncMode === "object") asyncMode.r = true;
373
398
  if (hasBeforeHandle || hasTrace) {
374
399
  const bfLen = (beforeHandlePrefix?.length ?? 0) + (hook?.beforeHandle?.length ?? 0);
375
400
  code += beginTrace("beforeHandle", bfLen);
@@ -379,7 +404,7 @@ function compileHandlerJit({ method, path, handler, root, errorRoot, hook, adapt
379
404
  const rbpAbort = abortOn ? ",1" : "";
380
405
  if (isAsync) {
381
406
  link(require_compile_handler_utils.runBeforeHandlePrefixAsync, "rbp");
382
- code += `tmp=await rbp(bp,c${rbpAbort})\n`;
407
+ code += `tmp=${awaitValue(`rbp(bp,c${rbpAbort})`, arm)}\n`;
383
408
  } else {
384
409
  link(require_compile_handler_utils.runBeforeHandlePrefix, "rbp");
385
410
  code += `tmp=rbp(bp,c${rbpAbort})\n`;
@@ -390,53 +415,53 @@ function compileHandlerJit({ method, path, handler, root, errorRoot, hook, adapt
390
415
  link(hook.beforeHandle, "bf");
391
416
  const deriveEntries = hook["~deriveEntries"];
392
417
  const chainGuard = abortChainGuard();
393
- const mapped = require_compile_handler_utils.mapBeforeHandle(hook.beforeHandle, deriveEntries, link, isAsync, buildReport("beforeHandle"), chainGuard);
418
+ const mapped = require_compile_handler_utils.mapBeforeHandle(hook.beforeHandle, deriveEntries, link, asyncMode, buildReport("beforeHandle"), chainGuard, arm);
394
419
  code += beforeHandlePrefix ? `if(${chainGuard ? `!${chainGuard}&&` : ""}_r===undefined){\n${mapped}}\n` : mapped;
395
420
  }
396
421
  }
397
422
  code += endTrace("beforeHandle");
398
423
  if (hasBeforeHandle) code += abortCheck();
399
424
  }
400
- if (hasAfterResponse || traceHandleOn) link(require_adapter_utils.tee, "tee");
401
- const teeConsumers = (hasAfterResponse ? 1 : 0) + (traceHandleOn ? 1 : 0);
402
- const teeCount = teeConsumers + 1;
403
- const teeBlock = teeConsumers > 0 && !syncAfterResponse ? `if(_r&&(_r[Symbol.iterator]||_r[Symbol.asyncIterator])&&typeof _r.next==='function'){\nconst _s=tee(_r,${teeCount})\n_r=_s[0]\n` + (hasAfterResponse ? `_stl=_s[1]\n` : "") + (traceHandleOn ? `_trs=_s[${1 + (hasAfterResponse ? 1 : 0)}]\n` : "") + `}\n` : "";
425
+ if (hasAfterResponse || traceHandleOn || hasDeriveDispose) {
426
+ link(require_adapter_utils.tee, "tee");
427
+ link(require_adapter_utils.observeStream, "obs");
428
+ }
429
+ const teeBlock = (hasAfterResponse || traceHandleOn || hasDeriveDispose) && !syncAfterResponse ? `if(${disposeGuard}_r&&(_r[Symbol.iterator]||_r[Symbol.asyncIterator])&&typeof _r.next==='function'){\nconst _s=tee(_r,2)\n_sv=_r=_s[0]\n` + (traceHandleOn ? `_trs=_s[1]\n` : `_stl=_s[1]\n`) + `}else if(${disposeGuard}_r instanceof ReadableStream){const _o=obs(_r)\nif(_o){_r=_o[0];_stl=_o[1];_sv=_o[2]}}\n` : "";
404
430
  if (traceHandleOn) {
405
431
  const handleName = handler?.name && typeof handler.name === "string" ? handler.name : "anonymous";
406
432
  code += beginTrace("handle", 1, handleName);
407
433
  const handleChild = buildReport("handle").resolveChild(handleName);
408
434
  code += handleChild.begin;
409
- if (hasBeforeHandle) code += `if(_r===undefined){\n${callHandler}${teeBlock}}\n`;
410
- else code += callHandler + teeBlock;
435
+ if (hasBeforeHandle) code += `if(_r===undefined){\n${callHandler()}${teeBlock}}\n`;
436
+ else code += callHandler() + teeBlock;
411
437
  code += handleChild.end("_r");
412
438
  code += `if(_trs){\n`;
413
439
  for (let i = 0; i < traceCount; i++) code += `_hr${i}=rp${i};\n`;
414
440
  code += `}else{\n`;
415
441
  code += endTrace("handle");
416
442
  code += `}\n`;
417
- } else if (hasBeforeHandle) code += `if(_r===undefined){\n${callHandler}${teeBlock}}\n`;
418
- else code += callHandler + teeBlock;
443
+ } else if (isHandleFunction && require_compile_handler_utils.asyncTail(asyncMode)) code += require_compile_handler_utils.tailStage(require_compile_handler_utils.asyncTail(asyncMode), hasBeforeHandle ? "_r===undefined" : void 0) + callHandler() + teeBlock + "}\n";
444
+ else if (hasBeforeHandle) code += plain(`if(_r===undefined){\n${callHandler()}${teeBlock}}\n`);
445
+ else code += plain(callHandler() + teeBlock);
446
+ if (teeBlock) discard = "_sv?.return()\n";
419
447
  code += abortCheck();
420
448
  if (syncAfterResponse) {
421
- link(require_handler_utils.forwardError, "fe");
422
- factoryHelpers += `function _fin(c,_r){
423
- if(_r instanceof Error)throw _r
424
- if(_r&&(_r[Symbol.iterator]||_r[Symbol.asyncIterator])&&typeof _r.next==='function'){
425
- const _s=tee(_r,${teeCount})\nreturn _fin2(c,_s[0],_s[1])\n}\nreturn _fin2(c,_r,undefined)\n}\nfunction _fin2(c,_r,_stl){\nc.responseValue=_r\n` + scheduleAfterResponse + `const _m=${hasSet ? `${map}(_r,c.set,c.request,true)` : `${map}(_r,c.request,true)`}\nreturn typeof _m?.then==='function'?Promise.resolve(_m).catch((_e)=>fre(rt,c,_e)):_m\n}\n`;
426
- code += "if(_r instanceof Promise)return _r.then(fe).then((_v)=>_fin(c,_v)).catch((_e)=>fre(rt,c,_e))\nreturn _fin(c,_r)\n";
449
+ if (!errorClasses) link(require_handler_utils.forwardError, "fe");
450
+ factoryHelpers += syncScheduleDecl + `function _fin(c,_r){\n` + rethrow("_r") + "if(_r&&(_r[Symbol.iterator]||_r[Symbol.asyncIterator])&&typeof _r.next==='function'){\nconst _s=tee(_r,2)\nreturn _fin2(c,_s[0],_s[1],_s[0])\n}\nif(_r instanceof ReadableStream){const _o=obs(_r)\nif(_o)return _fin2(c,_o[0],_o[1],_o[2])}\nreturn _fin2(c,_r)\n}\nfunction _fin2(c,_r,_stl,_sv){try{\nc.responseValue=_r\n" + signPrefix + `const _m=${mapValue("_r")}\n` + mapThenSchedule(syncScheduleDecl ? `_scf(c,_stl)\n` : scheduleAfterResponse, `(_e)=>{_sv?.return()\n${freThenSchedule("_e")}}`) + `}catch(_e){_sv?.return();throw _e}}\n`;
451
+ code += `if(typeof _r?.then==='function')return Promise.resolve(_r).then(${fwd}).then((_v)=>_fin(c,_v)).catch((_e)=>{${freThenSchedule("_e")}})\nreturn _fin(c,_r)\n`;
427
452
  } else {
428
- code += `if(_r instanceof Error)throw _r\n`;
453
+ code += plain(rethrow("_r"));
429
454
  if (!isAsync) {
430
- link(require_handler_utils.forwardError, "fe");
431
- code += `else if(_r instanceof Promise)_r=_r.then(fe)\n`;
455
+ if (!errorClasses) link(require_handler_utils.forwardError, "fe");
456
+ code += `${errorClasses ? "" : "else "}if(typeof _r?.then==='function')_r=Promise.resolve(_r).then(${fwd})\n`;
432
457
  }
433
- if (hasAfterHandle || hasMapResponse || hasAfterResponse || hasTrace) code += `c.responseValue=_r\n`;
458
+ if (hasAfterHandle || hasMapResponse || hasAfterResponse || hasTrace) code += plain(`c.responseValue=_r\n`);
434
459
  if (hasAfterHandle || hasTrace) {
435
460
  const afLen = hook?.afterHandle?.length ?? 0;
436
461
  code += beginTrace("afterHandle", afLen);
437
462
  if (hasAfterHandle) {
438
463
  link(hook.afterHandle, "af");
439
- code += require_compile_handler_utils.mapAfterHandle(hook.afterHandle, isAsync, buildReport("afterHandle"), abortChainGuard());
464
+ code += require_compile_handler_utils.mapChainHook(hook.afterHandle, "af", asyncMode, buildReport("afterHandle"), abortChainGuard(), arm);
440
465
  }
441
466
  code += endTrace("afterHandle");
442
467
  if (hasAfterHandle) code += abortCheck();
@@ -446,7 +471,7 @@ const _s=tee(_r,${teeCount})\nreturn _fin2(c,_s[0],_s[1])\n}\nreturn _fin2(c,_r,
446
471
  code += beginTrace("mapResponse", mrLen);
447
472
  if (hasMapResponse) {
448
473
  link(hook.mapResponse, "mr");
449
- code += require_compile_handler_utils.mapMapResponse(hook.mapResponse, isAsync, buildReport("mapResponse"), abortChainGuard());
474
+ code += require_compile_handler_utils.mapChainHook(hook.mapResponse, "mr", asyncMode, buildReport("mapResponse"), abortChainGuard(), arm);
450
475
  }
451
476
  code += endTrace("mapResponse");
452
477
  if (hasMapResponse) code += abortCheck();
@@ -454,27 +479,34 @@ const _s=tee(_r,${teeCount})\nreturn _fin2(c,_s[0],_s[1])\n}\nreturn _fin2(c,_r,
454
479
  if (hasResponseValidator) {
455
480
  link(vali, "va");
456
481
  link(require_error.ElysiaStatus, "es");
457
- const awaitStr = responseValiAsync ? "await " : "";
458
- code += `if(_r instanceof es){
459
- const _vr=va.response[_r.code]
460
- if(_vr)_r.response=${awaitStr}${responseValiAsync ? `(_vr.mayReturnPromise?_vr.From(_r.response,'response',true):_vr.EncodeFrom(_r.response,'response'))` : `_vr.EncodeFrom(_r.response,'response')`}\n}else if(!(_r instanceof Response)&&!(_r instanceof ReadableStream)&&typeof _r?.next!=='function'){\nconst _vr=va.response[c.set.status??200]\nif(_vr)_r=${awaitStr}${responseValiAsync ? `(_vr.mayReturnPromise?_vr.From(_r,'response',true):_vr.EncodeFrom(_r,'response'))` : `_vr.EncodeFrom(_r,'response')`}\n}\n`;
482
+ const encodeStatus = responseValiAsync ? `(_vr.mayReturnPromise?_vr.From(_r.response,'response',true):_vr.EncodeFrom(_r.response,'response'))` : `_vr.EncodeFrom(_r.response,'response')`;
483
+ const encodeBody = responseValiAsync ? `(_vr.mayReturnPromise?_vr.From(_r,'response',true):_vr.EncodeFrom(_r,'response'))` : `_vr.EncodeFrom(_r,'response')`;
484
+ code += plain(`if(_r instanceof es){
485
+ const _vr=va.response[_r.status]
486
+ if(_vr)_r.response=${responseValiAsync ? awaitValue(encodeStatus, arm) : encodeStatus}\n}else if(!(_r instanceof Response)&&!(_r instanceof ReadableStream)&&typeof _r?.next!=='function'){\nconst _vr=va.response[c.set.status??200]\nif(_vr)_r=${responseValiAsync ? awaitValue(encodeBody, arm) : encodeBody}\n}\n`);
461
487
  code += abortCheck();
462
488
  }
463
- code += schedule;
464
- code += signPrefix;
465
- const finalMap = hasSet ? `${map}(_r,c.set,c.request,true)` : `${map}(_r,c.request,true)`;
466
- if (isAsync) code += `return await ${finalMap}\n`;
489
+ const deferSchedule = !!schedule;
490
+ code += plain(signPrefix);
491
+ const finalMap = mapValue("_r");
492
+ const onMapReject = syncErrorHook ? `(_e)=>_ce(_e,c)` : dedupSchedule ? `(_e)=>{${freThenSchedule("_e")}}` : `(_e)=>fre(rt,c,_e)`;
493
+ if (tail) code += `let _m\n${stageSite(finalMap, "_m")}` + (deferSchedule ? schedule : "") + `return _m\n`;
494
+ else if (isAsync) code += deferSchedule ? `const _m=await ${finalMap}\n${schedule}return _m\n` : `return await ${finalMap}\n`;
467
495
  else {
468
496
  code += `const _m=${finalMap}\n`;
469
- code += syncErrorHook ? `return typeof _m?.then==='function'?Promise.resolve(_m).catch((_e)=>_ce(_e,c)):_m\n` : `return typeof _m?.then==='function'?Promise.resolve(_m).catch((_e)=>fre(rt,c,_e)):_m\n`;
497
+ code += deferSchedule ? mapThenSchedule(schedule, onMapReject) : `return typeof _m?.then==='function'?Promise.resolve(_m).catch(${onMapReject}):_m\n`;
470
498
  }
471
499
  }
472
500
  } else if (isHandleFunction) {
473
- if (!isAsync) link(require_handler_utils.forwardError, "fe");
474
- const mapArgs = hasSet ? "c.set,c.request,true" : "c.request,true";
475
- code += callHandlerSyncOnAsync ? `let _r=h(c)\nif(_r instanceof Promise)_r=await _r\n` : `let _r=${isAsync ? "await " : ""}h(c)\n`;
476
- code += abortCheck() + `if(_r instanceof Error)throw _r\n` + (isAsync ? `return await ${map}(_r,${mapArgs})\n` : syncErrorHook ? `if(_r instanceof Promise)_r=_r.then(fe)\nconst _m=${map}(_r,${mapArgs})\nreturn typeof _m?.then==='function'?Promise.resolve(_m).catch((_e)=>_ce(_e,c)):_m\n` : `if(_r instanceof Promise)_r=_r.then(fe)\nconst _m=${map}(_r,${mapArgs})\nreturn typeof _m?.then==='function'?Promise.resolve(_m).catch((_e)=>fre(rt,c,_e)):_m\n`);
477
- } else code += `const _m=${mapReturn.trim()}\nreturn typeof _m?.then==='function'?Promise.resolve(_m).catch((_e)=>fre(rt,c,_e)):_m\n`;
501
+ if (!isAsync && !errorClasses) link(require_handler_utils.forwardError, "fe");
502
+ const finalMap = mapValue("_r");
503
+ if (typeof asyncMode === "object") {
504
+ code += `let _r${require_compile_handler_utils.asyncTail(asyncMode) ? "=_lr" : ""}\n`;
505
+ asyncMode.r = true;
506
+ code += stageSite("h(c)", "_r", handler, arm);
507
+ } else code += `let ${callHandler()}`;
508
+ code += abortCheck() + plain(rethrow("_r")) + (tail ? `let _m\n${stageSite(finalMap, "_m")}return _m\n` : isAsync ? `return await ${finalMap}\n` : `if(typeof _r?.then==='function')_r=Promise.resolve(_r).then(${fwd})\nconst _m=${finalMap}\nreturn typeof _m?.then==='function'?Promise.resolve(_m).catch((_e)=>${syncErrorHook ? "_ce(_e,c)" : "fre(rt,c,_e)"}):_m\n`);
509
+ } else code += plain(`const _m=${mapValue(isStaticResponse ? "cr(h)" : isPromiseHandler ? "h.then(cr)" : "h")}\nreturn typeof _m?.then==='function'?Promise.resolve(_m).catch((_e)=>fre(rt,c,_e)):_m\n`);
478
510
  if (hasErrorHook || hasTrace) {
479
511
  let body = "";
480
512
  if (hasTrace) {
@@ -486,28 +518,48 @@ if(_vr)_r.response=${awaitStr}${responseValiAsync ? `(_vr.mayReturnPromise?_vr.F
486
518
  link(require_handler_error.fallbackResponse, "fbr");
487
519
  const allowUnsafeDetail = !!root["~config"]?.allowUnsafeValidationDetails;
488
520
  if (allowUnsafeDetail) link(require_error.ValidationError, "verr");
489
- factoryHelpers += `function _em(c,_r){return typeof _r?.then==='function'?Promise.resolve(_r).catch((_e)=>fre(rt,c,_e)):_r}\nfunction _fbm(_r,_s,_c){return ${map}(_r,_s,_c.request,true)}\n${asyncCookieSign ? "async " : ""}function _efb(e,c){\n` + (asyncCookieSign ? `let _sg\n` : ``) + signPrefix + "return _em(c,fbr(c,e,_fbm))\n}\n";
490
- body += `c.error=e\n` + (allowUnsafeDetail ? `if(e instanceof verr)e.allowUnsafeValidationDetails=true\n` : ``) + `if(e?.status)c.set.status=e.status
491
- else if(c.set.status===undefined||c.set.status===200)c.set.status=500
492
- let _r${hasMapResponse ? ",tmp" : ""}\n` + require_compile_handler_utils.mapError(hook.error, [
521
+ factoryHelpers += `function _em(c,_r){return typeof _r?.then==='function'?Promise.resolve(_r).catch((_e)=>fre(rt,c,_e)):_r}\nfunction _fbm(_r,_s,_c){return ${map}(_r,_s,_c.request,true)}\n${asyncCookieSign ? "async " : ""}function _efb(e,c){\n` + (asyncCookieSign ? `let _sg${arm ? ",_as" : ""}\n` : ``) + signPrefix + "return _em(c,fbr(c,e,_fbm))\n}\n";
522
+ const errorHead = plain(`c.error=e\n` + (allowUnsafeDetail ? `if(e instanceof verr)e.allowUnsafeValidationDetails=true\n` : ``) + "if(e?.status)c.set.status=e.status\nelse if(c.set.status===undefined||c.set.status===200)c.set.status=500\n");
523
+ if (typeof asyncMode === "object") {
524
+ tailCatch = asyncMode.n;
525
+ asyncMode.r = false;
526
+ asyncMode.e = true;
527
+ }
528
+ body += errorHead + `let _r${hasMapResponse ? ",tmp" : ""}\n` + require_compile_handler_utils.mapError(hook.error, [
493
529
  map,
494
530
  link,
495
- res.map,
496
- (hasMapResponse ? `c.responseValue=_r\n` + require_compile_handler_utils.mapMapResponse(hook.mapResponse, isAsync, void 0, abortOn ? abortArm : void 0) : "") + endTrace("error") + abortCatch + schedule,
531
+ responseMap,
532
+ (hasMapResponse ? `c.responseValue=_r\n` + require_compile_handler_utils.mapChainHook(hook.mapResponse, "mr", asyncMode, void 0, abortChainGuard(), arm) : "") + endTrace("error") + (hasDeriveDispose ? schedule + abortCatch : abortCatch + schedule),
497
533
  signPrefix,
498
- isAsync
499
- ], abortOn ? abortArm : void 0) + endTrace("error") + abortCatch + schedule + `return _efb(e,c)\n`;
500
- } else {
501
- body += endTrace("error") + schedule;
502
- body += `return fre(rt,c,e)\n`;
503
- }
534
+ asyncMode,
535
+ arm
536
+ ], abortChainGuard(), require_compile_handler_utils.asyncTail(asyncMode)) + endTrace("error") + (hasDeriveDispose ? schedule + abortCatch : abortCatch + schedule) + `return _efb(e,c)\n`;
537
+ } else body += endTrace("error") + freThenSchedule("e");
538
+ const hookThrew = `catch(_ee){${freThenSchedule("_ee").trimEnd()}}}\n`;
504
539
  if (syncErrorHook) {
505
- factoryHelpers += `function _ce(e,c){${abortOn ? "let _as\n" : ""}try{\n${body}}catch(_ee){return fre(rt,c,_ee)}}\n`;
540
+ factoryHelpers += `function _ce(e,c){${abortOn ? "let _as\n" : ""}try{\n${body}}${hookThrew}`;
506
541
  code += `}catch(e){return _ce(e,c)}\n`;
507
- } else code += `}catch(e){try{\n${body}}catch(_ee){return fre(rt,c,_ee)}}\n`;
508
- } else code += `}catch(e){return fre(rt,c,e)}\n`;
542
+ } else code += `}catch(e){try{\n${body}}${hookThrew}`;
543
+ } else code += catchSchedule ? `}catch(e){${freThenSchedule("e")}}\n` : `}catch(e){return fre(rt,c,e)}\n`;
544
+ if (tailPass) return code;
509
545
  code += "}";
510
- code = head + (abortOn && code.includes("_as") ? "let _as\n" : "") + scheduleDecl + code;
546
+ code = head + (abortOn && code.includes("_as") ? "let _as\n" : "") + (abortOn && code.includes("_av") ? "let _av\n" : "") + (tail ? "" : scheduleDecl) + code;
547
+ if (tail) {
548
+ const { n, live, sites } = asyncMode;
549
+ const pass = {
550
+ async: true,
551
+ n: 0,
552
+ live,
553
+ sites: []
554
+ };
555
+ const pipeline = compileHandlerJit(options, pass);
556
+ if (pass.sites.join("\n") !== sites.join("\n") || !pipeline.startsWith("try{\n")) throw new Error("[elysia] async tail out of step with its route");
557
+ factoryHelpers += scheduleDecl + `async function _t(c,_rk,_y,_lr,_le${live}){\n` + (abortOn && pipeline.includes("_as") ? "let _as\n" : "") + "try{\n" + (tailCatch !== -1 && tailCatch < n ? `if(_rk>=${tailCatch})throw _le\n` : "") + pipeline.slice(5) + "}\n";
558
+ }
559
+ if (syncCookieSign || asyncCookieSign) {
560
+ code = code.replaceAll("fre(rt,c,", "_sfre(rt,c,");
561
+ factoryHelpers = factoryHelpers.replaceAll("fre(rt,c,", "_sfre(rt,c,") + `function _sgn(s){return scv(s.cookie,cc)}\nfunction _sfre(rt,c,e){return fre(rt,c,e,_sgn)}\n`;
562
+ }
511
563
  if (factoryHelpers) code = `(function(){\n${factoryHelpers}return ${code}})()`;
512
564
  const alias = aliasKeys.join(",");
513
565
  const fullAlias = alias ? `rt,fre,${alias}` : "rt,fre";
@@ -515,12 +567,32 @@ let _r${hasMapResponse ? ",tmp" : ""}\n` + require_compile_handler_utils.mapErro
515
567
  method,
516
568
  path,
517
569
  alias: fullAlias,
518
- code
570
+ code,
571
+ k: shape
519
572
  });
573
+ onEmit?.(code);
520
574
  const isGeneratorHandler = isHandleFunction && handler.constructor.name.endsWith("GeneratorFunction");
521
575
  if (!hasTrace && isHandleFunction && !isGeneratorHandler && !inlineUnsafe) {
522
- if (alias === "rc" || !isAsync && !syncErrorHook && alias === "rc,fe") return createInlineHandler(res.compact ?? res.map, handler);
523
- else if (alias === "rm" || alias === "msh,rm" || !isAsync && !syncErrorHook && (alias === "rm,fe" || alias === "msh,rm,fe")) return responseMode === "set-with-default-headers" && inference.set ? createInlineHandlerWithDefaultHeaders(responseMap, handler) : createInlineHandlerWithSet(responseMap, handler);
576
+ if (alias === "rc" || !isAsync && !syncErrorHook && alias === "rc,fe") return createInlineHandler(responseCompact, handler);
577
+ else if (alias === "rm" || alias === "msh,rm" || !isAsync && !syncErrorHook && (alias === "rm,fe" || alias === "msh,rm,fe")) {
578
+ const rmap = responseMap;
579
+ const h = handler;
580
+ let inlineHandler;
581
+ if (responseMode === "set-with-default-headers" && inference.set) inlineHandler = ((c) => {
582
+ require_adapter_utils.materializeSetHeaders(c.set);
583
+ const r = h(c);
584
+ if (r instanceof Error) throw r;
585
+ if (typeof r?.then === "function") return Promise.resolve(r).then((v) => rmap(require_handler_utils.forwardError(v), c.set, c.request, true));
586
+ return rmap(r, c.set, c.request, true);
587
+ });
588
+ else inlineHandler = ((c) => {
589
+ const r = h(c);
590
+ if (r instanceof Error) throw r;
591
+ if (typeof r?.then === "function") return Promise.resolve(r).then((v) => rmap(require_handler_utils.forwardError(v), c.set, c.request, true));
592
+ return rmap(r, c.set, c.request, true);
593
+ });
594
+ return inlineHandler;
595
+ }
524
596
  }
525
597
  require_compile_jit_probe.JITProbe.record("handler:new-function");
526
598
  return new Function("h", fullAlias, `return ${code}`)(handler, ...paramValues);
@@ -529,5 +601,6 @@ let _r${hasMapResponse ? ",tmp" : ""}\n` + require_compile_handler_utils.mapErro
529
601
  //#endregion
530
602
  exports.compileHandlerJit = compileHandlerJit;
531
603
  exports.createInlineHandler = createInlineHandler;
532
- exports.schemaMediaKind = schemaMediaKind;
533
- exports.setCaptureHeaderShorthand = setCaptureHeaderShorthand;
604
+ exports.setAsyncTail = setAsyncTail;
605
+ exports.setCaptureHeaderShorthand = setCaptureHeaderShorthand;
606
+ exports.setOnEmit = setOnEmit;