@@ -367,6 +367,7 @@ type Response = {
367367_debugRootStack ?: null | Error , // DEV-only
368368_debugRootTask ?: null | ConsoleTask , // DEV-only
369369_debugStartTime : number , // DEV-only
370+ _debugEndTime ?: number , // DEV-only
370371_debugIOStarted : boolean , // DEV-only
371372_debugFindSourceMapURL ?: void | FindSourceMapURLCallback , // DEV-only
372373_debugChannel ?: void | DebugChannel , // DEV-only
@@ -500,6 +501,34 @@ function createErrorChunk<T>(
500501return new ReactPromise ( ERRORED , null , error ) ;
501502}
502503
504+ function filterDebugInfo(
505+ response: Response,
506+ value: { _debugInfo : ReactDebugInfo , ...} ,
507+ ) {
508+ if ( response . _debugEndTime === null ) {
509+ // No end time was defined, so we keep all debug info entries.
510+ return ;
511+ }
512+
513+ // Remove any debug info entries that arrived after the defined end time.
514+ const relativeEndTime =
515+ response._debugEndTime -
516+ // $FlowFixMe[prop-missing]
517+ performance.timeOrigin;
518+ const debugInfo = [];
519+ for (let i = 0; i < value . _debugInfo . length ; i ++ ) {
520+ const info = value . _debugInfo [ i ] ;
521+ if ( typeof info . time === 'number' && info . time > relativeEndTime ) {
522+ break ;
523+ }
524+ if ( info . awaited != null && info . awaited . end > relativeEndTime) {
525+ break ;
526+ }
527+ debugInfo.push(info);
528+ }
529+ value . _debugInfo = debugInfo ;
530+ }
531+
503532function moveDebugInfoFromChunkToInnerValue < T > (
504533 chunk: InitializedChunk< T > | InitializedStreamChunk< any > ,
505534 value: T,
@@ -534,7 +563,17 @@ function moveDebugInfoFromChunkToInnerValue<T>(
534563}
535564}
536565
566+ function processChunkDebugInfo < T > (
567+ response: Response,
568+ chunk: InitializedChunk< T > | InitializedStreamChunk< any > ,
569+ value: T,
570+ ): void {
571+ filterDebugInfo ( response , chunk ) ;
572+ moveDebugInfoFromChunkToInnerValue ( chunk , value ) ;
573+ }
574+
537575function wakeChunk< T > (
576+ response: Response,
538577 listeners: Array< InitializationReference | ( T = > mixed)> ,
539578value : T ,
540579chunk : InitializedChunk < T > ,
@@ -544,16 +583,17 @@ function wakeChunk<T>(
544583if ( typeof listener === 'function' ) {
545584listener ( value ) ;
546585} else {
547- fulfillReference ( listener , value , chunk ) ;
586+ fulfillReference ( response , listener , value , chunk ) ;
548587}
549588}
550589
551590if ( __DEV__ ) {
552- moveDebugInfoFromChunkToInnerValue ( chunk , value ) ;
591+ processChunkDebugInfo ( response , chunk , value ) ;
553592}
554593}
555594
556595function rejectChunk(
596+ response: Response,
557597 listeners: Array< InitializationReference | ( mixed = > mixed)> ,
558598error : mixed ,
559599) : void {
@@ -562,7 +602,7 @@ function rejectChunk(
562602if ( typeof listener === 'function' ) {
563603listener ( error ) ;
564604} else {
565- rejectReference ( listener , error ) ;
605+ rejectReference ( response , listener . handler , error ) ;
566606}
567607}
568608}
@@ -595,13 +635,14 @@ function resolveBlockedCycle<T>(
595635}
596636
597637function wakeChunkIfInitialized< T > (
638+ response: Response,
598639 chunk: SomeChunk< T > ,
599640 resolveListeners: Array< InitializationReference | ( T = > mixed)> ,
600641rejectListeners : null | Array < InitializationReference | ( mixed = > mixed)> ,
601642) : void {
602643switch ( chunk . status ) {
603644case INITIALIZED :
604- wakeChunk ( resolveListeners , chunk . value , chunk ) ;
645+ wakeChunk ( response , resolveListeners , chunk . value , chunk ) ;
605646break ;
606647case BLOCKED :
607648// It is possible that we're blocked on our own chunk if it's a cycle.
@@ -615,7 +656,7 @@ function wakeChunkIfInitialized<T>(
615656if ( cyclicHandler !== null ) {
616657// This reference points back to this chunk. We can resolve the cycle by
617658// using the value from that handler.
618- fulfillReference ( reference , cyclicHandler . value , chunk ) ;
659+ fulfillReference ( response , reference , cyclicHandler . value , chunk ) ;
619660resolveListeners . splice ( i , 1 ) ;
620661i -- ;
621662if ( rejectListeners !== null ) {
@@ -629,14 +670,15 @@ function wakeChunkIfInitialized<T>(
629670case INITIALIZED :
630671const initializedChunk : InitializedChunk < T > = ( chunk : any ) ;
631672wakeChunk (
673+ response ,
632674resolveListeners ,
633675initializedChunk . value ,
634676initializedChunk ,
635677) ;
636678return ;
637679case ERRORED :
638680if ( rejectListeners !== null ) {
639- rejectChunk ( rejectListeners , chunk . reason ) ;
681+ rejectChunk ( response , rejectListeners , chunk . reason ) ;
640682}
641683return ;
642684}
@@ -666,7 +708,7 @@ function wakeChunkIfInitialized<T>(
666708break ;
667709case ERRORED :
668710if ( rejectListeners ) {
669- rejectChunk ( rejectListeners , chunk . reason ) ;
711+ rejectChunk ( response , rejectListeners , chunk . reason ) ;
670712}
671713break ;
672714}
@@ -724,7 +766,7 @@ function triggerErrorOnChunk<T>(
724766erroredChunk . status = ERRORED ;
725767erroredChunk . reason = error ;
726768if ( listeners !== null ) {
727- rejectChunk ( listeners , error ) ;
769+ rejectChunk ( response , listeners , error ) ;
728770}
729771}
730772
@@ -832,7 +874,7 @@ function resolveModelChunk<T>(
832874// longer be rendered or might not be the highest pri.
833875initializeModelChunk ( resolvedChunk ) ;
834876// The status might have changed after initialization.
835- wakeChunkIfInitialized ( chunk , resolveListeners , rejectListeners ) ;
877+ wakeChunkIfInitialized ( response , chunk , resolveListeners , rejectListeners ) ;
836878}
837879}
838880
@@ -861,12 +903,11 @@ function resolveModuleChunk<T>(
861903}
862904if ( resolveListeners !== null ) {
863905initializeModuleChunk ( resolvedChunk ) ;
864- wakeChunkIfInitialized ( chunk , resolveListeners , rejectListeners ) ;
906+ wakeChunkIfInitialized ( response , chunk , resolveListeners , rejectListeners ) ;
865907}
866908}
867909
868910type InitializationReference = {
869- response : Response , // TODO: Remove Response from here and pass it through instead.
870911handler : InitializationHandler ,
871912parentObject : Object ,
872913key : string ,
@@ -1005,7 +1046,7 @@ function initializeModelChunk<T>(chunk: ResolvedModelChunk<T>): void {
10051046if ( typeof listener === 'function' ) {
10061047listener ( value ) ;
10071048} else {
1008- fulfillReference ( listener , value , cyclicChunk ) ;
1049+ fulfillReference ( response , listener , value , cyclicChunk ) ;
10091050}
10101051}
10111052}
@@ -1026,7 +1067,7 @@ function initializeModelChunk<T>(chunk: ResolvedModelChunk<T>): void {
10261067 initializedChunk.value = value;
10271068
10281069 if (__DEV__) {
1029- moveDebugInfoFromChunkToInnerValue ( initializedChunk , value ) ;
1070+ processChunkDebugInfo ( response , initializedChunk , value ) ;
10301071}
10311072} catch ( error ) {
10321073const erroredChunk : ErroredChunk < T > = ( chunk : any ) ;
@@ -1413,11 +1454,12 @@ function getChunk(response: Response, id: number): SomeChunk<any> {
14131454}
14141455
14151456function fulfillReference(
1457+ response: Response,
14161458 reference: InitializationReference,
14171459 value: any,
14181460 fulfilledChunk: SomeChunk< any > ,
14191461): void {
1420- const { response , handler , parentObject , key , map , path } = reference;
1462+ const { handler , parentObject , key , map , path } = reference;
14211463
14221464 for (let i = 1; i < path . length ; i ++ ) {
14231465while (
@@ -1487,7 +1529,11 @@ function fulfillReference(
14871529return ;
14881530}
14891531 default: {
1490- rejectReference ( reference , referencedChunk . reason ) ;
1532+ rejectReference (
1533+ response ,
1534+ reference . handler ,
1535+ referencedChunk . reason ,
1536+ ) ;
14911537return ;
14921538}
14931539}
@@ -1585,21 +1631,20 @@ function fulfillReference(
15851631initializedChunk . value = handler . value ;
15861632initializedChunk . reason = handler . reason ; // Used by streaming chunks
15871633if ( resolveListeners !== null ) {
1588- wakeChunk ( resolveListeners , handler . value , initializedChunk ) ;
1634+ wakeChunk ( response , resolveListeners , handler . value , initializedChunk ) ;
15891635} else {
15901636if ( __DEV__ ) {
1591- moveDebugInfoFromChunkToInnerValue ( initializedChunk , handler . value ) ;
1637+ processChunkDebugInfo ( response , initializedChunk , handler . value ) ;
15921638}
15931639}
15941640}
15951641}
15961642
15971643function rejectReference(
1598- reference: InitializationReference,
1644+ response: Response,
1645+ handler: InitializationHandler,
15991646 error: mixed,
16001647): void {
1601- const { handler , response } = reference;
1602-
16031648if ( handler . errored ) {
16041649// We've already errored. We could instead build up an AggregateError
16051650// but if there are multiple errors we just take the first one like
@@ -1690,7 +1735,6 @@ function waitForReference<T>(
16901735}
16911736
16921737 const reference: InitializationReference = {
1693- response ,
16941738handler ,
16951739parentObject ,
16961740key ,
@@ -1838,10 +1882,10 @@ function loadServerReference<A: Iterable<any>, T>(
18381882initializedChunk . status = INITIALIZED ;
18391883initializedChunk . value = handler . value ;
18401884if ( resolveListeners !== null ) {
1841- wakeChunk ( resolveListeners , handler . value , initializedChunk ) ;
1885+ wakeChunk ( response , resolveListeners , handler . value , initializedChunk ) ;
18421886} else {
18431887if ( __DEV__ ) {
1844- moveDebugInfoFromChunkToInnerValue ( initializedChunk , handler . value ) ;
1888+ processChunkDebugInfo ( response , initializedChunk , handler . value ) ;
18451889}
18461890}
18471891}
@@ -2578,6 +2622,7 @@ function ResponseInstance(
25782622replayConsole : boolean , // DEV-only
25792623environmentName : void | string , // DEV-only
25802624debugStartTime : void | number , // DEV-only
2625+ debugEndTime : void | number , // DEV-only
25812626debugChannel : void | DebugChannel , // DEV-only
25822627) {
25832628const chunks : Map < number , SomeChunk < any >> = new Map ( ) ;
@@ -2645,6 +2690,7 @@ function ResponseInstance(
26452690// and is not considered I/O required to load the stream.
26462691setTimeout ( markIOStarted . bind ( this ) , 0 ) ;
26472692}
2693+ this . _debugEndTime = debugEndTime == null ? null : debugEndTime ;
26482694this . _debugFindSourceMapURL = findSourceMapURL ;
26492695this . _debugChannel = debugChannel ;
26502696this . _blockedConsole = null ;
@@ -2688,6 +2734,7 @@ export function createResponse(
26882734replayConsole : boolean , // DEV-only
26892735environmentName : void | string , // DEV-only
26902736debugStartTime : void | number , // DEV-only
2737+ debugEndTime : void | number , // DEV-only
26912738debugChannel : void | DebugChannel , // DEV-only
26922739) : WeakResponse {
26932740return getWeakResponse (
@@ -2704,6 +2751,7 @@ export function createResponse(
27042751replayConsole ,
27052752environmentName ,
27062753debugStartTime ,
2754+ debugEndTime ,
27072755debugChannel ,
27082756) ,
27092757) ;
@@ -3075,10 +3123,10 @@ function resolveStream<T: ReadableStream | $AsyncIterable<any, any, void>>(
30753123 resolvedChunk.value = stream;
30763124 resolvedChunk.reason = controller;
30773125 if (resolveListeners !== null) {
3078- wakeChunk ( resolveListeners , chunk . value , ( chunk : any ) ) ;
3126+ wakeChunk ( response , resolveListeners , chunk . value , ( chunk : any ) ) ;
30793127} else {
30803128if ( __DEV__ ) {
3081- moveDebugInfoFromChunkToInnerValue ( resolvedChunk , stream ) ;
3129+ processChunkDebugInfo ( response , resolvedChunk , stream ) ;
30823130}
30833131}
30843132}
@@ -3218,7 +3266,12 @@ function startAsyncIterable<T>(
32183266initializedChunk . status = INITIALIZED ;
32193267initializedChunk . value = { done : false , value : value } ;
32203268if ( resolveListeners !== null ) {
3221- wakeChunkIfInitialized ( chunk , resolveListeners , rejectListeners ) ;
3269+ wakeChunkIfInitialized (
3270+ response ,
3271+ chunk ,
3272+ resolveListeners ,
3273+ rejectListeners ,
3274+ ) ;
32223275}
32233276}
32243277nextWriteIndex ++ ;
0 commit comments