@@ -2716,11 +2716,12 @@ async function prerenderToStream(
2716
2716
ctx ,
2717
2717
res . statusCode === 404
2718
2718
)
2719
+ let prerenderIsPending = true
2719
2720
const reactServerResult = ( reactServerPrerenderResult =
2720
2721
await createReactServerPrerenderResult (
2721
2722
prerenderAndAbortInSequentialTasks (
2722
- ( ) =>
2723
- workUnitAsyncStorage . run (
2723
+ async ( ) => {
2724
+ const prerenderResult = await workUnitAsyncStorage . run (
2724
2725
// The store to scope
2725
2726
finalRenderPrerenderStore ,
2726
2727
// The function to run
@@ -2730,17 +2731,36 @@ async function prerenderToStream(
2730
2731
clientReferenceManifest . clientModules ,
2731
2732
{
2732
2733
onError : ( err : unknown ) => {
2734
+ // TODO we can remove this once https://github.com/facebook/react/pull/31715 lands
2735
+ // because we won't have onError calls when halting the prerender
2733
2736
if ( finalServerController . signal . aborted ) {
2734
- serverIsDynamic = true
2735
2737
return
2736
2738
}
2737
2739
2738
2740
return serverComponentsErrorHandler ( err )
2739
2741
} ,
2740
2742
signal : finalServerController . signal ,
2741
2743
}
2742
- ) ,
2744
+ )
2745
+ prerenderIsPending = false
2746
+ return prerenderResult
2747
+ } ,
2743
2748
( ) => {
2749
+ if (
2750
+ finalServerController . signal . aborted ||
2751
+ prerenderIsPending
2752
+ ) {
2753
+ // If the server controller is already aborted we must have called something
2754
+ // that required aborting the prerender synchronously such as with new Date()
2755
+ serverIsDynamic = true
2756
+ return
2757
+ }
2758
+
2759
+ if ( prerenderIsPending ) {
2760
+ // If prerenderIsPending then we have blocked for longer than a Task and we assume
2761
+ // there is something unfinished.
2762
+ serverIsDynamic = true
2763
+ }
2744
2764
finalServerController . abort ( )
2745
2765
}
2746
2766
)
0 commit comments