elysia 2.0.0-exp.32 → 2.0.0-exp.34

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.
@@ -165,6 +165,8 @@ function compileHandlerJit({ method, path, handler, root, hook, adapter, buildVa
165
165
  const traceHandlers = hook?.trace ?? void 0;
166
166
  const hasTrace = !!traceHandlers?.length;
167
167
  const traceCount = hasTrace ? traceHandlers.length : 0;
168
+ const hasLifecycleHook = parseLength > 0 || !!hook?.transform?.length || hasBeforeHandle || hasAfterHandle || hasMapResponse || hasErrorHook || hasAfterResponse;
169
+ const abortCheck = hasLifecycleHook ? `if(aborted)return emp.clone()\n` : "";
168
170
  const tracePhases = hasTrace ? require_trace.unionTracePhases(traceHandlers) : /* @__PURE__ */ new Set();
169
171
  const phaseOn = (phase) => hasTrace && (tracePhases === null || tracePhases.has(phase));
170
172
  const hasAnyPhase = hasTrace && (tracePhases === null || tracePhases.size > 0);
@@ -217,6 +219,10 @@ function compileHandlerJit({ method, path, handler, root, hook, adapter, buildVa
217
219
  const syncAfterResponse = hasAfterResponse && !isAsync && !hasTrace && !hasErrorHook;
218
220
  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`;
219
221
  let code = `${isAsync ? "async " : ""}function route(c){\n`;
222
+ if (hasLifecycleHook) {
223
+ link(require_handler_utils.emptyResponse, "emp");
224
+ code += "let aborted=c.request.signal.aborted\nif(!aborted)c.request.signal.addEventListener('abort',()=>{aborted=true},{once:true})\n" + abortCheck;
225
+ }
220
226
  if ((hasAfterResponse || hasTrace) && !syncAfterResponse) code += "let _stl\n";
221
227
  if (asyncCookieSign) code += "let _sg\n";
222
228
  if (hasTrace) {
@@ -265,6 +271,7 @@ function compileHandlerJit({ method, path, handler, root, hook, adapter, buildVa
265
271
  link(require_error.ParseError, "pe");
266
272
  code += "try{\n" + parseCode + "}catch(e){throw new pe(e)}\n";
267
273
  if (hasTrace) code += endTrace("parse");
274
+ if (hasLifecycleHook) code += abortCheck;
268
275
  } else if (hasTrace) code += beginTrace("parse", 0) + endTrace("parse");
269
276
  if (hook?.transform?.length || hasTrace) {
270
277
  const transformLen = hook?.transform?.length ?? 0;
@@ -272,9 +279,10 @@ function compileHandlerJit({ method, path, handler, root, hook, adapter, buildVa
272
279
  if (transformLen) {
273
280
  link(hook.transform, "tf");
274
281
  if (isAsync) code += "let _tf\n";
275
- code += require_compile_handler_utils.mapTransform(hook.transform, [isAsync, buildReport("transform")]);
282
+ code += require_compile_handler_utils.mapTransform(hook.transform, [isAsync, buildReport("transform")], "aborted");
276
283
  }
277
284
  code += endTrace("transform");
285
+ if (transformLen) code += abortCheck;
278
286
  }
279
287
  if (vali?.body) {
280
288
  link(vali, "va");
@@ -344,9 +352,10 @@ function compileHandlerJit({ method, path, handler, root, hook, adapter, buildVa
344
352
  if (hasBeforeHandle) {
345
353
  link(hook.beforeHandle, "bf");
346
354
  const deriveEntries = hook["~deriveEntries"];
347
- code += require_compile_handler_utils.mapBeforeHandle(hook.beforeHandle, deriveEntries?.length ? new Set(deriveEntries) : void 0, link, isAsync, buildReport("beforeHandle"));
355
+ code += require_compile_handler_utils.mapBeforeHandle(hook.beforeHandle, deriveEntries?.length ? new Set(deriveEntries) : void 0, link, isAsync, buildReport("beforeHandle"), "aborted");
348
356
  }
349
357
  code += endTrace("beforeHandle");
358
+ if (hasBeforeHandle) code += abortCheck;
350
359
  }
351
360
  if (hasAfterResponse || traceHandleOn) link(require_adapter_utils.tee, "tee");
352
361
  const teeConsumers = (hasAfterResponse ? 1 : 0) + (traceHandleOn ? 1 : 0);
@@ -367,6 +376,7 @@ function compileHandlerJit({ method, path, handler, root, hook, adapter, buildVa
367
376
  code += `}\n`;
368
377
  } else if (hasBeforeHandle) code += `if(_r===undefined){\n${callHandler}${teeBlock}}\n`;
369
378
  else code += callHandler + teeBlock;
379
+ if (hasLifecycleHook) code += abortCheck;
370
380
  if (syncAfterResponse) {
371
381
  link(require_handler_utils.forwardError, "fe");
372
382
  factoryHelpers += `function _fin(c,_r){
@@ -386,18 +396,20 @@ const _s=tee(_r,${teeCount})\nreturn _fin2(c,_s[0],_s[1])\n}\nreturn _fin2(c,_r,
386
396
  code += beginTrace("afterHandle", afLen);
387
397
  if (hasAfterHandle) {
388
398
  link(hook.afterHandle, "af");
389
- code += require_compile_handler_utils.mapAfterHandle(hook.afterHandle, isAsync, buildReport("afterHandle"));
399
+ code += require_compile_handler_utils.mapAfterHandle(hook.afterHandle, isAsync, buildReport("afterHandle"), "aborted");
390
400
  }
391
401
  code += endTrace("afterHandle");
402
+ if (hasAfterHandle) code += abortCheck;
392
403
  }
393
404
  if (hasMapResponse || hasTrace) {
394
405
  const mrLen = hook?.mapResponse?.length ?? 0;
395
406
  code += beginTrace("mapResponse", mrLen);
396
407
  if (hasMapResponse) {
397
408
  link(hook.mapResponse, "mr");
398
- code += require_compile_handler_utils.mapMapResponse(hook.mapResponse, isAsync, buildReport("mapResponse"));
409
+ code += require_compile_handler_utils.mapMapResponse(hook.mapResponse, isAsync, buildReport("mapResponse"), "aborted");
399
410
  }
400
411
  code += endTrace("mapResponse");
412
+ if (hasMapResponse) code += abortCheck;
401
413
  }
402
414
  if (hasResponseValidator) {
403
415
  link(vali, "va");
@@ -406,17 +418,18 @@ const _s=tee(_r,${teeCount})\nreturn _fin2(c,_s[0],_s[1])\n}\nreturn _fin2(c,_r,
406
418
  code += `if(_r instanceof es){
407
419
  const _vr=va.response[_r.code]
408
420
  if(_vr)_r.response=${awaitStr}_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}_vr.EncodeFrom(_r,'response')\n}\n`;
421
+ if (hasLifecycleHook) code += abortCheck;
409
422
  }
410
423
  code += schedule;
411
424
  code += signPrefix;
412
425
  const finalMap = hasSet ? `${map}(_r,c.set,c.request)` : `${map}(_r,c.request)`;
413
- if (syncErrorHook) code += `if(_r instanceof Promise)return ${finalMap}.catch((_e)=>_ce(_e,c))\n`;
426
+ if (syncErrorHook) code += `if(_r instanceof Promise)return ${finalMap}.catch((_e)=>_ce(_e,c,aborted))\n`;
414
427
  code += `return ${finalMap}\n`;
415
428
  }
416
429
  } else if (isHandleFunction) {
417
430
  if (!isAsync) link(require_handler_utils.forwardError, "fe");
418
431
  const mapArgs = hasSet ? "c.set,c.request" : "c.request";
419
- code += (callHandlerSyncOnAsync ? `let _r=h(c)\nif(_r instanceof Promise)_r=await _r\n` : `let _r=${isAsync ? "await " : ""}h(c)\n`) + `if(_r instanceof Error)throw _r\n` + (isAsync ? `return ${map}(_r,${mapArgs})\n` : syncErrorHook ? `if(_r instanceof Promise)return ${map}(_r.then(fe),${mapArgs}).catch((_e)=>_ce(_e,c))\nreturn ${map}(_r,${mapArgs})\n` : `if(_r instanceof Promise)_r=_r.then(fe)\nreturn ${map}(_r,${mapArgs})\n`);
432
+ code += (callHandlerSyncOnAsync ? `let _r=h(c)\nif(_r instanceof Promise)_r=await _r\n` : `let _r=${isAsync ? "await " : ""}h(c)\n`) + abortCheck + `if(_r instanceof Error)throw _r\n` + (isAsync ? `return ${map}(_r,${mapArgs})\n` : syncErrorHook ? `if(_r instanceof Promise)return ${map}(_r.then(fe),${mapArgs}).catch((_e)=>_ce(_e,c,aborted))\nreturn ${map}(_r,${mapArgs})\n` : `if(_r instanceof Promise)_r=_r.then(fe)\nreturn ${map}(_r,${mapArgs})\n`);
420
433
  } else code += `return ${mapReturn}`;
421
434
  if (hasErrorHook || hasTrace) {
422
435
  let body = "";
@@ -438,9 +451,9 @@ let _r${hasMapResponse ? ",tmp" : ""}\n` + require_compile_handler_utils.mapErro
438
451
  map,
439
452
  link,
440
453
  res.map,
441
- (hasMapResponse ? `c.responseValue=_r\n` + require_compile_handler_utils.mapMapResponse(hook.mapResponse, isAsync, void 0) : "") + endTrace("error") + schedule,
454
+ (hasMapResponse ? `c.responseValue=_r\n` + require_compile_handler_utils.mapMapResponse(hook.mapResponse, isAsync, void 0, "aborted") : "") + endTrace("error") + abortCheck + schedule,
442
455
  signPrefix
443
- ]) + endTrace("error") + schedule + `if(typeof e?.toResponse==='function')try{
456
+ ], "aborted") + endTrace("error") + abortCheck + schedule + `if(typeof e?.toResponse==='function')try{
444
457
  const _er=e.toResponse()
445
458
  if(_er instanceof Promise)return _er.then(${asyncCookieSign ? "async " : ""}(_v)=>{if(_v instanceof Response){${signPrefix}return ${map}(_v,c.set,c.request)}return _efb(e,c)},()=>_efb(e,c))\nif(_er instanceof Response){${signPrefix}return ${map}(_er,c.set,c.request)}\n}catch{}\nreturn _efb(e,c)\n`;
446
459
  } else {
@@ -448,8 +461,8 @@ if(_er instanceof Promise)return _er.then(${asyncCookieSign ? "async " : ""}(_v)
448
461
  body += `throw e\n`;
449
462
  }
450
463
  if (syncErrorHook) {
451
- factoryHelpers += `function _ce(e,c){\n${body}}\n`;
452
- code += `}catch(e){return _ce(e,c)}\n`;
464
+ factoryHelpers += `function _ce(e,c,aborted){\n${body}}\n`;
465
+ code += `}catch(e){return _ce(e,c,aborted)}\n`;
453
466
  } else code += `}catch(e){\n${body}}\n`;
454
467
  }
455
468
  code += "}";
@@ -8,7 +8,7 @@ import { Capture } from "../aot.mjs";
8
8
  import { compileCookieConfig } from "../../cookie/config.mjs";
9
9
  import { buildCookieJar, hasSyncHmac, parseCookieRaw, parseCookieRawSigned, parseCookieRawSync, signCookieValues, signCookieValuesSync } from "../../cookie/utils.mjs";
10
10
  import { isAsyncFunction, isAsyncLifecycle, mayReturnPromise } from "../utils.mjs";
11
- import { forwardError } from "../../handler/utils.mjs";
11
+ import { emptyResponse, forwardError } from "../../handler/utils.mjs";
12
12
  import { cloneResponse, getQueryParseChannels, hasRequestBody, mapAfterHandle, mapAfterResponse, mapBeforeHandle, mapError, mapMapResponse, mapTransform } from "./utils.mjs";
13
13
  import { sucrose } from "../../sucrose.mjs";
14
14
  import { createTracer, unionTracePhases } from "../../trace.mjs";
@@ -164,6 +164,8 @@ function compileHandlerJit({ method, path, handler, root, hook, adapter, buildVa
164
164
  const traceHandlers = hook?.trace ?? void 0;
165
165
  const hasTrace = !!traceHandlers?.length;
166
166
  const traceCount = hasTrace ? traceHandlers.length : 0;
167
+ const hasLifecycleHook = parseLength > 0 || !!hook?.transform?.length || hasBeforeHandle || hasAfterHandle || hasMapResponse || hasErrorHook || hasAfterResponse;
168
+ const abortCheck = hasLifecycleHook ? `if(aborted)return emp.clone()\n` : "";
167
169
  const tracePhases = hasTrace ? unionTracePhases(traceHandlers) : /* @__PURE__ */ new Set();
168
170
  const phaseOn = (phase) => hasTrace && (tracePhases === null || tracePhases.has(phase));
169
171
  const hasAnyPhase = hasTrace && (tracePhases === null || tracePhases.size > 0);
@@ -216,6 +218,10 @@ function compileHandlerJit({ method, path, handler, root, hook, adapter, buildVa
216
218
  const syncAfterResponse = hasAfterResponse && !isAsync && !hasTrace && !hasErrorHook;
217
219
  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`;
218
220
  let code = `${isAsync ? "async " : ""}function route(c){\n`;
221
+ if (hasLifecycleHook) {
222
+ link(emptyResponse, "emp");
223
+ code += "let aborted=c.request.signal.aborted\nif(!aborted)c.request.signal.addEventListener('abort',()=>{aborted=true},{once:true})\n" + abortCheck;
224
+ }
219
225
  if ((hasAfterResponse || hasTrace) && !syncAfterResponse) code += "let _stl\n";
220
226
  if (asyncCookieSign) code += "let _sg\n";
221
227
  if (hasTrace) {
@@ -264,6 +270,7 @@ function compileHandlerJit({ method, path, handler, root, hook, adapter, buildVa
264
270
  link(ParseError, "pe");
265
271
  code += "try{\n" + parseCode + "}catch(e){throw new pe(e)}\n";
266
272
  if (hasTrace) code += endTrace("parse");
273
+ if (hasLifecycleHook) code += abortCheck;
267
274
  } else if (hasTrace) code += beginTrace("parse", 0) + endTrace("parse");
268
275
  if (hook?.transform?.length || hasTrace) {
269
276
  const transformLen = hook?.transform?.length ?? 0;
@@ -271,9 +278,10 @@ function compileHandlerJit({ method, path, handler, root, hook, adapter, buildVa
271
278
  if (transformLen) {
272
279
  link(hook.transform, "tf");
273
280
  if (isAsync) code += "let _tf\n";
274
- code += mapTransform(hook.transform, [isAsync, buildReport("transform")]);
281
+ code += mapTransform(hook.transform, [isAsync, buildReport("transform")], "aborted");
275
282
  }
276
283
  code += endTrace("transform");
284
+ if (transformLen) code += abortCheck;
277
285
  }
278
286
  if (vali?.body) {
279
287
  link(vali, "va");
@@ -343,9 +351,10 @@ function compileHandlerJit({ method, path, handler, root, hook, adapter, buildVa
343
351
  if (hasBeforeHandle) {
344
352
  link(hook.beforeHandle, "bf");
345
353
  const deriveEntries = hook["~deriveEntries"];
346
- code += mapBeforeHandle(hook.beforeHandle, deriveEntries?.length ? new Set(deriveEntries) : void 0, link, isAsync, buildReport("beforeHandle"));
354
+ code += mapBeforeHandle(hook.beforeHandle, deriveEntries?.length ? new Set(deriveEntries) : void 0, link, isAsync, buildReport("beforeHandle"), "aborted");
347
355
  }
348
356
  code += endTrace("beforeHandle");
357
+ if (hasBeforeHandle) code += abortCheck;
349
358
  }
350
359
  if (hasAfterResponse || traceHandleOn) link(tee, "tee");
351
360
  const teeConsumers = (hasAfterResponse ? 1 : 0) + (traceHandleOn ? 1 : 0);
@@ -366,6 +375,7 @@ function compileHandlerJit({ method, path, handler, root, hook, adapter, buildVa
366
375
  code += `}\n`;
367
376
  } else if (hasBeforeHandle) code += `if(_r===undefined){\n${callHandler}${teeBlock}}\n`;
368
377
  else code += callHandler + teeBlock;
378
+ if (hasLifecycleHook) code += abortCheck;
369
379
  if (syncAfterResponse) {
370
380
  link(forwardError, "fe");
371
381
  factoryHelpers += `function _fin(c,_r){
@@ -385,18 +395,20 @@ const _s=tee(_r,${teeCount})\nreturn _fin2(c,_s[0],_s[1])\n}\nreturn _fin2(c,_r,
385
395
  code += beginTrace("afterHandle", afLen);
386
396
  if (hasAfterHandle) {
387
397
  link(hook.afterHandle, "af");
388
- code += mapAfterHandle(hook.afterHandle, isAsync, buildReport("afterHandle"));
398
+ code += mapAfterHandle(hook.afterHandle, isAsync, buildReport("afterHandle"), "aborted");
389
399
  }
390
400
  code += endTrace("afterHandle");
401
+ if (hasAfterHandle) code += abortCheck;
391
402
  }
392
403
  if (hasMapResponse || hasTrace) {
393
404
  const mrLen = hook?.mapResponse?.length ?? 0;
394
405
  code += beginTrace("mapResponse", mrLen);
395
406
  if (hasMapResponse) {
396
407
  link(hook.mapResponse, "mr");
397
- code += mapMapResponse(hook.mapResponse, isAsync, buildReport("mapResponse"));
408
+ code += mapMapResponse(hook.mapResponse, isAsync, buildReport("mapResponse"), "aborted");
398
409
  }
399
410
  code += endTrace("mapResponse");
411
+ if (hasMapResponse) code += abortCheck;
400
412
  }
401
413
  if (hasResponseValidator) {
402
414
  link(vali, "va");
@@ -405,17 +417,18 @@ const _s=tee(_r,${teeCount})\nreturn _fin2(c,_s[0],_s[1])\n}\nreturn _fin2(c,_r,
405
417
  code += `if(_r instanceof es){
406
418
  const _vr=va.response[_r.code]
407
419
  if(_vr)_r.response=${awaitStr}_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}_vr.EncodeFrom(_r,'response')\n}\n`;
420
+ if (hasLifecycleHook) code += abortCheck;
408
421
  }
409
422
  code += schedule;
410
423
  code += signPrefix;
411
424
  const finalMap = hasSet ? `${map}(_r,c.set,c.request)` : `${map}(_r,c.request)`;
412
- if (syncErrorHook) code += `if(_r instanceof Promise)return ${finalMap}.catch((_e)=>_ce(_e,c))\n`;
425
+ if (syncErrorHook) code += `if(_r instanceof Promise)return ${finalMap}.catch((_e)=>_ce(_e,c,aborted))\n`;
413
426
  code += `return ${finalMap}\n`;
414
427
  }
415
428
  } else if (isHandleFunction) {
416
429
  if (!isAsync) link(forwardError, "fe");
417
430
  const mapArgs = hasSet ? "c.set,c.request" : "c.request";
418
- code += (callHandlerSyncOnAsync ? `let _r=h(c)\nif(_r instanceof Promise)_r=await _r\n` : `let _r=${isAsync ? "await " : ""}h(c)\n`) + `if(_r instanceof Error)throw _r\n` + (isAsync ? `return ${map}(_r,${mapArgs})\n` : syncErrorHook ? `if(_r instanceof Promise)return ${map}(_r.then(fe),${mapArgs}).catch((_e)=>_ce(_e,c))\nreturn ${map}(_r,${mapArgs})\n` : `if(_r instanceof Promise)_r=_r.then(fe)\nreturn ${map}(_r,${mapArgs})\n`);
431
+ code += (callHandlerSyncOnAsync ? `let _r=h(c)\nif(_r instanceof Promise)_r=await _r\n` : `let _r=${isAsync ? "await " : ""}h(c)\n`) + abortCheck + `if(_r instanceof Error)throw _r\n` + (isAsync ? `return ${map}(_r,${mapArgs})\n` : syncErrorHook ? `if(_r instanceof Promise)return ${map}(_r.then(fe),${mapArgs}).catch((_e)=>_ce(_e,c,aborted))\nreturn ${map}(_r,${mapArgs})\n` : `if(_r instanceof Promise)_r=_r.then(fe)\nreturn ${map}(_r,${mapArgs})\n`);
419
432
  } else code += `return ${mapReturn}`;
420
433
  if (hasErrorHook || hasTrace) {
421
434
  let body = "";
@@ -437,9 +450,9 @@ let _r${hasMapResponse ? ",tmp" : ""}\n` + mapError(hook.error, [
437
450
  map,
438
451
  link,
439
452
  res.map,
440
- (hasMapResponse ? `c.responseValue=_r\n` + mapMapResponse(hook.mapResponse, isAsync, void 0) : "") + endTrace("error") + schedule,
453
+ (hasMapResponse ? `c.responseValue=_r\n` + mapMapResponse(hook.mapResponse, isAsync, void 0, "aborted") : "") + endTrace("error") + abortCheck + schedule,
441
454
  signPrefix
442
- ]) + endTrace("error") + schedule + `if(typeof e?.toResponse==='function')try{
455
+ ], "aborted") + endTrace("error") + abortCheck + schedule + `if(typeof e?.toResponse==='function')try{
443
456
  const _er=e.toResponse()
444
457
  if(_er instanceof Promise)return _er.then(${asyncCookieSign ? "async " : ""}(_v)=>{if(_v instanceof Response){${signPrefix}return ${map}(_v,c.set,c.request)}return _efb(e,c)},()=>_efb(e,c))\nif(_er instanceof Response){${signPrefix}return ${map}(_er,c.set,c.request)}\n}catch{}\nreturn _efb(e,c)\n`;
445
458
  } else {
@@ -447,8 +460,8 @@ if(_er instanceof Promise)return _er.then(${asyncCookieSign ? "async " : ""}(_v)
447
460
  body += `throw e\n`;
448
461
  }
449
462
  if (syncErrorHook) {
450
- factoryHelpers += `function _ce(e,c){\n${body}}\n`;
451
- code += `}catch(e){return _ce(e,c)}\n`;
463
+ factoryHelpers += `function _ce(e,c,aborted){\n${body}}\n`;
464
+ code += `}catch(e){return _ce(e,c,aborted)}\n`;
452
465
  } else code += `}catch(e){\n${body}}\n`;
453
466
  }
454
467
  code += "}";
@@ -25,6 +25,7 @@ const HANDLER_PARAMS = {
25
25
  pe: () => require_error.ParseError,
26
26
  es: () => require_error.ElysiaStatus,
27
27
  ise: () => require_error.internalServerErrorResponse,
28
+ emp: () => require_handler_utils.emptyResponse,
28
29
  isprod: () => require_error.isProduction,
29
30
  verr: () => require_error.ValidationError,
30
31
  tee: () => require_adapter_utils.tee,
@@ -3,7 +3,7 @@ import { ElysiaStatus, ParseError, ValidationError, internalServerErrorResponse,
3
3
  import { tee } from "../../adapter/utils.mjs";
4
4
  import { parseQueryFromURL } from "../../parse-query.mjs";
5
5
  import { buildCookieJar, parseCookieRaw, parseCookieRawSigned, parseCookieRawSync, signCookieValues, signCookieValuesSync } from "../../cookie/utils.mjs";
6
- import { forwardError } from "../../handler/utils.mjs";
6
+ import { emptyResponse, forwardError } from "../../handler/utils.mjs";
7
7
  import { cloneResponse, getQueryParseChannels, hasRequestBody } from "./utils.mjs";
8
8
 
9
9
  //#region src/compile/handler/params.ts
@@ -24,6 +24,7 @@ const HANDLER_PARAMS = {
24
24
  pe: () => ParseError,
25
25
  es: () => ElysiaStatus,
26
26
  ise: () => internalServerErrorResponse,
27
+ emp: () => emptyResponse,
27
28
  isprod: () => isProduction,
28
29
  verr: () => ValidationError,
29
30
  tee: () => tee,
@@ -1,5 +1,7 @@
1
1
  import { AfterResponseHandler, AppHook, ErrorHandler, MaybeArray, TransformHandler } from "../../types.js";
2
2
  import { Context } from "../../context.js";
3
+ import { emptyResponse } from "../../handler/utils.js";
4
+
3
5
  //#region src/compile/handler/utils.d.ts
4
6
  type Link = (v: unknown, key: string) => void;
5
7
  interface TraceReporter {
@@ -10,17 +12,17 @@ interface TraceReporter {
10
12
  }
11
13
  declare function cloneResponse(r: unknown): unknown;
12
14
  declare function hasRequestBody(request: Request): boolean;
13
- declare const mapTransform: (event: MaybeArray<TransformHandler<any, any, undefined, "local">>, rest?: [isAsync: boolean, report?: TraceReporter | undefined] | undefined) => string;
15
+ declare const mapTransform: (event: MaybeArray<TransformHandler<any, any, undefined, "local">>, rest?: [isAsync: boolean, report?: TraceReporter | undefined] | undefined, abortGuard?: string) => string;
14
16
  declare function extractDeriveKeys(fn: Function): string[] | null;
15
- declare function mapBeforeHandle(_hooks: AppHook['beforeHandle'] | AppHook['beforeHandle'][0], derive: Set<Function> | undefined, link: Link, isAsync: boolean, report?: TraceReporter): string;
16
- declare const mapAfterHandle: (_hooks: AppHook["afterHandle"] | AppHook["afterHandle"][0], isAsync: boolean, report?: TraceReporter) => string;
17
- declare const mapMapResponse: (_hooks: AppHook["mapResponse"] | AppHook["mapResponse"][0], isAsync: boolean, report?: TraceReporter) => string;
18
- declare const mapAfterResponse: (event: MaybeArray<AfterResponseHandler<any, any, undefined, "local">>, rest?: [report?: TraceReporter | undefined] | undefined) => string;
19
- declare const mapError: (event: MaybeArray<ErrorHandler<any, any, any>>, rest?: [map: string, link: Link, mapResponse: (response: unknown, set: Context["set"], ...params: unknown[]) => unknown, schedule: string, sign: string] | undefined) => string;
17
+ declare function mapBeforeHandle(_hooks: AppHook['beforeHandle'] | AppHook['beforeHandle'][0], derive: Set<Function> | undefined, link: Link, isAsync: boolean, report?: TraceReporter, abortGuard?: string): string;
18
+ declare const mapAfterHandle: (_hooks: AppHook["afterHandle"] | AppHook["afterHandle"][0], isAsync: boolean, report?: TraceReporter, abortGuard?: string) => string;
19
+ declare const mapMapResponse: (_hooks: AppHook["mapResponse"] | AppHook["mapResponse"][0], isAsync: boolean, report?: TraceReporter, abortGuard?: string) => string;
20
+ declare const mapAfterResponse: (event: MaybeArray<AfterResponseHandler<any, any, undefined, "local">>, rest?: [report?: TraceReporter | undefined] | undefined, abortGuard?: string) => string;
21
+ declare const mapError: (event: MaybeArray<ErrorHandler<any, any, any>>, rest?: [map: string, link: Link, mapResponse: (response: unknown, set: Context["set"], ...params: unknown[]) => unknown, schedule: string, sign: string] | undefined, abortGuard?: string) => string;
20
22
  interface QueryWalkState {
21
23
  array: Record<string, 1> | undefined;
22
24
  object: Record<string, 1> | undefined;
23
25
  }
24
26
  declare function getQueryParseChannels(querySchema: any): QueryWalkState | undefined;
25
27
  //#endregion
26
- export { Link, TraceReporter, cloneResponse, extractDeriveKeys, getQueryParseChannels, hasRequestBody, mapAfterHandle, mapAfterResponse, mapBeforeHandle, mapError, mapMapResponse, mapTransform };
28
+ export { Link, TraceReporter, cloneResponse, emptyResponse, extractDeriveKeys, getQueryParseChannels, hasRequestBody, mapAfterHandle, mapAfterResponse, mapBeforeHandle, mapError, mapMapResponse, mapTransform };
@@ -3,6 +3,7 @@ const require_type_constants = require('../../type/constants.js');
3
3
  const require_adapter_skip_clone = require('../../adapter/skip-clone.js');
4
4
  const require_error = require('../../error.js');
5
5
  const require_compile_utils = require('../utils.js');
6
+ const require_handler_utils = require('../../handler/utils.js');
6
7
  const require_compile_lexer = require('../lexer.js');
7
8
 
8
9
  //#region src/compile/handler/utils.ts
@@ -242,7 +243,7 @@ function skipValue(src, i) {
242
243
  }
243
244
  return -1;
244
245
  }
245
- function mapBeforeHandle(_hooks, derive, link, isAsync, report) {
246
+ function mapBeforeHandle(_hooks, derive, link, isAsync, report, abortGuard) {
246
247
  const hooks = toArray(_hooks);
247
248
  let code = "";
248
249
  let depth = 0;
@@ -250,7 +251,7 @@ function mapBeforeHandle(_hooks, derive, link, isAsync, report) {
250
251
  for (let i = 0; i < hooks.length; i++) {
251
252
  const fn = hooks[i];
252
253
  if (i > 0) {
253
- code += `if(_r===undefined){\n`;
254
+ code += `if(${abortGuard ? `!${abortGuard}&&` : ""}_r===undefined){\n`;
254
255
  depth++;
255
256
  }
256
257
  const t = trace(report, fn);
@@ -270,13 +271,13 @@ else if(tmp){${merge};tmp=undefined}\n`;
270
271
  if (needsEs) link(require_error.ElysiaStatus, "es");
271
272
  return code;
272
273
  }
273
- function mapChainHook(hooks, prefix, isAsync, report) {
274
+ function mapChainHook(hooks, prefix, isAsync, report, abortGuard) {
274
275
  let code = "";
275
276
  let depth = 0;
276
277
  for (let i = 0; i < hooks.length; i++) {
277
278
  const fn = hooks[i];
278
279
  if (i > 0) {
279
- code += `if(tmp===undefined){\n`;
280
+ code += `if(${abortGuard ? `!${abortGuard}&&` : ""}tmp===undefined){\n`;
280
281
  depth++;
281
282
  }
282
283
  const t = trace(report, fn);
@@ -289,8 +290,8 @@ function mapChainHook(hooks, prefix, isAsync, report) {
289
290
  code += `if(tmp!==undefined)_r=c.responseValue=tmp\n`;
290
291
  return code;
291
292
  }
292
- const mapAfterHandle = (_hooks, isAsync, report) => mapChainHook(toArray(_hooks), "af", isAsync, report);
293
- const mapMapResponse = (_hooks, isAsync, report) => mapChainHook(toArray(_hooks), "mr", isAsync, report);
293
+ const mapAfterHandle = (_hooks, isAsync, report, abortGuard) => mapChainHook(toArray(_hooks), "af", isAsync, report, abortGuard);
294
+ const mapMapResponse = (_hooks, isAsync, report, abortGuard) => mapChainHook(toArray(_hooks), "mr", isAsync, report, abortGuard);
294
295
  const mapAfterResponse = /* @__PURE__ */ map((i, fn, [report]) => {
295
296
  const t = trace(report, fn);
296
297
  return `try{` + t.begin + `${Await(fn)}ar${at(i)}(c)\n` + t.end() + `}catch(_e){` + t.end("_e") + `}\n`;
@@ -300,10 +301,18 @@ const mapError = /* @__PURE__ */ map((i, fn, [map, link, mapResponse, schedule,
300
301
  return `_r=${Await(fn)}er${at(i)}(c)\nif(_r!==undefined){\nif(_r instanceof Response)c.set.status=_r.status\nelse if(c.set.status===undefined||c.set.status===200)c.set.status=500\n` + schedule + sign + `return ${map}(_r,c.set,c.request)\n}\n`;
301
302
  });
302
303
  function map(map) {
303
- return function(event, rest) {
304
+ return function(event, rest, abortGuard) {
304
305
  if (Array.isArray(event)) {
305
306
  let code = "";
306
- for (let i = 0; i < event.length; i++) code += map(i, event[i], rest);
307
+ let depth = 0;
308
+ for (let i = 0; i < event.length; i++) {
309
+ if (i > 0 && abortGuard) {
310
+ code += `if(!${abortGuard}){\n`;
311
+ depth++;
312
+ }
313
+ code += map(i, event[i], rest);
314
+ }
315
+ code += "}".repeat(depth);
307
316
  return code;
308
317
  } else return map(void 0, event, rest);
309
318
  };
@@ -376,6 +385,7 @@ const awaitGuard = (fn, isAsync, target) => isAsync && !require_compile_utils.is
376
385
 
377
386
  //#endregion
378
387
  exports.cloneResponse = cloneResponse;
388
+ exports.emptyResponse = require_handler_utils.emptyResponse;
379
389
  exports.extractDeriveKeys = extractDeriveKeys;
380
390
  exports.getQueryParseChannels = getQueryParseChannels;
381
391
  exports.hasRequestBody = hasRequestBody;
@@ -2,6 +2,7 @@ import { ELYSIA_TYPES } from "../../type/constants.mjs";
2
2
  import { skipClone } from "../../adapter/skip-clone.mjs";
3
3
  import { ElysiaStatus } from "../../error.mjs";
4
4
  import { isAsyncFunction } from "../utils.mjs";
5
+ import { emptyResponse } from "../../handler/utils.mjs";
5
6
  import { isIdentChar, isSpace, skipString } from "../lexer.mjs";
6
7
 
7
8
  //#region src/compile/handler/utils.ts
@@ -241,7 +242,7 @@ function skipValue(src, i) {
241
242
  }
242
243
  return -1;
243
244
  }
244
- function mapBeforeHandle(_hooks, derive, link, isAsync, report) {
245
+ function mapBeforeHandle(_hooks, derive, link, isAsync, report, abortGuard) {
245
246
  const hooks = toArray(_hooks);
246
247
  let code = "";
247
248
  let depth = 0;
@@ -249,7 +250,7 @@ function mapBeforeHandle(_hooks, derive, link, isAsync, report) {
249
250
  for (let i = 0; i < hooks.length; i++) {
250
251
  const fn = hooks[i];
251
252
  if (i > 0) {
252
- code += `if(_r===undefined){\n`;
253
+ code += `if(${abortGuard ? `!${abortGuard}&&` : ""}_r===undefined){\n`;
253
254
  depth++;
254
255
  }
255
256
  const t = trace(report, fn);
@@ -269,13 +270,13 @@ else if(tmp){${merge};tmp=undefined}\n`;
269
270
  if (needsEs) link(ElysiaStatus, "es");
270
271
  return code;
271
272
  }
272
- function mapChainHook(hooks, prefix, isAsync, report) {
273
+ function mapChainHook(hooks, prefix, isAsync, report, abortGuard) {
273
274
  let code = "";
274
275
  let depth = 0;
275
276
  for (let i = 0; i < hooks.length; i++) {
276
277
  const fn = hooks[i];
277
278
  if (i > 0) {
278
- code += `if(tmp===undefined){\n`;
279
+ code += `if(${abortGuard ? `!${abortGuard}&&` : ""}tmp===undefined){\n`;
279
280
  depth++;
280
281
  }
281
282
  const t = trace(report, fn);
@@ -288,8 +289,8 @@ function mapChainHook(hooks, prefix, isAsync, report) {
288
289
  code += `if(tmp!==undefined)_r=c.responseValue=tmp\n`;
289
290
  return code;
290
291
  }
291
- const mapAfterHandle = (_hooks, isAsync, report) => mapChainHook(toArray(_hooks), "af", isAsync, report);
292
- const mapMapResponse = (_hooks, isAsync, report) => mapChainHook(toArray(_hooks), "mr", isAsync, report);
292
+ const mapAfterHandle = (_hooks, isAsync, report, abortGuard) => mapChainHook(toArray(_hooks), "af", isAsync, report, abortGuard);
293
+ const mapMapResponse = (_hooks, isAsync, report, abortGuard) => mapChainHook(toArray(_hooks), "mr", isAsync, report, abortGuard);
293
294
  const mapAfterResponse = /* @__PURE__ */ map((i, fn, [report]) => {
294
295
  const t = trace(report, fn);
295
296
  return `try{` + t.begin + `${Await(fn)}ar${at(i)}(c)\n` + t.end() + `}catch(_e){` + t.end("_e") + `}\n`;
@@ -299,10 +300,18 @@ const mapError = /* @__PURE__ */ map((i, fn, [map, link, mapResponse, schedule,
299
300
  return `_r=${Await(fn)}er${at(i)}(c)\nif(_r!==undefined){\nif(_r instanceof Response)c.set.status=_r.status\nelse if(c.set.status===undefined||c.set.status===200)c.set.status=500\n` + schedule + sign + `return ${map}(_r,c.set,c.request)\n}\n`;
300
301
  });
301
302
  function map(map) {
302
- return function(event, rest) {
303
+ return function(event, rest, abortGuard) {
303
304
  if (Array.isArray(event)) {
304
305
  let code = "";
305
- for (let i = 0; i < event.length; i++) code += map(i, event[i], rest);
306
+ let depth = 0;
307
+ for (let i = 0; i < event.length; i++) {
308
+ if (i > 0 && abortGuard) {
309
+ code += `if(!${abortGuard}){\n`;
310
+ depth++;
311
+ }
312
+ code += map(i, event[i], rest);
313
+ }
314
+ code += "}".repeat(depth);
306
315
  return code;
307
316
  } else return map(void 0, event, rest);
308
317
  };
@@ -374,4 +383,4 @@ const Await = (fn) => isAsyncFunction(fn) ? "await " : "";
374
383
  const awaitGuard = (fn, isAsync, target) => isAsync && !isAsyncFunction(fn) ? `if(${target} instanceof Promise)${target}=await ${target}\n` : "";
375
384
 
376
385
  //#endregion
377
- export { cloneResponse, extractDeriveKeys, getQueryParseChannels, hasRequestBody, mapAfterHandle, mapAfterResponse, mapBeforeHandle, mapError, mapMapResponse, mapTransform };
386
+ export { cloneResponse, emptyResponse, extractDeriveKeys, getQueryParseChannels, hasRequestBody, mapAfterHandle, mapAfterResponse, mapBeforeHandle, mapError, mapMapResponse, mapTransform };
@@ -1,5 +1,5 @@
1
1
  //#region src/compile/lexer.d.ts
2
- declare const isSpace: (ch: string) => ch is "\n" | " " | "\t" | "\r";
2
+ declare const isSpace: (ch: string) => ch is " " | "\n" | "\t" | "\r";
3
3
  declare const isIdentChar: (ch: string) => boolean;
4
4
  declare const isIdentCharCode: (code: number) => boolean;
5
5
  declare function skipString(src: string, start: number): number;
package/dist/error.d.ts CHANGED
@@ -79,8 +79,8 @@ declare class ValidationError extends ElysiaError {
79
79
  on?: undefined;
80
80
  property?: undefined;
81
81
  detail?: undefined;
82
- expected?: undefined;
83
82
  found?: undefined;
83
+ expected?: undefined;
84
84
  errors?: undefined;
85
85
  } | {
86
86
  type: string;
@@ -89,8 +89,8 @@ declare class ValidationError extends ElysiaError {
89
89
  on: string | undefined;
90
90
  property: string;
91
91
  detail?: undefined;
92
- expected?: undefined;
93
92
  found?: undefined;
93
+ expected?: undefined;
94
94
  errors?: undefined;
95
95
  } | {
96
96
  type: string;
@@ -99,8 +99,8 @@ declare class ValidationError extends ElysiaError {
99
99
  detail: any;
100
100
  on: string | undefined;
101
101
  property: string;
102
- expected: unknown;
103
102
  found: unknown;
103
+ expected: unknown;
104
104
  errors: any[];
105
105
  };
106
106
  toResponse(headers?: Record<string, any>): Response;
@@ -192,6 +192,13 @@ type NumericStatus<Code extends number | keyof StatusMap> = Code extends keyof S
192
192
  type ProblemStatus<P> = P extends {
193
193
  status: infer S extends number | keyof StatusMap;
194
194
  } ? NumericStatus<S> : 500;
195
+ type ProblemResponseBody<Status extends number, P> = {
196
+ type: string;
197
+ title: string;
198
+ status: Status;
199
+ detail?: string;
200
+ instance?: string;
201
+ } & Omit<P, keyof Problem>;
195
202
  declare function problemBody(p: Problem): Record<string, unknown> & {
196
203
  status: number;
197
204
  };
@@ -199,13 +206,28 @@ declare function problemResponse(p: Problem, headers?: Record<string, any>): Res
199
206
  declare function internalServerErrorBody(error: any): Record<string, unknown>;
200
207
  declare function internalServerErrorBodyString(error: any): string;
201
208
  declare function internalServerErrorResponse(error: any): Response;
202
- declare const problem: <const P extends Problem>(detail: P) => ElysiaStatus<ProblemStatus<P>, {
203
- type: string;
204
- title: string;
205
- status: ProblemStatus<P>;
206
- detail?: string;
207
- instance?: string;
208
- } & Omit<P, keyof Problem>>;
209
+ /**
210
+ * RFC 9457 Problem Details function
211
+ *
212
+ * @example
213
+ * ```ts
214
+ * problem(400, { detail: 'Something went wrong' })
215
+ * ````
216
+ *
217
+ * @see https://www.rfc-editor.org/info/rfc9457
218
+ */
219
+ declare function problem<const Code extends number | keyof StatusMap, const P extends Record<string, unknown> = {}>(status: Code, detail?: P & Omit<Problem<Code>, 'status'>): ElysiaStatus<NumericStatus<Code>, ProblemResponseBody<NumericStatus<Code>, P>>;
220
+ /**
221
+ * RFC 9457 Problem Details function
222
+ *
223
+ * @example
224
+ * ```ts
225
+ * problem({ status: 400, detail: 'Something went wrong' })
226
+ * ````
227
+ *
228
+ * @see https://www.rfc-editor.org/info/rfc9457
229
+ */
230
+ declare function problem<const P extends Problem>(detail: P): ElysiaStatus<ProblemStatus<P>, ProblemResponseBody<ProblemStatus<P>, P>>;
209
231
  type CheckExcessProps<T, U> = 0 extends 1 & T ? T : U extends U ? Exclude<keyof T, keyof U> extends never ? T : { [K in keyof U]: U[K] } & { [K in Exclude<keyof T, keyof U>]: never } : never;
210
232
  type SelectiveStatus<in out Res> = <const Code extends keyof Res | StatusMapBack[Extract<keyof StatusMapBack, keyof Res>], T extends (Code extends keyof Res ? Res[Code] : Code extends keyof StatusMap ? Res[StatusMap[Code]] : never)>(code: Code, response: CheckExcessProps<T, Code extends keyof Res ? Res[Code] : Code extends keyof StatusMap ? Res[StatusMap[Code]] : never>) => ElysiaStatus<Code, T>;
211
233
  //#endregion
package/dist/error.js CHANGED
@@ -1,6 +1,5 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
2
2
  const require_constants = require('./constants.js');
3
- const require_utils = require('./utils.js');
4
3
  const require_type_bridge = require('./type/bridge.js');
5
4
  const require_type_constants = require('./type/constants.js');
6
5
  const require_adapter_skip_clone = require('./adapter/skip-clone.js');
@@ -319,7 +318,7 @@ var ValidationError = class extends ElysiaError {
319
318
  let expected;
320
319
  const schemaForExpected = first?.schema ?? this.schema;
321
320
  if (schemaForExpected) try {
322
- expected = require_type_bridge.Default(require_utils.nullObject(), schemaForExpected, void 0);
321
+ expected = require_type_bridge.Create(schemaForExpected);
323
322
  } catch {}
324
323
  return {
325
324
  type: "validation",
@@ -328,8 +327,8 @@ var ValidationError = class extends ElysiaError {
328
327
  detail,
329
328
  on: this.type,
330
329
  property,
331
- expected,
332
330
  found: scopeFound(this.value, first),
331
+ expected,
333
332
  errors
334
333
  };
335
334
  }
@@ -447,7 +446,13 @@ function internalServerErrorResponse(error) {
447
446
  require_adapter_skip_clone.skipClone.add(response);
448
447
  return response;
449
448
  }
450
- const problem = (detail) => new ElysiaStatus(detail.status ?? 500, problemBody(detail), { "content-type": PROBLEM_JSON });
449
+ function problem(statusOrDetail, detail) {
450
+ const body = typeof statusOrDetail === "object" ? statusOrDetail : {
451
+ ...detail,
452
+ status: statusOrDetail
453
+ };
454
+ return new ElysiaStatus(body.status ?? 500, problemBody(body), { "content-type": PROBLEM_JSON });
455
+ }
451
456
 
452
457
  //#endregion
453
458
  exports.ElysiaError = ElysiaError;
package/dist/error.mjs CHANGED
@@ -1,6 +1,5 @@
1
1
  import { StatusMap, StatusMapBack } from "./constants.mjs";
2
- import { nullObject } from "./utils.mjs";
3
- import { Default } from "./type/bridge.mjs";
2
+ import { Create } from "./type/bridge.mjs";
4
3
  import { primitiveElysiaTypes } from "./type/constants.mjs";
5
4
  import { skipClone } from "./adapter/skip-clone.mjs";
6
5
  import { env } from "./universal/env.mjs";
@@ -318,7 +317,7 @@ var ValidationError = class extends ElysiaError {
318
317
  let expected;
319
318
  const schemaForExpected = first?.schema ?? this.schema;
320
319
  if (schemaForExpected) try {
321
- expected = Default(nullObject(), schemaForExpected, void 0);
320
+ expected = Create(schemaForExpected);
322
321
  } catch {}
323
322
  return {
324
323
  type: "validation",
@@ -327,8 +326,8 @@ var ValidationError = class extends ElysiaError {
327
326
  detail,
328
327
  on: this.type,
329
328
  property,
330
- expected,
331
329
  found: scopeFound(this.value, first),
330
+ expected,
332
331
  errors
333
332
  };
334
333
  }
@@ -446,7 +445,13 @@ function internalServerErrorResponse(error) {
446
445
  skipClone.add(response);
447
446
  return response;
448
447
  }
449
- const problem = (detail) => new ElysiaStatus(detail.status ?? 500, problemBody(detail), { "content-type": PROBLEM_JSON });
448
+ function problem(statusOrDetail, detail) {
449
+ const body = typeof statusOrDetail === "object" ? statusOrDetail : {
450
+ ...detail,
451
+ status: statusOrDetail
452
+ };
453
+ return new ElysiaStatus(body.status ?? 500, problemBody(body), { "content-type": PROBLEM_JSON });
454
+ }
450
455
 
451
456
  //#endregion
452
457
  export { ElysiaError, ElysiaStatus, InternalServerError, NotFound, PROBLEM_JSON, ParseError, ValidationError, internalServerErrorBody, internalServerErrorBodyString, internalServerErrorResponse, isProduction, problem, problemBody, problemResponse, status, validationDetail };
@@ -175,6 +175,11 @@ function createFetchHandler(app) {
175
175
  const asyncIndexes = onRequests.length ? require_handler_utils.getAsyncIndexes(onRequests) : void 0;
176
176
  return async (request) => {
177
177
  const context = new Context(request);
178
+ let aborted = request.signal.aborted;
179
+ if (!aborted) request.signal.addEventListener("abort", () => {
180
+ aborted = true;
181
+ }, { once: true });
182
+ if (aborted) return require_handler_utils.emptyResponse.clone();
178
183
  const url = request.url, s = url.indexOf("/", pathStart);
179
184
  context.path = url.substring(s, (context.qi = url.indexOf("?", s)) === -1 ? url.length : context.qi);
180
185
  context.rid = require_utils.requestId();
@@ -201,6 +206,10 @@ function createFetchHandler(app) {
201
206
  });
202
207
  const result = asyncIndexes?.[i] ? await onRequests[i](context) : onRequests[i](context);
203
208
  for (let i = 0; i < traceLength; i++) endReports[i]?.();
209
+ if (aborted) {
210
+ for (let j = 0; j < traceLength; j++) trace[j].r(requestReports[j]);
211
+ return require_handler_utils.emptyResponse.clone();
212
+ }
204
213
  if (result !== void 0) {
205
214
  for (let j = 0; j < traceLength; j++) trace[j].r(requestReports[j]);
206
215
  const response = mapResponse(result, context.set);
@@ -221,11 +230,17 @@ function createFetchHandler(app) {
221
230
  const asyncIndexes = require_handler_utils.getAsyncIndexes(onRequests);
222
231
  if (asyncIndexes) return async (request) => {
223
232
  const context = new Context(request);
233
+ let aborted = request.signal.aborted;
234
+ if (!aborted) request.signal.addEventListener("abort", () => {
235
+ aborted = true;
236
+ }, { once: true });
237
+ if (aborted) return require_handler_utils.emptyResponse.clone();
224
238
  const url = request.url, s = url.indexOf("/", pathStart);
225
239
  context.path = url.substring(s, (context.qi = url.indexOf("?", s)) === -1 ? url.length : context.qi);
226
240
  try {
227
241
  for (let i = 0; i < onRequests.length; i++) {
228
242
  const result = asyncIndexes?.[i] ? await onRequests[i](context) : onRequests[i](context);
243
+ if (aborted) return require_handler_utils.emptyResponse.clone();
229
244
  if (result !== void 0) {
230
245
  const response = mapResponse(result, context.set);
231
246
  afterResponse?.(context);
@@ -239,11 +254,17 @@ function createFetchHandler(app) {
239
254
  };
240
255
  return (request) => {
241
256
  const context = new Context(request);
257
+ let aborted = request.signal.aborted;
258
+ if (!aborted) request.signal.addEventListener("abort", () => {
259
+ aborted = true;
260
+ }, { once: true });
261
+ if (aborted) return require_handler_utils.emptyResponse.clone();
242
262
  const url = request.url, s = url.indexOf("/", pathStart);
243
263
  context.path = url.substring(s, (context.qi = url.indexOf("?", s)) === -1 ? url.length : context.qi);
244
264
  try {
245
265
  for (let i = 0; i < onRequests.length; i++) {
246
266
  const result = onRequests[i](context);
267
+ if (aborted) return require_handler_utils.emptyResponse.clone();
247
268
  if (result !== void 0) {
248
269
  const response = mapResponse(result, context.set);
249
270
  afterResponse?.(context);
@@ -1,7 +1,7 @@
1
1
  import { flattenChain, isNotEmpty, nullObject, requestId } from "../utils.mjs";
2
2
  import { NotFound, PROBLEM_JSON, internalServerErrorResponse, isProduction } from "../error.mjs";
3
3
  import { handleSet } from "../adapter/utils.mjs";
4
- import { cachedResponse, getAsyncIndexes } from "./utils.mjs";
4
+ import { cachedResponse, emptyResponse, getAsyncIndexes } from "./utils.mjs";
5
5
  import { createTracer, unionTracePhases } from "../trace.mjs";
6
6
  import { createContext } from "../context.mjs";
7
7
  import { defaultAdapter } from "../adapter/constants.mjs";
@@ -173,6 +173,11 @@ function createFetchHandler(app) {
173
173
  const asyncIndexes = onRequests.length ? getAsyncIndexes(onRequests) : void 0;
174
174
  return async (request) => {
175
175
  const context = new Context(request);
176
+ let aborted = request.signal.aborted;
177
+ if (!aborted) request.signal.addEventListener("abort", () => {
178
+ aborted = true;
179
+ }, { once: true });
180
+ if (aborted) return emptyResponse.clone();
176
181
  const url = request.url, s = url.indexOf("/", pathStart);
177
182
  context.path = url.substring(s, (context.qi = url.indexOf("?", s)) === -1 ? url.length : context.qi);
178
183
  context.rid = requestId();
@@ -199,6 +204,10 @@ function createFetchHandler(app) {
199
204
  });
200
205
  const result = asyncIndexes?.[i] ? await onRequests[i](context) : onRequests[i](context);
201
206
  for (let i = 0; i < traceLength; i++) endReports[i]?.();
207
+ if (aborted) {
208
+ for (let j = 0; j < traceLength; j++) trace[j].r(requestReports[j]);
209
+ return emptyResponse.clone();
210
+ }
202
211
  if (result !== void 0) {
203
212
  for (let j = 0; j < traceLength; j++) trace[j].r(requestReports[j]);
204
213
  const response = mapResponse(result, context.set);
@@ -219,11 +228,17 @@ function createFetchHandler(app) {
219
228
  const asyncIndexes = getAsyncIndexes(onRequests);
220
229
  if (asyncIndexes) return async (request) => {
221
230
  const context = new Context(request);
231
+ let aborted = request.signal.aborted;
232
+ if (!aborted) request.signal.addEventListener("abort", () => {
233
+ aborted = true;
234
+ }, { once: true });
235
+ if (aborted) return emptyResponse.clone();
222
236
  const url = request.url, s = url.indexOf("/", pathStart);
223
237
  context.path = url.substring(s, (context.qi = url.indexOf("?", s)) === -1 ? url.length : context.qi);
224
238
  try {
225
239
  for (let i = 0; i < onRequests.length; i++) {
226
240
  const result = asyncIndexes?.[i] ? await onRequests[i](context) : onRequests[i](context);
241
+ if (aborted) return emptyResponse.clone();
227
242
  if (result !== void 0) {
228
243
  const response = mapResponse(result, context.set);
229
244
  afterResponse?.(context);
@@ -237,11 +252,17 @@ function createFetchHandler(app) {
237
252
  };
238
253
  return (request) => {
239
254
  const context = new Context(request);
255
+ let aborted = request.signal.aborted;
256
+ if (!aborted) request.signal.addEventListener("abort", () => {
257
+ aborted = true;
258
+ }, { once: true });
259
+ if (aborted) return emptyResponse.clone();
240
260
  const url = request.url, s = url.indexOf("/", pathStart);
241
261
  context.path = url.substring(s, (context.qi = url.indexOf("?", s)) === -1 ? url.length : context.qi);
242
262
  try {
243
263
  for (let i = 0; i < onRequests.length; i++) {
244
264
  const result = onRequests[i](context);
265
+ if (aborted) return emptyResponse.clone();
245
266
  if (result !== void 0) {
246
267
  const response = mapResponse(result, context.set);
247
268
  afterResponse?.(context);
@@ -1,4 +1,4 @@
1
+ import { getAsyncIndexes } from "./utils.js";
1
2
  import { createErrorHandler } from "./error.js";
2
3
  import { applyHoc, createFetchHandler } from "./fetch.js";
3
- import { getAsyncIndexes } from "./utils.js";
4
4
  export { applyHoc, createErrorHandler, createFetchHandler, getAsyncIndexes };
@@ -1,6 +1,9 @@
1
1
  //#region src/handler/utils.d.ts
2
+ declare const emptyResponse: Response | {
3
+ clone: () => Response;
4
+ };
2
5
  declare function cachedResponse(body: string, status: number, headers?: Record<string, string>): () => Response;
3
6
  declare function forwardError<T>(value: T): T;
4
7
  declare function getAsyncIndexes(onRequests: Function[]): (true | undefined)[] | undefined;
5
8
  //#endregion
6
- export { cachedResponse, forwardError, getAsyncIndexes };
9
+ export { cachedResponse, emptyResponse, forwardError, getAsyncIndexes };
@@ -3,6 +3,7 @@ const require_universal_constants = require('../universal/constants.js');
3
3
  const require_compile_utils = require('../compile/utils.js');
4
4
 
5
5
  //#region src/handler/utils.ts
6
+ const emptyResponse = require_universal_constants.isCloudflareWorker ? { clone: () => new Response(null) } : new Response(null);
6
7
  function cachedResponse(body, status, headers) {
7
8
  let cached;
8
9
  return () => require_universal_constants.isCloudflareWorker ? new Response(body, {
@@ -28,5 +29,6 @@ function getAsyncIndexes(onRequests) {
28
29
 
29
30
  //#endregion
30
31
  exports.cachedResponse = cachedResponse;
32
+ exports.emptyResponse = emptyResponse;
31
33
  exports.forwardError = forwardError;
32
34
  exports.getAsyncIndexes = getAsyncIndexes;
@@ -2,6 +2,7 @@ import { isCloudflareWorker } from "../universal/constants.mjs";
2
2
  import { isAsyncFunction } from "../compile/utils.mjs";
3
3
 
4
4
  //#region src/handler/utils.ts
5
+ const emptyResponse = isCloudflareWorker ? { clone: () => new Response(null) } : new Response(null);
5
6
  function cachedResponse(body, status, headers) {
6
7
  let cached;
7
8
  return () => isCloudflareWorker ? new Response(body, {
@@ -26,4 +27,4 @@ function getAsyncIndexes(onRequests) {
26
27
  }
27
28
 
28
29
  //#endregion
29
- export { cachedResponse, forwardError, getAsyncIndexes };
30
+ export { cachedResponse, emptyResponse, forwardError, getAsyncIndexes };
@@ -6,9 +6,9 @@ import { TypeBoxValidatorCache } from "./validator/validator-cache.js";
6
6
  import { TypeBoxValidator } from "./validator/index.js";
7
7
  import { Ref } from "typebox/type";
8
8
  import { Compile } from "typebox/compile";
9
- import { Clone, Decode, Default, HasCodec } from "typebox/value";
9
+ import { Clone, Create, Decode, Default, HasCodec } from "typebox/value";
10
10
 
11
11
  //#region src/type/bridge-live.d.ts
12
12
  declare function useTypebox(_mod?: Parameters<typeof useTypebox$1>[0]): void;
13
13
  //#endregion
14
- export { Clone, Compile, Decode, Default, HasCodec, Intersect, Ref, TypeBoxValidator, TypeBoxValidatorCache, applyCoercions, coerceBody, coerceFormData, coerceQuery, coerceRoot, coerceStringToStructure, hasTypes, useTypebox };
14
+ export { Clone, Compile, Create, Decode, Default, HasCodec, Intersect, Ref, TypeBoxValidator, TypeBoxValidatorCache, applyCoercions, coerceBody, coerceFormData, coerceQuery, coerceRoot, coerceStringToStructure, hasTypes, useTypebox };
@@ -17,6 +17,7 @@ function useTypebox(_mod) {}
17
17
  //#endregion
18
18
  exports.Clone = typebox_value.Clone;
19
19
  exports.Compile = typebox_compile.Compile;
20
+ exports.Create = typebox_value.Create;
20
21
  exports.Decode = typebox_value.Decode;
21
22
  exports.Default = typebox_value.Default;
22
23
  exports.HasCodec = typebox_value.HasCodec;
@@ -5,7 +5,7 @@ import { TypeBoxValidator } from "./validator/index.mjs";
5
5
  import { Intersect } from "./elysia/intersect.mjs";
6
6
  import { Ref } from "typebox/type";
7
7
  import { Compile } from "typebox/compile";
8
- import { Clone, Decode, Default, HasCodec } from "typebox/value";
8
+ import { Clone, Create, Decode, Default, HasCodec } from "typebox/value";
9
9
  import { Settings } from "typebox/system";
10
10
 
11
11
  //#region src/type/bridge-live.ts
@@ -13,4 +13,4 @@ Settings.Set({ unionPrioritySort: false });
13
13
  function useTypebox(_mod) {}
14
14
 
15
15
  //#endregion
16
- export { Clone, Compile, Decode, Default, HasCodec, Intersect, Ref, TypeBoxValidator, TypeBoxValidatorCache, applyCoercions, coerceBody, coerceFormData, coerceQuery, coerceRoot, coerceStringToStructure, hasTypes, useTypebox };
16
+ export { Clone, Compile, Create, Decode, Default, HasCodec, Intersect, Ref, TypeBoxValidator, TypeBoxValidatorCache, applyCoercions, coerceBody, coerceFormData, coerceQuery, coerceRoot, coerceStringToStructure, hasTypes, useTypebox };
@@ -5,11 +5,12 @@ import { TypeBoxValidatorCache as TypeBoxValidatorCache$1 } from "./validator/va
5
5
  import { TypeBoxValidator as TypeBoxValidator$1 } from "./validator/index.js";
6
6
  import { Ref as Ref$1, TAny, TSchema } from "typebox/type";
7
7
  import { Compile as Compile$1 } from "typebox/compile";
8
- import { Clone as Clone$1, Decode as Decode$1, Default as Default$1, HasCodec as HasCodec$1 } from "typebox/value";
8
+ import { Clone as Clone$1, Create as Create$1, Decode as Decode$1, Default as Default$1, HasCodec as HasCodec$1 } from "typebox/value";
9
9
 
10
10
  //#region src/type/bridge.d.ts
11
11
  interface TypeboxModule {
12
12
  Compile: typeof Compile$1;
13
+ Create: typeof Create$1;
13
14
  Decode: typeof Decode$1;
14
15
  applyCoercions: typeof applyCoercions$1;
15
16
  TypeBoxValidator: TypeBoxValidator$1;
@@ -27,6 +28,7 @@ interface TypeboxModule {
27
28
  Clone: typeof Clone$1;
28
29
  }
29
30
  declare let Compile: typeof Compile$1;
31
+ declare let Create: typeof Create$1;
30
32
  declare let Decode: typeof Decode$1;
31
33
  declare let applyCoercions: typeof applyCoercions$1;
32
34
  declare let TypeBoxValidator: TypeBoxValidator$1;
@@ -46,4 +48,4 @@ declare let Ref: typeof Ref$1;
46
48
  declare let Clone: typeof Clone$1;
47
49
  declare function useTypebox(mod: TypeboxModule): void;
48
50
  //#endregion
49
- export { Clone, Compile, Decode, Default, HasCodec, Intersect, Ref, TypeBoxValidator, TypeBoxValidatorCache, applyCoercions, coerceBody, coerceFormData, coerceQuery, coerceRoot, coerceStringToStructure, hasTypes, useTypebox };
51
+ export { Clone, Compile, Create, Decode, Default, HasCodec, Intersect, Ref, TypeBoxValidator, TypeBoxValidatorCache, applyCoercions, coerceBody, coerceFormData, coerceQuery, coerceRoot, coerceStringToStructure, hasTypes, useTypebox };
@@ -20,6 +20,7 @@ function stubClass(name) {
20
20
  };
21
21
  }
22
22
  let Compile = stub("Compile");
23
+ let Create = stub("Create");
23
24
  let Decode = stub("Decode");
24
25
  let applyCoercions = stub("applyCoercions");
25
26
  let TypeBoxValidator = stubClass("TypeBoxValidator");
@@ -38,6 +39,7 @@ let Clone = stub("Clone");
38
39
  function useTypebox(mod) {
39
40
  live = mod;
40
41
  Compile = mod.Compile;
42
+ Create = mod.Create;
41
43
  Decode = mod.Decode;
42
44
  applyCoercions = mod.applyCoercions;
43
45
  TypeBoxValidator = mod.TypeBoxValidator;
@@ -68,6 +70,12 @@ Object.defineProperty(exports, 'Compile', {
68
70
  return Compile;
69
71
  }
70
72
  });
73
+ Object.defineProperty(exports, 'Create', {
74
+ enumerable: true,
75
+ get: function () {
76
+ return Create;
77
+ }
78
+ });
71
79
  Object.defineProperty(exports, 'Decode', {
72
80
  enumerable: true,
73
81
  get: function () {
@@ -18,6 +18,7 @@ function stubClass(name) {
18
18
  };
19
19
  }
20
20
  let Compile = stub("Compile");
21
+ let Create = stub("Create");
21
22
  let Decode = stub("Decode");
22
23
  let applyCoercions = stub("applyCoercions");
23
24
  let TypeBoxValidator = stubClass("TypeBoxValidator");
@@ -36,6 +37,7 @@ let Clone = stub("Clone");
36
37
  function useTypebox(mod) {
37
38
  live = mod;
38
39
  Compile = mod.Compile;
40
+ Create = mod.Create;
39
41
  Decode = mod.Decode;
40
42
  applyCoercions = mod.applyCoercions;
41
43
  TypeBoxValidator = mod.TypeBoxValidator;
@@ -54,4 +56,4 @@ function useTypebox(mod) {
54
56
  }
55
57
 
56
58
  //#endregion
57
- export { Clone, Compile, Decode, Default, HasCodec, Intersect, Ref, TypeBoxValidator, TypeBoxValidatorCache, applyCoercions, coerceBody, coerceFormData, coerceQuery, coerceRoot, coerceStringToStructure, hasTypes, useTypebox };
59
+ export { Clone, Compile, Create, Decode, Default, HasCodec, Intersect, Ref, TypeBoxValidator, TypeBoxValidatorCache, applyCoercions, coerceBody, coerceFormData, coerceQuery, coerceRoot, coerceStringToStructure, hasTypes, useTypebox };
@@ -19,6 +19,7 @@ function setupTypebox() {
19
19
  typebox_system.Settings.Set({ unionPrioritySort: false });
20
20
  require_type_bridge.useTypebox({
21
21
  Compile: typebox_compile.Compile,
22
+ Create: typebox_value.Create,
22
23
  Decode: typebox_value.Decode,
23
24
  applyCoercions: require_type_coerce.applyCoercions,
24
25
  TypeBoxValidator: require_type_validator_index.TypeBoxValidator,
@@ -6,7 +6,7 @@ import { TypeBoxValidator } from "./validator/index.mjs";
6
6
  import { Intersect as Intersect$1 } from "./elysia/intersect.mjs";
7
7
  import { Ref } from "typebox/type";
8
8
  import { Compile } from "typebox/compile";
9
- import { Clone, Decode as Decode$1, Default, HasCodec } from "typebox/value";
9
+ import { Clone, Create, Decode as Decode$1, Default, HasCodec } from "typebox/value";
10
10
  import { Settings } from "typebox/system";
11
11
 
12
12
  //#region src/type/compat.ts
@@ -17,6 +17,7 @@ function setupTypebox() {
17
17
  Settings.Set({ unionPrioritySort: false });
18
18
  useTypebox({
19
19
  Compile,
20
+ Create,
20
21
  Decode: Decode$1,
21
22
  applyCoercions,
22
23
  TypeBoxValidator,
@@ -17,7 +17,7 @@ declare const ELYSIA_TYPES: {
17
17
  readonly NoValidate: 15;
18
18
  };
19
19
  type ELYSIA_TYPES = typeof ELYSIA_TYPES;
20
- declare const primitiveElysiaTypes: Set<1 | 2 | 3 | 6 | 10 | 11 | 13 | 14>;
20
+ declare const primitiveElysiaTypes: Set<3 | 1 | 2 | 6 | 10 | 11 | 13 | 14>;
21
21
  declare const noEnumerable: {
22
22
  readonly enumerable: false;
23
23
  };
@@ -2,8 +2,8 @@ import { Validator as Validator$1, ValidatorOptions } from "../../validator/inde
2
2
  import { TypeBoxValidatorCache } from "./validator-cache.js";
3
3
  import { MaybePromise } from "../../types.js";
4
4
  import { Static, StaticDecode, StaticEncode, TAny, TSchema } from "typebox/type";
5
- import { TLocalizedValidationError } from "typebox/error";
6
5
  import { Validator } from "typebox/schema";
6
+ import { TLocalizedValidationError } from "typebox/error";
7
7
 
8
8
  //#region src/type/validator/index.d.ts
9
9
  declare function shallowMergeObjects(members: any[]): TSchema | null;
package/dist/types.d.ts CHANGED
@@ -10,8 +10,8 @@ import { Context, ErrorContext, LifecycleContext, PreContext } from "./context.j
10
10
  import { WebSocketHandler } from "./ws/types.js";
11
11
  import { AnyElysia, Elysia } from "./base.js";
12
12
  import { ElysiaAdapter } from "./adapter/index.js";
13
- import { Static, StaticDecode, StaticEncode, TIntersect, TObject, TSchema } from "typebox";
14
13
  import { Instruction } from "exact-mirror";
14
+ import { Static, StaticDecode, StaticEncode, TIntersect, TObject, TSchema } from "typebox";
15
15
  import { OpenAPIV3 } from "openapi-types";
16
16
 
17
17
  //#region src/types.d.ts
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "elysia",
3
3
  "description": "Ergonomic Framework for Human",
4
- "version": "2.0.0-exp.32",
4
+ "version": "2.0.0-exp.34",
5
5
  "author": {
6
6
  "name": "saltyAom",
7
7
  "url": "https://github.com/SaltyAom",