@samitouri / QOS-React / commits / cf993fb457

[Flight] Fix stack overflow in `visitAsyncNode` with deep async chains (#35612)

Database libraries like Gel/EdgeDB can create very long linear chains of async sequences through temporal async sequencing in connection pools. The recursive traversal of `node.previous` chains in `visitAsyncNode` causes stack overflow on these deep chains. The fix converts the `previous` chain traversal from recursive to iterative. We collect the chain into an array, then process from deepest to shallowest. The `awaited` traversal remains recursive since its depth is bounded by promise dependency depth, not by the number of event loop turns. Each `awaited` branch still benefits from the iterative `previous` handling within its own traversal. I've verified that this fixes the [repro](https://github.com/jere-co/next-debug) provided in #35246. closes #35246

Hendrik Liebau committed Feb 4, 2026 at 19:43 UTC cf993fb457417e0f20535b1fd42c3f45df966583
2 files changed +566 -317
packages/react-server/src/ReactFlightServer.js
+47 -29
@@ -2345,19 +2345,53 @@ function visitAsyncNode(
2345 >,
2346 cutOff: number,
2347 ): void | null | PromiseNode | IONode {
2348 - if (visited.has(node)) {
2349 - // It's possible to visit them same node twice when it's part of both an "awaited" path
2350 - // and a "previous" path. This also gracefully handles cycles which would be a bug.
2351 - return visited.get(node);
2352 - }
2353 - // Set it as visited early in case we see ourselves before returning.
2354 - visited.set(node, null);
2355 - const result = visitAsyncNodeImpl(request, task, node, visited, cutOff);
2356 - if (result !== null) {
2357 - // If we ended up with a value, let's use that value for future visits.
2358 - visited.set(node, result);
2348 + // Collect the previous chain iteratively instead of recursively to avoid
2349 + // stack overflow on deep chains. We process from deepest to shallowest so
2350 + // each node has its previousIONode available.
2351 + const chain: Array<AsyncSequence> = [];
2352 + let current: AsyncSequence | null = node;
2353 +
2354 + while (current !== null) {
2355 + if (visited.has(current)) {
2356 + break;
2357 + }
2358 + chain.push(current);
2359 + current = current.previous;
2360 }
2360 - return result;
2361 +
2362 + let previousIONode: void | null | PromiseNode | IONode =
2363 + current !== null ? visited.get(current) : null;
2364 +
2365 + // Process from deepest to shallowest (reverse order).
2366 + for (let i = chain.length - 1; i >= 0; i--) {
2367 + const n = chain[i];
2368 + // Set it as visited early in case we see the node again before returning.
2369 + visited.set(n, null);
2370 +
2371 + const result = visitAsyncNodeImpl(
2372 + request,
2373 + task,
2374 + n,
2375 + visited,
2376 + cutOff,
2377 + previousIONode,
2378 + );
2379 +
2380 + if (result !== null) {
2381 + // If we ended up with a value, let's use that value for future visits.
2382 + visited.set(n, result);
2383 + }
2384 +
2385 + if (result === undefined) {
2386 + // Undefined is used as a signal that we found a suitable aborted node
2387 + // and we don't have to find further aborted nodes.
2388 + return undefined;
2389 + }
2390 +
2391 + previousIONode = result;
2392 + }
2393 +
2394 + return previousIONode;
2395 }
2396
2397 function visitAsyncNodeImpl(
@@ -2369,6 +2403,7 @@ function visitAsyncNodeImpl(
2403 void | null | PromiseNode | IONode,
2404 >,
2405 cutOff: number,
2406 + previousIONode: void | null | PromiseNode | IONode,
2407 ): void | null | PromiseNode | IONode {
2408 if (node.end >= 0 && node.end <= request.timeOrigin) {
2409 // This was already resolved when we started this render. It must have been either something
@@ -2377,23 +2412,6 @@ function visitAsyncNodeImpl(
2412 return null;
2413 }
2414
2380 - let previousIONode: void | null | PromiseNode | IONode = null;
2381 - // First visit anything that blocked this sequence to start in the first place.
2382 - if (node.previous !== null) {
2383 - previousIONode = visitAsyncNode(
2384 - request,
2385 - task,
2386 - node.previous,
2387 - visited,
2388 - cutOff,
2389 - );
2390 - if (previousIONode === undefined) {
2391 - // Undefined is used as a signal that we found a suitable aborted node and we don't have to find
2392 - // further aborted nodes.
2393 - return undefined;
2394 - }
2395 - }
2396 -
2415 // `found` represents the return value of the following switch statement.
2416 // We can't use multiple `return` statements in the switch statement
2417 // since that prevents Closure compiler from inlining `visitAsyncImpl`
packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js
+519 -288
@@ -5,6 +5,7 @@
5
6 import {patchSetImmediate} from '../../../../scripts/jest/patchSetImmediate';
7
8 +import crypto from 'crypto';
9 import fs from 'fs/promises';
10 import path from 'path';
11
@@ -160,9 +161,9 @@ describe('ReactFlightAsyncDebugInfo', () => {
161 [
162 "Object.<anonymous>",
163 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
163 - 129,
164 + 130,
165 + 109,
166 109,
165 - 108,
167 50,
168 ],
169 ],
@@ -184,9 +185,9 @@ describe('ReactFlightAsyncDebugInfo', () => {
185 [
186 "Object.<anonymous>",
187 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
187 - 129,
188 + 130,
189 + 109,
190 109,
189 - 108,
191 50,
192 ],
193 ],
@@ -195,25 +196,25 @@ describe('ReactFlightAsyncDebugInfo', () => {
196 [
197 "delay",
198 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
198 - 86,
199 + 87,
200 12,
200 - 85,
201 + 86,
202 3,
203 ],
204 [
205 "getData",
206 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
206 - 110,
207 + 111,
208 13,
208 - 109,
209 + 110,
210 5,
211 ],
212 [
213 "Component",
214 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
214 - 118,
215 + 119,
216 26,
216 - 117,
217 + 118,
218 5,
219 ],
220 ],
@@ -232,9 +233,9 @@ describe('ReactFlightAsyncDebugInfo', () => {
233 [
234 "Object.<anonymous>",
235 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
235 - 129,
236 + 130,
237 + 109,
238 109,
237 - 108,
239 50,
240 ],
241 ],
@@ -243,17 +244,17 @@ describe('ReactFlightAsyncDebugInfo', () => {
244 [
245 "getData",
246 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
246 - 110,
247 + 111,
248 13,
248 - 109,
249 + 110,
250 5,
251 ],
252 [
253 "Component",
254 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
254 - 118,
255 + 119,
256 26,
256 - 117,
257 + 118,
258 5,
259 ],
260 ],
@@ -278,9 +279,9 @@ describe('ReactFlightAsyncDebugInfo', () => {
279 [
280 "Object.<anonymous>",
281 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
281 - 129,
282 + 130,
283 + 109,
284 109,
283 - 108,
285 50,
286 ],
287 ],
@@ -289,25 +290,25 @@ describe('ReactFlightAsyncDebugInfo', () => {
290 [
291 "delay",
292 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
292 - 86,
293 + 87,
294 12,
294 - 85,
295 + 86,
296 3,
297 ],
298 [
299 "getData",
300 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
300 - 111,
301 + 112,
302 21,
302 - 109,
303 + 110,
304 5,
305 ],
306 [
307 "Component",
308 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
308 - 118,
309 + 119,
310 20,
310 - 117,
311 + 118,
312 5,
313 ],
314 ],
@@ -326,9 +327,9 @@ describe('ReactFlightAsyncDebugInfo', () => {
327 [
328 "Object.<anonymous>",
329 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
329 - 129,
330 + 130,
331 + 109,
332 109,
331 - 108,
333 50,
334 ],
335 ],
@@ -337,17 +338,17 @@ describe('ReactFlightAsyncDebugInfo', () => {
338 [
339 "getData",
340 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
340 - 113,
341 + 114,
342 21,
342 - 109,
343 + 110,
344 5,
345 ],
346 [
347 "Component",
348 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
348 - 118,
349 + 119,
350 20,
350 - 117,
351 + 118,
352 5,
353 ],
354 ],
@@ -367,9 +368,9 @@ describe('ReactFlightAsyncDebugInfo', () => {
368 [
369 "Component",
370 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
370 - 120,
371 + 121,
372 60,
372 - 117,
373 + 118,
374 5,
375 ],
376 ],
@@ -391,9 +392,9 @@ describe('ReactFlightAsyncDebugInfo', () => {
392 [
393 "Object.<anonymous>",
394 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
394 - 129,
395 + 130,
396 + 109,
397 109,
396 - 108,
398 50,
399 ],
400 ],
@@ -402,17 +403,17 @@ describe('ReactFlightAsyncDebugInfo', () => {
403 [
404 "delay",
405 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
405 - 86,
406 + 87,
407 12,
407 - 85,
408 + 86,
409 3,
410 ],
411 [
412 "getData",
413 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
413 - 111,
414 + 112,
415 21,
415 - 109,
416 + 110,
417 5,
418 ],
419 ],
@@ -431,9 +432,9 @@ describe('ReactFlightAsyncDebugInfo', () => {
432 [
433 "Component",
434 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
434 - 120,
435 + 121,
436 60,
436 - 117,
437 + 118,
438 5,
439 ],
440 ],
@@ -442,9 +443,9 @@ describe('ReactFlightAsyncDebugInfo', () => {
443 [
444 "InnerComponent",
445 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
445 - 126,
446 + 127,
447 35,
447 - 123,
448 + 124,
449 5,
450 ],
451 ],
@@ -625,9 +626,9 @@ describe('ReactFlightAsyncDebugInfo', () => {
626 [
627 "Object.<anonymous>",
628 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
628 - 589,
629 + 590,
630 40,
630 - 570,
631 + 571,
632 49,
633 ],
634 [
@@ -657,9 +658,9 @@ describe('ReactFlightAsyncDebugInfo', () => {
658 [
659 "Object.<anonymous>",
660 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
660 - 589,
661 + 590,
662 40,
662 - 570,
663 + 571,
664 49,
665 ],
666 [
@@ -676,25 +677,25 @@ describe('ReactFlightAsyncDebugInfo', () => {
677 [
678 "delay",
679 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
679 - 86,
680 + 87,
681 12,
681 - 85,
682 + 86,
683 3,
684 ],
685 [
686 "getData",
687 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
687 - 572,
688 + 573,
689 13,
689 - 571,
690 + 572,
691 5,
692 ],
693 [
694 "Component",
695 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
695 - 577,
696 + 578,
697 36,
697 - 576,
698 + 577,
699 5,
700 ],
701 ],
@@ -713,9 +714,9 @@ describe('ReactFlightAsyncDebugInfo', () => {
714 [
715 "Object.<anonymous>",
716 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
716 - 589,
717 + 590,
718 40,
718 - 570,
719 + 571,
720 49,
721 ],
722 [
@@ -732,17 +733,17 @@ describe('ReactFlightAsyncDebugInfo', () => {
733 [
734 "getData",
735 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
735 - 572,
736 + 573,
737 13,
737 - 571,
738 + 572,
739 5,
740 ],
741 [
742 "Component",
743 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
743 - 577,
744 + 578,
745 36,
745 - 576,
746 + 577,
747 5,
748 ],
749 ],
@@ -762,9 +763,9 @@ describe('ReactFlightAsyncDebugInfo', () => {
763 [
764 "Component",
765 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
765 - 579,
766 + 580,
767 60,
767 - 576,
768 + 577,
769 5,
770 ],
771 ],
@@ -783,9 +784,9 @@ describe('ReactFlightAsyncDebugInfo', () => {
784 [
785 "Object.<anonymous>",
786 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
786 - 589,
787 + 590,
788 40,
788 - 570,
789 + 571,
790 49,
791 ],
792 [
@@ -802,25 +803,25 @@ describe('ReactFlightAsyncDebugInfo', () => {
803 [
804 "delay",
805 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
805 - 86,
806 + 87,
807 12,
807 - 85,
808 + 86,
809 3,
810 ],
811 [
812 "getData",
813 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
813 - 572,
814 + 573,
815 13,
815 - 571,
816 + 572,
817 5,
818 ],
819 [
820 "Component",
821 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
821 - 578,
822 + 579,
823 22,
823 - 576,
824 + 577,
825 5,
826 ],
827 ],
@@ -839,9 +840,9 @@ describe('ReactFlightAsyncDebugInfo', () => {
840 [
841 "Component",
842 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
842 - 579,
843 + 580,
844 60,
844 - 576,
845 + 577,
846 5,
847 ],
848 ],
@@ -850,9 +851,9 @@ describe('ReactFlightAsyncDebugInfo', () => {
851 [
852 "InnerComponent",
853 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
853 - 585,
854 + 586,
855 40,
855 - 582,
856 + 583,
857 5,
858 ],
859 ],
@@ -927,9 +928,9 @@ describe('ReactFlightAsyncDebugInfo', () => {
928 [
929 "Object.<anonymous>",
930 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
930 - 896,
931 + 897,
932 109,
932 - 883,
933 + 884,
934 80,
935 ],
936 ],
@@ -948,9 +949,9 @@ describe('ReactFlightAsyncDebugInfo', () => {
949 [
950 "Object.<anonymous>",
951 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
951 - 896,
952 + 897,
953 109,
953 - 883,
954 + 884,
955 80,
956 ],
957 ],
@@ -967,9 +968,9 @@ describe('ReactFlightAsyncDebugInfo', () => {
968 [
969 "Object.<anonymous>",
970 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
970 - 896,
971 + 897,
972 109,
972 - 883,
973 + 884,
974 80,
975 ],
976 ],
@@ -1041,9 +1042,9 @@ describe('ReactFlightAsyncDebugInfo', () => {
1042 [
1043 "Object.<anonymous>",
1044 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
1044 - 1010,
1045 + 1011,
1046 109,
1046 - 1001,
1047 + 1002,
1048 94,
1049 ],
1050 ],
@@ -1114,9 +1115,9 @@ describe('ReactFlightAsyncDebugInfo', () => {
1115 [
1116 "Object.<anonymous>",
1117 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
1117 - 1083,
1118 + 1084,
1119 109,
1119 - 1059,
1120 + 1060,
1121 50,
1122 ],
1123 ],
@@ -1198,9 +1199,9 @@ describe('ReactFlightAsyncDebugInfo', () => {
1199 [
1200 "Object.<anonymous>",
1201 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
1201 - 1167,
1202 + 1168,
1203 109,
1203 - 1150,
1204 + 1151,
1205 63,
1206 ],
1207 ],
@@ -1217,17 +1218,17 @@ describe('ReactFlightAsyncDebugInfo', () => {
1218 [
1219 "fetchThirdParty",
1220 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
1220 - 93,
1221 + 94,
1222 40,
1222 - 91,
1223 + 92,
1224 3,
1225 ],
1226 [
1227 "Component",
1228 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
1228 - 1163,
1229 + 1164,
1230 24,
1230 - 1162,
1231 + 1163,
1232 5,
1233 ],
1234 ],
@@ -1249,17 +1250,17 @@ describe('ReactFlightAsyncDebugInfo', () => {
1250 [
1251 "fetchThirdParty",
1252 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
1252 - 93,
1253 + 94,
1254 40,
1254 - 91,
1255 + 92,
1256 3,
1257 ],
1258 [
1259 "Component",
1260 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
1260 - 1163,
1261 + 1164,
1262 24,
1262 - 1162,
1263 + 1163,
1264 5,
1265 ],
1266 ],
@@ -1268,25 +1269,25 @@ describe('ReactFlightAsyncDebugInfo', () => {
1269 [
1270 "delay",
1271 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
1271 - 86,
1272 + 87,
1273 12,
1273 - 85,
1274 + 86,
1275 3,
1276 ],
1277 [
1278 "getData",
1279 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
1279 - 1152,
1280 + 1153,
1281 13,
1281 - 1151,
1282 + 1152,
1283 5,
1284 ],
1285 [
1286 "ThirdPartyComponent",
1287 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
1287 - 1158,
1288 + 1159,
1289 24,
1289 - 1157,
1290 + 1158,
1291 5,
1292 ],
1293 ],
@@ -1305,17 +1306,17 @@ describe('ReactFlightAsyncDebugInfo', () => {
1306 [
1307 "fetchThirdParty",
1308 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
1308 - 93,
1309 + 94,
1310 40,
1310 - 91,
1311 + 92,
1312 3,
1313 ],
1314 [
1315 "Component",
1316 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
1316 - 1163,
1317 + 1164,
1318 24,
1318 - 1162,
1319 + 1163,
1320 5,
1321 ],
1322 ],
@@ -1324,17 +1325,17 @@ describe('ReactFlightAsyncDebugInfo', () => {
1325 [
1326 "getData",
1327 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
1327 - 1152,
1328 + 1153,
1329 13,
1329 - 1151,
1330 + 1152,
1331 5,
1332 ],
1333 [
1334 "ThirdPartyComponent",
1335 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
1335 - 1158,
1336 + 1159,
1337 24,
1337 - 1157,
1338 + 1158,
1339 5,
1340 ],
1341 ],
@@ -1359,17 +1360,17 @@ describe('ReactFlightAsyncDebugInfo', () => {
1360 [
1361 "fetchThirdParty",
1362 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
1362 - 93,
1363 + 94,
1364 40,
1364 - 91,
1365 + 92,
1366 3,
1367 ],
1368 [
1369 "Component",
1370 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
1370 - 1163,
1371 + 1164,
1372 24,
1372 - 1162,
1373 + 1163,
1374 5,
1375 ],
1376 ],
@@ -1378,25 +1379,25 @@ describe('ReactFlightAsyncDebugInfo', () => {
1379 [
1380 "delay",
1381 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
1381 - 86,
1382 + 87,
1383 12,
1383 - 85,
1384 + 86,
1385 3,
1386 ],
1387 [
1388 "getData",
1389 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
1389 - 1153,
1390 + 1154,
1391 13,
1391 - 1151,
1392 + 1152,
1393 5,
1394 ],
1395 [
1396 "ThirdPartyComponent",
1397 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
1397 - 1158,
1398 + 1159,
1399 18,
1399 - 1157,
1400 + 1158,
1401 5,
1402 ],
1403 ],
@@ -1415,17 +1416,17 @@ describe('ReactFlightAsyncDebugInfo', () => {
1416 [
1417 "fetchThirdParty",
1418 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
1418 - 93,
1419 + 94,
1420 40,
1420 - 91,
1421 + 92,
1422 3,
1423 ],
1424 [
1425 "Component",
1426 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
1426 - 1163,
1427 + 1164,
1428 24,
1428 - 1162,
1429 + 1163,
1430 5,
1431 ],
1432 ],
@@ -1434,17 +1435,17 @@ describe('ReactFlightAsyncDebugInfo', () => {
1435 [
1436 "getData",
1437 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
1437 - 1153,
1438 + 1154,
1439 13,
1439 - 1151,
1440 + 1152,
1441 5,
1442 ],
1443 [
1444 "ThirdPartyComponent",
1445 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
1445 - 1158,
1446 + 1159,
1447 18,
1447 - 1157,
1448 + 1158,
1449 5,
1450 ],
1451 ],
@@ -1544,9 +1545,9 @@ describe('ReactFlightAsyncDebugInfo', () => {
1545 [
1546 "Object.<anonymous>",
1547 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
1547 - 1508,
1548 + 1509,
1549 40,
1549 - 1491,
1550 + 1492,
1551 62,
1552 ],
1553 [
@@ -1576,9 +1577,9 @@ describe('ReactFlightAsyncDebugInfo', () => {
1577 [
1578 "Object.<anonymous>",
1579 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
1579 - 1508,
1580 + 1509,
1581 40,
1581 - 1491,
1582 + 1492,
1583 62,
1584 ],
1585 [
@@ -1595,25 +1596,25 @@ describe('ReactFlightAsyncDebugInfo', () => {
1596 [
1597 "delay",
1598 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
1598 - 86,
1599 + 87,
1600 12,
1600 - 85,
1601 + 86,
1602 3,
1603 ],
1604 [
1605 "getData",
1606 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
1606 - 1493,
1607 + 1494,
1608 13,
1608 - 1492,
1609 + 1493,
1610 25,
1611 ],
1612 [
1613 "Component",
1614 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
1614 - 1503,
1615 + 1504,
1616 13,
1616 - 1502,
1617 + 1503,
1618 5,
1619 ],
1620 ],
@@ -1632,9 +1633,9 @@ describe('ReactFlightAsyncDebugInfo', () => {
1633 [
1634 "Object.<anonymous>",
1635 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
1635 - 1508,
1636 + 1509,
1637 40,
1637 - 1491,
1638 + 1492,
1639 62,
1640 ],
1641 [
@@ -1651,17 +1652,17 @@ describe('ReactFlightAsyncDebugInfo', () => {
1652 [
1653 "getData",
1654 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
1654 - 1493,
1655 + 1494,
1656 13,
1656 - 1492,
1657 + 1493,
1658 25,
1659 ],
1660 [
1661 "Component",
1662 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
1662 - 1503,
1663 + 1504,
1664 13,
1664 - 1502,
1665 + 1503,
1666 5,
1667 ],
1668 ],
@@ -1681,9 +1682,9 @@ describe('ReactFlightAsyncDebugInfo', () => {
1682 [
1683 "Component",
1684 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
1684 - 1504,
1685 + 1505,
1686 60,
1686 - 1502,
1687 + 1503,
1688 5,
1689 ],
1690 ],
@@ -1705,9 +1706,9 @@ describe('ReactFlightAsyncDebugInfo', () => {
1706 [
1707 "Object.<anonymous>",
1708 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
1708 - 1508,
1709 + 1509,
1710 40,
1710 - 1491,
1711 + 1492,
1712 62,
1713 ],
1714 [
@@ -1724,25 +1725,25 @@ describe('ReactFlightAsyncDebugInfo', () => {
1725 [
1726 "delay",
1727 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
1727 - 86,
1728 + 87,
1729 12,
1729 - 85,
1730 + 86,
1731 3,
1732 ],
1733 [
1734 "getData",
1735 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
1735 - 1493,
1736 + 1494,
1737 13,
1737 - 1492,
1738 + 1493,
1739 25,
1740 ],
1741 [
1742 "Component",
1743 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
1743 - 1503,
1744 + 1504,
1745 13,
1745 - 1502,
1746 + 1503,
1747 5,
1748 ],
1749 ],
@@ -1761,9 +1762,9 @@ describe('ReactFlightAsyncDebugInfo', () => {
1762 [
1763 "Component",
1764 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
1764 - 1504,
1765 + 1505,
1766 60,
1766 - 1502,
1767 + 1503,
1768 5,
1769 ],
1770 ],
@@ -1772,9 +1773,9 @@ describe('ReactFlightAsyncDebugInfo', () => {
1773 [
1774 "Child",
1775 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
1775 - 1498,
1776 + 1499,
1777 28,
1777 - 1497,
1778 + 1498,
1779 5,
1780 ],
1781 ],
@@ -1857,9 +1858,9 @@ describe('ReactFlightAsyncDebugInfo', () => {
1858 [
1859 "Object.<anonymous>",
1860 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
1860 - 1821,
1861 + 1822,
1862 40,
1862 - 1805,
1863 + 1806,
1864 57,
1865 ],
1866 [
@@ -1889,9 +1890,9 @@ describe('ReactFlightAsyncDebugInfo', () => {
1890 [
1891 "Object.<anonymous>",
1892 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
1892 - 1821,
1893 + 1822,
1894 40,
1894 - 1805,
1895 + 1806,
1896 57,
1897 ],
1898 [
@@ -1908,25 +1909,25 @@ describe('ReactFlightAsyncDebugInfo', () => {
1909 [
1910 "delay",
1911 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
1911 - 86,
1912 + 87,
1913 12,
1913 - 85,
1914 + 86,
1915 3,
1916 ],
1917 [
1918 "getData",
1919 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
1919 - 1807,
1920 + 1808,
1921 13,
1921 - 1806,
1922 + 1807,
1923 25,
1924 ],
1925 [
1926 "Component",
1927 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
1927 - 1816,
1928 + 1817,
1929 23,
1929 - 1815,
1930 + 1816,
1931 5,
1932 ],
1933 ],
@@ -1945,9 +1946,9 @@ describe('ReactFlightAsyncDebugInfo', () => {
1946 [
1947 "Object.<anonymous>",
1948 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
1948 - 1821,
1949 + 1822,
1950 40,
1950 - 1805,
1951 + 1806,
1952 57,
1953 ],
1954 [
@@ -1964,17 +1965,17 @@ describe('ReactFlightAsyncDebugInfo', () => {
1965 [
1966 "getData",
1967 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
1967 - 1807,
1968 + 1808,
1969 13,
1969 - 1806,
1970 + 1807,
1971 25,
1972 ],
1973 [
1974 "Component",
1975 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
1975 - 1816,
1976 + 1817,
1977 23,
1977 - 1815,
1978 + 1816,
1979 5,
1980 ],
1981 ],
@@ -1994,9 +1995,9 @@ describe('ReactFlightAsyncDebugInfo', () => {
1995 [
1996 "Component",
1997 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
1997 - 1817,
1998 + 1818,
1999 60,
1999 - 1815,
2000 + 1816,
2001 5,
2002 ],
2003 ],
@@ -2015,9 +2016,9 @@ describe('ReactFlightAsyncDebugInfo', () => {
2016 [
2017 "Object.<anonymous>",
2018 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
2018 - 1821,
2019 + 1822,
2020 40,
2020 - 1805,
2021 + 1806,
2022 57,
2023 ],
2024 [
@@ -2034,25 +2035,25 @@ describe('ReactFlightAsyncDebugInfo', () => {
2035 [
2036 "delay",
2037 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
2037 - 86,
2038 + 87,
2039 12,
2039 - 85,
2040 + 86,
2041 3,
2042 ],
2043 [
2044 "getData",
2045 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
2045 - 1807,
2046 + 1808,
2047 13,
2047 - 1806,
2048 + 1807,
2049 25,
2050 ],
2051 [
2052 "Component",
2053 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
2053 - 1816,
2054 + 1817,
2055 23,
2055 - 1815,
2056 + 1816,
2057 5,
2058 ],
2059 ],
@@ -2066,9 +2067,9 @@ describe('ReactFlightAsyncDebugInfo', () => {
2067 [
2068 "Component",
2069 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
2069 - 1817,
2070 + 1818,
2071 60,
2071 - 1815,
2072 + 1816,
2073 5,
2074 ],
2075 ],
@@ -2153,9 +2154,9 @@ describe('ReactFlightAsyncDebugInfo', () => {
2154 [
2155 "Object.<anonymous>",
2156 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
2156 - 2117,
2157 + 2118,
2158 40,
2158 - 2099,
2159 + 2100,
2160 80,
2161 ],
2162 [
@@ -2185,9 +2186,9 @@ describe('ReactFlightAsyncDebugInfo', () => {
2186 [
2187 "Object.<anonymous>",
2188 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
2188 - 2117,
2189 + 2118,
2190 40,
2190 - 2099,
2191 + 2100,
2192 80,
2193 ],
2194 [
@@ -2204,25 +2205,25 @@ describe('ReactFlightAsyncDebugInfo', () => {
2205 [
2206 "delay",
2207 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
2207 - 86,
2208 + 87,
2209 12,
2209 - 85,
2210 + 86,
2211 3,
2212 ],
2213 [
2214 "delayTrice",
2215 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
2215 - 2107,
2216 + 2108,
2217 13,
2217 - 2105,
2218 + 2106,
2219 5,
2220 ],
2221 [
2222 "Bar",
2223 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
2223 - 2112,
2224 + 2113,
2225 13,
2225 - 2111,
2226 + 2112,
2227 5,
2228 ],
2229 ],
@@ -2241,9 +2242,9 @@ describe('ReactFlightAsyncDebugInfo', () => {
2242 [
2243 "Object.<anonymous>",
2244 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
2244 - 2117,
2245 + 2118,
2246 40,
2246 - 2099,
2247 + 2100,
2248 80,
2249 ],
2250 [
@@ -2260,17 +2261,17 @@ describe('ReactFlightAsyncDebugInfo', () => {
2261 [
2262 "delayTrice",
2263 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
2263 - 2107,
2264 + 2108,
2265 13,
2265 - 2105,
2266 + 2106,
2267 5,
2268 ],
2269 [
2270 "Bar",
2271 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
2271 - 2112,
2272 + 2113,
2273 13,
2273 - 2111,
2274 + 2112,
2275 5,
2276 ],
2277 ],
@@ -2292,9 +2293,9 @@ describe('ReactFlightAsyncDebugInfo', () => {
2293 [
2294 "Object.<anonymous>",
2295 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
2295 - 2117,
2296 + 2118,
2297 40,
2297 - 2099,
2298 + 2100,
2299 80,
2300 ],
2301 [
@@ -2311,33 +2312,33 @@ describe('ReactFlightAsyncDebugInfo', () => {
2312 [
2313 "delay",
2314 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
2314 - 86,
2315 + 87,
2316 12,
2316 - 85,
2317 + 86,
2318 3,
2319 ],
2320 [
2321 "delayTwice",
2322 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
2322 - 2101,
2323 + 2102,
2324 13,
2324 - 2100,
2325 + 2101,
2326 5,
2327 ],
2328 [
2329 "delayTrice",
2330 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
2330 - 2106,
2331 + 2107,
2332 15,
2332 - 2105,
2333 + 2106,
2334 5,
2335 ],
2336 [
2337 "Bar",
2338 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
2338 - 2112,
2339 + 2113,
2340 13,
2340 - 2111,
2341 + 2112,
2342 5,
2343 ],
2344 ],
@@ -2356,9 +2357,9 @@ describe('ReactFlightAsyncDebugInfo', () => {
2357 [
2358 "Object.<anonymous>",
2359 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
2359 - 2117,
2360 + 2118,
2361 40,
2361 - 2099,
2362 + 2100,
2363 80,
2364 ],
2365 [
@@ -2375,25 +2376,25 @@ describe('ReactFlightAsyncDebugInfo', () => {
2376 [
2377 "delayTwice",
2378 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
2378 - 2101,
2379 + 2102,
2380 13,
2380 - 2100,
2381 + 2101,
2382 5,
2383 ],
2384 [
2385 "delayTrice",
2386 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
2386 - 2106,
2387 + 2107,
2388 15,
2388 - 2105,
2389 + 2106,
2390 5,
2391 ],
2392 [
2393 "Bar",
2394 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
2394 - 2112,
2395 + 2113,
2396 13,
2396 - 2111,
2397 + 2112,
2398 5,
2399 ],
2400 ],
@@ -2415,9 +2416,9 @@ describe('ReactFlightAsyncDebugInfo', () => {
2416 [
2417 "Object.<anonymous>",
2418 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
2418 - 2117,
2419 + 2118,
2420 40,
2420 - 2099,
2421 + 2100,
2422 80,
2423 ],
2424 [
@@ -2434,17 +2435,17 @@ describe('ReactFlightAsyncDebugInfo', () => {
2435 [
2436 "delay",
2437 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
2437 - 86,
2438 + 87,
2439 12,
2439 - 85,
2440 + 86,
2441 3,
2442 ],
2443 [
2444 "delayTwice",
2445 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
2445 - 2102,
2446 + 2103,
2447 13,
2447 - 2100,
2448 + 2101,
2449 5,
2450 ],
2451 ],
@@ -2463,9 +2464,9 @@ describe('ReactFlightAsyncDebugInfo', () => {
2464 [
2465 "Object.<anonymous>",
2466 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
2466 - 2117,
2467 + 2118,
2468 40,
2468 - 2099,
2469 + 2100,
2470 80,
2471 ],
2472 [
@@ -2482,9 +2483,9 @@ describe('ReactFlightAsyncDebugInfo', () => {
2483 [
2484 "delayTwice",
2485 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
2485 - 2102,
2486 + 2103,
2487 13,
2487 - 2100,
2488 + 2101,
2489 5,
2490 ],
2491 ],
@@ -2557,9 +2558,9 @@ describe('ReactFlightAsyncDebugInfo', () => {
2558 [
2559 "Object.<anonymous>",
2560 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
2560 - 2526,
2561 + 2527,
2562 109,
2562 - 2515,
2563 + 2516,
2564 58,
2565 ],
2566 ],
@@ -2581,9 +2582,9 @@ describe('ReactFlightAsyncDebugInfo', () => {
2582 [
2583 "Object.<anonymous>",
2584 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
2584 - 2526,
2585 + 2527,
2586 109,
2586 - 2515,
2587 + 2516,
2588 58,
2589 ],
2590 ],
@@ -2592,25 +2593,25 @@ describe('ReactFlightAsyncDebugInfo', () => {
2593 [
2594 "delay",
2595 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
2595 - 86,
2596 + 87,
2597 12,
2597 - 85,
2598 + 86,
2599 3,
2600 ],
2601 [
2602 "getData",
2603 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
2603 - 2517,
2604 + 2518,
2605 14,
2605 - 2516,
2606 + 2517,
2607 5,
2608 ],
2609 [
2610 "Component",
2611 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
2611 - 2523,
2612 + 2524,
2613 20,
2613 - 2522,
2614 + 2523,
2615 5,
2616 ],
2617 ],
@@ -2629,9 +2630,9 @@ describe('ReactFlightAsyncDebugInfo', () => {
2630 [
2631 "Object.<anonymous>",
2632 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
2632 - 2526,
2633 + 2527,
2634 109,
2634 - 2515,
2635 + 2516,
2636 58,
2637 ],
2638 ],
@@ -2640,17 +2641,17 @@ describe('ReactFlightAsyncDebugInfo', () => {
2641 [
2642 "getData",
2643 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
2643 - 2517,
2644 + 2518,
2645 23,
2645 - 2516,
2646 + 2517,
2647 5,
2648 ],
2649 [
2650 "Component",
2651 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
2651 - 2523,
2652 + 2524,
2653 20,
2653 - 2522,
2654 + 2523,
2655 5,
2656 ],
2657 ],
@@ -2729,9 +2730,9 @@ describe('ReactFlightAsyncDebugInfo', () => {
2730 [
2731 "Object.<anonymous>",
2732 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
2732 - 2693,
2733 + 2694,
2734 40,
2734 - 2681,
2735 + 2682,
2736 56,
2737 ],
2738 [
@@ -2761,9 +2762,9 @@ describe('ReactFlightAsyncDebugInfo', () => {
2762 [
2763 "Object.<anonymous>",
2764 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
2764 - 2693,
2765 + 2694,
2766 40,
2766 - 2681,
2767 + 2682,
2768 56,
2769 ],
2770 [
@@ -2780,17 +2781,17 @@ describe('ReactFlightAsyncDebugInfo', () => {
2781 [
2782 "delay",
2783 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
2783 - 86,
2784 + 87,
2785 12,
2785 - 85,
2786 + 86,
2787 3,
2788 ],
2789 [
2790 "Component",
2791 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
2791 - 2689,
2792 + 2690,
2793 20,
2793 - 2688,
2794 + 2689,
2795 5,
2796 ],
2797 ],
@@ -2809,9 +2810,9 @@ describe('ReactFlightAsyncDebugInfo', () => {
2810 [
2811 "Object.<anonymous>",
2812 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
2812 - 2693,
2813 + 2694,
2814 40,
2814 - 2681,
2815 + 2682,
2816 56,
2817 ],
2818 [
@@ -2828,9 +2829,9 @@ describe('ReactFlightAsyncDebugInfo', () => {
2829 [
2830 "Component",
2831 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
2831 - 2689,
2832 + 2690,
2833 20,
2833 - 2688,
2834 + 2689,
2835 5,
2836 ],
2837 ],
@@ -2923,9 +2924,9 @@ describe('ReactFlightAsyncDebugInfo', () => {
2924 [
2925 "Object.<anonymous>",
2926 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
2926 - 2882,
2927 + 2883,
2928 40,
2928 - 2861,
2929 + 2862,
2930 42,
2931 ],
2932 [
@@ -2955,9 +2956,9 @@ describe('ReactFlightAsyncDebugInfo', () => {
2956 [
2957 "Object.<anonymous>",
2958 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
2958 - 2882,
2959 + 2883,
2960 40,
2960 - 2861,
2961 + 2862,
2962 42,
2963 ],
2964 [
@@ -2974,17 +2975,17 @@ describe('ReactFlightAsyncDebugInfo', () => {
2975 [
2976 "",
2977 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
2977 - 2868,
2978 + 2869,
2979 15,
2979 - 2867,
2980 + 2868,
2981 15,
2982 ],
2983 [
2984 "Component",
2985 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
2985 - 2877,
2986 + 2878,
2987 19,
2987 - 2876,
2988 + 2877,
2989 5,
2990 ],
2991 ],
@@ -3003,9 +3004,9 @@ describe('ReactFlightAsyncDebugInfo', () => {
3004 [
3005 "Object.<anonymous>",
3006 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
3006 - 2882,
3007 + 2883,
3008 40,
3008 - 2861,
3009 + 2862,
3010 42,
3011 ],
3012 [
@@ -3022,17 +3023,17 @@ describe('ReactFlightAsyncDebugInfo', () => {
3023 [
3024 "",
3025 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
3025 - 2868,
3026 + 2869,
3027 15,
3027 - 2867,
3028 + 2868,
3029 15,
3030 ],
3031 [
3032 "Component",
3033 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
3033 - 2877,
3034 + 2878,
3035 19,
3035 - 2876,
3036 + 2877,
3037 5,
3038 ],
3039 ],
@@ -3054,9 +3055,9 @@ describe('ReactFlightAsyncDebugInfo', () => {
3055 [
3056 "Object.<anonymous>",
3057 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
3057 - 2882,
3058 + 2883,
3059 40,
3059 - 2861,
3060 + 2862,
3061 42,
3062 ],
3063 [
@@ -3073,9 +3074,9 @@ describe('ReactFlightAsyncDebugInfo', () => {
3074 [
3075 "Component",
3076 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
3076 - 2877,
3077 + 2878,
3078 25,
3078 - 2876,
3079 + 2877,
3080 5,
3081 ],
3082 ],
@@ -3094,9 +3095,9 @@ describe('ReactFlightAsyncDebugInfo', () => {
3095 [
3096 "Object.<anonymous>",
3097 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
3097 - 2882,
3098 + 2883,
3099 40,
3099 - 2861,
3100 + 2862,
3101 42,
3102 ],
3103 [
@@ -3113,9 +3114,9 @@ describe('ReactFlightAsyncDebugInfo', () => {
3114 [
3115 "Component",
3116 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
3116 - 2877,
3117 + 2878,
3118 25,
3118 - 2876,
3119 + 2877,
3120 5,
3121 ],
3122 ],
@@ -3191,9 +3192,9 @@ describe('ReactFlightAsyncDebugInfo', () => {
3192 [
3193 "Object.<anonymous>",
3194 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
3194 - 3158,
3195 + 3159,
3196 19,
3196 - 3146,
3197 + 3147,
3198 36,
3199 ],
3200 ],
@@ -3215,9 +3216,9 @@ describe('ReactFlightAsyncDebugInfo', () => {
3216 [
3217 "Object.<anonymous>",
3218 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
3218 - 3158,
3219 + 3159,
3220 19,
3220 - 3146,
3221 + 3147,
3222 36,
3223 ],
3224 ],
@@ -3226,9 +3227,9 @@ describe('ReactFlightAsyncDebugInfo', () => {
3227 [
3228 "Component",
3229 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
3229 - 3150,
3230 + 3151,
3231 7,
3231 - 3148,
3232 + 3149,
3233 5,
3234 ],
3235 ],
@@ -3247,9 +3248,9 @@ describe('ReactFlightAsyncDebugInfo', () => {
3248 [
3249 "Object.<anonymous>",
3250 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
3250 - 3158,
3251 + 3159,
3252 19,
3252 - 3146,
3253 + 3147,
3254 36,
3255 ],
3256 ],
@@ -3258,9 +3259,9 @@ describe('ReactFlightAsyncDebugInfo', () => {
3259 [
3260 "Component",
3261 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
3261 - 3152,
3262 + 3153,
3263 7,
3263 - 3148,
3264 + 3149,
3265 5,
3266 ],
3267 ],
@@ -3385,9 +3386,9 @@ describe('ReactFlightAsyncDebugInfo', () => {
3386 [
3387 "Component",
3388 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
3388 - 3303,
3389 + 3304,
3390 20,
3390 - 3302,
3391 + 3303,
3392 5,
3393 ],
3394 ],
@@ -3402,4 +3403,234 @@ describe('ReactFlightAsyncDebugInfo', () => {
3403 `);
3404 }
3405 });
3406 +
3407 + // Regression test: Database clients like Gel/EdgeDB with connection pools can
3408 + // create very long chains of async nodes linked via `previous` pointers.
3409 + // visitAsyncNode must handle chains of thousands of nodes without stack
3410 + // overflow.
3411 + //
3412 + // The pattern that creates deep chains (Event/messageWaiter):
3413 + // 1. Create a Promise resolved by an I/O callback
3414 + // 2. Start I/O, await the Promise
3415 + // 3. When I/O resolves, code continues in the callback context
3416 + // 4. The next iteration's async nodes link via `previous` to the current
3417 + // context
3418 + it('handles deep linear async chains from connection pool patterns', async () => {
3419 + // Replicate Gel's Event class pattern, a Promise resolved externally by I/O
3420 + class Event {
3421 + constructor() {
3422 + this._resolve = null;
3423 + this._promise = new Promise(resolve => {
3424 + this._resolve = resolve;
3425 + });
3426 + }
3427 +
3428 + wait() {
3429 + return this._promise;
3430 + }
3431 +
3432 + set() {
3433 + this._resolve(true);
3434 + }
3435 + }
3436 +
3437 + // Replicate Gel's _waitForMessage pattern:
3438 + // Each iteration creates an Event, schedules I/O to resolve it, and awaits.
3439 + // The next iteration runs in the context of the previous I/O callback,
3440 + // creating linear chains of previous pointers.
3441 + async function buildLinearChain(depth) {
3442 + for (let i = 0; i < depth; i++) {
3443 + const event = new Event();
3444 + // crypto.randomBytes uses the thread pool and is recognized as I/O
3445 + // (type='RANDOMBYTESREQUEST'). It's much faster than setTimeout.
3446 + crypto.randomBytes(1, () => event.set());
3447 + await event.wait();
3448 + // After this await resolves, we're in the crypto callback's context
3449 + // The next Event will be created in this context, linking prev pointers
3450 + }
3451 + }
3452 +
3453 + async function Component() {
3454 + // Use 2000 iterations to ensure regression would be caught. Using
3455 + // crypto.randomBytes keeps the test fast.
3456 + await buildLinearChain(2000);
3457 + return 'done';
3458 + }
3459 +
3460 + const stream = ReactServerDOMServer.renderToPipeableStream(
3461 + <Component />,
3462 + {},
3463 + {
3464 + filterStackFrame: (filename, functionName) => {
3465 + // Custom filter that treats Event and buildLinearChain as library
3466 + // code. This simulates how real DB libraries like Gel/EdgeDB would be
3467 + // filtered.
3468 + if (
3469 + functionName === 'new Event' ||
3470 + functionName === 'buildLinearChain' ||
3471 + functionName === '_loop' // Generated name for the for-loop
3472 + ) {
3473 + return false;
3474 + }
3475 + return filterStackFrame(filename, functionName);
3476 + },
3477 + },
3478 + );
3479 +
3480 + const readable = new Stream.PassThrough(streamOptions);
3481 +
3482 + const result = ReactServerDOMClient.createFromNodeStream(readable, {
3483 + moduleMap: {},
3484 + moduleLoading: {},
3485 + });
3486 + stream.pipe(readable);
3487 +
3488 + // This should not throw "Maximum call stack size exceeded"
3489 + expect(await result).toBe('done');
3490 +
3491 + await finishLoadingStream(readable);
3492 + if (
3493 + __DEV__ &&
3494 + gate(
3495 + flags =>
3496 + flags.enableComponentPerformanceTrack && flags.enableAsyncDebugInfo,
3497 + )
3498 + ) {
3499 + // With library code filtered out, we should only see the Component's
3500 + // debug info, not thousands of entries from the internal
3501 + // Event/buildLinearChain operations.
3502 + expect(getDebugInfo(result)).toMatchInlineSnapshot(`
3503 + [
3504 + {
3505 + "time": 0,
3506 + },
3507 + {
3508 + "env": "Server",
3509 + "key": null,
3510 + "name": "Component",
3511 + "props": {},
3512 + "stack": [
3513 + [
3514 + "Object.<anonymous>",
3515 + "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
3516 + 3461,
3517 + 40,
3518 + 3418,
3519 + 72,
3520 + ],
3521 + [
3522 + "new Promise",
3523 + "",
3524 + 0,
3525 + 0,
3526 + 0,
3527 + 0,
3528 + ],
3529 + ],
3530 + },
3531 + {
3532 + "time": 0,
3533 + },
3534 + {
3535 + "awaited": {
3536 + "end": 0,
3537 + "env": "Server",
3538 + "name": "buildLinearChain",
3539 + "owner": {
3540 + "env": "Server",
3541 + "key": null,
3542 + "name": "Component",
3543 + "props": {},
3544 + "stack": [
3545 + [
3546 + "Object.<anonymous>",
3547 + "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
3548 + 3461,
3549 + 40,
3550 + 3418,
3551 + 72,
3552 + ],
3553 + [
3554 + "new Promise",
3555 + "",
3556 + 0,
3557 + 0,
3558 + 0,
3559 + 0,
3560 + ],
3561 + ],
3562 + },
3563 + "stack": [
3564 + [
3565 + "Component",
3566 + "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
3567 + 3456,
3568 + 13,
3569 + 3453,
3570 + 5,
3571 + ],
3572 + ],
3573 + "start": 0,
3574 + "value": {
3575 + "value": undefined,
3576 + },
3577 + },
3578 + "env": "Server",
3579 + "owner": {
3580 + "env": "Server",
3581 + "key": null,
3582 + "name": "Component",
3583 + "props": {},
3584 + "stack": [
3585 + [
3586 + "Object.<anonymous>",
3587 + "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
3588 + 3461,
3589 + 40,
3590 + 3418,
3591 + 72,
3592 + ],
3593 + [
3594 + "new Promise",
3595 + "",
3596 + 0,
3597 + 0,
3598 + 0,
3599 + 0,
3600 + ],
3601 + ],
3602 + },
3603 + "stack": [
3604 + [
3605 + "Component",
3606 + "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
3607 + 3456,
3608 + 13,
3609 + 3453,
3610 + 5,
3611 + ],
3612 + ],
3613 + },
3614 + {
3615 + "time": 0,
3616 + },
3617 + {
3618 + "time": 0,
3619 + },
3620 + {
3621 + "awaited": {
3622 + "byteSize": 0,
3623 + "end": 0,
3624 + "name": "rsc stream",
3625 + "owner": null,
3626 + "start": 0,
3627 + "value": {
3628 + "value": "stream",
3629 + },
3630 + },
3631 + },
3632 + ]
3633 + `);
3634 + }
3635 + });
3636 });