@@ -1905,7 +1905,7 @@ function visitAsyncNode(
19051905 return ioNode ;
19061906 }
19071907 // Outline the IO node.
1908- emitIOChunk ( request , ioNode ) ;
1908+ serializeIONode ( request , ioNode ) ;
19091909 // Then emit a reference to us awaiting it in the current task.
19101910 request . pendingChunks ++ ;
19111911 emitDebugChunk ( request , task . id , {
@@ -1942,7 +1942,7 @@ function emitAsyncSequence(
19421942 // each occurrence. Right now we'll only track the first time it is invoked.
19431943 awaitedNode . end = performance . now ( ) ;
19441944 }
1945- emitIOChunk ( request , awaitedNode ) ;
1945+ serializeIONode ( request , awaitedNode ) ;
19461946 request. pendingChunks ++ ;
19471947 emitDebugChunk ( request , task . id , {
19481948 awaited : ( ( awaitedNode : any ) : ReactIOInfo ) , // This is deduped by this reference.
@@ -3493,80 +3493,88 @@ function outlineComponentInfo(
34933493 request . writtenObjects . set ( componentInfo , serializeByValueID ( id ) ) ;
34943494}
34953495
3496- function outlineIOInfo ( request : Request , ioInfo : ReactIOInfo ) : void {
3496+ function emitIOInfoChunk (
3497+ request : Request ,
3498+ id : number ,
3499+ start : number ,
3500+ end : number ,
3501+ stack : ?ReactStackTrace ,
3502+ ) : void {
34973503 if ( ! __DEV__ ) {
34983504 // These errors should never make it into a build so we don't need to encode them in codes.json
34993505 // eslint-disable-next-line react-internal/prod-error-codes
35003506 throw new Error (
3501- 'outlineIOInfo should never be called in production mode. This is a bug in React.' ,
3507+ 'emitIOInfoChunk should never be called in production mode. This is a bug in React.' ,
35023508 ) ;
35033509 }
35043510
3505- if ( request . writtenObjects . has ( ioInfo ) ) {
3506- // Already written
3507- return ;
3508- }
3509-
3510- // Limit the number of objects we write to prevent emitting giant props objects.
35113511 let objectLimit = 10 ;
3512- if ( ioInfo . stack != null ) {
3513- // Ensure we have enough object limit to encode the stack trace.
3514- objectLimit += ioInfo . stack . length ;
3512+ if ( stack ) {
3513+ objectLimit += stack . length ;
35153514 }
3516-
3517- // We use the console encoding so that we can dedupe objects but don't necessarily
3518- // use the full serialization that requires a task.
35193515 const counter = { objectLimit} ;
3516+ function replacer (
3517+ this :
3518+ | { + [ key : string | number ] : ReactClientValue }
3519+ | $ReadOnlyArray < ReactClientValue > ,
3520+ parentPropertyName : string ,
3521+ value : ReactClientValue ,
3522+ ) : ReactJSONValue {
3523+ return renderConsoleValue (
3524+ request ,
3525+ counter ,
3526+ this ,
3527+ parentPropertyName ,
3528+ value ,
3529+ ) ;
3530+ }
35203531
3521- // We can't serialize the ConsoleTask/Error objects so we need to omit them before serializing.
3522- const relativeStartTimestamp = ioInfo . start - request . timeOrigin ;
3523- const relativeEndTimestamp = ioInfo . end - request . timeOrigin ;
3532+ const relativeStartTimestamp = start - request . timeOrigin ;
3533+ const relativeEndTimestamp = end - request . timeOrigin ;
35243534 const debugIOInfo : Omit < ReactIOInfo , 'debugTask' | 'debugStack' > = {
35253535 start : relativeStartTimestamp ,
35263536 end : relativeEndTimestamp ,
3527- stack : ioInfo . stack ,
3537+ stack : stack ,
35283538 } ;
3529- const id = outlineConsoleValue ( request , counter , debugIOInfo ) ;
3530- request . writtenObjects . set ( ioInfo , serializeByValueID ( id ) ) ;
3539+ // $FlowFixMe[incompatible-type] stringify can return null
3540+ const json : string = stringify ( debugIOInfo , replacer ) ;
3541+ const row = id . toString ( 16 ) + ':J' + json + '\n' ;
3542+ const processedChunk = stringToChunk ( row ) ;
3543+ request . completedRegularChunks . push ( processedChunk ) ;
35313544}
35323545
3533- function emitIOChunk ( request : Request , ioNode : IONode | PromiseNode ) : void {
3534- if ( ! __DEV__ ) {
3535- // These errors should never make it into a build so we don't need to encode them in codes.json
3536- // eslint-disable-next-line react-internal/prod-error-codes
3537- throw new Error (
3538- 'outlineIOInfo should never be called in production mode. This is a bug in React.' ,
3539- ) ;
3546+ function outlineIOInfo ( request : Request , ioInfo : ReactIOInfo ) : void {
3547+ if ( request . writtenObjects . has ( ioInfo ) ) {
3548+ // Already written
3549+ return ;
35403550 }
3551+ // We can't serialize the ConsoleTask/Error objects so we need to omit them before serializing.
3552+ request . pendingChunks ++ ;
3553+ const id = request . nextChunkId ++ ;
3554+ emitIOInfoChunk ( request , id , ioInfo . start , ioInfo . end , ioInfo . stack ) ;
3555+ request . writtenObjects . set ( ioInfo , serializeByValueID ( id ) ) ;
3556+ }
35413557
3542- if ( request . writtenObjects . has ( ioNode ) ) {
3558+ function serializeIONode (
3559+ request : Request ,
3560+ ioNode : IONode | PromiseNode ,
3561+ ) : string {
3562+ const existingRef = request . writtenObjects . get ( ioNode ) ;
3563+ if ( existingRef !== undefined ) {
35433564 // Already written
3544- return ;
3565+ return existingRef ;
35453566 }
35463567
3547- // Limit the number of objects we write to prevent emitting giant props objects.
3548- let objectLimit = 10 ;
35493568 let stack = null ;
35503569 if ( ioNode . stack !== null ) {
35513570 stack = filterStackTrace ( request , ioNode . stack , 1 ) ;
3552- // Ensure we have enough object limit to encode the stack trace.
3553- objectLimit += stack . length ;
35543571 }
3555-
3556- // We use the console encoding so that we can dedupe objects but don't necessarily
3557- // use the full serialization that requires a task.
3558- const counter = { objectLimit} ;
3559-
3560- // We can't serialize the ConsoleTask/Error objects so we need to omit them before serializing.
3561- const relativeStartTimestamp = ioNode . start - request . timeOrigin ;
3562- const relativeEndTimestamp = ioNode . end - request . timeOrigin ;
3563- const debugIOInfo : Omit < ReactIOInfo , 'debugTask' | 'debugStack' > = {
3564- start : relativeStartTimestamp ,
3565- end : relativeEndTimestamp ,
3566- stack : stack ,
3567- } ;
3568- const id = outlineConsoleValue ( request , counter , debugIOInfo ) ;
3569- request . writtenObjects . set ( ioNode , serializeByValueID ( id ) ) ;
3572+ request . pendingChunks ++ ;
3573+ const id = request . nextChunkId ++ ;
3574+ emitIOInfoChunk ( request , id , ioNode . start , ioNode . end , stack ) ;
3575+ const ref = serializeByValueID ( id ) ;
3576+ request . writtenObjects . set ( ioNode , ref ) ;
3577+ return ref ;
35703578}
35713579
35723580function emitTypedArrayChunk (
0 commit comments