elysia 0.7.21 → 0.7.23

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.
@@ -21,8 +21,10 @@ const createReport = ({ hasTrace, hasTraceSet = false, addFn, condition = {} })
21
21
  ? event
22
22
  : event.slice(0, dotIndex))])
23
23
  return () => {
24
- if (hasTraceSet && event === 'afterHandle')
25
- addFn('\nawait traceDone\n');
24
+ if (hasTraceSet && event === 'afterHandle') {
25
+ addFn(`reporter.emit('event',{id,event:'exit',type:'begin',time:0})`);
26
+ addFn(`\nawait traceDone\n`);
27
+ }
26
28
  };
27
29
  if (isGroup)
28
30
  name ||= event;
@@ -52,8 +54,10 @@ const createReport = ({ hasTrace, hasTraceSet = false, addFn, condition = {} })
52
54
  time: performance.now()
53
55
  })`.replace(/(\t| |\n)/g, '') +
54
56
  '\n');
55
- if (hasTraceSet && event === 'afterHandle')
57
+ if (hasTraceSet && event === 'afterHandle') {
58
+ addFn(`\nreporter.emit('event',{id,event:'exit',type:'begin',time:0})\n`);
56
59
  addFn('\nawait traceDone\n');
60
+ }
57
61
  };
58
62
  };
59
63
  }
@@ -458,9 +462,14 @@ const composeHandler = ({ path, method, hooks, validator, handler, handleError,
458
462
  }
459
463
  });
460
464
  fnLiteral += hasErrorHandler ? 'try {\n' : '';
461
- if (hasTrace)
462
- fnLiteral +=
463
- '\nconst traceDone = new Promise(r => { reporter.once(`res${id}`, r) })\n';
465
+ if (hasTrace) {
466
+ // fnLiteral += `\nconst traceDone = new Promise(r => r())\n`
467
+ fnLiteral += `\nconst traceDone = Promise.all([`;
468
+ for (let i = 0; i < hooks.trace.length; i++) {
469
+ fnLiteral += `new Promise(r => { reporter.once(\`res\${id}.${i}\`, r) }),`;
470
+ }
471
+ fnLiteral += `])\n`;
472
+ }
464
473
  const maybeAsync = hasCookie ||
465
474
  hasBody ||
466
475
  hasTraceSet ||
@@ -800,8 +809,6 @@ const composeHandler = ({ path, method, hooks, validator, handler, handleError,
800
809
  else {
801
810
  fnLiteral += `if(${name}) {`;
802
811
  endAfterHandle();
803
- if (hasTraceSet)
804
- fnLiteral += `${name} = mapEarlyResponse(${name}, c.set)\n`;
805
812
  fnLiteral += `return ${name}}\n`;
806
813
  }
807
814
  }
@@ -906,7 +913,6 @@ const composeHandler = ({ path, method, hooks, validator, handler, handleError,
906
913
  fnLiteral += `}`;
907
914
  }
908
915
  }
909
- // console.log(fnLiteral)
910
916
  fnLiteral = `const {
911
917
  handler,
912
918
  handleError,
@@ -980,5 +980,5 @@ export { Cookie, type CookieOptions } from './cookie';
980
980
  export { getSchemaValidator, mergeDeep, mergeHook, mergeObjectArray, getResponseSchemaValidator } from './utils';
981
981
  export { ParseError, NotFoundError, ValidationError, InternalServerError, InvalidCookieSignature } from './error';
982
982
  export type { Context, PreContext } from './context';
983
- export type { ElysiaConfig, DecoratorBase, DefinitionBase, RouteBase, Handler, ComposedHandler, InputSchema, LocalHook, MergeSchema, RouteSchema, UnwrapRoute, InternalRoute, HTTPMethod, SchemaValidator, VoidHandler, PreHandler, BodyHandler, OptionalHandler, ErrorHandler, AfterHandler, TraceHandler, TraceStream, LifeCycleEvent, TraceEvent, LifeCycleStore, MaybePromise, ListenCallback, UnwrapSchema } from './types';
983
+ export type { ElysiaConfig, DecoratorBase, DefinitionBase, RouteBase, Handler, ComposedHandler, InputSchema, LocalHook, MergeSchema, RouteSchema, UnwrapRoute, InternalRoute, HTTPMethod, SchemaValidator, VoidHandler, PreHandler, BodyHandler, OptionalHandler, ErrorHandler, AfterHandler, LifeCycleEvent, TraceEvent, LifeCycleStore, MaybePromise, ListenCallback, UnwrapSchema, TraceHandler, TraceProcess, TraceReporter, TraceStream } from './types';
984
984
  export type { Static } from '@sinclair/typebox';
package/dist/cjs/index.js CHANGED
@@ -556,7 +556,7 @@ class Elysia {
556
556
  * ```
557
557
  */
558
558
  trace(handler) {
559
- this.reporter.on('event', (0, trace_1.createTraceListener)(() => this.reporter, handler));
559
+ this.reporter.on('event', (0, trace_1.createTraceListener)(() => this.reporter, this.event.trace.length, handler));
560
560
  this.on('trace', handler);
561
561
  return this;
562
562
  }
@@ -1,2 +1,2 @@
1
1
  import type { TraceHandler, TraceReporter, TraceStream } from './types';
2
- export declare const createTraceListener: (getReporter: () => TraceReporter, handler: TraceHandler<any, any>) => (event: TraceStream) => Promise<void>;
2
+ export declare const createTraceListener: (getReporter: () => TraceReporter, totalListener: number, handler: TraceHandler<any, any>) => (trace: TraceStream) => Promise<void>;
package/dist/cjs/trace.js CHANGED
@@ -1,217 +1,204 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.createTraceListener = void 0;
4
- const createTraceListener = (getReporter, handler) => {
5
- return async function trace(event) {
6
- const id = event.id;
7
- if (event.event === 'request' && event.type === 'begin') {
8
- const reporter = getReporter();
9
- const createSignal = () => {
10
- let resolveHandle;
11
- let resolveHandleEnd;
12
- let childIteration = -1;
13
- const children = [];
14
- const endChildren = [];
15
- let resolved = false;
16
- const handle = new Promise((resolve) => {
17
- resolveHandle = (a) => {
18
- if (resolved)
19
- return;
20
- else
21
- resolved = true;
22
- resolve(a);
23
- };
24
- });
25
- let resolvedEnd = false;
26
- const handleEnd = new Promise((resolve) => {
27
- resolveHandleEnd = (a) => {
28
- if (resolvedEnd)
29
- return;
30
- else
31
- resolvedEnd = true;
32
- if (childIteration === -1)
33
- childIteration = 0;
34
- for (; childIteration < endChildren.length; childIteration++) {
35
- // eslint-disable-next-line prefer-const
36
- let end;
37
- const start = {
38
- name: 'anonymous',
39
- time: performance.now(),
40
- skip: true,
41
- end: new Promise((resolve) => {
42
- resolve(end);
43
- }),
44
- children: []
45
- };
46
- end = performance.now();
47
- children[childIteration](start);
48
- }
49
- resolve(a);
50
- };
51
- });
52
- return {
53
- signal: handle,
54
- consumeChild(event) {
55
- switch (event.type) {
56
- case 'begin':
57
- const child = children[++childIteration];
58
- // Child may cause early return
59
- if (child)
60
- child({
61
- name: event.name,
62
- time: event.time,
4
+ const resolver = () => {
5
+ let resolve;
6
+ const promise = new Promise((r) => {
7
+ resolve = r;
8
+ });
9
+ return [promise, resolve];
10
+ };
11
+ const createSignal = () => {
12
+ const [start, resolveStart] = resolver();
13
+ const [end, resolveEnd] = resolver();
14
+ const children = [];
15
+ const resolvers = [];
16
+ return {
17
+ signal: start,
18
+ consume: (trace) => {
19
+ switch (trace.type) {
20
+ case 'begin':
21
+ if (trace.unit && children.length === 0)
22
+ for (let i = 0; i < trace.unit; i++) {
23
+ const [start, resolveStart] = resolver();
24
+ const [end, resolveEnd] = resolver();
25
+ children.push(start);
26
+ resolvers.push([
27
+ (trace) => {
28
+ resolveStart({
29
+ children: [],
30
+ end,
31
+ name: trace.name ?? '',
63
32
  skip: false,
64
- end: new Promise((resolve) => {
65
- endChildren.push(resolve);
66
- })
33
+ time: trace.time
67
34
  });
68
- else {
69
- this.resolve();
70
- console.log("SKIP");
35
+ },
36
+ (time) => {
37
+ resolveEnd(time);
71
38
  }
72
- break;
73
- case 'end':
74
- endChildren[childIteration]?.(event.time);
75
- break;
39
+ ]);
76
40
  }
77
- },
78
- consume(event) {
79
- switch (event.type) {
80
- case 'begin':
81
- const unitsProcess = [];
82
- const units = event.unit ?? 0;
83
- for (let i = 0; i < units; i++) {
84
- let resolveChild;
85
- unitsProcess.push(new Promise((resolve) => {
86
- resolveChild = resolve;
87
- }));
88
- children.push(resolveChild);
89
- }
90
- resolveHandle({
91
- // Begin always have name
92
- name: event.name,
93
- time: event.time,
94
- skip: false,
95
- end: handleEnd,
96
- children: unitsProcess
97
- });
98
- break;
99
- case 'end':
100
- resolveHandleEnd(event.time);
101
- break;
102
- }
103
- },
104
- resolve() {
105
- if (resolved && resolvedEnd)
106
- return;
107
- // eslint-disable-next-line prefer-const
108
- let end;
109
- const start = {
110
- name: 'anonymous',
111
- time: performance.now(),
112
- skip: true,
113
- end: new Promise((resolve) => {
114
- resolve(end);
115
- }),
116
- children: []
117
- };
118
- end = performance.now();
119
- resolveHandle(start);
120
- resolveHandleEnd(end);
121
- }
122
- };
123
- };
124
- const request = createSignal();
125
- const parse = createSignal();
126
- const transform = createSignal();
127
- const beforeHandle = createSignal();
128
- const handle = createSignal();
129
- const afterHandle = createSignal();
130
- const error = createSignal();
131
- const response = createSignal();
132
- request.consume(event);
133
- const reducer = (event) => {
134
- if (event.id === id)
135
- switch (event.event) {
136
- case 'request':
137
- request.consume(event);
138
- break;
139
- case 'request.unit':
140
- request.consumeChild(event);
141
- break;
142
- case 'parse':
143
- parse.consume(event);
144
- break;
145
- case 'parse.unit':
146
- parse.consumeChild(event);
147
- break;
148
- case 'transform':
149
- transform.consume(event);
150
- break;
151
- case 'transform.unit':
152
- transform.consumeChild(event);
153
- break;
154
- case 'beforeHandle':
155
- beforeHandle.consume(event);
156
- break;
157
- case 'beforeHandle.unit':
158
- beforeHandle.consumeChild(event);
159
- break;
160
- case 'handle':
161
- handle.consume(event);
162
- break;
163
- case 'afterHandle':
164
- afterHandle.consume(event);
165
- break;
166
- case 'afterHandle.unit':
167
- afterHandle.consumeChild(event);
168
- break;
169
- case 'error':
170
- error.consume(event);
171
- break;
172
- case 'error.unit':
173
- error.consumeChild(event);
174
- break;
175
- case 'response':
176
- if (event.type === 'begin') {
177
- request.resolve();
178
- parse.resolve();
179
- transform.resolve();
180
- beforeHandle.resolve();
181
- handle.resolve();
182
- afterHandle.resolve();
183
- error.resolve();
184
- }
185
- else
186
- reporter.off('event', reducer);
187
- response.consume(event);
188
- break;
189
- case 'response.unit':
190
- response.consumeChild(event);
191
- break;
192
- }
193
- };
194
- reporter.on('event', reducer);
195
- await handler({
196
- id: event.id,
197
- // @ts-ignore
198
- context: event.ctx,
199
- // @ts-ignore
200
- set: event.ctx?.set,
201
- // @ts-ignore
202
- store: event.ctx?.store,
203
- time: event.time,
204
- request: request.signal,
205
- parse: parse.signal,
206
- transform: transform.signal,
207
- beforeHandle: beforeHandle.signal,
208
- handle: handle.signal,
209
- afterHandle: afterHandle.signal,
210
- error: error.signal,
211
- response: response.signal
41
+ resolveStart({
42
+ children,
43
+ end,
44
+ name: trace.name ?? '',
45
+ skip: false,
46
+ time: trace.time
47
+ });
48
+ break;
49
+ case 'end':
50
+ resolveEnd(trace.time);
51
+ break;
52
+ }
53
+ },
54
+ consumeChild(trace) {
55
+ switch (trace.type) {
56
+ case 'begin':
57
+ if (!resolvers[0])
58
+ return;
59
+ const [resolveStart] = resolvers[0];
60
+ resolveStart({
61
+ children: [],
62
+ end,
63
+ name: trace.name ?? '',
64
+ skip: false,
65
+ time: trace.time
66
+ });
67
+ break;
68
+ case 'end':
69
+ const child = resolvers.shift();
70
+ if (!child)
71
+ return;
72
+ child[1](trace.time);
73
+ }
74
+ },
75
+ resolve() {
76
+ resolveStart({
77
+ children: [],
78
+ end: new Promise((resolve) => resolve(0)),
79
+ name: '',
80
+ skip: true,
81
+ time: 0
212
82
  });
213
- reporter.emit(`res${id}`, undefined);
83
+ for (const [resolveStart, resolveEnd] of resolvers) {
84
+ resolveStart({
85
+ children: [],
86
+ end: new Promise((resolve) => resolve(0)),
87
+ name: '',
88
+ skip: true,
89
+ time: 0
90
+ });
91
+ resolveEnd(0);
92
+ }
93
+ resolveEnd(0);
214
94
  }
215
95
  };
216
96
  };
97
+ const createTraceListener = (getReporter, totalListener, handler) => {
98
+ return async function trace(trace) {
99
+ if (trace.event !== 'request' || trace.type !== 'begin')
100
+ return;
101
+ const id = trace.id;
102
+ const reporter = getReporter();
103
+ const request = createSignal();
104
+ const parse = createSignal();
105
+ const transform = createSignal();
106
+ const beforeHandle = createSignal();
107
+ const handle = createSignal();
108
+ const afterHandle = createSignal();
109
+ const error = createSignal();
110
+ const response = createSignal();
111
+ request.consume(trace);
112
+ const reducer = (event) => {
113
+ if (event.id === id)
114
+ switch (event.event) {
115
+ case 'request':
116
+ request.consume(event);
117
+ break;
118
+ case 'request.unit':
119
+ request.consumeChild(event);
120
+ break;
121
+ case 'parse':
122
+ parse.consume(event);
123
+ break;
124
+ case 'parse.unit':
125
+ parse.consumeChild(event);
126
+ break;
127
+ case 'transform':
128
+ transform.consume(event);
129
+ break;
130
+ case 'transform.unit':
131
+ transform.consumeChild(event);
132
+ break;
133
+ case 'beforeHandle':
134
+ beforeHandle.consume(event);
135
+ break;
136
+ case 'beforeHandle.unit':
137
+ beforeHandle.consumeChild(event);
138
+ break;
139
+ case 'handle':
140
+ handle.consume(event);
141
+ break;
142
+ case 'afterHandle':
143
+ afterHandle.consume(event);
144
+ break;
145
+ case 'afterHandle.unit':
146
+ afterHandle.consumeChild(event);
147
+ break;
148
+ case 'error':
149
+ error.consume(event);
150
+ break;
151
+ case 'error.unit':
152
+ error.consumeChild(event);
153
+ break;
154
+ case 'response':
155
+ if (event.type === 'begin') {
156
+ request.resolve();
157
+ parse.resolve();
158
+ transform.resolve();
159
+ beforeHandle.resolve();
160
+ handle.resolve();
161
+ afterHandle.resolve();
162
+ error.resolve();
163
+ }
164
+ else
165
+ reporter.off('event', reducer);
166
+ response.consume(event);
167
+ break;
168
+ case 'response.unit':
169
+ response.consumeChild(event);
170
+ break;
171
+ case 'exit':
172
+ request.resolve();
173
+ parse.resolve();
174
+ transform.resolve();
175
+ beforeHandle.resolve();
176
+ handle.resolve();
177
+ afterHandle.resolve();
178
+ error.resolve();
179
+ break;
180
+ }
181
+ };
182
+ reporter.on('event', reducer);
183
+ await handler({
184
+ id,
185
+ // @ts-ignore
186
+ context: trace.ctx,
187
+ // @ts-ignore
188
+ set: trace.ctx?.set,
189
+ // @ts-ignore
190
+ store: trace.ctx?.store,
191
+ time: trace.time,
192
+ request: request.signal,
193
+ parse: parse.signal,
194
+ transform: transform.signal,
195
+ beforeHandle: beforeHandle.signal,
196
+ handle: handle.signal,
197
+ afterHandle: afterHandle.signal,
198
+ error: error.signal,
199
+ response: response.signal
200
+ });
201
+ reporter.emit(`res${id}.${totalListener}`, undefined);
202
+ };
203
+ };
217
204
  exports.createTraceListener = createTraceListener;
@@ -165,7 +165,7 @@ export type VoidHandler<Route extends RouteSchema = {}, Decorators extends Decor
165
165
  request: {};
166
166
  store: {};
167
167
  }> = (context: Prettify<Context<Route, Decorators>>) => MaybePromise<void>;
168
- export type TraceEvent = 'request' | 'parse' | 'transform' | 'beforeHandle' | 'afterHandle' | 'error' | 'response' extends infer Events extends string ? Events | `${Events}.unit` | 'handle' : never;
168
+ export type TraceEvent = 'request' | 'parse' | 'transform' | 'beforeHandle' | 'afterHandle' | 'error' | 'response' extends infer Events extends string ? Events | `${Events}.unit` | 'handle' | 'exit' : never;
169
169
  export type TraceStream = {
170
170
  id: number;
171
171
  event: TraceEvent;
@@ -175,7 +175,7 @@ export type TraceStream = {
175
175
  unit?: number;
176
176
  };
177
177
  export type TraceReporter = EventEmitter<{
178
- [res in `res${number}`]: undefined;
178
+ [res in `res${number}.${number}`]: undefined;
179
179
  } & {
180
180
  event(stream: TraceStream): MaybePromise<void>;
181
181
  }>;
package/dist/cjs/utils.js CHANGED
@@ -182,7 +182,11 @@ const mergeLifeCycle = (a, b, checksum) => {
182
182
  beforeHandle: (0, exports.mergeObjectArray)(a.beforeHandle, (b?.beforeHandle ?? []).map(injectChecksum)),
183
183
  afterHandle: (0, exports.mergeObjectArray)(a.afterHandle, (b?.afterHandle ?? []).map(injectChecksum)),
184
184
  onResponse: (0, exports.mergeObjectArray)(a.onResponse, (b?.onResponse ?? []).map(injectChecksum)),
185
- trace: (0, exports.mergeObjectArray)(a.trace, ('trace' in b ? b.trace ?? [] : []).map(injectChecksum)),
185
+ trace: a.trace,
186
+ // trace: mergeObjectArray(
187
+ // a.trace as any,
188
+ // ('trace' in b ? b.trace ?? [] : ([] as any)).map(injectChecksum)
189
+ // ),
186
190
  error: (0, exports.mergeObjectArray)(a.error, (b?.error ?? []).map(injectChecksum)),
187
191
  stop: (0, exports.mergeObjectArray)(a.stop, ('stop' in b ? b.stop ?? [] : []).map(injectChecksum))
188
192
  };
package/dist/compose.js CHANGED
@@ -1,6 +1,8 @@
1
1
  import{parse as e}from"fast-querystring";import{signCookie as t}from"./utils";import{mapEarlyResponse as r,mapResponse as s,mapCompactResponse as n,isNotEmpty as o}from"./handler";import{NotFoundError as a,ValidationError as i,InternalServerError as c,ERROR_CODE as l}from"./error";import{parseCookie as f}from"./cookie";let u=new Headers().toJSON,d=RegExp(" (\\w+) = context","g"),p={value:0},m=({hasTrace:e,hasTraceSet:t=!1,addFn:r,condition:s={}})=>(r(`
2
2
  const reporter = getReporter()
3
- `),e)?(e,{name:n,attribute:o="",unit:a=0}={})=>{let i=e.indexOf("."),c=-1===i;if("request"!==e&&"response"!==e&&!s[c?e:e.slice(0,i)])return()=>{t&&"afterHandle"===e&&r("\nawait traceDone\n")};c?n||=e:n||="anonymous",r("\n"+`reporter.emit('event', {
3
+ `),e)?(e,{name:n,attribute:o="",unit:a=0}={})=>{let i=e.indexOf("."),c=-1===i;if("request"!==e&&"response"!==e&&!s[c?e:e.slice(0,i)])return()=>{t&&"afterHandle"===e&&(r("reporter.emit('event',{id,event:'exit',type:'begin',time:0})"),r(`
4
+ await traceDone
5
+ `))};c?n||=e:n||="anonymous",r("\n"+`reporter.emit('event', {
4
6
  id,
5
7
  event: '${e}',
6
8
  type: 'begin',
@@ -13,7 +15,9 @@ const reporter = getReporter()
13
15
  event: '${e}',
14
16
  type: 'end',
15
17
  time: performance.now()
16
- })`.replace(/(\t| |\n)/g,"")+"\n"),t&&"afterHandle"===e&&r("\nawait traceDone\n"))}}:()=>()=>{};export const hasReturn=e=>{let t=e.indexOf(")");return(// Is direct arrow function return eg. () => 1
18
+ })`.replace(/(\t| |\n)/g,"")+"\n"),t&&"afterHandle"===e&&(r(`
19
+ reporter.emit('event',{id,event:'exit',type:'begin',time:0})
20
+ `),r("\nawait traceDone\n")))}}:()=>()=>{};export const hasReturn=e=>{let t=e.indexOf(")");return(// Is direct arrow function return eg. () => 1
17
21
  61===e.charCodeAt(t+2)&&123!==e.charCodeAt(t+5)||e.includes("return"))};let h=(e,{injectResponse:t=""}={})=>({composeValidation:(t,r=`c.${t}`)=>e?`c.set.status = 400; throw new ValidationError(
18
22
  '${t}',
19
23
  ${t},
@@ -57,7 +61,7 @@ if(t.match(RegExp(`${r}(.${e}|\\["${e}"\\])`)))return!0;let n=-1!==s?r.slice(s+3
57
61
  * ```
58
62
  */let b=e=>{if(!e)return;// @ts-ignore
59
63
  let t=e?.schema;if(t&&"anyOf"in t){let e=!1,r=t.anyOf[0].type;for(let s of t.anyOf)if(s.type!==r){e=!0;break}if(!e)return r}// @ts-ignore
60
- return e.schema?.type},k=/(?:return|=>) \S*\(/g;export const isAsync=e=>"AsyncFunction"===e.constructor.name||e.toString().match(k);export const composeHandler=({path:d,method:$,hooks:g,validator:k,handler:w,handleError:R,definitions:x,schema:q,onRequest:H,config:E,getReporter:v})=>{let O=E.forceErrorEncapsulation||g.error.length>0||"undefined"==typeof Bun||g.onResponse.length>0||!!g.trace.length,A=g.onResponse.length?`
64
+ return e.schema?.type},k=/(?:return|=>) \S*\(/g;export const isAsync=e=>"AsyncFunction"===e.constructor.name||e.toString().match(k);export const composeHandler=({path:d,method:$,hooks:g,validator:k,handler:w,handleError:x,definitions:R,schema:q,onRequest:H,config:v,getReporter:E})=>{let O=v.forceErrorEncapsulation||g.error.length>0||"undefined"==typeof Bun||g.onResponse.length>0||!!g.trace.length,A=g.onResponse.length?`
61
65
  ;(async () => {${g.onResponse.map((e,t)=>`await res${t}(c)`).join(";")}})();
62
66
  `:"",C=g.trace.map(e=>e.toString()),F=!1;if(y(w.toString())&&(F=!0),!F){for(let[e,t]of Object.entries(g))if(Array.isArray(t)&&t.length&&["parse","transform","beforeHandle","afterHandle","onResponse"].includes(e)){for(let e of t)if("function"==typeof e&&y(e.toString())){F=!0;break}if(F)break}}let j={parse:C.some(e=>isFnUse("parse",e)),transform:C.some(e=>isFnUse("transform",e)),handle:C.some(e=>isFnUse("handle",e)),beforeHandle:C.some(e=>isFnUse("beforeHandle",e)),afterHandle:C.some(e=>isFnUse("afterHandle",e)),error:O||C.some(e=>isFnUse("error",e))},T=g.trace.length>0,S="",U=k||"GET"!==$&&"HEAD"!==$?[w,...g.transform,...g.beforeHandle,...g.afterHandle].map(e=>e.toString()):[],D=F||"GET"!==$&&"HEAD"!==$&&"none"!==g.type&&(!!k.body||!!g.type||U.some(e=>isFnUse("body",e))),V=F||k.headers||U.some(e=>isFnUse("headers",e)),N=F||k.cookie||U.some(e=>isFnUse("cookie",e)),_=k?.cookie?.schema,I="";if(_?.sign){if(!_.secrets)throw Error(`t.Cookie required secret which is not set in (${$}) ${d}.`);let e=_.secrets?"string"==typeof _.secrets?_.secrets:_.secrets[0]:void 0;if(I+=`const _setCookie = c.set.cookie
63
67
  if(_setCookie) {`,!0===_.sign)// encodeCookie += `if(_setCookie['${name}']?.value) { c.set.cookie['${name}'].value = await signCookie(_setCookie['${name}'].value, '${secret}') }\n`
@@ -87,14 +91,17 @@ let r=_?.[e]??t;return r?"string"==typeof r?`${e}: '${r}',`:r instanceof Date?`$
87
91
  c.cookie = await parseCookie(c.set, c.headers.cookie, ${t})
88
92
  `:S+=`
89
93
  c.cookie = await parseCookie(c.set, c.request.headers.get('cookie'), ${t})
90
- `}let G=F||k.query||U.some(e=>isFnUse("query",e));G&&(S+=`const url = c.request.url
94
+ `}let P=F||k.query||U.some(e=>isFnUse("query",e));P&&(S+=`const url = c.request.url
91
95
 
92
96
  if(c.qi !== -1) {
93
97
  c.query ??= parseQuery(url.substring(c.qi + 1))
94
98
  } else {
95
99
  c.query ??= {}
96
100
  }
97
- `);let L=g.trace.map(e=>e.toString()),P=L.some(e=>isFnUse("set",e)||y(e));F||g.trace.some(e=>isFnUse("set",e.toString()));let Q=P||N||U.some(e=>isFnUse("set",e))||H.some(e=>isFnUse("set",e.toString()));T&&(S+="\nconst id = c.$$requestId\n");let K=m({hasTrace:T,hasTraceSet:P,condition:j,addFn:e=>{S+=e}});S+=O?"try {\n":"",T&&(S+="\nconst traceDone = new Promise(r => { reporter.once(`res${id}`, r) })\n");let J=N||D||P||isAsync(w)||g.parse.length>0||g.afterHandle.some(isAsync)||g.beforeHandle.some(isAsync)||g.transform.some(isAsync),z=K("parse",{unit:g.parse.length});if(D){let e=b(k?.body);if(g.type&&!Array.isArray(g.type)){if(g.type)switch(g.type){case"json":case"application/json":S+=`c.body = await c.request.json()
101
+ `);let G=g.trace.map(e=>e.toString()),L=G.some(e=>isFnUse("set",e)||y(e));F||g.trace.some(e=>isFnUse("set",e.toString()));let Q=L||N||U.some(e=>isFnUse("set",e))||H.some(e=>isFnUse("set",e.toString()));T&&(S+="\nconst id = c.$$requestId\n");let K=m({hasTrace:T,hasTraceSet:L,condition:j,addFn:e=>{S+=e}});if(S+=O?"try {\n":"",T){// fnLiteral += `\nconst traceDone = new Promise(r => r())\n`
102
+ S+=`
103
+ const traceDone = Promise.all([`;for(let e=0;e<g.trace.length;e++)S+=`new Promise(r => { reporter.once(\`res\${id}.${e}\`, r) }),`;S+=`])
104
+ `}let J=N||D||L||isAsync(w)||g.parse.length>0||g.afterHandle.some(isAsync)||g.beforeHandle.some(isAsync)||g.transform.some(isAsync),z=K("parse",{unit:g.parse.length});if(D){let e=b(k?.body);if(g.type&&!Array.isArray(g.type)){if(g.type)switch(g.type){case"json":case"application/json":S+=`c.body = await c.request.json()
98
105
  `;break;case"text":case"text/plain":S+=`c.body = await c.request.text()
99
106
  `;break;case"urlencoded":case"application/x-www-form-urlencoded":S+=`c.body = parseQuery(await c.request.text())
100
107
  `;break;case"arrayBuffer":case"application/octet-stream":S+=`c.body = await c.request.arrayBuffer()
@@ -212,9 +219,8 @@ c.cookie = params.Decode(c.cookie)
212
219
  `:S+=isAsync(g.afterHandle[e])?`let ${r} = mapEarlyResponse(await afterHandle[${e}](c), c.set)
213
220
  `:`let ${r} = mapEarlyResponse(afterHandle[${e}](c), c.set)
214
221
  `,n(),k.response?(S+=`if(${r} !== undefined) {`+W(r)+`${r} = mapEarlyResponse(${r}, c.set)
215
- `+`if(${r}) {`,t(),P&&(S+=`${r} = mapEarlyResponse(${r}, c.set)
216
- `),S+=`return ${r} } }`):(S+=`if(${r}) {`,t(),P&&(S+=`${r} = mapEarlyResponse(${r}, c.set)
217
- `),S+=`return ${r}}
222
+ `+`if(${r}) {`,t(),L&&(S+=`${r} = mapEarlyResponse(${r}, c.set)
223
+ `),S+=`return ${r} } }`):(S+=`if(${r}) {`,t(),S+=`return ${r}}
218
224
  `)):(S+=isAsync(g.afterHandle[e])?`await afterHandle[${e}](c)
219
225
  `:`afterHandle[${e}](c)
220
226
  `,n())}t(),S+=`r = c.response
@@ -246,8 +252,7 @@ let ${t} = handleErrors[${e}](
246
252
  if (${t}) {return ${t} }
247
253
  `}if(e(),S+=`return handleError(c, error)
248
254
 
249
- `,J||(S+="})()"),S+="}",A||T){S+=" finally { ";let e=K("response",{unit:g.onResponse.length});S+=A,e(),S+="}"}}// console.log(fnLiteral)
250
- S=`const {
255
+ `,J||(S+="})()"),S+="}",A||T){S+=" finally { ";let e=K("response",{unit:g.onResponse.length});S+=A,e(),S+="}"}}S=`const {
251
256
  handler,
252
257
  handleError,
253
258
  hooks: {
@@ -289,9 +294,9 @@ S=`const {
289
294
  ${g.onResponse.length?`const ${g.onResponse.map((e,t)=>`res${t} = onResponse[${t}]`).join(",")}`:""}
290
295
 
291
296
  return ${J?"async":""} function(c) {
292
- ${q&&x?"c.schema = schema; c.defs = definitions;":""}
297
+ ${q&&R?"c.schema = schema; c.defs = definitions;":""}
293
298
  ${S}
294
- }`;let M=Function("hooks",S);return M({handler:w,hooks:g,validator:k,handleError:R,utils:{mapResponse:s,mapCompactResponse:n,mapEarlyResponse:r,parseQuery:e},error:{NotFoundError:a,ValidationError:i,InternalServerError:c},schema:q,definitions:x,ERROR_CODE:l,getReporter:v,requestId:p,parseCookie:f,signCookie:t})};export const composeGeneralHandler=e=>{let t="",s="";// @ts-ignore
299
+ }`;let M=Function("hooks",S);return M({handler:w,hooks:g,validator:k,handleError:x,utils:{mapResponse:s,mapCompactResponse:n,mapEarlyResponse:r,parseQuery:e},error:{NotFoundError:a,ValidationError:i,InternalServerError:c},schema:q,definitions:R,ERROR_CODE:l,getReporter:E,requestId:p,parseCookie:f,signCookie:t})};export const composeGeneralHandler=e=>{let t="",s="";// @ts-ignore
295
300
  for(let r of Object.keys(e.decorators))t+=`,${r}: app.decorators.${r}`;// @ts-ignore
296
301
  let{router:n,staticRouter:o}=e,i=e.event.trace.length>0,c=`
297
302
  const route = find(request.method, path) ${n.root.ALL?'?? find("ALL", path)':""}
package/dist/index.d.ts CHANGED
@@ -980,5 +980,5 @@ export { Cookie, type CookieOptions } from './cookie';
980
980
  export { getSchemaValidator, mergeDeep, mergeHook, mergeObjectArray, getResponseSchemaValidator } from './utils';
981
981
  export { ParseError, NotFoundError, ValidationError, InternalServerError, InvalidCookieSignature } from './error';
982
982
  export type { Context, PreContext } from './context';
983
- export type { ElysiaConfig, DecoratorBase, DefinitionBase, RouteBase, Handler, ComposedHandler, InputSchema, LocalHook, MergeSchema, RouteSchema, UnwrapRoute, InternalRoute, HTTPMethod, SchemaValidator, VoidHandler, PreHandler, BodyHandler, OptionalHandler, ErrorHandler, AfterHandler, TraceHandler, TraceStream, LifeCycleEvent, TraceEvent, LifeCycleStore, MaybePromise, ListenCallback, UnwrapSchema } from './types';
983
+ export type { ElysiaConfig, DecoratorBase, DefinitionBase, RouteBase, Handler, ComposedHandler, InputSchema, LocalHook, MergeSchema, RouteSchema, UnwrapRoute, InternalRoute, HTTPMethod, SchemaValidator, VoidHandler, PreHandler, BodyHandler, OptionalHandler, ErrorHandler, AfterHandler, LifeCycleEvent, TraceEvent, LifeCycleStore, MaybePromise, ListenCallback, UnwrapSchema, TraceHandler, TraceProcess, TraceReporter, TraceStream } from './types';
984
984
  export type { Static } from '@sinclair/typebox';
package/dist/index.js CHANGED
@@ -139,7 +139,7 @@ ${this.staticRouter.map[v].code}`)}else this.router.add(e,h,y),this.config.stric
139
139
  * return JSON.stringify(response)
140
140
  * })
141
141
  * ```
142
- */trace(e){return this.reporter.on("event",r(()=>this.reporter,e)),this.on("trace",e),this}addError(// eslint-disable-next-line @typescript-eslint/no-unused-vars
142
+ */trace(e){return this.reporter.on("event",r(()=>this.reporter,this.event.trace.length,e)),this.on("trace",e),this}addError(// eslint-disable-next-line @typescript-eslint/no-unused-vars
143
143
  e,// eslint-disable-next-line @typescript-eslint/no-unused-vars
144
144
  t){return this.error(e,t)}error(// eslint-disable-next-line @typescript-eslint/no-unused-vars
145
145
  e,// eslint-disable-next-line @typescript-eslint/no-unused-vars
package/dist/trace.d.ts CHANGED
@@ -1,2 +1,2 @@
1
1
  import type { TraceHandler, TraceReporter, TraceStream } from './types';
2
- export declare const createTraceListener: (getReporter: () => TraceReporter, handler: TraceHandler<any, any>) => (event: TraceStream) => Promise<void>;
2
+ export declare const createTraceListener: (getReporter: () => TraceReporter, totalListener: number, handler: TraceHandler<any, any>) => (trace: TraceStream) => Promise<void>;