elysia 2.0.0-beta.12 → 2.0.0-beta.13

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 (51) hide show
  1. package/dist/adapter/bun/index.js +28 -17
  2. package/dist/adapter/bun/index.mjs +28 -17
  3. package/dist/adapter/utils.js +1 -0
  4. package/dist/adapter/utils.mjs +1 -0
  5. package/dist/adapter/web-standard/handler.js +2 -2
  6. package/dist/adapter/web-standard/handler.mjs +2 -2
  7. package/dist/compile/aot-emit.js +1 -1
  8. package/dist/compile/aot-emit.mjs +1 -1
  9. package/dist/compile/aot.d.ts +1 -1
  10. package/dist/compile/aot.js +2 -2
  11. package/dist/compile/aot.mjs +2 -2
  12. package/dist/compile/handler/descriptor.d.ts +2 -3
  13. package/dist/compile/handler/descriptor.js +6 -16
  14. package/dist/compile/handler/descriptor.mjs +7 -16
  15. package/dist/compile/handler/index.d.ts +1 -1
  16. package/dist/compile/handler/index.js +15 -6
  17. package/dist/compile/handler/index.mjs +15 -6
  18. package/dist/compile/handler/jit.js +71 -66
  19. package/dist/compile/handler/jit.mjs +72 -67
  20. package/dist/compile/handler/params.js +3 -2
  21. package/dist/compile/handler/params.mjs +4 -3
  22. package/dist/compile/handler/static-clone-resolver.d.ts +6 -0
  23. package/dist/compile/handler/static-clone-resolver.js +8 -0
  24. package/dist/compile/handler/static-clone-resolver.mjs +7 -0
  25. package/dist/compile/handler/utils.d.ts +7 -6
  26. package/dist/compile/handler/utils.js +23 -18
  27. package/dist/compile/handler/utils.mjs +23 -19
  28. package/dist/compile/utils.js +7 -4
  29. package/dist/compile/utils.mjs +7 -4
  30. package/dist/cookie/lib.js +2 -1
  31. package/dist/cookie/lib.mjs +2 -1
  32. package/dist/cookie/utils.d.ts +1 -1
  33. package/dist/cookie/utils.js +9 -23
  34. package/dist/cookie/utils.mjs +9 -23
  35. package/dist/handler/error.js +3 -4
  36. package/dist/handler/error.mjs +3 -4
  37. package/dist/handler/fetch.js +17 -13
  38. package/dist/handler/fetch.mjs +17 -13
  39. package/dist/package.js +1 -1
  40. package/dist/package.mjs +1 -1
  41. package/dist/plugin/aot/core.d.ts +2 -0
  42. package/dist/plugin/aot/core.js +6 -0
  43. package/dist/plugin/aot/core.mjs +6 -0
  44. package/dist/plugin/aot/hooks.js +5 -1
  45. package/dist/plugin/aot/hooks.mjs +5 -1
  46. package/dist/trace.js +14 -5
  47. package/dist/trace.mjs +14 -5
  48. package/dist/type/constants.d.ts +1 -1
  49. package/dist/types.d.ts +5 -4
  50. package/dist/utils.d.ts +0 -1
  51. package/package.json +4 -4
@@ -10,45 +10,44 @@ 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;
22
21
  const setCaptureHeaderShorthand = (value) => {
23
22
  captureHeaderShorthand = value;
24
23
  };
25
- function builtinParser(adapter, parse, link) {
24
+ function builtinParser(adapter, parse, link, arm) {
26
25
  switch (parse) {
27
26
  case "formdata":
28
27
  case "multipart/form-data":
29
28
  link(adapter.formData, "pf");
30
- return parseFormData;
29
+ return `c.body=${awaitValue("pf(c)", arm)}\n`;
31
30
  case "json":
32
31
  case "application/json":
33
32
  link(adapter.json, "pj");
34
- return "c.body=await pj(c)\n";
33
+ return `c.body=${awaitValue("pj(c)", arm)}\n`;
35
34
  case "urlencoded":
36
35
  case "application/x-www-form-urlencoded":
37
36
  link(adapter.urlencoded, "pu");
38
- return "c.body=await pu(c)\n";
37
+ return `c.body=${awaitValue("pu(c)", arm)}\n`;
39
38
  case "arrayBuffer":
40
39
  case "application/octet-stream":
41
40
  link(adapter.arrayBuffer, "pa");
42
- return "c.body=await pa(c)\n";
41
+ return `c.body=${awaitValue("pa(c)", arm)}\n`;
43
42
  case "text":
44
43
  case "text/plain":
45
44
  link(adapter.text, "pt");
46
- return "c.body=await pt(c)\n";
45
+ return `c.body=${awaitValue("pt(c)", arm)}\n`;
47
46
  case "none": return "";
48
47
  default: throw new Error(`Unsupported content type: ${parse}`);
49
48
  }
50
49
  }
51
- function parse(adapter, parsers, bodyVali, hasHeaders, link, report) {
50
+ function parse(adapter, parsers, bodyVali, hasHeaders, link, report, arm) {
52
51
  if (parsers && typeof parsers === "function") parsers = [parsers];
53
52
  if (typeof parsers === "string" || parsers?.length === 1 && typeof parsers[0] === "string") {
54
53
  if (parsers.length === 1) parsers = parsers[0];
@@ -56,7 +55,7 @@ function parse(adapter, parsers, bodyVali, hasHeaders, link, report) {
56
55
  const child = report?.resolveChild(builtinName);
57
56
  const begin = child ? child.begin : "";
58
57
  const end = child ? child.end() : "";
59
- return begin + builtinParser(adapter, parsers, link) + end;
58
+ return begin + builtinParser(adapter, parsers, link, arm) + end;
60
59
  }
61
60
  let hasFn = false;
62
61
  let hasType = false;
@@ -77,7 +76,7 @@ if(cti!==-1)ct=ct.slice(0,cti)
77
76
  const child = report?.resolveChild(parser.name || "anonymous");
78
77
  if (i) code += "if(!hasBody){";
79
78
  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`;
79
+ code += `_bp=ho.parse[${i}](c,ct)\n` + require_compile_handler_utils.awaitGuard(parser, true, "_bp", arm) + `c.body=_bp\n`;
81
80
  code += "hasBody=c.body!==undefined\n";
82
81
  if (child) code += child.end();
83
82
  if (i) code += "}\n";
@@ -86,7 +85,7 @@ if(cti!==-1)ct=ct.slice(0,cti)
86
85
  const child = report?.resolveChild(parser);
87
86
  if (i) code += "if(!hasBody){\n";
88
87
  if (child) code += child.begin;
89
- code += builtinParser(adapter, parser, link);
88
+ code += builtinParser(adapter, parser, link, arm);
90
89
  if (child) code += child.end();
91
90
  if (i) code += "}\n";
92
91
  break;
@@ -104,7 +103,8 @@ if(cti!==-1)ct=ct.slice(0,cti)
104
103
  code += `if(ct&&!(${mediaGuard}))throw new es(415,'Unsupported Media Type')\n`;
105
104
  link(require_error.ElysiaStatus, "es");
106
105
  }
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`;
106
+ const value = `c.body=cj?${awaitValue("pj(c)", arm)}:${awaitValue("pd(c,ce,true)", arm)}\n`;
107
+ code += hasFn ? `if(!hasBody&&${guard}){${begin}${value}${end}}\n` : `if(${guard}){${begin}${value}${end}}\n`;
108
108
  if (!bodyVali) link(require_compile_handler_utils.hasRequestBody, "hb");
109
109
  link(adapter.json, "pj");
110
110
  link(adapter.default, "pd");
@@ -141,24 +141,24 @@ const fromArgs = (type, isAsync) => `'${type}'${isAsync ? ",true" : ""}`;
141
141
  const createInlineHandler = (map, h) => ((c) => {
142
142
  const r = h(c);
143
143
  if (r instanceof Error) throw r;
144
- if (r instanceof Promise) return r.then((v) => map(require_handler_utils.forwardError(v), c.request, true));
144
+ if (typeof r?.then === "function") return Promise.resolve(r).then((v) => map(require_handler_utils.forwardError(v), c.request, true));
145
145
  return map(r, c.request, true);
146
146
  });
147
147
  const createInlineHandlerWithSet = (map, h) => ((c) => {
148
148
  const r = h(c);
149
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));
150
+ if (typeof r?.then === "function") return Promise.resolve(r).then((v) => map(require_handler_utils.forwardError(v), c.set, c.request, true));
151
151
  return map(r, c.set, c.request, true);
152
152
  });
153
153
  const createInlineHandlerWithDefaultHeaders = (map, h) => ((c) => {
154
154
  require_adapter_utils.materializeSetHeaders(c.set);
155
155
  const r = h(c);
156
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));
157
+ if (typeof r?.then === "function") return Promise.resolve(r).then((v) => map(require_handler_utils.forwardError(v), c.set, c.request, true));
158
158
  return map(r, c.set, c.request, true);
159
159
  });
160
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;
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, syncErrorHook, syncAfterResponse } } = state;
162
162
  const hasStaticAfterResponse = !!hook?.afterResponse?.length;
163
163
  const hasDynamicAfterResponse = !!inference.afterResponse;
164
164
  const seenKeys = new Set(["rt", "fre"]);
@@ -181,15 +181,10 @@ function compileHandlerJit({ method, path, handler, root, errorRoot, hook, adapt
181
181
  }
182
182
  const abortOn = hasLifecycleHook && root["~config"]?.abortSignal !== false;
183
183
  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` : "";
184
+ const arm = abortOn ? "_as??=(c['~sig']??=c.request.signal)" : "";
185
+ const abortCheck = () => abortOn ? `if(${abortPeek})return emp.clone()\n` : "";
186
+ const abortChainGuard = () => abortOn ? abortPeek : void 0;
187
+ const abortCatch = abortOn ? `if((${arm}).aborted)return emp.clone()\n` : "";
193
188
  const phaseOn = (phase) => hasTrace && (tracePhases === null || tracePhases.has(phase));
194
189
  const beginTrace = (phase, total, name = phase) => {
195
190
  if (!phaseOn(phase)) return "";
@@ -222,7 +217,7 @@ function compileHandlerJit({ method, path, handler, root, errorRoot, hook, adapt
222
217
  };
223
218
  const needsStaticClone = !isHandleFunction && !isStaticResponse && !isPromiseHandler && (hasAfterHandle || hasMapResponse) && typeof handler === "object" && handler !== null;
224
219
  if (needsStaticClone) link(require_compile_handler_utils.cloneStaticValue, "scl");
225
- 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` : needsStaticClone ? `_r=scl(h)\n` : `_r=h\n`;
220
+ const callHandler = isHandleFunction ? `_r=h(c)\n${require_compile_handler_utils.awaitGuard(handler, isAsync, "_r", arm)}` : isStaticResponse ? `_r=cr(h)\n` : isPromiseHandler ? `_r=h.then(cr)\n` : needsStaticClone ? `_r=scl(h)\n` : `_r=h\n`;
226
221
  let code = `${isAsync ? "async " : ""}function route(c){\n`;
227
222
  if (abortOn) {
228
223
  link(require_handler_utils.emptyResponse, "emp");
@@ -279,7 +274,7 @@ function compileHandlerJit({ method, path, handler, root, errorRoot, hook, adapt
279
274
  if (hasBody) {
280
275
  const parseLen = Array.isArray(hook?.parse) ? hook.parse.length : 0;
281
276
  if (hasTrace) code += beginTrace("parse", parseLen);
282
- const parseCode = parse(adapter.parse, hook?.parse, vali?.body, hasHeaders, link, buildReport("parse"));
277
+ const parseCode = parse(adapter.parse, hook?.parse, vali?.body, hasHeaders, link, buildReport("parse"), arm);
283
278
  const preserveParseStatus = seenKeys.has("es");
284
279
  link(require_error.ParseError, "pe");
285
280
  code += "try{\n" + parseCode + `}catch(e){${preserveParseStatus ? "if(e instanceof es)throw e\n" : ""}throw new pe(e)}\n`;
@@ -292,26 +287,34 @@ function compileHandlerJit({ method, path, handler, root, errorRoot, hook, adapt
292
287
  if (transformLen) {
293
288
  link(hook.transform, "tf");
294
289
  if (isAsync) code += "let _tf\n";
295
- code += require_compile_handler_utils.mapTransform(hook.transform, [isAsync, buildReport("transform")], abortChainGuard());
290
+ code += require_compile_handler_utils.mapTransform(hook.transform, [
291
+ isAsync,
292
+ buildReport("transform"),
293
+ arm
294
+ ], abortChainGuard());
296
295
  }
297
296
  code += endTrace("transform");
298
297
  if (transformLen) code += abortCheck();
299
298
  }
300
299
  if (vali?.body) {
301
300
  link(vali, "va");
302
- code += `c.body=${bodyValiIsAsync ? "await " : ""}va.body.From(c.body,${fromArgs("body", bodyValiIsAsync)})\n`;
301
+ const value = `va.body.From(c.body,${fromArgs("body", bodyValiIsAsync)})`;
302
+ code += `c.body=${bodyValiIsAsync ? awaitValue(value, arm) : value}\n`;
303
303
  }
304
304
  if (vali?.headers) {
305
305
  link(vali, "va");
306
- code += `c.headers=${headersValiIsAsync ? "await " : ""}va.headers.From(c.headers,${fromArgs("headers", !!headersValiIsAsync)})\n`;
306
+ const value = `va.headers.From(c.headers,${fromArgs("headers", !!headersValiIsAsync)})`;
307
+ code += `c.headers=${headersValiIsAsync ? awaitValue(value, arm) : value}\n`;
307
308
  }
308
309
  if (vali?.params) {
309
310
  link(vali, "va");
310
- code += `c.params=${paramsValiIsAsync ? "await " : ""}va.params.From(c.params,${fromArgs("params", !!paramsValiIsAsync)})\n`;
311
+ const value = `va.params.From(c.params,${fromArgs("params", !!paramsValiIsAsync)})`;
312
+ code += `c.params=${paramsValiIsAsync ? awaitValue(value, arm) : value}\n`;
311
313
  }
312
314
  if (vali?.query) {
313
315
  link(vali, "va");
314
- code += `c.query=${queryValiIsAsync ? "await " : ""}va.query.From(c.query,${fromArgs("query", !!queryValiIsAsync)})\n`;
316
+ const value = `va.query.From(c.query,${fromArgs("query", !!queryValiIsAsync)})`;
317
+ code += `c.query=${queryValiIsAsync ? awaitValue(value, arm) : value}\n`;
315
318
  }
316
319
  if (cookieConfig) {
317
320
  link(require_cookie_utils.buildCookieJar, "bcj");
@@ -336,25 +339,30 @@ function compileHandlerJit({ method, path, handler, root, errorRoot, hook, adapt
336
339
  code += `let _ck=pcrsg(${cookieHeaderExpr},cc)\n`;
337
340
  } else {
338
341
  link(require_cookie_utils.parseCookieRaw, "pcr");
339
- code += `let _ck=await pcr(${cookieHeaderExpr},cc)\n`;
342
+ code += `let _ck=${awaitValue(`pcr(${cookieHeaderExpr},cc)`, arm)}\n`;
340
343
  }
341
344
  if (vali?.cookie) {
342
345
  link(vali, "va");
343
346
  const cookieIsOptional = !!(hook?.cookie)?.["~optional"];
344
- const validateExpr = `_ck=${cookieValidIsAsync ? "await " : ""}va.cookie.From(_ck,${fromArgs("cookie", !!cookieValidIsAsync)})\n`;
347
+ const value = `va.cookie.From(_ck,${fromArgs("cookie", !!cookieValidIsAsync)})`;
348
+ const validateExpr = `_ck=${cookieValidIsAsync ? awaitValue(value, arm) : value}\n`;
345
349
  if (cookieIsOptional) code += `if(Object.keys(_ck).length){${validateExpr}}\n`;
346
350
  else code += validateExpr;
347
351
  }
348
352
  code += `c.cookie=bcj(c.set,_ck,cc${deferDecode ? ",undefined,1" : ""})\n`;
349
353
  }
350
354
  }
351
- const hasSet = responseMode !== "compact";
355
+ const compactEligible = responseMode === "compact";
352
356
  const res = adapter.response;
353
357
  const responseMap = res.map;
354
- const map = hasSet ? link(res.map, "rm") ?? "rm" : link(res.compact ?? res.map, "rc") ?? "rc";
358
+ const responseCompact = compactEligible ? res.compact : void 0;
359
+ const portableCompact = compactEligible && (require_compile_aot.Capture.isAotBuildEnv() || require_compile_aot.Capture.isCapturing());
360
+ const hasSet = !compactEligible || !responseCompact && !portableCompact;
361
+ const map = hasSet ? link(responseMap, "rm") ?? "rm" : link(responseCompact, "rc") ?? "rc";
362
+ if (portableCompact) link(responseMap, "rm");
363
+ 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)`;
355
364
  if (isStaticResponse || isPromiseHandler) link(require_compile_handler_utils.cloneResponse, "cr");
356
- const handleInstruction = isHandleFunction ? "h(c)" : isStaticResponse ? "cr(h)" : isPromiseHandler ? "h.then(cr)" : "h";
357
- const mapReturn = hasSet ? `rm(${handleInstruction},c.set,c.request,true)\n` : `rc(${handleInstruction},c.request,true)\n`;
365
+ const mapReturn = `${mapValue(isHandleFunction ? "h(c)" : isStaticResponse ? "cr(h)" : isPromiseHandler ? "h.then(cr)" : "h")}\n`;
358
366
  if (hasStaticAfterResponse) link(hook.afterResponse, "ar");
359
367
  const drainTraceStream = traceHandleOn ? `let _ser\nif(_trs){try{for await(const v of _trs){}}catch(_te){_ser=_te}}\n` : "";
360
368
  const resolveHandlePostDrain = traceHandleOn ? (() => {
@@ -370,7 +378,7 @@ function compileHandlerJit({ method, path, handler, root, errorRoot, hook, adapt
370
378
  const syncScheduleDecl = syncAfterResponse && scheduleAfterResponse ? `function _scf(c,_stl){\n${scheduleAfterResponse}}\n` : "";
371
379
  const catchSchedule = dedupSchedule ? `_sc()\n` : syncScheduleDecl ? `_scf(c)\n` : "";
372
380
  const freThenSchedule = (arg) => catchSchedule ? `if(c._arf)return fre(rt,c,${arg})\nc._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`;
373
- const signPrefix = syncCookieSign ? `scv(c.set.cookie,cc)\n` : asyncCookieSign ? `_sg=scv(c.set.cookie,cc)\nif(_sg)await _sg\n` : "";
381
+ const signPrefix = syncCookieSign ? `scv(c.set.cookie,cc)\n` : asyncCookieSign ? `_sg=scv(c.set.cookie,cc)\nif(_sg){${arm ? `${arm}\n` : ""}await _sg}\n` : "";
374
382
  if (syncCookieSign || asyncCookieSign) link(require_cookie_utils.signCookieValues, "scv");
375
383
  let factoryHelpers = "";
376
384
  if (hasBeforeHandle || hasAfterHandle || hasMapResponse || hasAfterResponse || hasResponseValidator || hasCookieSign || hasTrace) {
@@ -384,7 +392,7 @@ function compileHandlerJit({ method, path, handler, root, errorRoot, hook, adapt
384
392
  const rbpAbort = abortOn ? ",1" : "";
385
393
  if (isAsync) {
386
394
  link(require_compile_handler_utils.runBeforeHandlePrefixAsync, "rbp");
387
- code += `tmp=await rbp(bp,c${rbpAbort})\n`;
395
+ code += `tmp=${awaitValue(`rbp(bp,c${rbpAbort})`, arm)}\n`;
388
396
  } else {
389
397
  link(require_compile_handler_utils.runBeforeHandlePrefix, "rbp");
390
398
  code += `tmp=rbp(bp,c${rbpAbort})\n`;
@@ -395,7 +403,7 @@ function compileHandlerJit({ method, path, handler, root, errorRoot, hook, adapt
395
403
  link(hook.beforeHandle, "bf");
396
404
  const deriveEntries = hook["~deriveEntries"];
397
405
  const chainGuard = abortChainGuard();
398
- const mapped = require_compile_handler_utils.mapBeforeHandle(hook.beforeHandle, deriveEntries, link, isAsync, buildReport("beforeHandle"), chainGuard);
406
+ const mapped = require_compile_handler_utils.mapBeforeHandle(hook.beforeHandle, deriveEntries, link, isAsync, buildReport("beforeHandle"), chainGuard, arm);
399
407
  code += beforeHandlePrefix ? `if(${chainGuard ? `!${chainGuard}&&` : ""}_r===undefined){\n${mapped}}\n` : mapped;
400
408
  }
401
409
  }
@@ -403,9 +411,7 @@ function compileHandlerJit({ method, path, handler, root, errorRoot, hook, adapt
403
411
  if (hasBeforeHandle) code += abortCheck();
404
412
  }
405
413
  if (hasAfterResponse || traceHandleOn) link(require_adapter_utils.tee, "tee");
406
- const teeConsumers = (hasAfterResponse ? 1 : 0) + (traceHandleOn ? 1 : 0);
407
- const teeCount = teeConsumers + 1;
408
- 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` : "";
414
+ const teeBlock = (hasAfterResponse || traceHandleOn) && !syncAfterResponse ? "if(_r&&(_r[Symbol.iterator]||_r[Symbol.asyncIterator])&&typeof _r.next==='function'){\nconst _s=tee(_r,2)\n_r=_s[0]\n" + (traceHandleOn ? `_trs=_s[1]\n` : `_stl=_s[1]\n`) + `}\n` : "";
409
415
  if (traceHandleOn) {
410
416
  const handleName = handler?.name && typeof handler.name === "string" ? handler.name : "anonymous";
411
417
  code += beginTrace("handle", 1, handleName);
@@ -424,16 +430,13 @@ function compileHandlerJit({ method, path, handler, root, errorRoot, hook, adapt
424
430
  code += abortCheck();
425
431
  if (syncAfterResponse) {
426
432
  link(require_handler_utils.forwardError, "fe");
427
- factoryHelpers += syncScheduleDecl + `function _fin(c,_r){
428
- if(_r instanceof Error)throw _r
429
- if(_r&&(_r[Symbol.iterator]||_r[Symbol.asyncIterator])&&typeof _r.next==='function'){
430
- 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` + (syncScheduleDecl ? `_scf(c,_stl)\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`;
431
- 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";
433
+ factoryHelpers += syncScheduleDecl + "function _fin(c,_r){\nif(_r instanceof Error)throw _r\nif(_r&&(_r[Symbol.iterator]||_r[Symbol.asyncIterator])&&typeof _r.next==='function'){\nconst _s=tee(_r,2)\nreturn _fin2(c,_s[0],_s[1])\n}\nreturn _fin2(c,_r,undefined)\n}\nfunction _fin2(c,_r,_stl){\nc.responseValue=_r\n" + (syncScheduleDecl ? `_scf(c,_stl)\n` : scheduleAfterResponse) + `const _m=${mapValue("_r")}\nreturn typeof _m?.then==='function'?Promise.resolve(_m).catch((_e)=>fre(rt,c,_e)):_m\n}\n`;
434
+ code += "if(typeof _r?.then==='function')return Promise.resolve(_r).then(fe).then((_v)=>_fin(c,_v)).catch((_e)=>fre(rt,c,_e))\nreturn _fin(c,_r)\n";
432
435
  } else {
433
436
  code += `if(_r instanceof Error)throw _r\n`;
434
437
  if (!isAsync) {
435
438
  link(require_handler_utils.forwardError, "fe");
436
- code += `else if(_r instanceof Promise)_r=_r.then(fe)\n`;
439
+ code += `else if(typeof _r?.then==='function')_r=Promise.resolve(_r).then(fe)\n`;
437
440
  }
438
441
  if (hasAfterHandle || hasMapResponse || hasAfterResponse || hasTrace) code += `c.responseValue=_r\n`;
439
442
  if (hasAfterHandle || hasTrace) {
@@ -441,7 +444,7 @@ const _s=tee(_r,${teeCount})\nreturn _fin2(c,_s[0],_s[1])\n}\nreturn _fin2(c,_r,
441
444
  code += beginTrace("afterHandle", afLen);
442
445
  if (hasAfterHandle) {
443
446
  link(hook.afterHandle, "af");
444
- code += require_compile_handler_utils.mapAfterHandle(hook.afterHandle, isAsync, buildReport("afterHandle"), abortChainGuard());
447
+ code += require_compile_handler_utils.mapAfterHandle(hook.afterHandle, isAsync, buildReport("afterHandle"), abortChainGuard(), arm);
445
448
  }
446
449
  code += endTrace("afterHandle");
447
450
  if (hasAfterHandle) code += abortCheck();
@@ -451,7 +454,7 @@ const _s=tee(_r,${teeCount})\nreturn _fin2(c,_s[0],_s[1])\n}\nreturn _fin2(c,_r,
451
454
  code += beginTrace("mapResponse", mrLen);
452
455
  if (hasMapResponse) {
453
456
  link(hook.mapResponse, "mr");
454
- code += require_compile_handler_utils.mapMapResponse(hook.mapResponse, isAsync, buildReport("mapResponse"), abortChainGuard());
457
+ code += require_compile_handler_utils.mapMapResponse(hook.mapResponse, isAsync, buildReport("mapResponse"), abortChainGuard(), arm);
455
458
  }
456
459
  code += endTrace("mapResponse");
457
460
  if (hasMapResponse) code += abortCheck();
@@ -459,15 +462,16 @@ const _s=tee(_r,${teeCount})\nreturn _fin2(c,_s[0],_s[1])\n}\nreturn _fin2(c,_r,
459
462
  if (hasResponseValidator) {
460
463
  link(vali, "va");
461
464
  link(require_error.ElysiaStatus, "es");
462
- const awaitStr = responseValiAsync ? "await " : "";
465
+ const encodeStatus = responseValiAsync ? `(_vr.mayReturnPromise?_vr.From(_r.response,'response',true):_vr.EncodeFrom(_r.response,'response'))` : `_vr.EncodeFrom(_r.response,'response')`;
466
+ const encodeBody = responseValiAsync ? `(_vr.mayReturnPromise?_vr.From(_r,'response',true):_vr.EncodeFrom(_r,'response'))` : `_vr.EncodeFrom(_r,'response')`;
463
467
  code += `if(_r instanceof es){
464
468
  const _vr=va.response[_r.status]
465
- 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`;
469
+ 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`;
466
470
  code += abortCheck();
467
471
  }
468
472
  const deferSchedule = !!schedule;
469
473
  code += signPrefix;
470
- const finalMap = hasSet ? `${map}(_r,c.set,c.request,true)` : `${map}(_r,c.request,true)`;
474
+ const finalMap = mapValue("_r");
471
475
  const onMapReject = syncErrorHook ? `(_e)=>_ce(_e,c)` : dedupSchedule ? `(_e)=>{${freThenSchedule("_e")}}` : `(_e)=>fre(rt,c,_e)`;
472
476
  if (isAsync) code += deferSchedule ? `const _m=await ${finalMap}\n${schedule}return _m\n` : `return await ${finalMap}\n`;
473
477
  else {
@@ -477,9 +481,9 @@ if(_vr)_r.response=${awaitStr}${responseValiAsync ? `(_vr.mayReturnPromise?_vr.F
477
481
  }
478
482
  } else if (isHandleFunction) {
479
483
  if (!isAsync) link(require_handler_utils.forwardError, "fe");
480
- const mapArgs = hasSet ? "c.set,c.request,true" : "c.request,true";
481
- code += callHandlerSyncOnAsync ? `let _r=h(c)\nif(_r instanceof Promise)_r=await _r\n` : `let _r=${isAsync ? "await " : ""}h(c)\n`;
482
- 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`);
484
+ const finalMap = mapValue("_r");
485
+ code += `let ${callHandler}`;
486
+ code += abortCheck() + `if(_r instanceof Error)throw _r\n` + (isAsync ? `return await ${finalMap}\n` : syncErrorHook ? `if(typeof _r?.then==='function')_r=Promise.resolve(_r).then(fe)\nconst _m=${finalMap}\nreturn typeof _m?.then==='function'?Promise.resolve(_m).catch((_e)=>_ce(_e,c)):_m\n` : `if(typeof _r?.then==='function')_r=Promise.resolve(_r).then(fe)\nconst _m=${finalMap}\nreturn typeof _m?.then==='function'?Promise.resolve(_m).catch((_e)=>fre(rt,c,_e)):_m\n`);
483
487
  } else code += `const _m=${mapReturn.trim()}\nreturn typeof _m?.then==='function'?Promise.resolve(_m).catch((_e)=>fre(rt,c,_e)):_m\n`;
484
488
  if (hasErrorHook || hasTrace) {
485
489
  let body = "";
@@ -492,17 +496,18 @@ if(_vr)_r.response=${awaitStr}${responseValiAsync ? `(_vr.mayReturnPromise?_vr.F
492
496
  link(require_handler_error.fallbackResponse, "fbr");
493
497
  const allowUnsafeDetail = !!root["~config"]?.allowUnsafeValidationDetails;
494
498
  if (allowUnsafeDetail) link(require_error.ValidationError, "verr");
495
- 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";
499
+ 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";
496
500
  body += `c.error=e\n` + (allowUnsafeDetail ? `if(e instanceof verr)e.allowUnsafeValidationDetails=true\n` : ``) + `if(e?.status)c.set.status=e.status
497
501
  else if(c.set.status===undefined||c.set.status===200)c.set.status=500
498
502
  let _r${hasMapResponse ? ",tmp" : ""}\n` + require_compile_handler_utils.mapError(hook.error, [
499
503
  map,
500
504
  link,
501
- res.map,
502
- (hasMapResponse ? `c.responseValue=_r\n` + require_compile_handler_utils.mapMapResponse(hook.mapResponse, isAsync, void 0, abortOn ? abortArm : void 0) : "") + endTrace("error") + abortCatch + schedule,
505
+ responseMap,
506
+ (hasMapResponse ? `c.responseValue=_r\n` + require_compile_handler_utils.mapMapResponse(hook.mapResponse, isAsync, void 0, abortChainGuard(), arm) : "") + endTrace("error") + abortCatch + schedule,
503
507
  signPrefix,
504
- isAsync
505
- ], abortOn ? abortArm : void 0) + endTrace("error") + abortCatch + schedule + `return _efb(e,c)\n`;
508
+ isAsync,
509
+ arm
510
+ ], abortChainGuard()) + endTrace("error") + abortCatch + schedule + `return _efb(e,c)\n`;
506
511
  } else body += endTrace("error") + freThenSchedule("e");
507
512
  if (syncErrorHook) {
508
513
  factoryHelpers += `function _ce(e,c){${abortOn ? "let _as\n" : ""}try{\n${body}}catch(_ee){return fre(rt,c,_ee)}}\n`;
@@ -510,7 +515,7 @@ let _r${hasMapResponse ? ",tmp" : ""}\n` + require_compile_handler_utils.mapErro
510
515
  } else code += `}catch(e){try{\n${body}}catch(_ee){return fre(rt,c,_ee)}}\n`;
511
516
  } else code += catchSchedule ? `}catch(e){${freThenSchedule("e")}}\n` : `}catch(e){return fre(rt,c,e)}\n`;
512
517
  code += "}";
513
- code = head + (abortOn && code.includes("_as") ? "let _as\n" : "") + scheduleDecl + code;
518
+ code = head + (abortOn && code.includes("_as") ? "let _as\n" : "") + (code.includes("_av") ? "let _av\n" : "") + scheduleDecl + code;
514
519
  if (factoryHelpers) code = `(function(){\n${factoryHelpers}return ${code}})()`;
515
520
  const alias = aliasKeys.join(",");
516
521
  const fullAlias = alias ? `rt,fre,${alias}` : "rt,fre";
@@ -522,7 +527,7 @@ let _r${hasMapResponse ? ",tmp" : ""}\n` + require_compile_handler_utils.mapErro
522
527
  });
523
528
  const isGeneratorHandler = isHandleFunction && handler.constructor.name.endsWith("GeneratorFunction");
524
529
  if (!hasTrace && isHandleFunction && !isGeneratorHandler && !inlineUnsafe) {
525
- if (alias === "rc" || !isAsync && !syncErrorHook && alias === "rc,fe") return createInlineHandler(res.compact ?? res.map, handler);
530
+ if (alias === "rc" || !isAsync && !syncErrorHook && alias === "rc,fe") return createInlineHandler(responseCompact, handler);
526
531
  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);
527
532
  }
528
533
  require_compile_jit_probe.JITProbe.record("handler:new-function");