@@ -70,12 +70,20 @@ type ServeAsset<AssetEntry> = (
7070 options ?: { preserve : boolean }
7171) => Promise < Response > ;
7272
73+ type CacheStatus = "hit" | "miss" ;
74+ type CacheResult < A extends string > = `${A } -${CacheStatus } `;
75+ export type HandlerMetrics = {
76+ preservationCacheResult ?: CacheResult < "checked" > | "disabled" ;
77+ earlyHintsResult ?: CacheResult < "used" | "notused" > | "disabled" ;
78+ } ;
79+
7380type FullHandlerContext < AssetEntry , ContentNegotiation , Asset > = {
7481 request : Request ;
7582 metadata : Metadata ;
7683 xServerEnvHeader ?: string ;
7784 xDeploymentIdHeader ?: boolean ;
7885 logError : ( err : Error ) => void ;
86+ setMetrics ?: ( metrics : HandlerMetrics ) => void ;
7987 findAssetEntryForPath : FindAssetEntryForPath < AssetEntry > ;
8088 getAssetKey ( assetEntry : AssetEntry , content : ContentNegotiation ) : string ;
8189 negotiateContent (
@@ -123,6 +131,7 @@ export async function generateHandler<
123131 xServerEnvHeader,
124132 xDeploymentIdHeader,
125133 logError,
134+ setMetrics,
126135 findAssetEntryForPath,
127136 getAssetKey,
128137 negotiateContent,
@@ -332,7 +341,12 @@ export async function generateHandler<
332341 const earlyHintsLinkHeader = earlyHintsResponse . headers . get ( "Link" ) ;
333342 if ( earlyHintsLinkHeader ) {
334343 headers . set ( "Link" , earlyHintsLinkHeader ) ;
344+ if ( setMetrics ) setMetrics ( { earlyHintsResult : "used-hit" } ) ;
345+ } else {
346+ if ( setMetrics ) setMetrics ( { earlyHintsResult : "notused-hit" } ) ;
335347 }
348+ } else {
349+ if ( setMetrics ) setMetrics ( { earlyHintsResult : "notused-miss" } ) ;
336350 }
337351
338352 const clonedResponse = response . clone ( ) ;
@@ -393,6 +407,8 @@ export async function generateHandler<
393407 } ) ( )
394408 ) ;
395409 }
410+ } else {
411+ if ( setMetrics ) setMetrics ( { earlyHintsResult : "disabled" } ) ;
396412 }
397413
398414 // Iterate through rules and find rules that match the path
@@ -566,8 +582,13 @@ export async function generateHandler<
566582 ) ;
567583 const preservedResponse = await assetPreservationCache . match ( request . url ) ;
568584 if ( preservedResponse ) {
585+ if ( setMetrics ) setMetrics ( { preservationCacheResult : "checked-hit" } ) ;
569586 return preservedResponse ;
587+ } else {
588+ if ( setMetrics ) setMetrics ( { preservationCacheResult : "checked-miss" } ) ;
570589 }
590+ } else {
591+ if ( setMetrics ) setMetrics ( { preservationCacheResult : "disabled" } ) ;
571592 }
572593
573594 // Traverse upwards from the current path looking for a custom 404 page
0 commit comments