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