@@ -1158,125 +1158,73 @@ describe("tracing channels for H3Core instances", () => {
11581158 } ) ;
11591159} ) ;
11601160
1161- describe ( "wrapFindRouteWithTracing " , ( ) => {
1162- it ( "wraps route handlers returned by findRoute " , async ( ) => {
1161+ describe ( "wrapHandlerWithTracing " , ( ) => {
1162+ it ( "wraps a handler so route traces are emitted " , async ( ) => {
11631163 const listener = createTracingListener ( ) ;
11641164 const { H3Core } = await import ( "../src/h3.ts" ) ;
1165- const { wrapFindRouteWithTracing } = await import ( "../src/tracing.ts" ) ;
1165+ const { wrapHandlerWithTracing } = await import ( "../src/tracing.ts" ) ;
11661166 const { H3Event } = await import ( "../src/event.ts" ) ;
11671167
11681168 try {
11691169 const app = new H3Core ( ) ;
1170- const routeHandler = ( ) => "file-based response" ;
1170+ const routeHandler = wrapHandlerWithTracing ( ( ) => "traced response" ) ;
11711171
1172- const baseFindRoute = ( event : any ) => {
1173- if ( event . url . pathname === "/file-route" && event . req . method === "GET" ) {
1174- return {
1175- data : { method : "GET" , route : "/file-route" , handler : routeHandler } ,
1176- params : { } ,
1177- } ;
1172+ app [ "~findRoute" ] = ( event : any ) => {
1173+ if ( event . url . pathname === "/test" && event . req . method === "GET" ) {
1174+ return { data : { method : "GET" , route : "/test" , handler : routeHandler } , params : { } } ;
11781175 }
11791176 return undefined ;
11801177 } ;
11811178
1182- app [ "~findRoute" ] = wrapFindRouteWithTracing ( baseFindRoute as any ) ;
1183-
1184- const request = new Request ( "http://localhost/file-route" , { method : "GET" } ) ;
1179+ const request = new Request ( "http://localhost/test" , { method : "GET" } ) ;
11851180 const event = new H3Event ( request , undefined , app as any ) ;
11861181
11871182 await app . handler ( event ) ;
11881183 await new Promise ( ( resolve ) => setTimeout ( resolve , 10 ) ) ;
11891184
11901185 const routeEvents = listener . events . filter ( ( e ) => e . asyncStart ?. data . type === "route" ) ;
1191- expect ( routeEvents . some ( ( e ) => e . asyncStart ?. data . event . url . pathname === "/file-route" ) ) . toBe (
1192- true ,
1193- ) ;
1186+ expect ( routeEvents . some ( ( e ) => e . asyncStart ?. data . event . url . pathname === "/test" ) ) . toBe ( true ) ;
11941187 } finally {
11951188 listener . cleanup ( ) ;
11961189 }
11971190 } ) ;
11981191
1199- it ( "does not double-wrap handlers across repeated calls" , async ( ) => {
1200- const listener = createTracingListener ( ) ;
1201- const { H3Core } = await import ( "../src/h3.ts" ) ;
1202- const { wrapFindRouteWithTracing } = await import ( "../src/tracing.ts" ) ;
1203- const { H3Event } = await import ( "../src/event.ts" ) ;
1204-
1205- try {
1206- const app = new H3Core ( ) ;
1207- const routeHandler = ( ) => "ok" ;
1208-
1209- const cachedRoute = {
1210- data : { method : "GET" as const , route : "/cached" , handler : routeHandler } ,
1211- params : { } ,
1212- } ;
1213-
1214- app [ "~findRoute" ] = wrapFindRouteWithTracing ( ( ( ) => cachedRoute ) as any ) ;
1215-
1216- const run = async ( ) => {
1217- const request = new Request ( "http://localhost/cached" , { method : "GET" } ) ;
1218- const event = new H3Event ( request , undefined , app as any ) ;
1219- await app . handler ( event ) ;
1220- } ;
1221-
1222- await run ( ) ;
1223- const wrappedHandler = cachedRoute . data . handler ;
1224- expect ( ( wrappedHandler as any ) . __traced__ ) . toBe ( true ) ;
1225-
1226- await run ( ) ;
1227- await run ( ) ;
1192+ it ( "is idempotent — wrapping twice returns the same wrapper" , async ( ) => {
1193+ const { wrapHandlerWithTracing } = await import ( "../src/tracing.ts" ) ;
12281194
1229- expect ( cachedRoute . data . handler ) . toBe ( wrappedHandler ) ;
1195+ const handler = ( ) => "ok" ;
1196+ const wrapped = wrapHandlerWithTracing ( handler ) ;
1197+ const doubleWrapped = wrapHandlerWithTracing ( wrapped ) ;
12301198
1231- await new Promise ( ( resolve ) => setTimeout ( resolve , 10 ) ) ;
1232-
1233- const routeAsyncStarts = listener . events . filter ( ( e ) => e . asyncStart ?. data . type === "route" ) ;
1234- expect ( routeAsyncStarts . length ) . toBe ( 3 ) ;
1235- } finally {
1236- listener . cleanup ( ) ;
1237- }
1199+ expect ( doubleWrapped ) . toBe ( wrapped ) ;
1200+ expect ( ( wrapped as any ) . __traced__ ) . toBe ( true ) ;
12381201 } ) ;
12391202
1240- it ( "mutates cached route.data.middleware in place without reallocating " , async ( ) => {
1203+ it ( "emits exactly one trace per request on a pre-wrapped handler " , async ( ) => {
12411204 const listener = createTracingListener ( ) ;
12421205 const { H3Core } = await import ( "../src/h3.ts" ) ;
1243- const { wrapFindRouteWithTracing } = await import ( "../src/tracing.ts" ) ;
1206+ const { wrapHandlerWithTracing } = await import ( "../src/tracing.ts" ) ;
12441207 const { H3Event } = await import ( "../src/event.ts" ) ;
12451208
12461209 try {
12471210 const app = new H3Core ( ) ;
1248- const mw = ( event : any ) => {
1249- event . context . mw = true ;
1250- } ;
1251- const cachedRoute = {
1252- data : {
1253- method : "GET" as const ,
1254- route : "/cached" ,
1255- handler : ( ) => "ok" ,
1256- middleware : [ mw ] ,
1257- } ,
1258- params : { } ,
1259- } ;
1211+ const routeHandler = wrapHandlerWithTracing ( ( ) => "ok" ) ;
12601212
1261- app [ "~findRoute" ] = wrapFindRouteWithTracing ( ( ( ) => cachedRoute ) as any ) ;
1213+ app [ "~findRoute" ] = ( ) => ( {
1214+ data : { method : "GET" as const , route : "/test" , handler : routeHandler } ,
1215+ params : { } ,
1216+ } ) ;
12621217
12631218 const run = async ( ) => {
1264- const request = new Request ( "http://localhost/cached " , { method : "GET" } ) ;
1219+ const request = new Request ( "http://localhost/test " , { method : "GET" } ) ;
12651220 const event = new H3Event ( request , undefined , app as any ) ;
12661221 await app . handler ( event ) ;
12671222 } ;
12681223
12691224 await run ( ) ;
1270- const middlewareArray = cachedRoute . data . middleware ;
1271- const wrappedMw = middlewareArray [ 0 ] ;
1272- expect ( ( wrappedMw as any ) . __traced__ ) . toBe ( true ) ;
1273-
12741225 await run ( ) ;
12751226 await run ( ) ;
12761227
1277- expect ( cachedRoute . data . middleware ) . toBe ( middlewareArray ) ;
1278- expect ( cachedRoute . data . middleware [ 0 ] ) . toBe ( wrappedMw ) ;
1279-
12801228 await new Promise ( ( resolve ) => setTimeout ( resolve , 10 ) ) ;
12811229
12821230 const routeAsyncStarts = listener . events . filter ( ( e ) => e . asyncStart ?. data . type === "route" ) ;
0 commit comments