@samitouri / QOS-React-1 / commits / f1ecf82bfb

[Flight] Optimize Async Stack Collection (#33727)

We need to optimize the collection of debug info for dev mode. This is an incredibly hot path since it instruments all I/O and Promises in the app. These optimizations focus primarily on the collection of stack traces. They are expensive to collect because we need to eagerly collect the stacks since they can otherwise cause memory leaks. We also need to do some of the processing of them up front. We also end up only using a few of them in the end but we don't know which ones we'll use. The first compromise here is that I now only collect the stacks of "awaits" if they were in a specific request's render. In some cases it's useful to collect them even outside of this if they're part of a sequence that started early. I still collect stacks for the created Promises outside of this though which can still provide some context. The other optimization to awaits, is that since we'll only use the inner most one that had an await directly in userspace, we can stop collecting stacks on a chain of awaits after we find one. This requires a quick filter on a single callsite to determine. Since we now only collect stacks from awaits that belongs to a specific Request we can use that request's specific filter option. Technically this might not be quite correct if that same thing ends up deduped across Requests but that's an edge case. Additionally, I now stop collecting stack for I/O nodes. They're almost always superseded by the Promise that wraps them anyway. Even if you write mostly Promise free code, you'll likely end up with a Promise at the root of the component eventually anyway and then you end up using its stack anyway. You have to really contort the code to end up with zero Promises at which point it's not very useful anyway. At best it's maybe mostly useful for giving a name to the I/O when the rest is just stuff like `new Promise`. However, a possible alternative optimization could be to *only* collect the stack of spawned I/O and not the stack of Promises. The issue with Promises (not awaits) is that we never know what will end up resolving them in the end when they're created so we have to always eagerly collect stacks. This could be an issue when you have a lot of abstractions that end up not actually be related to I/O at all. The issue with collecting stacks only for I/O is that the actual I/O can be pooled or batched so you end up not having the stack when the conceptual start of each operation within the batch started. Which is why I decided to keep the Promise stack.

Sebastian Markbåge committed Jul 8, 2025 at 10:49 UTC f1ecf82bfb5fdfa5d1c3aedcf114415fc29bd2da
4 files changed +237 -195
packages/react-server/src/ReactFlightAsyncSequence.js
+5 -5
@@ -26,7 +26,7 @@ type PromiseWithDebugInfo = interface extends Promise<any> {
26 export type IONode = {
27 tag: 0,
28 owner: null | ReactComponentInfo,
29 - stack: ReactStackTrace, // callsite that spawned the I/O
29 + stack: null, // callsite that spawned the I/O
30 start: number, // start time when the first part of the I/O sequence started
31 end: number, // we typically don't use this. only when there's no promise intermediate.
32 promise: null, // not used on I/O
@@ -37,7 +37,7 @@ export type IONode = {
37 export type PromiseNode = {
38 tag: 1,
39 owner: null | ReactComponentInfo,
40 - stack: ReactStackTrace, // callsite that created the Promise
40 + stack: null | ReactStackTrace, // callsite that created the Promise
41 start: number, // start time when the Promise was created
42 end: number, // end time when the Promise was resolved.
43 promise: WeakRef<PromiseWithDebugInfo>, // a reference to this Promise if still referenced
@@ -48,7 +48,7 @@ export type PromiseNode = {
48 export type AwaitNode = {
49 tag: 2,
50 owner: null | ReactComponentInfo,
51 - stack: ReactStackTrace, // callsite that awaited (using await, .then(), Promise.all(), ...)
51 + stack: null | ReactStackTrace, // callsite that awaited (using await, .then(), Promise.all(), ...)
52 start: number, // when we started blocking. This might be later than the I/O started.
53 end: number, // when we unblocked. This might be later than the I/O resolved if there's CPU time.
54 promise: WeakRef<PromiseWithDebugInfo>, // a reference to this Promise if still referenced
@@ -59,7 +59,7 @@ export type AwaitNode = {
59 export type UnresolvedPromiseNode = {
60 tag: 3,
61 owner: null | ReactComponentInfo,
62 - stack: ReactStackTrace, // callsite that created the Promise
62 + stack: null | ReactStackTrace, // callsite that created the Promise
63 start: number, // start time when the Promise was created
64 end: -1.1, // set when we resolve.
65 promise: WeakRef<PromiseWithDebugInfo>, // a reference to this Promise if still referenced
@@ -70,7 +70,7 @@ export type UnresolvedPromiseNode = {
70 export type UnresolvedAwaitNode = {
71 tag: 4,
72 owner: null | ReactComponentInfo,
73 - stack: ReactStackTrace, // callsite that awaited (using await, .then(), Promise.all(), ...)
73 + stack: null | ReactStackTrace, // callsite that awaited (using await, .then(), Promise.all(), ...)
74 start: number, // when we started blocking. This might be later than the I/O started.
75 end: -1.1, // set when we resolve.
76 promise: WeakRef<PromiseWithDebugInfo>, // a reference to this Promise if still referenced
packages/react-server/src/ReactFlightServer.js
+55 -31
@@ -251,6 +251,46 @@ function filterStackTrace(
251 return filteredStack;
252 }
253
254 +function hasUnfilteredFrame(request: Request, stack: ReactStackTrace): boolean {
255 + const filterStackFrame = request.filterStackFrame;
256 + for (let i = 0; i < stack.length; i++) {
257 + const callsite = stack[i];
258 + const functionName = callsite[0];
259 + const url = devirtualizeURL(callsite[1]);
260 + const lineNumber = callsite[2];
261 + const columnNumber = callsite[3];
262 + if (filterStackFrame(url, functionName, lineNumber, columnNumber)) {
263 + return true;
264 + }
265 + }
266 + return false;
267 +}
268 +
269 +export function isAwaitInUserspace(
270 + request: Request,
271 + stack: ReactStackTrace,
272 +): boolean {
273 + let firstFrame = 0;
274 + while (stack.length > firstFrame && stack[firstFrame][0] === 'Promise.then') {
275 + // Skip Promise.then frame itself.
276 + firstFrame++;
277 + }
278 + if (stack.length > firstFrame) {
279 + // Check if the very first stack frame that awaited this Promise was in user space.
280 + // TODO: This doesn't take into account wrapper functions such as our fake .then()
281 + // in FlightClient which will always be considered third party awaits if you call
282 + // .then directly.
283 + const filterStackFrame = request.filterStackFrame;
284 + const callsite = stack[firstFrame];
285 + const functionName = callsite[0];
286 + const url = devirtualizeURL(callsite[1]);
287 + const lineNumber = callsite[2];
288 + const columnNumber = callsite[3];
289 + return filterStackFrame(url, functionName, lineNumber, columnNumber);
290 + }
291 + return false;
292 +}
293 +
294 initAsyncDebugInfo();
295
296 function patchConsole(consoleInst: typeof console, methodName: string) {
@@ -2088,7 +2128,10 @@ function visitAsyncNode(
2128 // If the ioNode was a Promise, then that means we found one in user space since otherwise
2129 // we would've returned an IO node. We assume this has the best stack.
2130 match = ioNode;
2091 - } else if (filterStackTrace(request, node.stack).length === 0) {
2131 + } else if (
2132 + node.stack === null ||
2133 + !hasUnfilteredFrame(request, node.stack)
2134 + ) {
2135 // If this Promise was created inside only third party code, then try to use
2136 // the inner I/O node instead. This could happen if third party calls into first
2137 // party to perform some I/O.
@@ -2101,7 +2144,10 @@ function visitAsyncNode(
2144 // We aborted this render. If this Promise spanned the abort time it was probably the
2145 // Promise that was aborted. This won't necessarily have I/O associated with it but
2146 // it's a point of interest.
2104 - if (filterStackTrace(request, node.stack).length > 0) {
2147 + if (
2148 + node.stack !== null &&
2149 + hasUnfilteredFrame(request, node.stack)
2150 + ) {
2151 match = node;
2152 }
2153 }
@@ -2147,35 +2193,10 @@ function visitAsyncNode(
2193 // just part of a previous component's rendering.
2194 match = ioNode;
2195 } else {
2150 - let isAwaitInUserspace = false;
2151 - const fullStack = node.stack;
2152 - let firstFrame = 0;
2153 - while (
2154 - fullStack.length > firstFrame &&
2155 - fullStack[firstFrame][0] === 'Promise.then'
2196 + if (
2197 + node.stack === null ||
2198 + !isAwaitInUserspace(request, node.stack)
2199 ) {
2157 - // Skip Promise.then frame itself.
2158 - firstFrame++;
2159 - }
2160 - if (fullStack.length > firstFrame) {
2161 - // Check if the very first stack frame that awaited this Promise was in user space.
2162 - // TODO: This doesn't take into account wrapper functions such as our fake .then()
2163 - // in FlightClient which will always be considered third party awaits if you call
2164 - // .then directly.
2165 - const filterStackFrame = request.filterStackFrame;
2166 - const callsite = fullStack[firstFrame];
2167 - const functionName = callsite[0];
2168 - const url = devirtualizeURL(callsite[1]);
2169 - const lineNumber = callsite[2];
2170 - const columnNumber = callsite[3];
2171 - isAwaitInUserspace = filterStackFrame(
2172 - url,
2173 - functionName,
2174 - lineNumber,
2175 - columnNumber,
2176 - );
2177 - }
2178 - if (!isAwaitInUserspace) {
2200 // If this await was fully filtered out, then it was inside third party code
2201 // such as in an external library. We return the I/O node and try another await.
2202 match = ioNode;
@@ -2204,7 +2225,10 @@ function visitAsyncNode(
2225 awaited: ((ioNode: any): ReactIOInfo), // This is deduped by this reference.
2226 env: env,
2227 owner: node.owner,
2207 - stack: filterStackTrace(request, node.stack),
2228 + stack:
2229 + node.stack === null
2230 + ? null
2231 + : filterStackTrace(request, node.stack),
2232 });
2233 // Mark the end time of the await. If we're aborting then we don't emit this
2234 // to signal that this never resolved inside this render.
packages/react-server/src/ReactFlightServerConfigDebugNode.js
+31 -3
@@ -7,6 +7,8 @@
7 * @flow
8 */
9
10 +import type {ReactStackTrace} from 'shared/ReactTypes';
11 +
12 import type {
13 AsyncSequence,
14 IONode,
@@ -24,6 +26,7 @@ import {
26 UNRESOLVED_AWAIT_NODE,
27 } from './ReactFlightAsyncSequence';
28 import {resolveOwner} from './flight/ReactFlightCurrentOwner';
29 +import {resolveRequest, isAwaitInUserspace} from './ReactFlightServer';
30 import {createHook, executionAsyncId, AsyncResource} from 'async_hooks';
31 import {enableAsyncDebugInfo} from 'shared/ReactFeatureFlags';
32 import {parseStackTrace} from './ReactFlightServerConfig';
@@ -66,6 +69,8 @@ function resolvePromiseOrAwaitNode(
69 return resolvedNode;
70 }
71
72 +const emptyStack: ReactStackTrace = [];
73 +
74 // Initialize the tracing of async operations.
75 // We do this globally since the async work can potentially eagerly
76 // start before the first request and once requests start they can interleave.
@@ -110,10 +115,33 @@ export function initAsyncDebugInfo(): void {
115 }
116 // If the thing we're waiting on is another Await we still track that sequence
117 // so that we can later pick the best stack trace in user space.
118 + let stack = null;
119 + if (
120 + trigger.stack !== null &&
121 + (trigger.tag === AWAIT_NODE ||
122 + trigger.tag === UNRESOLVED_AWAIT_NODE)
123 + ) {
124 + // We already had a stack for an await. In a chain of awaits we'll only need one good stack.
125 + // We mark it with an empty stack to signal to any await on this await that we have a stack.
126 + stack = emptyStack;
127 + } else {
128 + const request = resolveRequest();
129 + if (request === null) {
130 + // We don't collect stacks for awaits that weren't in the scope of a specific render.
131 + } else {
132 + stack = parseStackTrace(new Error(), 5);
133 + if (!isAwaitInUserspace(request, stack)) {
134 + // If this await was not done directly in user space, then clear the stack. We won't use it
135 + // anyway. This lets future awaits on this await know that we still need to get their stacks
136 + // until we find one in user space.
137 + stack = null;
138 + }
139 + }
140 + }
141 node = ({
142 tag: UNRESOLVED_AWAIT_NODE,
143 owner: resolveOwner(),
116 - stack: parseStackTrace(new Error(), 5),
144 + stack: stack,
145 start: performance.now(),
146 end: -1.1, // set when resolved.
147 promise: new WeakRef((resource: Promise<any>)),
@@ -145,7 +173,7 @@ export function initAsyncDebugInfo(): void {
173 node = ({
174 tag: IO_NODE,
175 owner: resolveOwner(),
148 - stack: parseStackTrace(new Error(), 3), // This is only used if no native promises are used.
176 + stack: null,
177 start: performance.now(),
178 end: -1.1, // Only set when pinged.
179 promise: null,
@@ -160,7 +188,7 @@ export function initAsyncDebugInfo(): void {
188 node = ({
189 tag: IO_NODE,
190 owner: resolveOwner(),
163 - stack: parseStackTrace(new Error(), 3),
191 + stack: null,
192 start: performance.now(),
193 end: -1.1, // Only set when pinged.
194 promise: null,
packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js
+146 -156
@@ -805,7 +805,7 @@ describe('ReactFlightAsyncDebugInfo', () => {
805 }
806 });
807
808 - it('can track the start of I/O when no native promise is used', async () => {
808 + it('cannot currently track the start of I/O when no native promise is used', async () => {
809 function Component() {
810 const callbacks = [];
811 setTimeout(function timer() {
@@ -855,7 +855,7 @@ describe('ReactFlightAsyncDebugInfo', () => {
855 821,
856 109,
857 808,
858 - 67,
858 + 80,
859 ],
860 ],
861 },
@@ -863,7 +863,7 @@ describe('ReactFlightAsyncDebugInfo', () => {
863 "awaited": {
864 "end": 0,
865 "env": "Server",
866 - "name": "setTimeout",
866 + "name": "",
867 "owner": {
868 "env": "Server",
869 "key": null,
@@ -876,20 +876,10 @@ describe('ReactFlightAsyncDebugInfo', () => {
876 821,
877 109,
878 808,
879 - 67,
879 + 80,
880 ],
881 ],
882 },
883 - "stack": [
884 - [
885 - "Component",
886 - "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
887 - 811,
888 - 7,
889 - 809,
890 - 5,
891 - ],
892 - ],
883 "start": 0,
884 },
885 "env": "Server",
@@ -948,9 +938,9 @@ describe('ReactFlightAsyncDebugInfo', () => {
938 [
939 "Object.<anonymous>",
940 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
951 - 917,
941 + 907,
942 109,
953 - 908,
943 + 898,
944 94,
945 ],
946 ],
@@ -1021,9 +1011,9 @@ describe('ReactFlightAsyncDebugInfo', () => {
1011 [
1012 "Object.<anonymous>",
1013 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
1024 - 990,
1014 + 980,
1015 109,
1026 - 966,
1016 + 956,
1017 50,
1018 ],
1019 ],
@@ -1105,9 +1095,9 @@ describe('ReactFlightAsyncDebugInfo', () => {
1095 [
1096 "Object.<anonymous>",
1097 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
1108 - 1074,
1098 + 1064,
1099 109,
1110 - 1057,
1100 + 1047,
1101 63,
1102 ],
1103 ],
@@ -1132,9 +1122,9 @@ describe('ReactFlightAsyncDebugInfo', () => {
1122 [
1123 "Component",
1124 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
1135 - 1070,
1125 + 1060,
1126 24,
1137 - 1069,
1127 + 1059,
1128 5,
1129 ],
1130 ],
@@ -1164,9 +1154,9 @@ describe('ReactFlightAsyncDebugInfo', () => {
1154 [
1155 "Component",
1156 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
1167 - 1070,
1157 + 1060,
1158 24,
1169 - 1069,
1159 + 1059,
1160 5,
1161 ],
1162 ],
@@ -1183,17 +1173,17 @@ describe('ReactFlightAsyncDebugInfo', () => {
1173 [
1174 "getData",
1175 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
1186 - 1059,
1176 + 1049,
1177 13,
1188 - 1058,
1178 + 1048,
1179 5,
1180 ],
1181 [
1182 "ThirdPartyComponent",
1183 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
1194 - 1065,
1184 + 1055,
1185 24,
1196 - 1064,
1186 + 1054,
1187 5,
1188 ],
1189 ],
@@ -1220,9 +1210,9 @@ describe('ReactFlightAsyncDebugInfo', () => {
1210 [
1211 "Component",
1212 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
1223 - 1070,
1213 + 1060,
1214 24,
1225 - 1069,
1215 + 1059,
1216 5,
1217 ],
1218 ],
@@ -1231,17 +1221,17 @@ describe('ReactFlightAsyncDebugInfo', () => {
1221 [
1222 "getData",
1223 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
1234 - 1059,
1224 + 1049,
1225 13,
1236 - 1058,
1226 + 1048,
1227 5,
1228 ],
1229 [
1230 "ThirdPartyComponent",
1231 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
1242 - 1065,
1232 + 1055,
1233 24,
1244 - 1064,
1234 + 1054,
1235 5,
1236 ],
1237 ],
@@ -1274,9 +1264,9 @@ describe('ReactFlightAsyncDebugInfo', () => {
1264 [
1265 "Component",
1266 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
1277 - 1070,
1267 + 1060,
1268 24,
1279 - 1069,
1269 + 1059,
1270 5,
1271 ],
1272 ],
@@ -1293,17 +1283,17 @@ describe('ReactFlightAsyncDebugInfo', () => {
1283 [
1284 "getData",
1285 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
1296 - 1060,
1286 + 1050,
1287 13,
1298 - 1058,
1288 + 1048,
1289 5,
1290 ],
1291 [
1292 "ThirdPartyComponent",
1293 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
1304 - 1065,
1294 + 1055,
1295 18,
1306 - 1064,
1296 + 1054,
1297 5,
1298 ],
1299 ],
@@ -1330,9 +1320,9 @@ describe('ReactFlightAsyncDebugInfo', () => {
1320 [
1321 "Component",
1322 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
1333 - 1070,
1323 + 1060,
1324 24,
1335 - 1069,
1325 + 1059,
1326 5,
1327 ],
1328 ],
@@ -1341,17 +1331,17 @@ describe('ReactFlightAsyncDebugInfo', () => {
1331 [
1332 "getData",
1333 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
1344 - 1060,
1334 + 1050,
1335 13,
1346 - 1058,
1336 + 1048,
1337 5,
1338 ],
1339 [
1340 "ThirdPartyComponent",
1341 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
1352 - 1065,
1342 + 1055,
1343 18,
1354 - 1064,
1344 + 1054,
1345 5,
1346 ],
1347 ],
@@ -1426,9 +1416,9 @@ describe('ReactFlightAsyncDebugInfo', () => {
1416 [
1417 "Object.<anonymous>",
1418 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
1429 - 1390,
1419 + 1380,
1420 40,
1431 - 1373,
1421 + 1363,
1422 62,
1423 ],
1424 ],
@@ -1450,9 +1440,9 @@ describe('ReactFlightAsyncDebugInfo', () => {
1440 [
1441 "Object.<anonymous>",
1442 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
1453 - 1390,
1443 + 1380,
1444 40,
1455 - 1373,
1445 + 1363,
1446 62,
1447 ],
1448 ],
@@ -1469,17 +1459,17 @@ describe('ReactFlightAsyncDebugInfo', () => {
1459 [
1460 "getData",
1461 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
1472 - 1375,
1462 + 1365,
1463 13,
1474 - 1374,
1464 + 1364,
1465 25,
1466 ],
1467 [
1468 "Component",
1469 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
1480 - 1385,
1470 + 1375,
1471 13,
1482 - 1384,
1472 + 1374,
1473 5,
1474 ],
1475 ],
@@ -1498,9 +1488,9 @@ describe('ReactFlightAsyncDebugInfo', () => {
1488 [
1489 "Object.<anonymous>",
1490 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
1501 - 1390,
1491 + 1380,
1492 40,
1503 - 1373,
1493 + 1363,
1494 62,
1495 ],
1496 ],
@@ -1509,17 +1499,17 @@ describe('ReactFlightAsyncDebugInfo', () => {
1499 [
1500 "getData",
1501 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
1512 - 1375,
1502 + 1365,
1503 13,
1514 - 1374,
1504 + 1364,
1505 25,
1506 ],
1507 [
1508 "Component",
1509 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
1520 - 1385,
1510 + 1375,
1511 13,
1522 - 1384,
1512 + 1374,
1513 5,
1514 ],
1515 ],
@@ -1539,9 +1529,9 @@ describe('ReactFlightAsyncDebugInfo', () => {
1529 [
1530 "Component",
1531 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
1542 - 1386,
1532 + 1376,
1533 60,
1544 - 1384,
1534 + 1374,
1535 5,
1536 ],
1537 ],
@@ -1563,9 +1553,9 @@ describe('ReactFlightAsyncDebugInfo', () => {
1553 [
1554 "Object.<anonymous>",
1555 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
1566 - 1390,
1556 + 1380,
1557 40,
1568 - 1373,
1558 + 1363,
1559 62,
1560 ],
1561 ],
@@ -1582,17 +1572,17 @@ describe('ReactFlightAsyncDebugInfo', () => {
1572 [
1573 "getData",
1574 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
1585 - 1375,
1575 + 1365,
1576 13,
1587 - 1374,
1577 + 1364,
1578 25,
1579 ],
1580 [
1581 "Component",
1582 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
1593 - 1385,
1583 + 1375,
1584 13,
1595 - 1384,
1585 + 1374,
1586 5,
1587 ],
1588 ],
@@ -1611,9 +1601,9 @@ describe('ReactFlightAsyncDebugInfo', () => {
1601 [
1602 "Component",
1603 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
1614 - 1386,
1604 + 1376,
1605 60,
1616 - 1384,
1606 + 1374,
1607 5,
1608 ],
1609 ],
@@ -1622,9 +1612,9 @@ describe('ReactFlightAsyncDebugInfo', () => {
1612 [
1613 "Child",
1614 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
1625 - 1380,
1615 + 1370,
1616 28,
1627 - 1379,
1617 + 1369,
1618 5,
1619 ],
1620 ],
@@ -1695,9 +1685,9 @@ describe('ReactFlightAsyncDebugInfo', () => {
1685 [
1686 "Object.<anonymous>",
1687 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
1698 - 1659,
1688 + 1649,
1689 40,
1700 - 1643,
1690 + 1633,
1691 57,
1692 ],
1693 ],
@@ -1719,9 +1709,9 @@ describe('ReactFlightAsyncDebugInfo', () => {
1709 [
1710 "Object.<anonymous>",
1711 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
1722 - 1659,
1712 + 1649,
1713 40,
1724 - 1643,
1714 + 1633,
1715 57,
1716 ],
1717 ],
@@ -1738,17 +1728,17 @@ describe('ReactFlightAsyncDebugInfo', () => {
1728 [
1729 "getData",
1730 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
1741 - 1645,
1731 + 1635,
1732 13,
1743 - 1644,
1733 + 1634,
1734 25,
1735 ],
1736 [
1737 "Component",
1738 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
1749 - 1654,
1739 + 1644,
1740 23,
1751 - 1653,
1741 + 1643,
1742 5,
1743 ],
1744 ],
@@ -1767,9 +1757,9 @@ describe('ReactFlightAsyncDebugInfo', () => {
1757 [
1758 "Object.<anonymous>",
1759 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
1770 - 1659,
1760 + 1649,
1761 40,
1772 - 1643,
1762 + 1633,
1763 57,
1764 ],
1765 ],
@@ -1778,17 +1768,17 @@ describe('ReactFlightAsyncDebugInfo', () => {
1768 [
1769 "getData",
1770 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
1781 - 1645,
1771 + 1635,
1772 13,
1783 - 1644,
1773 + 1634,
1774 25,
1775 ],
1776 [
1777 "Component",
1778 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
1789 - 1654,
1779 + 1644,
1780 23,
1791 - 1653,
1781 + 1643,
1782 5,
1783 ],
1784 ],
@@ -1808,9 +1798,9 @@ describe('ReactFlightAsyncDebugInfo', () => {
1798 [
1799 "Component",
1800 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
1811 - 1655,
1801 + 1645,
1802 60,
1813 - 1653,
1803 + 1643,
1804 5,
1805 ],
1806 ],
@@ -1829,9 +1819,9 @@ describe('ReactFlightAsyncDebugInfo', () => {
1819 [
1820 "Object.<anonymous>",
1821 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
1832 - 1659,
1822 + 1649,
1823 40,
1834 - 1643,
1824 + 1633,
1825 57,
1826 ],
1827 ],
@@ -1848,17 +1838,17 @@ describe('ReactFlightAsyncDebugInfo', () => {
1838 [
1839 "getData",
1840 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
1851 - 1645,
1841 + 1635,
1842 13,
1853 - 1644,
1843 + 1634,
1844 25,
1845 ],
1846 [
1847 "Component",
1848 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
1859 - 1654,
1849 + 1644,
1850 23,
1861 - 1653,
1851 + 1643,
1852 5,
1853 ],
1854 ],
@@ -1937,9 +1927,9 @@ describe('ReactFlightAsyncDebugInfo', () => {
1927 [
1928 "Object.<anonymous>",
1929 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
1940 - 1901,
1930 + 1891,
1931 40,
1942 - 1883,
1932 + 1873,
1933 80,
1934 ],
1935 ],
@@ -1961,9 +1951,9 @@ describe('ReactFlightAsyncDebugInfo', () => {
1951 [
1952 "Object.<anonymous>",
1953 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
1964 - 1901,
1954 + 1891,
1955 40,
1966 - 1883,
1956 + 1873,
1957 80,
1958 ],
1959 ],
@@ -1980,17 +1970,17 @@ describe('ReactFlightAsyncDebugInfo', () => {
1970 [
1971 "delayTrice",
1972 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
1983 - 1891,
1973 + 1881,
1974 13,
1985 - 1889,
1975 + 1879,
1976 5,
1977 ],
1978 [
1979 "Bar",
1980 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
1991 - 1896,
1981 + 1886,
1982 13,
1993 - 1895,
1983 + 1885,
1984 5,
1985 ],
1986 ],
@@ -2009,9 +1999,9 @@ describe('ReactFlightAsyncDebugInfo', () => {
1999 [
2000 "Object.<anonymous>",
2001 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
2012 - 1901,
2002 + 1891,
2003 40,
2014 - 1883,
2004 + 1873,
2005 80,
2006 ],
2007 ],
@@ -2020,17 +2010,17 @@ describe('ReactFlightAsyncDebugInfo', () => {
2010 [
2011 "delayTrice",
2012 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
2023 - 1891,
2013 + 1881,
2014 13,
2025 - 1889,
2015 + 1879,
2016 5,
2017 ],
2018 [
2019 "Bar",
2020 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
2031 - 1896,
2021 + 1886,
2022 13,
2033 - 1895,
2023 + 1885,
2024 5,
2025 ],
2026 ],
@@ -2052,9 +2042,9 @@ describe('ReactFlightAsyncDebugInfo', () => {
2042 [
2043 "Object.<anonymous>",
2044 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
2055 - 1901,
2045 + 1891,
2046 40,
2057 - 1883,
2047 + 1873,
2048 80,
2049 ],
2050 ],
@@ -2071,25 +2061,25 @@ describe('ReactFlightAsyncDebugInfo', () => {
2061 [
2062 "delayTwice",
2063 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
2074 - 1885,
2064 + 1875,
2065 13,
2076 - 1884,
2066 + 1874,
2067 5,
2068 ],
2069 [
2070 "delayTrice",
2071 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
2082 - 1890,
2072 + 1880,
2073 15,
2084 - 1889,
2074 + 1879,
2075 5,
2076 ],
2077 [
2078 "Bar",
2079 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
2090 - 1896,
2080 + 1886,
2081 13,
2092 - 1895,
2082 + 1885,
2083 5,
2084 ],
2085 ],
@@ -2108,9 +2098,9 @@ describe('ReactFlightAsyncDebugInfo', () => {
2098 [
2099 "Object.<anonymous>",
2100 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
2111 - 1901,
2101 + 1891,
2102 40,
2113 - 1883,
2103 + 1873,
2104 80,
2105 ],
2106 ],
@@ -2119,25 +2109,25 @@ describe('ReactFlightAsyncDebugInfo', () => {
2109 [
2110 "delayTwice",
2111 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
2122 - 1885,
2112 + 1875,
2113 13,
2124 - 1884,
2114 + 1874,
2115 5,
2116 ],
2117 [
2118 "delayTrice",
2119 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
2130 - 1890,
2120 + 1880,
2121 15,
2132 - 1889,
2122 + 1879,
2123 5,
2124 ],
2125 [
2126 "Bar",
2127 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
2138 - 1896,
2128 + 1886,
2129 13,
2140 - 1895,
2130 + 1885,
2131 5,
2132 ],
2133 ],
@@ -2159,9 +2149,9 @@ describe('ReactFlightAsyncDebugInfo', () => {
2149 [
2150 "Object.<anonymous>",
2151 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
2162 - 1901,
2152 + 1891,
2153 40,
2164 - 1883,
2154 + 1873,
2155 80,
2156 ],
2157 ],
@@ -2178,9 +2168,9 @@ describe('ReactFlightAsyncDebugInfo', () => {
2168 [
2169 "delayTwice",
2170 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
2181 - 1886,
2171 + 1876,
2172 13,
2183 - 1884,
2173 + 1874,
2174 5,
2175 ],
2176 ],
@@ -2199,9 +2189,9 @@ describe('ReactFlightAsyncDebugInfo', () => {
2189 [
2190 "Object.<anonymous>",
2191 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
2202 - 1901,
2192 + 1891,
2193 40,
2204 - 1883,
2194 + 1873,
2195 80,
2196 ],
2197 ],
@@ -2210,9 +2200,9 @@ describe('ReactFlightAsyncDebugInfo', () => {
2200 [
2201 "delayTwice",
2202 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
2213 - 1886,
2203 + 1876,
2204 13,
2215 - 1884,
2205 + 1874,
2206 5,
2207 ],
2208 ],
@@ -2273,9 +2263,9 @@ describe('ReactFlightAsyncDebugInfo', () => {
2263 [
2264 "Object.<anonymous>",
2265 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
2276 - 2242,
2266 + 2232,
2267 109,
2278 - 2231,
2268 + 2221,
2269 58,
2270 ],
2271 ],
@@ -2297,9 +2287,9 @@ describe('ReactFlightAsyncDebugInfo', () => {
2287 [
2288 "Object.<anonymous>",
2289 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
2300 - 2242,
2290 + 2232,
2291 109,
2302 - 2231,
2292 + 2221,
2293 58,
2294 ],
2295 ],
@@ -2316,17 +2306,17 @@ describe('ReactFlightAsyncDebugInfo', () => {
2306 [
2307 "getData",
2308 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
2319 - 2233,
2309 + 2223,
2310 14,
2321 - 2232,
2311 + 2222,
2312 5,
2313 ],
2314 [
2315 "Component",
2316 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
2327 - 2239,
2317 + 2229,
2318 20,
2329 - 2238,
2319 + 2228,
2320 5,
2321 ],
2322 ],
@@ -2345,9 +2335,9 @@ describe('ReactFlightAsyncDebugInfo', () => {
2335 [
2336 "Object.<anonymous>",
2337 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
2348 - 2242,
2338 + 2232,
2339 109,
2350 - 2231,
2340 + 2221,
2341 58,
2342 ],
2343 ],
@@ -2356,17 +2346,17 @@ describe('ReactFlightAsyncDebugInfo', () => {
2346 [
2347 "getData",
2348 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
2359 - 2233,
2349 + 2223,
2350 23,
2361 - 2232,
2351 + 2222,
2352 5,
2353 ],
2354 [
2355 "Component",
2356 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
2367 - 2239,
2357 + 2229,
2358 20,
2369 - 2238,
2359 + 2228,
2360 5,
2361 ],
2362 ],
@@ -2433,9 +2423,9 @@ describe('ReactFlightAsyncDebugInfo', () => {
2423 [
2424 "Object.<anonymous>",
2425 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
2436 - 2397,
2426 + 2387,
2427 40,
2438 - 2385,
2428 + 2375,
2429 56,
2430 ],
2431 ],
@@ -2457,9 +2447,9 @@ describe('ReactFlightAsyncDebugInfo', () => {
2447 [
2448 "Object.<anonymous>",
2449 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
2460 - 2397,
2450 + 2387,
2451 40,
2462 - 2385,
2452 + 2375,
2453 56,
2454 ],
2455 ],
@@ -2476,9 +2466,9 @@ describe('ReactFlightAsyncDebugInfo', () => {
2466 [
2467 "Component",
2468 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
2479 - 2393,
2469 + 2383,
2470 20,
2481 - 2392,
2471 + 2382,
2472 5,
2473 ],
2474 ],
@@ -2497,9 +2487,9 @@ describe('ReactFlightAsyncDebugInfo', () => {
2487 [
2488 "Object.<anonymous>",
2489 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
2500 - 2397,
2490 + 2387,
2491 40,
2502 - 2385,
2492 + 2375,
2493 56,
2494 ],
2495 ],
@@ -2508,9 +2498,9 @@ describe('ReactFlightAsyncDebugInfo', () => {
2498 [
2499 "Component",
2500 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
2511 - 2393,
2501 + 2383,
2502 20,
2513 - 2392,
2503 + 2382,
2504 5,
2505 ],
2506 ],