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.
- package/dist/adapter/bun/index.js +28 -17
- package/dist/adapter/bun/index.mjs +28 -17
- package/dist/adapter/utils.js +1 -0
- package/dist/adapter/utils.mjs +1 -0
- package/dist/adapter/web-standard/handler.js +2 -2
- package/dist/adapter/web-standard/handler.mjs +2 -2
- package/dist/compile/aot-emit.js +1 -1
- package/dist/compile/aot-emit.mjs +1 -1
- package/dist/compile/aot.d.ts +1 -1
- package/dist/compile/aot.js +2 -2
- package/dist/compile/aot.mjs +2 -2
- package/dist/compile/handler/descriptor.d.ts +2 -3
- package/dist/compile/handler/descriptor.js +6 -16
- package/dist/compile/handler/descriptor.mjs +7 -16
- package/dist/compile/handler/index.d.ts +1 -1
- package/dist/compile/handler/index.js +15 -6
- package/dist/compile/handler/index.mjs +15 -6
- package/dist/compile/handler/jit.js +71 -66
- package/dist/compile/handler/jit.mjs +72 -67
- package/dist/compile/handler/params.js +3 -2
- package/dist/compile/handler/params.mjs +4 -3
- package/dist/compile/handler/static-clone-resolver.d.ts +6 -0
- package/dist/compile/handler/static-clone-resolver.js +8 -0
- package/dist/compile/handler/static-clone-resolver.mjs +7 -0
- package/dist/compile/handler/utils.d.ts +7 -6
- package/dist/compile/handler/utils.js +23 -18
- package/dist/compile/handler/utils.mjs +23 -19
- package/dist/compile/utils.js +7 -4
- package/dist/compile/utils.mjs +7 -4
- package/dist/cookie/lib.js +2 -1
- package/dist/cookie/lib.mjs +2 -1
- package/dist/cookie/utils.d.ts +1 -1
- package/dist/cookie/utils.js +9 -23
- package/dist/cookie/utils.mjs +9 -23
- package/dist/handler/error.js +3 -4
- package/dist/handler/error.mjs +3 -4
- package/dist/handler/fetch.js +17 -13
- package/dist/handler/fetch.mjs +17 -13
- package/dist/package.js +1 -1
- package/dist/package.mjs +1 -1
- package/dist/plugin/aot/core.d.ts +2 -0
- package/dist/plugin/aot/core.js +6 -0
- package/dist/plugin/aot/core.mjs +6 -0
- package/dist/plugin/aot/hooks.js +5 -1
- package/dist/plugin/aot/hooks.mjs +5 -1
- package/dist/trace.js +14 -5
- package/dist/trace.mjs +14 -5
- package/dist/type/constants.d.ts +1 -1
- package/dist/types.d.ts +5 -4
- package/dist/utils.d.ts +0 -1
- 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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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 +=
|
|
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
|
-
|
|
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
|
|
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
|
|
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
|
|
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,
|
|
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
|
|
185
|
-
|
|
186
|
-
const
|
|
187
|
-
|
|
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 ?
|
|
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, [
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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
|
|
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
|
|
355
|
+
const compactEligible = responseMode === "compact";
|
|
352
356
|
const res = adapter.response;
|
|
353
357
|
const responseMap = res.map;
|
|
354
|
-
const
|
|
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
|
|
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
|
|
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
|
|
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 +
|
|
428
|
-
if(_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
|
|
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
|
|
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=${
|
|
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 =
|
|
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
|
|
481
|
-
code +=
|
|
482
|
-
code += abortCheck() + `if(_r instanceof Error)throw _r\n` + (isAsync ? `return await ${
|
|
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
|
-
|
|
502
|
-
(hasMapResponse ? `c.responseValue=_r\n` + require_compile_handler_utils.mapMapResponse(hook.mapResponse, isAsync, void 0,
|
|
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
|
-
|
|
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(
|
|
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");
|