elysia 1.3.20 → 1.3.21

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -709,22 +709,26 @@ var handleFile = (response, set2) => {
709
709
  try {
710
710
  for await (let chunk of generator) {
711
711
  if (end) break;
712
- if (chunk != null) {
712
+ if (chunk != null)
713
713
  if (chunk.toSSE)
714
714
  controller.enqueue(chunk.toSSE());
715
- else if (typeof chunk == "object")
716
- try {
717
- controller.enqueue(
718
- format(JSON.stringify(chunk))
719
- );
720
- } catch {
715
+ else {
716
+ if (typeof chunk == "object")
717
+ try {
718
+ controller.enqueue(
719
+ format(JSON.stringify(chunk))
720
+ );
721
+ } catch {
722
+ controller.enqueue(
723
+ format(chunk.toString())
724
+ );
725
+ }
726
+ else
721
727
  controller.enqueue(format(chunk.toString()));
722
- }
723
- else controller.enqueue(format(chunk.toString()));
724
- await new Promise(
725
- (resolve) => setTimeout(() => resolve(), 0)
726
- );
727
- }
728
+ isSSE || await new Promise(
729
+ (resolve) => setTimeout(() => resolve(), 0)
730
+ );
731
+ }
728
732
  }
729
733
  } catch (error) {
730
734
  console.warn(error);
@@ -723,22 +723,26 @@ var handleFile = (response, set2) => {
723
723
  try {
724
724
  for await (let chunk of generator) {
725
725
  if (end) break;
726
- if (chunk != null) {
726
+ if (chunk != null)
727
727
  if (chunk.toSSE)
728
728
  controller.enqueue(chunk.toSSE());
729
- else if (typeof chunk == "object")
730
- try {
731
- controller.enqueue(
732
- format(JSON.stringify(chunk))
733
- );
734
- } catch {
729
+ else {
730
+ if (typeof chunk == "object")
731
+ try {
732
+ controller.enqueue(
733
+ format(JSON.stringify(chunk))
734
+ );
735
+ } catch {
736
+ controller.enqueue(
737
+ format(chunk.toString())
738
+ );
739
+ }
740
+ else
735
741
  controller.enqueue(format(chunk.toString()));
736
- }
737
- else controller.enqueue(format(chunk.toString()));
738
- await new Promise(
739
- (resolve) => setTimeout(() => resolve(), 0)
740
- );
741
- }
742
+ isSSE || await new Promise(
743
+ (resolve) => setTimeout(() => resolve(), 0)
744
+ );
745
+ }
742
746
  }
743
747
  } catch (error) {
744
748
  console.warn(error);
@@ -3411,7 +3415,9 @@ for(const [k,v] of c.request.headers.entries())c.headers[k]=v
3411
3415
  ),
3412
3416
  websocket: {
3413
3417
  ...app.config.websocket || {},
3414
- ...websocket || {}
3418
+ ...websocket || {},
3419
+ // @ts-expect-error not available in this variant of options type
3420
+ ...options.websocket || {}
3415
3421
  },
3416
3422
  fetch: app.fetch
3417
3423
  } : {
@@ -3517,7 +3523,7 @@ for(const [k,v] of c.request.headers.entries())c.headers[k]=v
3517
3523
  ...(app.event.error ?? []).map(
3518
3524
  (x) => typeof x == "function" ? x : x.fn
3519
3525
  )
3520
- ].filter((x) => x), handleErrors = errorHandlers.length ? async (ws, error) => {
3526
+ ].filter((x) => x), hasCustomErrorHandlers = errorHandlers.length > 0, handleErrors = hasCustomErrorHandlers ? async (ws, error) => {
3521
3527
  for (let handleError of errorHandlers) {
3522
3528
  let response2 = handleError(
3523
3529
  Object.assign(context, { error })
@@ -3554,14 +3560,14 @@ for(const [k,v] of c.request.headers.entries())c.headers[k]=v
3554
3560
  },
3555
3561
  message: async (ws, _message) => {
3556
3562
  let message = await parseMessage(ws, _message);
3557
- if (validateMessage?.Check(message) === !1)
3558
- return void ws.send(
3559
- new ValidationError(
3560
- "message",
3561
- validateMessage,
3562
- message
3563
- ).message
3563
+ if (validateMessage?.Check(message) === !1) {
3564
+ let validationError = new ValidationError(
3565
+ "message",
3566
+ validateMessage,
3567
+ message
3564
3568
  );
3569
+ return hasCustomErrorHandlers ? handleErrors(ws, validationError) : void ws.send(validationError.message);
3570
+ }
3565
3571
  try {
3566
3572
  await handleResponse3(
3567
3573
  ws,
@@ -409,22 +409,26 @@ var handleFile = (response, set2) => {
409
409
  try {
410
410
  for await (let chunk of generator) {
411
411
  if (end) break;
412
- if (chunk != null) {
412
+ if (chunk != null)
413
413
  if (chunk.toSSE)
414
414
  controller.enqueue(chunk.toSSE());
415
- else if (typeof chunk == "object")
416
- try {
417
- controller.enqueue(
418
- format(JSON.stringify(chunk))
419
- );
420
- } catch {
415
+ else {
416
+ if (typeof chunk == "object")
417
+ try {
418
+ controller.enqueue(
419
+ format(JSON.stringify(chunk))
420
+ );
421
+ } catch {
422
+ controller.enqueue(
423
+ format(chunk.toString())
424
+ );
425
+ }
426
+ else
421
427
  controller.enqueue(format(chunk.toString()));
422
- }
423
- else controller.enqueue(format(chunk.toString()));
424
- await new Promise(
425
- (resolve) => setTimeout(() => resolve(), 0)
426
- );
427
- }
428
+ isSSE || await new Promise(
429
+ (resolve) => setTimeout(() => resolve(), 0)
430
+ );
431
+ }
428
432
  }
429
433
  } catch (error) {
430
434
  console.warn(error);
@@ -724,22 +724,26 @@ var handleFile = (response, set2) => {
724
724
  try {
725
725
  for await (let chunk of generator) {
726
726
  if (end) break;
727
- if (chunk != null) {
727
+ if (chunk != null)
728
728
  if (chunk.toSSE)
729
729
  controller.enqueue(chunk.toSSE());
730
- else if (typeof chunk == "object")
731
- try {
732
- controller.enqueue(
733
- format(JSON.stringify(chunk))
734
- );
735
- } catch {
730
+ else {
731
+ if (typeof chunk == "object")
732
+ try {
733
+ controller.enqueue(
734
+ format(JSON.stringify(chunk))
735
+ );
736
+ } catch {
737
+ controller.enqueue(
738
+ format(chunk.toString())
739
+ );
740
+ }
741
+ else
736
742
  controller.enqueue(format(chunk.toString()));
737
- }
738
- else controller.enqueue(format(chunk.toString()));
739
- await new Promise(
740
- (resolve) => setTimeout(() => resolve(), 0)
741
- );
742
- }
743
+ isSSE || await new Promise(
744
+ (resolve) => setTimeout(() => resolve(), 0)
745
+ );
746
+ }
743
747
  }
744
748
  } catch (error) {
745
749
  console.warn(error);
@@ -3429,7 +3433,9 @@ for(const [k,v] of c.request.headers.entries())c.headers[k]=v
3429
3433
  ),
3430
3434
  websocket: {
3431
3435
  ...app.config.websocket || {},
3432
- ...websocket || {}
3436
+ ...websocket || {},
3437
+ // @ts-expect-error not available in this variant of options type
3438
+ ...options.websocket || {}
3433
3439
  },
3434
3440
  fetch: app.fetch
3435
3441
  } : {
@@ -3535,7 +3541,7 @@ for(const [k,v] of c.request.headers.entries())c.headers[k]=v
3535
3541
  ...(app.event.error ?? []).map(
3536
3542
  (x) => typeof x == "function" ? x : x.fn
3537
3543
  )
3538
- ].filter((x) => x), handleErrors = errorHandlers.length ? async (ws, error) => {
3544
+ ].filter((x) => x), hasCustomErrorHandlers = errorHandlers.length > 0, handleErrors = hasCustomErrorHandlers ? async (ws, error) => {
3539
3545
  for (let handleError of errorHandlers) {
3540
3546
  let response2 = handleError(
3541
3547
  Object.assign(context, { error })
@@ -3572,14 +3578,14 @@ for(const [k,v] of c.request.headers.entries())c.headers[k]=v
3572
3578
  },
3573
3579
  message: async (ws, _message) => {
3574
3580
  let message = await parseMessage(ws, _message);
3575
- if (validateMessage?.Check(message) === !1)
3576
- return void ws.send(
3577
- new ValidationError(
3578
- "message",
3579
- validateMessage,
3580
- message
3581
- ).message
3581
+ if (validateMessage?.Check(message) === !1) {
3582
+ let validationError = new ValidationError(
3583
+ "message",
3584
+ validateMessage,
3585
+ message
3582
3586
  );
3587
+ return hasCustomErrorHandlers ? handleErrors(ws, validationError) : void ws.send(validationError.message);
3588
+ }
3583
3589
  try {
3584
3590
  await handleResponse3(
3585
3591
  ws,
@@ -285,22 +285,26 @@ var handleFile = (response, set) => {
285
285
  try {
286
286
  for await (let chunk of generator) {
287
287
  if (end) break;
288
- if (chunk != null) {
288
+ if (chunk != null)
289
289
  if (chunk.toSSE)
290
290
  controller.enqueue(chunk.toSSE());
291
- else if (typeof chunk == "object")
292
- try {
293
- controller.enqueue(
294
- format(JSON.stringify(chunk))
295
- );
296
- } catch {
291
+ else {
292
+ if (typeof chunk == "object")
293
+ try {
294
+ controller.enqueue(
295
+ format(JSON.stringify(chunk))
296
+ );
297
+ } catch {
298
+ controller.enqueue(
299
+ format(chunk.toString())
300
+ );
301
+ }
302
+ else
297
303
  controller.enqueue(format(chunk.toString()));
298
- }
299
- else controller.enqueue(format(chunk.toString()));
300
- await new Promise(
301
- (resolve) => setTimeout(() => resolve(), 0)
302
- );
303
- }
304
+ isSSE || await new Promise(
305
+ (resolve) => setTimeout(() => resolve(), 0)
306
+ );
307
+ }
304
308
  }
305
309
  } catch (error) {
306
310
  console.warn(error);
@@ -488,22 +488,26 @@ var handleFile = (response, set2) => {
488
488
  try {
489
489
  for await (let chunk of generator) {
490
490
  if (end) break;
491
- if (chunk != null) {
491
+ if (chunk != null)
492
492
  if (chunk.toSSE)
493
493
  controller.enqueue(chunk.toSSE());
494
- else if (typeof chunk == "object")
495
- try {
496
- controller.enqueue(
497
- format(JSON.stringify(chunk))
498
- );
499
- } catch {
494
+ else {
495
+ if (typeof chunk == "object")
496
+ try {
497
+ controller.enqueue(
498
+ format(JSON.stringify(chunk))
499
+ );
500
+ } catch {
501
+ controller.enqueue(
502
+ format(chunk.toString())
503
+ );
504
+ }
505
+ else
500
506
  controller.enqueue(format(chunk.toString()));
501
- }
502
- else controller.enqueue(format(chunk.toString()));
503
- await new Promise(
504
- (resolve) => setTimeout(() => resolve(), 0)
505
- );
506
- }
507
+ isSSE || await new Promise(
508
+ (resolve) => setTimeout(() => resolve(), 0)
509
+ );
510
+ }
507
511
  }
508
512
  } catch (error) {
509
513
  console.warn(error);
@@ -484,22 +484,26 @@ var handleFile = (response, set2) => {
484
484
  try {
485
485
  for await (let chunk of generator) {
486
486
  if (end) break;
487
- if (chunk != null) {
487
+ if (chunk != null)
488
488
  if (chunk.toSSE)
489
489
  controller.enqueue(chunk.toSSE());
490
- else if (typeof chunk == "object")
491
- try {
492
- controller.enqueue(
493
- format(JSON.stringify(chunk))
494
- );
495
- } catch {
490
+ else {
491
+ if (typeof chunk == "object")
492
+ try {
493
+ controller.enqueue(
494
+ format(JSON.stringify(chunk))
495
+ );
496
+ } catch {
497
+ controller.enqueue(
498
+ format(chunk.toString())
499
+ );
500
+ }
501
+ else
496
502
  controller.enqueue(format(chunk.toString()));
497
- }
498
- else controller.enqueue(format(chunk.toString()));
499
- await new Promise(
500
- (resolve) => setTimeout(() => resolve(), 0)
501
- );
502
- }
503
+ isSSE || await new Promise(
504
+ (resolve) => setTimeout(() => resolve(), 0)
505
+ );
506
+ }
503
507
  }
504
508
  } catch (error) {
505
509
  console.warn(error);
@@ -2602,11 +2602,16 @@ try{a${index}.push(JSON.parse(value))}catch{a${index}.push(value)}if(deepMemory=
2602
2602
  }
2603
2603
  }
2604
2604
  let isAsyncHandler = typeof handler == "function" && isAsync(handler), saveResponse = hasTrace || hooks.afterResponse?.length ? "c.response= " : "", maybeAsync = hasCookie || hasBody || isAsyncHandler || !!hooks.parse?.length || !!hooks.afterHandle?.some(isAsync) || !!hooks.beforeHandle?.some(isAsync) || !!hooks.transform?.some(isAsync) || !!hooks.mapResponse?.some(isAsync), maybeStream = (typeof handler == "function" ? isGenerator(handler) : !1) || !!hooks.beforeHandle?.some(isGenerator) || !!hooks.afterHandle?.some(isGenerator) || !!hooks.transform?.some(isGenerator), responseKeys = Object.keys(validator.response ?? {}), hasMultipleResponses = responseKeys.length > 1, hasSingle200 = responseKeys.length === 0 || responseKeys.length === 1 && responseKeys[0] === "200", hasSet = inference.cookie || inference.set || hasHeaders || hasTrace || hasMultipleResponses || !hasSingle200 || isHandleFn && hasDefaultHeaders || maybeStream, afterResponse = () => {
2605
- if (!hooks.afterResponse?.length) return "";
2605
+ if (!hooks.afterResponse?.length && !hasTrace) return "";
2606
2606
  let afterResponse2 = "", prefix = hooks.afterResponse?.some(isAsync) ? "async " : "";
2607
2607
  afterResponse2 += `
2608
2608
  setImmediate(${prefix}()=>{`;
2609
- let reporter = report("afterResponse", {
2609
+ let reporter = createReport({
2610
+ trace: hooks.trace,
2611
+ addFn: (word) => {
2612
+ afterResponse2 += word;
2613
+ }
2614
+ })("afterResponse", {
2610
2615
  total: hooks.afterResponse?.length
2611
2616
  });
2612
2617
  if (hooks.afterResponse?.length && hooks.afterResponse)
@@ -2623,7 +2628,7 @@ ${prefix2}e.afterResponse[${i}](c)
2623
2628
  }, mapResponse = (r = "r") => {
2624
2629
  let after = afterResponse(), response = `${hasSet ? "mapResponse" : "mapCompactResponse"}(${saveResponse}${r}${hasSet ? ",c.set" : ""}${mapResponseContext})
2625
2630
  `;
2626
- return after || `${response}`, `const _res=${response}` + after + "return _res";
2631
+ return after ? `const _res=${response}` + after + "return _res" : `return ${response}`;
2627
2632
  }, mapResponseContext = maybeStream || adapter.mapResponseContext ? `,${adapter.mapResponseContext}` : "";
2628
2633
  (hasTrace || inference.route) && (fnLiteral += `c.route=\`${path}\`
2629
2634
  `);
@@ -2777,15 +2782,16 @@ delete c.contentType`);
2777
2782
  }
2778
2783
  fnLiteral += "}catch(error){throw new ParseError(error)}";
2779
2784
  }
2780
- if (parseReporter.resolve(), hooks?.transform) {
2785
+ if (parseReporter.resolve(), hooks?.transform || hasTrace) {
2781
2786
  let reporter = report("transform", {
2782
- total: hooks.transform.length
2787
+ total: hooks.transform?.length
2783
2788
  });
2784
- hooks.transform.length && (fnLiteral += `let transformed
2785
- `);
2786
- for (let i = 0; i < hooks.transform.length; i++) {
2787
- let transform = hooks.transform[i], endUnit = reporter.resolveChild(transform.fn.name);
2788
- fnLiteral += isAsync(transform) ? `transformed=await e.transform[${i}](c)
2789
+ if (hooks.transform?.length) {
2790
+ fnLiteral += `let transformed
2791
+ `;
2792
+ for (let i = 0; i < hooks.transform.length; i++) {
2793
+ let transform = hooks.transform[i], endUnit = reporter.resolveChild(transform.fn.name);
2794
+ fnLiteral += isAsync(transform) ? `transformed=await e.transform[${i}](c)
2789
2795
  ` : `transformed=e.transform[${i}](c)
2790
2796
  `, transform.subType === "mapDerive" ? fnLiteral += "if(transformed instanceof ElysiaCustomStatusResponse){" + mapResponse("transformed") + `}else{transformed.request=c.request
2791
2797
  transformed.store=c.store
@@ -2797,6 +2803,7 @@ transformed.set=c.set
2797
2803
  transformed.error=c.error
2798
2804
  c=transformed}` : fnLiteral += "if(transformed instanceof ElysiaCustomStatusResponse){" + mapResponse("transformed") + `}else Object.assign(c,transformed)
2799
2805
  `, endUnit();
2806
+ }
2800
2807
  }
2801
2808
  reporter.resolve();
2802
2809
  }
@@ -2984,14 +2991,15 @@ for(const [key,value] of Object.entries(c.cookie))cookieValue[key]=value.value
2984
2991
  )), cookieValidator.isOptional && (fnLiteral += "}");
2985
2992
  }
2986
2993
  }
2987
- if (hooks?.beforeHandle) {
2994
+ if (hooks?.beforeHandle || hasTrace) {
2988
2995
  let reporter = report("beforeHandle", {
2989
- total: hooks.beforeHandle.length
2996
+ total: hooks.beforeHandle?.length
2990
2997
  }), hasResolve = !1;
2991
- for (let i = 0; i < hooks.beforeHandle.length; i++) {
2992
- let beforeHandle = hooks.beforeHandle[i], endUnit = reporter.resolveChild(beforeHandle.fn.name), returning = hasReturn(beforeHandle);
2993
- if (beforeHandle.subType === "resolve" || beforeHandle.subType === "mapResolve")
2994
- hasResolve || (hasResolve = !0, fnLiteral += `
2998
+ if (hooks.beforeHandle?.length)
2999
+ for (let i = 0; i < hooks.beforeHandle.length; i++) {
3000
+ let beforeHandle = hooks.beforeHandle[i], endUnit = reporter.resolveChild(beforeHandle.fn.name), returning = hasReturn(beforeHandle);
3001
+ if (beforeHandle.subType === "resolve" || beforeHandle.subType === "mapResolve")
3002
+ hasResolve || (hasResolve = !0, fnLiteral += `
2995
3003
  let resolved
2996
3004
  `), fnLiteral += isAsync(beforeHandle) ? `resolved=await e.beforeHandle[${i}](c);
2997
3005
  ` : `resolved=e.beforeHandle[${i}](c);
@@ -3004,76 +3012,78 @@ resolved.redirect=c.redirect
3004
3012
  resolved.set=c.set
3005
3013
  resolved.error=c.error
3006
3014
  c=resolved}` : fnLiteral += "if(resolved instanceof ElysiaCustomStatusResponse){" + mapResponse("resolved") + `}else Object.assign(c, resolved)
3007
- `;
3008
- else if (!returning)
3009
- fnLiteral += isAsync(beforeHandle) ? `await e.beforeHandle[${i}](c)
3015
+ `, endUnit();
3016
+ else if (!returning)
3017
+ fnLiteral += isAsync(beforeHandle) ? `await e.beforeHandle[${i}](c)
3010
3018
  ` : `e.beforeHandle[${i}](c)
3011
3019
  `, endUnit();
3012
- else {
3013
- if (fnLiteral += isAsync(beforeHandle) ? `be=await e.beforeHandle[${i}](c)
3020
+ else {
3021
+ if (fnLiteral += isAsync(beforeHandle) ? `be=await e.beforeHandle[${i}](c)
3014
3022
  ` : `be=e.beforeHandle[${i}](c)
3015
- `, endUnit("be"), fnLiteral += "if(be!==undefined){", reporter.resolve(), hooks.afterHandle?.length) {
3016
- report("handle", {
3017
- name: isHandleFn ? handler.name : void 0
3018
- }).resolve();
3019
- let reporter2 = report("afterHandle", {
3020
- total: hooks.afterHandle.length
3021
- });
3022
- for (let i2 = 0; i2 < hooks.afterHandle.length; i2++) {
3023
- let hook = hooks.afterHandle[i2], returning2 = hasReturn(hook), endUnit2 = reporter2.resolveChild(hook.fn.name);
3024
- fnLiteral += `c.response = be
3023
+ `, endUnit("be"), fnLiteral += "if(be!==undefined){", reporter.resolve(), hooks.afterHandle?.length || hasTrace) {
3024
+ report("handle", {
3025
+ name: isHandleFn ? handler.name : void 0
3026
+ }).resolve();
3027
+ let reporter2 = report("afterHandle", {
3028
+ total: hooks.afterHandle?.length
3029
+ });
3030
+ if (hooks.afterHandle?.length)
3031
+ for (let i2 = 0; i2 < hooks.afterHandle.length; i2++) {
3032
+ let hook = hooks.afterHandle[i2], returning2 = hasReturn(hook), endUnit2 = reporter2.resolveChild(hook.fn.name);
3033
+ fnLiteral += `c.response = be
3025
3034
  `, returning2 ? (fnLiteral += isAsync(hook.fn) ? `af=await e.afterHandle[${i2}](c)
3026
3035
  ` : `af=e.afterHandle[${i2}](c)
3027
3036
  `, fnLiteral += `if(af!==undefined) c.response=be=af
3028
3037
  `) : fnLiteral += isAsync(hook.fn) ? `await e.afterHandle[${i2}](c, be)
3029
3038
  ` : `e.afterHandle[${i2}](c, be)
3030
3039
  `, endUnit2("af");
3040
+ }
3041
+ reporter2.resolve();
3031
3042
  }
3032
- reporter2.resolve();
3033
- }
3034
- validator.response && (fnLiteral += validation.response("be"));
3035
- let mapResponseReporter = report("mapResponse", {
3036
- total: hooks.mapResponse?.length
3037
- });
3038
- if (hooks.mapResponse?.length) {
3039
- fnLiteral += `c.response=be
3043
+ validator.response && (fnLiteral += validation.response("be"));
3044
+ let mapResponseReporter = report("mapResponse", {
3045
+ total: hooks.mapResponse?.length
3046
+ });
3047
+ if (hooks.mapResponse?.length) {
3048
+ fnLiteral += `c.response=be
3040
3049
  `;
3041
- for (let i2 = 0; i2 < hooks.mapResponse.length; i2++) {
3042
- let mapResponse2 = hooks.mapResponse[i2], endUnit2 = mapResponseReporter.resolveChild(
3043
- mapResponse2.fn.name
3044
- );
3045
- fnLiteral += `if(mr===undefined){mr=${isAsyncName(mapResponse2) ? "await " : ""}e.mapResponse[${i2}](c)
3050
+ for (let i2 = 0; i2 < hooks.mapResponse.length; i2++) {
3051
+ let mapResponse2 = hooks.mapResponse[i2], endUnit2 = mapResponseReporter.resolveChild(
3052
+ mapResponse2.fn.name
3053
+ );
3054
+ fnLiteral += `if(mr===undefined){mr=${isAsyncName(mapResponse2) ? "await " : ""}e.mapResponse[${i2}](c)
3046
3055
  if(mr!==undefined)be=c.response=mr}`, endUnit2();
3056
+ }
3047
3057
  }
3048
- }
3049
- mapResponseReporter.resolve(), fnLiteral += encodeCookie(), fnLiteral += `return mapEarlyResponse(${saveResponse}be,c.set${mapResponseContext})}
3058
+ mapResponseReporter.resolve(), fnLiteral += encodeCookie(), fnLiteral += `return mapEarlyResponse(${saveResponse}be,c.set${mapResponseContext})}
3050
3059
  `;
3060
+ }
3051
3061
  }
3052
- }
3053
3062
  reporter.resolve();
3054
3063
  }
3055
- if (hooks.afterHandle?.length) {
3064
+ if (hooks.afterHandle?.length || hasTrace) {
3056
3065
  let handleReporter = report("handle", {
3057
3066
  name: isHandleFn ? handler.name : void 0
3058
3067
  });
3059
- hooks.afterHandle.length ? fnLiteral += isAsyncHandler ? `let r=c.response=await ${handle}
3068
+ hooks.afterHandle?.length ? fnLiteral += isAsyncHandler ? `let r=c.response=await ${handle}
3060
3069
  ` : `let r=c.response=${handle}
3061
3070
  ` : fnLiteral += isAsyncHandler ? `let r=await ${handle}
3062
3071
  ` : `let r=${handle}
3063
3072
  `, handleReporter.resolve();
3064
3073
  let reporter = report("afterHandle", {
3065
- total: hooks.afterHandle.length
3074
+ total: hooks.afterHandle?.length
3066
3075
  });
3067
- for (let i = 0; i < hooks.afterHandle.length; i++) {
3068
- let hook = hooks.afterHandle[i], returning = hasReturn(hook), endUnit = reporter.resolveChild(hook.fn.name);
3069
- returning ? (fnLiteral += isAsync(hook.fn) ? `af=await e.afterHandle[${i}](c)
3076
+ if (hooks.afterHandle?.length)
3077
+ for (let i = 0; i < hooks.afterHandle.length; i++) {
3078
+ let hook = hooks.afterHandle[i], returning = hasReturn(hook), endUnit = reporter.resolveChild(hook.fn.name);
3079
+ returning ? (fnLiteral += isAsync(hook.fn) ? `af=await e.afterHandle[${i}](c)
3070
3080
  ` : `af=e.afterHandle[${i}](c)
3071
3081
  `, endUnit("af"), validator.response ? (fnLiteral += "if(af!==undefined){", reporter.resolve(), fnLiteral += validation.response("af"), fnLiteral += "c.response=af}") : (fnLiteral += "if(af!==undefined){", reporter.resolve(), fnLiteral += "c.response=af}")) : (fnLiteral += isAsync(hook.fn) ? `await e.afterHandle[${i}](c)
3072
3082
  ` : `e.afterHandle[${i}](c)
3073
3083
  `, endUnit());
3074
- }
3075
- reporter.resolve(), fnLiteral += `r=c.response
3076
- `, validator.response && (fnLiteral += validation.response()), fnLiteral += encodeCookie();
3084
+ }
3085
+ reporter.resolve(), hooks.afterHandle?.length && (fnLiteral += `r=c.response
3086
+ `), validator.response && (fnLiteral += validation.response()), fnLiteral += encodeCookie();
3077
3087
  let mapResponseReporter = report("mapResponse", {
3078
3088
  total: hooks.mapResponse?.length
3079
3089
  });
@@ -3091,7 +3101,7 @@ if(mr!==undefined)r=c.response=mr
3091
3101
  let handleReporter = report("handle", {
3092
3102
  name: isHandleFn ? handler.name : void 0
3093
3103
  });
3094
- if (validator.response || hooks.mapResponse?.length) {
3104
+ if (validator.response || hooks.mapResponse?.length || hasTrace) {
3095
3105
  fnLiteral += isAsyncHandler ? `let r=await ${handle}
3096
3106
  ` : `let r=${handle}
3097
3107
  `, handleReporter.resolve(), validator.response && (fnLiteral += validation.response());
@@ -3411,22 +3421,29 @@ map: switch(p){
3411
3421
  fnLiteral += word;
3412
3422
  }
3413
3423
  }), afterResponse = () => {
3414
- if (!hooks.afterResponse?.length) return "";
3415
- let afterResponse2 = "", prefix = hooks.afterResponse.some(isAsync) ? "async" : "";
3424
+ if (!hooks.afterResponse?.length && !hasTrace) return "";
3425
+ let afterResponse2 = "", prefix = hooks.afterResponse?.some(isAsync) ? "async" : "";
3416
3426
  afterResponse2 += `
3417
3427
  setImmediate(${prefix}()=>{`;
3418
- let reporter = report("afterResponse", {
3428
+ let reporter = createReport({
3429
+ context: "context",
3430
+ trace: hooks.trace,
3431
+ addFn: (word) => {
3432
+ afterResponse2 += word;
3433
+ }
3434
+ })("afterResponse", {
3419
3435
  total: hooks.afterResponse?.length,
3420
3436
  name: "context"
3421
3437
  });
3422
- for (let i = 0; i < hooks.afterResponse.length; i++) {
3423
- let fn = hooks.afterResponse[i].fn, endUnit = reporter.resolveChild(fn.name);
3424
- afterResponse2 += `
3438
+ if (hooks.afterResponse?.length && hooks.afterResponse)
3439
+ for (let i = 0; i < hooks.afterResponse.length; i++) {
3440
+ let fn = hooks.afterResponse[i].fn, endUnit = reporter.resolveChild(fn.name);
3441
+ afterResponse2 += `
3425
3442
  ${isAsyncName(fn) ? "await " : ""}afterResponse[${i}](context)
3426
3443
  `, endUnit();
3427
- }
3428
- return afterResponse2 += `})
3429
- `, reporter.resolve(), afterResponse2;
3444
+ }
3445
+ return reporter.resolve(), afterResponse2 += `})
3446
+ `, afterResponse2;
3430
3447
  };
3431
3448
  fnLiteral += `const set=context.set
3432
3449
  let _r
@@ -3434,7 +3451,7 @@ if(!context.code)context.code=error.code??error[ERROR_CODE]
3434
3451
  if(!(context.error instanceof Error))context.error=error
3435
3452
  if(error instanceof ElysiaCustomStatusResponse){set.status=error.status=error.code
3436
3453
  error.message=error.response}`, adapter.declare && (fnLiteral += adapter.declare);
3437
- let saveResponse = hasTrace || hooks.afterResponse?.length || hooks.afterResponse?.length ? "context.response = " : "";
3454
+ let saveResponse = hasTrace || hooks.afterResponse?.length ? "context.response = " : "";
3438
3455
  if (app.event.error)
3439
3456
  for (let i = 0; i < app.event.error.length; i++) {
3440
3457
  let handler = app.event.error[i], response = `${isAsync(handler) ? "await " : ""}onError[${i}](context)