@@ -12,6 +12,7 @@ import type {
1212 RoutingResult ,
1313} from "types/open-next" ;
1414
15+ import type { AssetResolver } from "types/overrides" ;
1516import { debug , error } from "../adapters/logger" ;
1617import { cacheInterceptor } from "./routing/cacheInterceptor" ;
1718import { detectLocale } from "./routing/i18n" ;
@@ -64,6 +65,7 @@ function applyMiddlewareHeaders(
6465
6566export default async function routingHandler (
6667 event : InternalEvent ,
68+ { assetResolver } : { assetResolver ?: AssetResolver } = { } ,
6769) : Promise < InternalResult | RoutingResult > {
6870 try {
6971 // Add Next geo headers
@@ -89,11 +91,13 @@ export default async function routingHandler(
8991
9092 const nextHeaders = getNextConfigHeaders ( event , ConfigHeaders ) ;
9193
92- let internalEvent = fixDataPage ( event , BuildId ) ;
93- if ( "statusCode" in internalEvent ) {
94- return internalEvent ;
94+ const internalEventOrResult = fixDataPage ( event , BuildId ) ;
95+ if ( "statusCode" in internalEventOrResult ) {
96+ return internalEventOrResult ;
9597 }
9698
99+ let internalEvent : InternalEvent | InternalResult = internalEventOrResult ;
100+
97101 const redirect = handleRedirects ( internalEvent , RoutesManifest . redirects ) ;
98102 if ( redirect ) {
99103 // We need to encode the value in the Location header to make sure it is valid according to RFC
@@ -105,21 +109,20 @@ export default async function routingHandler(
105109 return redirect ;
106110 }
107111
108- const eventOrResult = await handleMiddleware (
112+ const middlewareEventOrResult = await handleMiddleware (
109113 internalEvent ,
110114 // We need to pass the initial search without any decoding
111115 // TODO: we'd need to refactor InternalEvent to include the initial querystring directly
112116 // Should be done in another PR because it is a breaking change
113117 new URL ( event . url ) . search ,
114118 ) ;
115- const isResult = "statusCode" in eventOrResult ;
116- if ( isResult ) {
117- return eventOrResult ;
119+ if ( "statusCode" in middlewareEventOrResult ) {
120+ return middlewareEventOrResult ;
118121 }
119- const middlewareResponseHeaders = eventOrResult . responseHeaders ;
120- let isExternalRewrite = eventOrResult . isExternalRewrite ?? false ;
121- // internalEvent is `InternalEvent | MiddlewareEvent`
122- internalEvent = eventOrResult ;
122+
123+ const middlewareResponseHeaders = middlewareEventOrResult . responseHeaders ;
124+ let isExternalRewrite = middlewareEventOrResult . isExternalRewrite ?? false ;
125+ internalEvent = middlewareEventOrResult ;
123126
124127 if ( ! isExternalRewrite ) {
125128 // First rewrite to be applied
@@ -184,7 +187,22 @@ export default async function routingHandler(
184187 dynamicRouteMatcher ( internalEvent . rawPath ) . length > 0
185188 )
186189 ) {
187- internalEvent = {
190+ const assetEventOrResult =
191+ await assetResolver ?. onRouteNotFound ( internalEvent ) ;
192+
193+ if ( assetEventOrResult && "statusCode" in assetEventOrResult ) {
194+ applyMiddlewareHeaders (
195+ assetEventOrResult . headers ,
196+ {
197+ ...middlewareResponseHeaders ,
198+ ...nextHeaders ,
199+ } ,
200+ false ,
201+ ) ;
202+ return assetEventOrResult ;
203+ }
204+
205+ internalEvent = assetEventOrResult ?? {
188206 ...internalEvent ,
189207 rawPath : "/404" ,
190208 url : constructNextUrl ( internalEvent . url , "/404" ) ,
0 commit comments