@samitouri / QOS-React-2 / commits / b367b60927

[Flight] Add "use ..." boundary after the change instead of before it (#33478)

I noticed that the ThirdPartyComponent in the fixture was showing the wrong stack and the `"use third-party"` is in the wrong location. <img width="628" alt="Screenshot 2025-06-06 at 11 22 11 PM" src="https://github.com/user-attachments/assets/f0013380-d79e-4765-b371-87fd61b3056b" /> When creating the initial JSX inside the third party server, we should make sure that it has no owner. In a real cross-server environment you get this by default by just executing in different context. But since the fixture example is inside the same AsyncLocalStorage as the parent it already has an owner which gets transferred. So we should make sure that were we create the JSX has no owner to simulate this. When we then parse a null owner on the receiving side, we replace its owner/stack with the owner/stack of the call to `createFrom...` to connect them. This worked fine with only two environments. The bug was that when we did this and then transferred the result to a third environment we took the original parsed stack trace. We should instead parse a new one from the replaced stack in the current environment. The second bug was that the `"use third-party"` badge ends up in the wrong place when we do this kind of thing. Because the stack of the thing entering the new environment is the call to `createFrom...` which is in the old environment even though the component itself executes in the new environment. So to see if there's a change we should be comparing the current environment of the task to the owner's environment instead of the next environment after the task. After: <img width="494" alt="Screenshot 2025-06-07 at 1 13 28 AM" src="https://github.com/user-attachments/assets/e2e870ba-f125-4526-a853-bd29f164cf09" />

Sebastian Markbåge committed Jun 7, 2025 at 11:28 UTC b367b60927dd85239852bfee60715034c7ca97ba
7 files changed +152 -138
fixtures/flight/src/App.js
+13 -7
@@ -33,20 +33,26 @@ function Foo({children}) {
33 return <div>{children}</div>;
34 }
35
36 +async function delay(text, ms) {
37 + return new Promise(resolve => setTimeout(() => resolve(text), ms));
38 +}
39 +
40 async function Bar({children}) {
37 - await new Promise(resolve => setTimeout(() => resolve('deferred text'), 10));
41 + await delay('deferred text', 10);
42 return <div>{children}</div>;
43 }
44
45 async function ThirdPartyComponent() {
42 - return new Promise(resolve =>
43 - setTimeout(() => resolve('hello from a 3rd party'), 30)
44 - );
46 + return delay('hello from a 3rd party', 30);
47 }
48
49 // Using Web streams for tee'ing convenience here.
50 let cachedThirdPartyReadableWeb;
51
52 +// We create the Component outside of AsyncLocalStorage so that it has no owner.
53 +// That way it gets the owner from the call to createFromNodeStream.
54 +const thirdPartyComponent = <ThirdPartyComponent />;
55 +
56 function fetchThirdParty(noCache) {
57 if (cachedThirdPartyReadableWeb && !noCache) {
58 const [readableWeb1, readableWeb2] = cachedThirdPartyReadableWeb.tee();
@@ -59,7 +65,7 @@ function fetchThirdParty(noCache) {
65 }
66
67 const stream = renderToPipeableStream(
62 - <ThirdPartyComponent />,
68 + thirdPartyComponent,
69 {},
70 {environmentName: 'third-party'}
71 );
@@ -80,8 +86,8 @@ function fetchThirdParty(noCache) {
86 }
87
88 async function ServerComponent({noCache}) {
83 - await new Promise(resolve => setTimeout(() => resolve('deferred text'), 50));
84 - return fetchThirdParty(noCache);
89 + await delay('deferred text', 50);
90 + return await fetchThirdParty(noCache);
91 }
92
93 export default async function App({prerender, noCache}) {
packages/react-client/src/ReactFlightClient.js
+41 -49
@@ -844,7 +844,7 @@ function createElement(
844 // This owner should ideally have already been initialized to avoid getting
845 // user stack frames on the stack.
846 const ownerTask =
847 - owner === null ? null : initializeFakeTask(response, owner, env);
847 + owner === null ? null : initializeFakeTask(response, owner);
848 if (ownerTask === null) {
849 const rootTask = response._debugRootTask;
850 if (rootTask != null) {
@@ -2494,7 +2494,6 @@ function getRootTask(
2494 function initializeFakeTask(
2495 response: Response,
2496 debugInfo: ReactComponentInfo | ReactAsyncInfo | ReactIOInfo,
2497 - childEnvironmentName: string,
2497 ): null | ConsoleTask {
2498 if (!supportsCreateTask) {
2499 return null;
@@ -2504,6 +2503,10 @@ function initializeFakeTask(
2503 // If it's null, we can't initialize a task.
2504 return null;
2505 }
2506 + const cachedEntry = debugInfo.debugTask;
2507 + if (cachedEntry !== undefined) {
2508 + return cachedEntry;
2509 + }
2510
2511 // Workaround for a bug where Chrome Performance tracking uses the enclosing line/column
2512 // instead of the callsite. For ReactAsyncInfo/ReactIOInfo, the only thing we're going
@@ -2516,47 +2519,35 @@ function initializeFakeTask(
2519 const stack = debugInfo.stack;
2520 const env: string =
2521 debugInfo.env == null ? response._rootEnvironmentName : debugInfo.env;
2519 - if (env !== childEnvironmentName) {
2522 + const ownerEnv: string =
2523 + debugInfo.owner == null || debugInfo.owner.env == null
2524 + ? response._rootEnvironmentName
2525 + : debugInfo.owner.env;
2526 + const ownerTask =
2527 + debugInfo.owner == null
2528 + ? null
2529 + : initializeFakeTask(response, debugInfo.owner);
2530 + const taskName =
2531 // This is the boundary between two environments so we'll annotate the task name.
2521 - // That is unusual so we don't cache it.
2522 - const ownerTask =
2523 - debugInfo.owner == null
2524 - ? null
2525 - : initializeFakeTask(response, debugInfo.owner, env);
2526 - return buildFakeTask(
2527 - response,
2528 - ownerTask,
2529 - stack,
2530 - '"use ' + childEnvironmentName.toLowerCase() + '"',
2531 - env,
2532 - useEnclosingLine,
2533 - );
2534 - } else {
2535 - const cachedEntry = debugInfo.debugTask;
2536 - if (cachedEntry !== undefined) {
2537 - return cachedEntry;
2538 - }
2539 - const ownerTask =
2540 - debugInfo.owner == null
2541 - ? null
2542 - : initializeFakeTask(response, debugInfo.owner, env);
2543 - // Some unfortunate pattern matching to refine the type.
2544 - const taskName =
2545 - debugInfo.key !== undefined
2532 + // We assume that the stack frame of the entry into the new environment was done
2533 + // from the old environment. So we use the owner's environment as the current.
2534 + env !== ownerEnv
2535 + ? '"use ' + env.toLowerCase() + '"'
2536 + : // Some unfortunate pattern matching to refine the type.
2537 + debugInfo.key !== undefined
2538 ? getServerComponentTaskName(((debugInfo: any): ReactComponentInfo))
2539 : debugInfo.name !== undefined
2540 ? getIOInfoTaskName(((debugInfo: any): ReactIOInfo))
2541 : getAsyncInfoTaskName(((debugInfo: any): ReactAsyncInfo));
2550 - // $FlowFixMe[cannot-write]: We consider this part of initialization.
2551 - return (debugInfo.debugTask = buildFakeTask(
2552 - response,
2553 - ownerTask,
2554 - stack,
2555 - taskName,
2556 - env,
2557 - useEnclosingLine,
2558 - ));
2559 - }
2542 + // $FlowFixMe[cannot-write]: We consider this part of initialization.
2543 + return (debugInfo.debugTask = buildFakeTask(
2544 + response,
2545 + ownerTask,
2546 + stack,
2547 + taskName,
2548 + ownerEnv,
2549 + useEnclosingLine,
2550 + ));
2551 }
2552
2553 function buildFakeTask(
@@ -2658,27 +2649,30 @@ function resolveDebugInfo(
2649 'resolveDebugInfo should never be called in production mode. This is a bug in React.',
2650 );
2651 }
2661 - // We eagerly initialize the fake task because this resolving happens outside any
2662 - // render phase so we're not inside a user space stack at this point. If we waited
2663 - // to initialize it when we need it, we might be inside user code.
2664 - const env =
2665 - debugInfo.env === undefined ? response._rootEnvironmentName : debugInfo.env;
2652 if (debugInfo.stack !== undefined) {
2653 const componentInfoOrAsyncInfo: ReactComponentInfo | ReactAsyncInfo =
2654 // $FlowFixMe[incompatible-type]
2655 debugInfo;
2670 - initializeFakeTask(response, componentInfoOrAsyncInfo, env);
2656 + // We eagerly initialize the fake task because this resolving happens outside any
2657 + // render phase so we're not inside a user space stack at this point. If we waited
2658 + // to initialize it when we need it, we might be inside user code.
2659 + initializeFakeTask(response, componentInfoOrAsyncInfo);
2660 }
2672 - if (debugInfo.owner === null && response._debugRootOwner != null) {
2661 + if (debugInfo.owner == null && response._debugRootOwner != null) {
2662 const componentInfoOrAsyncInfo: ReactComponentInfo | ReactAsyncInfo =
2663 // $FlowFixMe: By narrowing `owner` to `null`, we narrowed `debugInfo` to `ReactComponentInfo`
2664 debugInfo;
2665 // $FlowFixMe[cannot-write]
2666 componentInfoOrAsyncInfo.owner = response._debugRootOwner;
2667 + // We clear the parsed stack frames to indicate that it needs to be re-parsed from debugStack.
2668 + // $FlowFixMe[cannot-write]
2669 + componentInfoOrAsyncInfo.stack = null;
2670 // We override the stack if we override the owner since the stack where the root JSX
2671 // was created on the server isn't very useful but where the request was made is.
2672 // $FlowFixMe[cannot-write]
2673 componentInfoOrAsyncInfo.debugStack = response._debugRootStack;
2674 + // $FlowFixMe[cannot-write]
2675 + componentInfoOrAsyncInfo.debugTask = response._debugRootTask;
2676 } else if (debugInfo.stack !== undefined) {
2677 const componentInfoOrAsyncInfo: ReactComponentInfo | ReactAsyncInfo =
2678 // $FlowFixMe[incompatible-type]
@@ -2738,7 +2732,7 @@ const replayConsoleWithCallStack = {
2732 bindToConsole(methodName, args, env),
2733 );
2734 if (owner != null) {
2741 - const task = initializeFakeTask(response, owner, env);
2735 + const task = initializeFakeTask(response, owner);
2736 initializeFakeStack(response, owner);
2737 if (task !== null) {
2738 task.run(callStack);
@@ -2812,10 +2806,8 @@ function resolveConsoleEntry(
2806 }
2807
2808 function initializeIOInfo(response: Response, ioInfo: ReactIOInfo): void {
2815 - const env =
2816 - ioInfo.env === undefined ? response._rootEnvironmentName : ioInfo.env;
2809 if (ioInfo.stack !== undefined) {
2818 - initializeFakeTask(response, ioInfo, env);
2810 + initializeFakeTask(response, ioInfo);
2811 initializeFakeStack(response, ioInfo);
2812 }
2813 // Adjust the time to the current environment's time space.
packages/react-client/src/__tests__/ReactFlight-test.js
-11
@@ -320,7 +320,6 @@ describe('ReactFlight', () => {
320 name: 'Greeting',
321 env: 'Server',
322 key: null,
323 - owner: null,
323 stack: ' in Object.<anonymous> (at **)',
324 props: {
325 firstName: 'Seb',
@@ -364,7 +363,6 @@ describe('ReactFlight', () => {
363 name: 'Greeting',
364 env: 'Server',
365 key: null,
367 - owner: null,
366 stack: ' in Object.<anonymous> (at **)',
367 props: {
368 firstName: 'Seb',
@@ -2812,7 +2810,6 @@ describe('ReactFlight', () => {
2810 name: 'ServerComponent',
2811 env: 'Server',
2812 key: null,
2815 - owner: null,
2813 stack: ' in Object.<anonymous> (at **)',
2814 props: {
2815 transport: expect.arrayContaining([]),
@@ -2834,7 +2831,6 @@ describe('ReactFlight', () => {
2831 name: 'ThirdPartyComponent',
2832 env: 'third-party',
2833 key: null,
2837 - owner: null,
2834 stack: ' in Object.<anonymous> (at **)',
2835 props: {},
2836 },
@@ -2851,7 +2847,6 @@ describe('ReactFlight', () => {
2847 name: 'ThirdPartyLazyComponent',
2848 env: 'third-party',
2849 key: null,
2854 - owner: null,
2850 stack: ' in myLazy (at **)\n in lazyInitializer (at **)',
2851 props: {},
2852 },
@@ -2867,7 +2862,6 @@ describe('ReactFlight', () => {
2862 name: 'ThirdPartyFragmentComponent',
2863 env: 'third-party',
2864 key: '3',
2870 - owner: null,
2865 stack: ' in Object.<anonymous> (at **)',
2866 props: {},
2867 },
@@ -2941,7 +2935,6 @@ describe('ReactFlight', () => {
2935 name: 'ServerComponent',
2936 env: 'Server',
2937 key: null,
2944 - owner: null,
2938 stack: ' in Object.<anonymous> (at **)',
2939 props: {
2940 transport: expect.arrayContaining([]),
@@ -2961,7 +2954,6 @@ describe('ReactFlight', () => {
2954 name: 'Keyed',
2955 env: 'Server',
2956 key: 'keyed',
2964 - owner: null,
2957 stack: ' in ServerComponent (at **)',
2958 props: {
2959 children: {},
@@ -2980,7 +2972,6 @@ describe('ReactFlight', () => {
2972 name: 'ThirdPartyAsyncIterableComponent',
2973 env: 'third-party',
2974 key: null,
2983 - owner: null,
2975 stack: ' in Object.<anonymous> (at **)',
2976 props: {},
2977 },
@@ -3137,7 +3128,6 @@ describe('ReactFlight', () => {
3128 name: 'Component',
3129 env: 'A',
3130 key: null,
3140 - owner: null,
3131 stack: ' in Object.<anonymous> (at **)',
3132 props: {},
3133 },
@@ -3325,7 +3315,6 @@ describe('ReactFlight', () => {
3315 name: 'Greeting',
3316 env: 'Server',
3317 key: null,
3328 - owner: null,
3318 stack: ' in Object.<anonymous> (at **)',
3319 props: {
3320 firstName: 'Seb',
packages/react-server-dom-webpack/src/__tests__/ReactFlightDOMBrowser-test.js
-2
@@ -708,7 +708,6 @@ describe('ReactFlightDOMBrowser', () => {
708 name: 'Server',
709 env: 'Server',
710 key: null,
711 - owner: null,
711 }),
712 }),
713 );
@@ -724,7 +723,6 @@ describe('ReactFlightDOMBrowser', () => {
723 name: 'Server',
724 env: 'Server',
725 key: null,
727 - owner: null,
726 }),
727 }),
728 );
packages/react-server-dom-webpack/src/__tests__/ReactFlightDOMEdge-test.js
-1
@@ -1190,7 +1190,6 @@ describe('ReactFlightDOMEdge', () => {
1190 const greetInfo = expect.objectContaining({
1191 name: 'Greeting',
1192 env: 'Server',
1193 - owner: null,
1193 });
1194 expect(lazyWrapper._debugInfo).toEqual([
1195 {time: 12},
packages/react-server/src/ReactFlightServer.js
+60 -15
@@ -3587,12 +3587,27 @@ function outlineComponentInfo(
3587 'debugTask' | 'debugStack',
3588 > = {
3589 name: componentInfo.name,
3590 - env: componentInfo.env,
3590 key: componentInfo.key,
3592 - owner: componentInfo.owner,
3591 };
3594 - // $FlowFixMe[cannot-write]
3595 - componentDebugInfo.stack = componentInfo.stack;
3592 + if (componentInfo.env != null) {
3593 + // $FlowFixMe[cannot-write]
3594 + componentDebugInfo.env = componentInfo.env;
3595 + }
3596 + if (componentInfo.owner != null) {
3597 + // $FlowFixMe[cannot-write]
3598 + componentDebugInfo.owner = componentInfo.owner;
3599 + }
3600 + if (componentInfo.stack == null && componentInfo.debugStack != null) {
3601 + // If we have a debugStack but no parsed stack we should parse it.
3602 + // $FlowFixMe[cannot-write]
3603 + componentDebugInfo.stack = filterStackTrace(
3604 + request,
3605 + parseStackTrace(componentInfo.debugStack, 1),
3606 + );
3607 + } else if (componentInfo.stack != null) {
3608 + // $FlowFixMe[cannot-write]
3609 + componentDebugInfo.stack = componentInfo.stack;
3610 + }
3611 // Ensure we serialize props after the stack to favor the stack being complete.
3612 // $FlowFixMe[cannot-write]
3613 componentDebugInfo.props = componentInfo.props;
@@ -3679,6 +3694,16 @@ function outlineIOInfo(request: Request, ioInfo: ReactIOInfo): void {
3694 if (owner != null) {
3695 outlineComponentInfo(request, owner);
3696 }
3697 + let debugStack;
3698 + if (ioInfo.stack == null && ioInfo.debugStack != null) {
3699 + // If we have a debugStack but no parsed stack we should parse it.
3700 + debugStack = filterStackTrace(
3701 + request,
3702 + parseStackTrace(ioInfo.debugStack, 1),
3703 + );
3704 + } else {
3705 + debugStack = ioInfo.stack;
3706 + }
3707 emitIOInfoChunk(
3708 request,
3709 id,
@@ -3687,7 +3712,7 @@ function outlineIOInfo(request: Request, ioInfo: ReactIOInfo): void {
3712 ioInfo.end,
3713 ioInfo.env,
3714 owner,
3690 - ioInfo.stack,
3715 + debugStack,
3716 );
3717 request.writtenObjects.set(ioInfo, serializeByValueID(id));
3718 }
@@ -4243,30 +4268,50 @@ function forwardDebugInfo(
4268 debugInfo: ReactDebugInfo,
4269 ) {
4270 for (let i = 0; i < debugInfo.length; i++) {
4246 - if (typeof debugInfo[i].time === 'number') {
4271 + const info = debugInfo[i];
4272 + if (typeof info.time === 'number') {
4273 // When forwarding time we need to ensure to convert it to the time space of the payload.
4248 - emitTimingChunk(request, id, debugInfo[i].time);
4274 + emitTimingChunk(request, id, info.time);
4275 } else {
4276 request.pendingChunks++;
4251 - if (typeof debugInfo[i].name === 'string') {
4277 + if (typeof info.name === 'string') {
4278 // We outline this model eagerly so that we can refer to by reference as an owner.
4279 // If we had a smarter way to dedupe we might not have to do this if there ends up
4280 // being no references to this as an owner.
4255 - outlineComponentInfo(request, (debugInfo[i]: any));
4281 + outlineComponentInfo(request, (info: any));
4282 // Emit a reference to the outlined one.
4257 - emitDebugChunk(request, id, debugInfo[i]);
4258 - } else if (debugInfo[i].awaited) {
4259 - const ioInfo = debugInfo[i].awaited;
4283 + emitDebugChunk(request, id, info);
4284 + } else if (info.awaited) {
4285 + const ioInfo = info.awaited;
4286 // Outline the IO info in case the same I/O is awaited in more than one place.
4287 outlineIOInfo(request, ioInfo);
4288 // We can't serialize the ConsoleTask/Error objects so we need to omit them before serializing.
4289 + let debugStack;
4290 + if (info.stack == null && info.debugStack != null) {
4291 + // If we have a debugStack but no parsed stack we should parse it.
4292 + debugStack = filterStackTrace(
4293 + request,
4294 + parseStackTrace(info.debugStack, 1),
4295 + );
4296 + } else {
4297 + debugStack = info.stack;
4298 + }
4299 const debugAsyncInfo: Omit<ReactAsyncInfo, 'debugTask' | 'debugStack'> =
4300 {
4301 awaited: ioInfo,
4266 - env: debugInfo[i].env,
4267 - owner: debugInfo[i].owner,
4268 - stack: debugInfo[i].stack,
4302 };
4303 + if (info.env != null) {
4304 + // $FlowFixMe[cannot-write]
4305 + debugAsyncInfo.env = info.env;
4306 + }
4307 + if (info.owner != null) {
4308 + // $FlowFixMe[cannot-write]
4309 + debugAsyncInfo.owner = info.owner;
4310 + }
4311 + if (debugStack != null) {
4312 + // $FlowFixMe[cannot-write]
4313 + debugAsyncInfo.stack = debugStack;
4314 + }
4315 emitDebugChunk(request, id, debugAsyncInfo);
4316 } else {
4317 emitDebugChunk(request, id, debugInfo[i]);
packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js
+38 -53
@@ -174,7 +174,6 @@ describe('ReactFlightAsyncDebugInfo', () => {
174 "env": "Server",
175 "key": null,
176 "name": "Component",
177 - "owner": null,
177 "props": {},
178 "stack": [
179 [
@@ -199,7 +198,6 @@ describe('ReactFlightAsyncDebugInfo', () => {
198 "env": "Server",
199 "key": null,
200 "name": "Component",
202 - "owner": null,
201 "props": {},
202 "stack": [
203 [
@@ -245,7 +243,6 @@ describe('ReactFlightAsyncDebugInfo', () => {
243 "env": "Server",
244 "key": null,
245 "name": "Component",
248 - "owner": null,
246 "props": {},
247 "stack": [
248 [
@@ -292,7 +289,6 @@ describe('ReactFlightAsyncDebugInfo', () => {
289 "env": "Server",
290 "key": null,
291 "name": "Component",
295 - "owner": null,
292 "props": {},
293 "stack": [
294 [
@@ -338,7 +334,6 @@ describe('ReactFlightAsyncDebugInfo', () => {
334 "env": "Server",
335 "key": null,
336 "name": "Component",
341 - "owner": null,
337 "props": {},
338 "stack": [
339 [
@@ -421,15 +416,14 @@ describe('ReactFlightAsyncDebugInfo', () => {
416 "env": "Server",
417 "key": null,
418 "name": "Component",
424 - "owner": null,
419 "props": {},
420 "stack": [
421 [
422 "Object.<anonymous>",
423 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
430 - 397,
424 + 392,
425 109,
432 - 384,
426 + 379,
427 67,
428 ],
429 ],
@@ -446,15 +440,14 @@ describe('ReactFlightAsyncDebugInfo', () => {
440 "env": "Server",
441 "key": null,
442 "name": "Component",
449 - "owner": null,
443 "props": {},
444 "stack": [
445 [
446 "Object.<anonymous>",
447 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
455 - 397,
448 + 392,
449 109,
457 - 384,
450 + 379,
451 67,
452 ],
453 ],
@@ -463,9 +456,9 @@ describe('ReactFlightAsyncDebugInfo', () => {
456 [
457 "Component",
458 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
466 - 387,
459 + 382,
460 7,
468 - 385,
461 + 380,
462 5,
463 ],
464 ],
@@ -520,15 +513,14 @@ describe('ReactFlightAsyncDebugInfo', () => {
513 "env": "Server",
514 "key": null,
515 "name": "Component",
523 - "owner": null,
516 "props": {},
517 "stack": [
518 [
519 "Object.<anonymous>",
520 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
529 - 496,
521 + 489,
522 109,
531 - 487,
523 + 480,
524 94,
525 ],
526 ],
@@ -592,15 +584,14 @@ describe('ReactFlightAsyncDebugInfo', () => {
584 "env": "Server",
585 "key": null,
586 "name": "Component",
595 - "owner": null,
587 "props": {},
588 "stack": [
589 [
590 "Object.<anonymous>",
591 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
601 - 568,
592 + 560,
593 109,
603 - 544,
594 + 536,
595 50,
596 ],
597 ],
@@ -675,15 +666,14 @@ describe('ReactFlightAsyncDebugInfo', () => {
666 "env": "Server",
667 "key": null,
668 "name": "Component",
678 - "owner": null,
669 "props": {},
670 "stack": [
671 [
672 "Object.<anonymous>",
673 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
684 - 651,
674 + 642,
675 109,
686 - 634,
676 + 625,
677 63,
678 ],
679 ],
@@ -695,7 +685,6 @@ describe('ReactFlightAsyncDebugInfo', () => {
685 "env": "third-party",
686 "key": null,
687 "name": "ThirdPartyComponent",
698 - "owner": null,
688 "props": {},
689 "stack": [
690 [
@@ -709,9 +698,9 @@ describe('ReactFlightAsyncDebugInfo', () => {
698 [
699 "Component",
700 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
712 - 647,
701 + 638,
702 24,
714 - 646,
703 + 637,
704 5,
705 ],
706 ],
@@ -728,7 +717,6 @@ describe('ReactFlightAsyncDebugInfo', () => {
717 "env": "third-party",
718 "key": null,
719 "name": "ThirdPartyComponent",
731 - "owner": null,
720 "props": {},
721 "stack": [
722 [
@@ -742,9 +730,9 @@ describe('ReactFlightAsyncDebugInfo', () => {
730 [
731 "Component",
732 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
745 - 647,
733 + 638,
734 24,
747 - 646,
735 + 637,
736 5,
737 ],
738 ],
@@ -761,17 +749,17 @@ describe('ReactFlightAsyncDebugInfo', () => {
749 [
750 "getData",
751 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
764 - 636,
752 + 627,
753 13,
766 - 635,
754 + 626,
755 5,
756 ],
757 [
758 "ThirdPartyComponent",
759 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
772 - 642,
760 + 633,
761 24,
774 - 641,
762 + 632,
763 5,
764 ],
765 ],
@@ -782,7 +770,6 @@ describe('ReactFlightAsyncDebugInfo', () => {
770 "env": "third-party",
771 "key": null,
772 "name": "ThirdPartyComponent",
785 - "owner": null,
773 "props": {},
774 "stack": [
775 [
@@ -796,9 +783,9 @@ describe('ReactFlightAsyncDebugInfo', () => {
783 [
784 "Component",
785 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
799 - 647,
786 + 638,
787 24,
801 - 646,
788 + 637,
789 5,
790 ],
791 ],
@@ -807,17 +794,17 @@ describe('ReactFlightAsyncDebugInfo', () => {
794 [
795 "getData",
796 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
810 - 636,
797 + 627,
798 13,
812 - 635,
799 + 626,
800 5,
801 ],
802 [
803 "ThirdPartyComponent",
804 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
818 - 642,
805 + 633,
806 24,
820 - 641,
807 + 632,
808 5,
809 ],
810 ],
@@ -837,7 +824,6 @@ describe('ReactFlightAsyncDebugInfo', () => {
824 "env": "third-party",
825 "key": null,
826 "name": "ThirdPartyComponent",
840 - "owner": null,
827 "props": {},
828 "stack": [
829 [
@@ -851,9 +837,9 @@ describe('ReactFlightAsyncDebugInfo', () => {
837 [
838 "Component",
839 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
854 - 647,
840 + 638,
841 24,
856 - 646,
842 + 637,
843 5,
844 ],
845 ],
@@ -870,17 +856,17 @@ describe('ReactFlightAsyncDebugInfo', () => {
856 [
857 "getData",
858 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
873 - 637,
859 + 628,
860 13,
875 - 635,
861 + 626,
862 5,
863 ],
864 [
865 "ThirdPartyComponent",
866 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
881 - 642,
867 + 633,
868 18,
883 - 641,
869 + 632,
870 5,
871 ],
872 ],
@@ -891,7 +877,6 @@ describe('ReactFlightAsyncDebugInfo', () => {
877 "env": "third-party",
878 "key": null,
879 "name": "ThirdPartyComponent",
894 - "owner": null,
880 "props": {},
881 "stack": [
882 [
@@ -905,9 +890,9 @@ describe('ReactFlightAsyncDebugInfo', () => {
890 [
891 "Component",
892 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
908 - 647,
893 + 638,
894 24,
910 - 646,
895 + 637,
896 5,
897 ],
898 ],
@@ -916,17 +901,17 @@ describe('ReactFlightAsyncDebugInfo', () => {
901 [
902 "getData",
903 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
919 - 637,
904 + 628,
905 13,
921 - 635,
906 + 626,
907 5,
908 ],
909 [
910 "ThirdPartyComponent",
911 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
927 - 642,
912 + 633,
913 18,
929 - 641,
914 + 632,
915 5,
916 ],
917 ],