diff --git a/fixtures/flight/src/App.js b/fixtures/flight/src/App.js index 5f12956fd6..d244ec8d39 100644 --- a/fixtures/flight/src/App.js +++ b/fixtures/flight/src/App.js @@ -33,20 +33,26 @@ function Foo({children}) { return
{children}
; } +async function delay(text, ms) { + return new Promise(resolve => setTimeout(() => resolve(text), ms)); +} + async function Bar({children}) { - await new Promise(resolve => setTimeout(() => resolve('deferred text'), 10)); + await delay('deferred text', 10); return
{children}
; } async function ThirdPartyComponent() { - return new Promise(resolve => - setTimeout(() => resolve('hello from a 3rd party'), 30) - ); + return delay('hello from a 3rd party', 30); } // Using Web streams for tee'ing convenience here. let cachedThirdPartyReadableWeb; +// We create the Component outside of AsyncLocalStorage so that it has no owner. +// That way it gets the owner from the call to createFromNodeStream. +const thirdPartyComponent = ; + function fetchThirdParty(noCache) { if (cachedThirdPartyReadableWeb && !noCache) { const [readableWeb1, readableWeb2] = cachedThirdPartyReadableWeb.tee(); @@ -59,7 +65,7 @@ function fetchThirdParty(noCache) { } const stream = renderToPipeableStream( - , + thirdPartyComponent, {}, {environmentName: 'third-party'} ); @@ -80,8 +86,8 @@ function fetchThirdParty(noCache) { } async function ServerComponent({noCache}) { - await new Promise(resolve => setTimeout(() => resolve('deferred text'), 50)); - return fetchThirdParty(noCache); + await delay('deferred text', 50); + return await fetchThirdParty(noCache); } export default async function App({prerender, noCache}) { diff --git a/packages/react-client/src/ReactFlightClient.js b/packages/react-client/src/ReactFlightClient.js index 78a2d85eea..a69ede9efd 100644 --- a/packages/react-client/src/ReactFlightClient.js +++ b/packages/react-client/src/ReactFlightClient.js @@ -844,7 +844,7 @@ function createElement( // This owner should ideally have already been initialized to avoid getting // user stack frames on the stack. const ownerTask = - owner === null ? null : initializeFakeTask(response, owner, env); + owner === null ? null : initializeFakeTask(response, owner); if (ownerTask === null) { const rootTask = response._debugRootTask; if (rootTask != null) { @@ -2494,7 +2494,6 @@ function getRootTask( function initializeFakeTask( response: Response, debugInfo: ReactComponentInfo | ReactAsyncInfo | ReactIOInfo, - childEnvironmentName: string, ): null | ConsoleTask { if (!supportsCreateTask) { return null; @@ -2504,6 +2503,10 @@ function initializeFakeTask( // If it's null, we can't initialize a task. return null; } + const cachedEntry = debugInfo.debugTask; + if (cachedEntry !== undefined) { + return cachedEntry; + } // Workaround for a bug where Chrome Performance tracking uses the enclosing line/column // instead of the callsite. For ReactAsyncInfo/ReactIOInfo, the only thing we're going @@ -2516,47 +2519,35 @@ function initializeFakeTask( const stack = debugInfo.stack; const env: string = debugInfo.env == null ? response._rootEnvironmentName : debugInfo.env; - if (env !== childEnvironmentName) { + const ownerEnv: string = + debugInfo.owner == null || debugInfo.owner.env == null + ? response._rootEnvironmentName + : debugInfo.owner.env; + const ownerTask = + debugInfo.owner == null + ? null + : initializeFakeTask(response, debugInfo.owner); + const taskName = // This is the boundary between two environments so we'll annotate the task name. - // That is unusual so we don't cache it. - const ownerTask = - debugInfo.owner == null - ? null - : initializeFakeTask(response, debugInfo.owner, env); - return buildFakeTask( - response, - ownerTask, - stack, - '"use ' + childEnvironmentName.toLowerCase() + '"', - env, - useEnclosingLine, - ); - } else { - const cachedEntry = debugInfo.debugTask; - if (cachedEntry !== undefined) { - return cachedEntry; - } - const ownerTask = - debugInfo.owner == null - ? null - : initializeFakeTask(response, debugInfo.owner, env); - // Some unfortunate pattern matching to refine the type. - const taskName = - debugInfo.key !== undefined + // We assume that the stack frame of the entry into the new environment was done + // from the old environment. So we use the owner's environment as the current. + env !== ownerEnv + ? '"use ' + env.toLowerCase() + '"' + : // Some unfortunate pattern matching to refine the type. + debugInfo.key !== undefined ? getServerComponentTaskName(((debugInfo: any): ReactComponentInfo)) : debugInfo.name !== undefined ? getIOInfoTaskName(((debugInfo: any): ReactIOInfo)) : getAsyncInfoTaskName(((debugInfo: any): ReactAsyncInfo)); - // $FlowFixMe[cannot-write]: We consider this part of initialization. - return (debugInfo.debugTask = buildFakeTask( - response, - ownerTask, - stack, - taskName, - env, - useEnclosingLine, - )); - } + // $FlowFixMe[cannot-write]: We consider this part of initialization. + return (debugInfo.debugTask = buildFakeTask( + response, + ownerTask, + stack, + taskName, + ownerEnv, + useEnclosingLine, + )); } function buildFakeTask( @@ -2658,27 +2649,30 @@ function resolveDebugInfo( 'resolveDebugInfo should never be called in production mode. This is a bug in React.', ); } - // We eagerly initialize the fake task because this resolving happens outside any - // render phase so we're not inside a user space stack at this point. If we waited - // to initialize it when we need it, we might be inside user code. - const env = - debugInfo.env === undefined ? response._rootEnvironmentName : debugInfo.env; if (debugInfo.stack !== undefined) { const componentInfoOrAsyncInfo: ReactComponentInfo | ReactAsyncInfo = // $FlowFixMe[incompatible-type] debugInfo; - initializeFakeTask(response, componentInfoOrAsyncInfo, env); + // We eagerly initialize the fake task because this resolving happens outside any + // render phase so we're not inside a user space stack at this point. If we waited + // to initialize it when we need it, we might be inside user code. + initializeFakeTask(response, componentInfoOrAsyncInfo); } - if (debugInfo.owner === null && response._debugRootOwner != null) { + if (debugInfo.owner == null && response._debugRootOwner != null) { const componentInfoOrAsyncInfo: ReactComponentInfo | ReactAsyncInfo = // $FlowFixMe: By narrowing `owner` to `null`, we narrowed `debugInfo` to `ReactComponentInfo` debugInfo; // $FlowFixMe[cannot-write] componentInfoOrAsyncInfo.owner = response._debugRootOwner; + // We clear the parsed stack frames to indicate that it needs to be re-parsed from debugStack. + // $FlowFixMe[cannot-write] + componentInfoOrAsyncInfo.stack = null; // We override the stack if we override the owner since the stack where the root JSX // was created on the server isn't very useful but where the request was made is. // $FlowFixMe[cannot-write] componentInfoOrAsyncInfo.debugStack = response._debugRootStack; + // $FlowFixMe[cannot-write] + componentInfoOrAsyncInfo.debugTask = response._debugRootTask; } else if (debugInfo.stack !== undefined) { const componentInfoOrAsyncInfo: ReactComponentInfo | ReactAsyncInfo = // $FlowFixMe[incompatible-type] @@ -2738,7 +2732,7 @@ const replayConsoleWithCallStack = { bindToConsole(methodName, args, env), ); if (owner != null) { - const task = initializeFakeTask(response, owner, env); + const task = initializeFakeTask(response, owner); initializeFakeStack(response, owner); if (task !== null) { task.run(callStack); @@ -2812,10 +2806,8 @@ function resolveConsoleEntry( } function initializeIOInfo(response: Response, ioInfo: ReactIOInfo): void { - const env = - ioInfo.env === undefined ? response._rootEnvironmentName : ioInfo.env; if (ioInfo.stack !== undefined) { - initializeFakeTask(response, ioInfo, env); + initializeFakeTask(response, ioInfo); initializeFakeStack(response, ioInfo); } // Adjust the time to the current environment's time space. diff --git a/packages/react-client/src/__tests__/ReactFlight-test.js b/packages/react-client/src/__tests__/ReactFlight-test.js index ef98642005..90f72416e3 100644 --- a/packages/react-client/src/__tests__/ReactFlight-test.js +++ b/packages/react-client/src/__tests__/ReactFlight-test.js @@ -320,7 +320,6 @@ describe('ReactFlight', () => { name: 'Greeting', env: 'Server', key: null, - owner: null, stack: ' in Object. (at **)', props: { firstName: 'Seb', @@ -364,7 +363,6 @@ describe('ReactFlight', () => { name: 'Greeting', env: 'Server', key: null, - owner: null, stack: ' in Object. (at **)', props: { firstName: 'Seb', @@ -2812,7 +2810,6 @@ describe('ReactFlight', () => { name: 'ServerComponent', env: 'Server', key: null, - owner: null, stack: ' in Object. (at **)', props: { transport: expect.arrayContaining([]), @@ -2834,7 +2831,6 @@ describe('ReactFlight', () => { name: 'ThirdPartyComponent', env: 'third-party', key: null, - owner: null, stack: ' in Object. (at **)', props: {}, }, @@ -2851,7 +2847,6 @@ describe('ReactFlight', () => { name: 'ThirdPartyLazyComponent', env: 'third-party', key: null, - owner: null, stack: ' in myLazy (at **)\n in lazyInitializer (at **)', props: {}, }, @@ -2867,7 +2862,6 @@ describe('ReactFlight', () => { name: 'ThirdPartyFragmentComponent', env: 'third-party', key: '3', - owner: null, stack: ' in Object. (at **)', props: {}, }, @@ -2941,7 +2935,6 @@ describe('ReactFlight', () => { name: 'ServerComponent', env: 'Server', key: null, - owner: null, stack: ' in Object. (at **)', props: { transport: expect.arrayContaining([]), @@ -2961,7 +2954,6 @@ describe('ReactFlight', () => { name: 'Keyed', env: 'Server', key: 'keyed', - owner: null, stack: ' in ServerComponent (at **)', props: { children: {}, @@ -2980,7 +2972,6 @@ describe('ReactFlight', () => { name: 'ThirdPartyAsyncIterableComponent', env: 'third-party', key: null, - owner: null, stack: ' in Object. (at **)', props: {}, }, @@ -3137,7 +3128,6 @@ describe('ReactFlight', () => { name: 'Component', env: 'A', key: null, - owner: null, stack: ' in Object. (at **)', props: {}, }, @@ -3325,7 +3315,6 @@ describe('ReactFlight', () => { name: 'Greeting', env: 'Server', key: null, - owner: null, stack: ' in Object. (at **)', props: { firstName: 'Seb', diff --git a/packages/react-server-dom-webpack/src/__tests__/ReactFlightDOMBrowser-test.js b/packages/react-server-dom-webpack/src/__tests__/ReactFlightDOMBrowser-test.js index 8670f606ba..6afaa20729 100644 --- a/packages/react-server-dom-webpack/src/__tests__/ReactFlightDOMBrowser-test.js +++ b/packages/react-server-dom-webpack/src/__tests__/ReactFlightDOMBrowser-test.js @@ -708,7 +708,6 @@ describe('ReactFlightDOMBrowser', () => { name: 'Server', env: 'Server', key: null, - owner: null, }), }), ); @@ -724,7 +723,6 @@ describe('ReactFlightDOMBrowser', () => { name: 'Server', env: 'Server', key: null, - owner: null, }), }), ); diff --git a/packages/react-server-dom-webpack/src/__tests__/ReactFlightDOMEdge-test.js b/packages/react-server-dom-webpack/src/__tests__/ReactFlightDOMEdge-test.js index 43e0aaa7e7..0c31177f1d 100644 --- a/packages/react-server-dom-webpack/src/__tests__/ReactFlightDOMEdge-test.js +++ b/packages/react-server-dom-webpack/src/__tests__/ReactFlightDOMEdge-test.js @@ -1190,7 +1190,6 @@ describe('ReactFlightDOMEdge', () => { const greetInfo = expect.objectContaining({ name: 'Greeting', env: 'Server', - owner: null, }); expect(lazyWrapper._debugInfo).toEqual([ {time: 12}, diff --git a/packages/react-server/src/ReactFlightServer.js b/packages/react-server/src/ReactFlightServer.js index b1d3a91dc0..c56103665e 100644 --- a/packages/react-server/src/ReactFlightServer.js +++ b/packages/react-server/src/ReactFlightServer.js @@ -3587,12 +3587,27 @@ function outlineComponentInfo( 'debugTask' | 'debugStack', > = { name: componentInfo.name, - env: componentInfo.env, key: componentInfo.key, - owner: componentInfo.owner, }; - // $FlowFixMe[cannot-write] - componentDebugInfo.stack = componentInfo.stack; + if (componentInfo.env != null) { + // $FlowFixMe[cannot-write] + componentDebugInfo.env = componentInfo.env; + } + if (componentInfo.owner != null) { + // $FlowFixMe[cannot-write] + componentDebugInfo.owner = componentInfo.owner; + } + if (componentInfo.stack == null && componentInfo.debugStack != null) { + // If we have a debugStack but no parsed stack we should parse it. + // $FlowFixMe[cannot-write] + componentDebugInfo.stack = filterStackTrace( + request, + parseStackTrace(componentInfo.debugStack, 1), + ); + } else if (componentInfo.stack != null) { + // $FlowFixMe[cannot-write] + componentDebugInfo.stack = componentInfo.stack; + } // Ensure we serialize props after the stack to favor the stack being complete. // $FlowFixMe[cannot-write] componentDebugInfo.props = componentInfo.props; @@ -3679,6 +3694,16 @@ function outlineIOInfo(request: Request, ioInfo: ReactIOInfo): void { if (owner != null) { outlineComponentInfo(request, owner); } + let debugStack; + if (ioInfo.stack == null && ioInfo.debugStack != null) { + // If we have a debugStack but no parsed stack we should parse it. + debugStack = filterStackTrace( + request, + parseStackTrace(ioInfo.debugStack, 1), + ); + } else { + debugStack = ioInfo.stack; + } emitIOInfoChunk( request, id, @@ -3687,7 +3712,7 @@ function outlineIOInfo(request: Request, ioInfo: ReactIOInfo): void { ioInfo.end, ioInfo.env, owner, - ioInfo.stack, + debugStack, ); request.writtenObjects.set(ioInfo, serializeByValueID(id)); } @@ -4243,30 +4268,50 @@ function forwardDebugInfo( debugInfo: ReactDebugInfo, ) { for (let i = 0; i < debugInfo.length; i++) { - if (typeof debugInfo[i].time === 'number') { + const info = debugInfo[i]; + if (typeof info.time === 'number') { // When forwarding time we need to ensure to convert it to the time space of the payload. - emitTimingChunk(request, id, debugInfo[i].time); + emitTimingChunk(request, id, info.time); } else { request.pendingChunks++; - if (typeof debugInfo[i].name === 'string') { + if (typeof info.name === 'string') { // We outline this model eagerly so that we can refer to by reference as an owner. // If we had a smarter way to dedupe we might not have to do this if there ends up // being no references to this as an owner. - outlineComponentInfo(request, (debugInfo[i]: any)); + outlineComponentInfo(request, (info: any)); // Emit a reference to the outlined one. - emitDebugChunk(request, id, debugInfo[i]); - } else if (debugInfo[i].awaited) { - const ioInfo = debugInfo[i].awaited; + emitDebugChunk(request, id, info); + } else if (info.awaited) { + const ioInfo = info.awaited; // Outline the IO info in case the same I/O is awaited in more than one place. outlineIOInfo(request, ioInfo); // We can't serialize the ConsoleTask/Error objects so we need to omit them before serializing. + let debugStack; + if (info.stack == null && info.debugStack != null) { + // If we have a debugStack but no parsed stack we should parse it. + debugStack = filterStackTrace( + request, + parseStackTrace(info.debugStack, 1), + ); + } else { + debugStack = info.stack; + } const debugAsyncInfo: Omit = { awaited: ioInfo, - env: debugInfo[i].env, - owner: debugInfo[i].owner, - stack: debugInfo[i].stack, }; + if (info.env != null) { + // $FlowFixMe[cannot-write] + debugAsyncInfo.env = info.env; + } + if (info.owner != null) { + // $FlowFixMe[cannot-write] + debugAsyncInfo.owner = info.owner; + } + if (debugStack != null) { + // $FlowFixMe[cannot-write] + debugAsyncInfo.stack = debugStack; + } emitDebugChunk(request, id, debugAsyncInfo); } else { emitDebugChunk(request, id, debugInfo[i]); diff --git a/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js b/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js index d1c84f9cc2..eee2a3749f 100644 --- a/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js +++ b/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js @@ -174,7 +174,6 @@ describe('ReactFlightAsyncDebugInfo', () => { "env": "Server", "key": null, "name": "Component", - "owner": null, "props": {}, "stack": [ [ @@ -199,7 +198,6 @@ describe('ReactFlightAsyncDebugInfo', () => { "env": "Server", "key": null, "name": "Component", - "owner": null, "props": {}, "stack": [ [ @@ -245,7 +243,6 @@ describe('ReactFlightAsyncDebugInfo', () => { "env": "Server", "key": null, "name": "Component", - "owner": null, "props": {}, "stack": [ [ @@ -292,7 +289,6 @@ describe('ReactFlightAsyncDebugInfo', () => { "env": "Server", "key": null, "name": "Component", - "owner": null, "props": {}, "stack": [ [ @@ -338,7 +334,6 @@ describe('ReactFlightAsyncDebugInfo', () => { "env": "Server", "key": null, "name": "Component", - "owner": null, "props": {}, "stack": [ [ @@ -421,15 +416,14 @@ describe('ReactFlightAsyncDebugInfo', () => { "env": "Server", "key": null, "name": "Component", - "owner": null, "props": {}, "stack": [ [ "Object.", "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js", - 397, + 392, 109, - 384, + 379, 67, ], ], @@ -446,15 +440,14 @@ describe('ReactFlightAsyncDebugInfo', () => { "env": "Server", "key": null, "name": "Component", - "owner": null, "props": {}, "stack": [ [ "Object.", "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js", - 397, + 392, 109, - 384, + 379, 67, ], ], @@ -463,9 +456,9 @@ describe('ReactFlightAsyncDebugInfo', () => { [ "Component", "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js", - 387, + 382, 7, - 385, + 380, 5, ], ], @@ -520,15 +513,14 @@ describe('ReactFlightAsyncDebugInfo', () => { "env": "Server", "key": null, "name": "Component", - "owner": null, "props": {}, "stack": [ [ "Object.", "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js", - 496, + 489, 109, - 487, + 480, 94, ], ], @@ -592,15 +584,14 @@ describe('ReactFlightAsyncDebugInfo', () => { "env": "Server", "key": null, "name": "Component", - "owner": null, "props": {}, "stack": [ [ "Object.", "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js", - 568, + 560, 109, - 544, + 536, 50, ], ], @@ -675,15 +666,14 @@ describe('ReactFlightAsyncDebugInfo', () => { "env": "Server", "key": null, "name": "Component", - "owner": null, "props": {}, "stack": [ [ "Object.", "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js", - 651, + 642, 109, - 634, + 625, 63, ], ], @@ -695,7 +685,6 @@ describe('ReactFlightAsyncDebugInfo', () => { "env": "third-party", "key": null, "name": "ThirdPartyComponent", - "owner": null, "props": {}, "stack": [ [ @@ -709,224 +698,220 @@ describe('ReactFlightAsyncDebugInfo', () => { [ "Component", "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js", - 647, + 638, 24, - 646, - 5, - ], - ], - }, - { - "time": 0, - }, - { - "awaited": { - "end": 0, - "env": "third-party", - "name": "delay", - "owner": { - "env": "third-party", - "key": null, - "name": "ThirdPartyComponent", - "owner": null, - "props": {}, - "stack": [ - [ - "fetchThirdParty", - "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js", - 122, - 40, - 120, - 3, - ], - [ - "Component", - "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js", - 647, - 24, - 646, - 5, - ], - ], - }, - "stack": [ - [ - "delay", - "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js", - 115, - 12, - 114, - 3, - ], - [ - "getData", - "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js", - 636, - 13, - 635, - 5, - ], - [ - "ThirdPartyComponent", - "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js", - 642, - 24, - 641, - 5, - ], - ], - "start": 0, - }, - "env": "third-party", - "owner": { - "env": "third-party", - "key": null, - "name": "ThirdPartyComponent", - "owner": null, - "props": {}, - "stack": [ - [ - "fetchThirdParty", - "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js", - 122, - 40, - 120, - 3, - ], - [ - "Component", - "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js", - 647, - 24, - 646, - 5, - ], - ], - }, - "stack": [ - [ - "getData", - "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js", - 636, - 13, - 635, - 5, - ], - [ - "ThirdPartyComponent", - "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js", - 642, - 24, - 641, - 5, - ], - ], - }, - { - "time": 0, - }, - { - "time": 0, - }, - { - "awaited": { - "end": 0, - "env": "third-party", - "name": "delay", - "owner": { - "env": "third-party", - "key": null, - "name": "ThirdPartyComponent", - "owner": null, - "props": {}, - "stack": [ - [ - "fetchThirdParty", - "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js", - 122, - 40, - 120, - 3, - ], - [ - "Component", - "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js", - 647, - 24, - 646, - 5, - ], - ], - }, - "stack": [ - [ - "delay", - "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js", - 115, - 12, - 114, - 3, - ], - [ - "getData", - "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js", - 637, - 13, - 635, - 5, - ], - [ - "ThirdPartyComponent", - "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js", - 642, - 18, - 641, - 5, - ], - ], - "start": 0, - }, - "env": "third-party", - "owner": { - "env": "third-party", - "key": null, - "name": "ThirdPartyComponent", - "owner": null, - "props": {}, - "stack": [ - [ - "fetchThirdParty", - "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js", - 122, - 40, - 120, - 3, - ], - [ - "Component", - "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js", - 647, - 24, - 646, - 5, - ], - ], - }, - "stack": [ - [ - "getData", - "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js", 637, + 5, + ], + ], + }, + { + "time": 0, + }, + { + "awaited": { + "end": 0, + "env": "third-party", + "name": "delay", + "owner": { + "env": "third-party", + "key": null, + "name": "ThirdPartyComponent", + "props": {}, + "stack": [ + [ + "fetchThirdParty", + "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js", + 122, + 40, + 120, + 3, + ], + [ + "Component", + "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js", + 638, + 24, + 637, + 5, + ], + ], + }, + "stack": [ + [ + "delay", + "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js", + 115, + 12, + 114, + 3, + ], + [ + "getData", + "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js", + 627, + 13, + 626, + 5, + ], + [ + "ThirdPartyComponent", + "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js", + 633, + 24, + 632, + 5, + ], + ], + "start": 0, + }, + "env": "third-party", + "owner": { + "env": "third-party", + "key": null, + "name": "ThirdPartyComponent", + "props": {}, + "stack": [ + [ + "fetchThirdParty", + "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js", + 122, + 40, + 120, + 3, + ], + [ + "Component", + "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js", + 638, + 24, + 637, + 5, + ], + ], + }, + "stack": [ + [ + "getData", + "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js", + 627, 13, - 635, + 626, 5, ], [ "ThirdPartyComponent", "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js", - 642, + 633, + 24, + 632, + 5, + ], + ], + }, + { + "time": 0, + }, + { + "time": 0, + }, + { + "awaited": { + "end": 0, + "env": "third-party", + "name": "delay", + "owner": { + "env": "third-party", + "key": null, + "name": "ThirdPartyComponent", + "props": {}, + "stack": [ + [ + "fetchThirdParty", + "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js", + 122, + 40, + 120, + 3, + ], + [ + "Component", + "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js", + 638, + 24, + 637, + 5, + ], + ], + }, + "stack": [ + [ + "delay", + "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js", + 115, + 12, + 114, + 3, + ], + [ + "getData", + "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js", + 628, + 13, + 626, + 5, + ], + [ + "ThirdPartyComponent", + "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js", + 633, + 18, + 632, + 5, + ], + ], + "start": 0, + }, + "env": "third-party", + "owner": { + "env": "third-party", + "key": null, + "name": "ThirdPartyComponent", + "props": {}, + "stack": [ + [ + "fetchThirdParty", + "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js", + 122, + 40, + 120, + 3, + ], + [ + "Component", + "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js", + 638, + 24, + 637, + 5, + ], + ], + }, + "stack": [ + [ + "getData", + "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js", + 628, + 13, + 626, + 5, + ], + [ + "ThirdPartyComponent", + "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js", + 633, 18, - 641, + 632, 5, ], ],