@@ -146,8 +146,8 @@ export async function createRender({
146
146
forMatchpathname ,
147
147
matchEntryName ,
148
148
) ;
149
- const framework = metaName || 'modern-js' ;
150
- const fallbackHeader = `x-${ cutNameByHyphen ( framework ) } -ssr-fallback` ;
149
+ const framework = cutNameByHyphen ( metaName || 'modern-js' ) ;
150
+ const fallbackHeader = `x-${ framework } -ssr-fallback` ;
151
151
let fallbackReason = null ;
152
152
153
153
const fallbackWrapper : FallbackWrapper = async ( reason , error ?) => {
@@ -227,13 +227,27 @@ export async function createRender({
227
227
onTiming,
228
228
} ;
229
229
230
+ if ( fallbackReason ) {
231
+ renderOptions . html = injectFallbackReasonToHtml ( {
232
+ html : renderOptions . html ,
233
+ reason : fallbackReason ,
234
+ framework,
235
+ } ) ;
236
+ }
237
+
230
238
let response : Response ;
231
239
232
240
switch ( renderMode ) {
233
241
case 'data' :
234
242
response =
235
243
( await dataHandler ( req , renderOptions ) ) ||
236
- ( await renderHandler ( req , renderOptions , 'ssr' , fallbackWrapper ) ) ;
244
+ ( await renderHandler (
245
+ req ,
246
+ renderOptions ,
247
+ 'ssr' ,
248
+ fallbackWrapper ,
249
+ framework ,
250
+ ) ) ;
237
251
break ;
238
252
case 'rsc-tree' :
239
253
response = await renderRscHandler ( req , renderOptions ) ;
@@ -248,6 +262,7 @@ export async function createRender({
248
262
renderOptions ,
249
263
renderMode ,
250
264
fallbackWrapper ,
265
+ framework ,
251
266
) ;
252
267
break ;
253
268
default :
@@ -266,6 +281,7 @@ async function renderHandler(
266
281
options : SSRRenderOptions ,
267
282
mode : 'ssr' | 'csr' ,
268
283
fallbackWrapper : FallbackWrapper ,
284
+ framework : string ,
269
285
) {
270
286
let response : Response | null = null ;
271
287
@@ -318,7 +334,14 @@ async function renderHandler(
318
334
} catch ( e ) {
319
335
options . onError ( e as Error , ErrorDigest . ERENDER ) ;
320
336
await fallbackWrapper ( 'error' , e ) ;
321
- response = csrRender ( options . html ) ;
337
+
338
+ response = csrRender (
339
+ injectFallbackReasonToHtml ( {
340
+ html : options . html ,
341
+ reason : 'error' ,
342
+ framework,
343
+ } ) ,
344
+ ) ;
322
345
}
323
346
} else {
324
347
response = csrRender ( options . html ) ;
@@ -374,6 +397,19 @@ async function getRenderMode(
374
397
}
375
398
}
376
399
400
+ function injectFallbackReasonToHtml ( {
401
+ html,
402
+ reason,
403
+ framework,
404
+ } : {
405
+ html : string ;
406
+ reason : FallbackReason ;
407
+ framework : string ;
408
+ } ) {
409
+ const tag = `<script id="__${ framework } _ssr_fallback_reason__" type="application/json">${ JSON . stringify ( { reason } ) } </script>` ;
410
+ return html . replace ( / < \/ h e a d > / , `${ tag } </head>` ) ;
411
+ }
412
+
377
413
function csrRender ( html : string ) : Response {
378
414
return new Response ( html , {
379
415
status : 200 ,
0 commit comments