@samitouri / QOS-React / commits / 0378b46e7e

[Flight] Include I/O not awaited in user space (#33715)

If I/O is not awaited in user space in a "previous" path we used to just drop it on the floor. There's a few strategies we could apply here. My first commit just emits it without an await but that would mean we don't have an await stack when there's no I/O in a follow up. I went with a strategy where the "previous" I/O is used only if the "next" didn't have I/O. This may still drop I/O on the floor if there's two back to back within internals for example. It would only log the first one even though the outer await may have started earlier. It may also log deeper in the "next" path if that had user space stacks and then the outer await will appear as if it awaited after. So it's not perfect.

Sebastian Markbåge committed Jul 7, 2025 at 10:33 UTC 0378b46e7e4c5c15ac57308e2894b6d78d5fb488
2 files changed +393 -251
packages/react-server/src/ReactFlightServer.js
+8 -11
@@ -2061,20 +2061,17 @@ function visitAsyncNode(
2061 return null;
2062 }
2063 visited.add(node);
2064 + let previousIONode = null;
2065 // First visit anything that blocked this sequence to start in the first place.
2066 if (node.previous !== null && node.end > request.timeOrigin) {
2066 - // We ignore the returned io nodes here because if it wasn't awaited in user space,
2067 - // then we don't log it. It also means that it can just have been part of a previous
2068 - // component's render.
2069 - // TODO: This means that some I/O can get lost that was still blocking the sequence.
2070 - const ioNode = visitAsyncNode(
2067 + previousIONode = visitAsyncNode(
2068 request,
2069 task,
2070 node.previous,
2071 visited,
2072 cutOff,
2073 );
2077 - if (ioNode === undefined) {
2074 + if (previousIONode === undefined) {
2075 // Undefined is used as a signal that we found a suitable aborted node and we don't have to find
2076 // further aborted nodes.
2077 return undefined;
@@ -2085,17 +2082,17 @@ function visitAsyncNode(
2082 return node;
2083 }
2084 case UNRESOLVED_PROMISE_NODE: {
2088 - return null;
2085 + return previousIONode;
2086 }
2087 case PROMISE_NODE: {
2088 if (node.end <= request.timeOrigin) {
2089 // This was already resolved when we started this render. It must have been either something
2090 // that's part of a start up sequence or externally cached data. We exclude that information.
2091 // The technique for debugging the effects of uncached data on the render is to simply uncache it.
2095 - return null;
2092 + return previousIONode;
2093 }
2094 const awaited = node.awaited;
2098 - let match = null;
2095 + let match: void | null | PromiseNode | IONode = previousIONode;
2096 if (awaited !== null) {
2097 const ioNode = visitAsyncNode(request, task, awaited, visited, cutOff);
2098 if (ioNode === undefined) {
@@ -2143,11 +2140,11 @@ function visitAsyncNode(
2140 return match;
2141 }
2142 case UNRESOLVED_AWAIT_NODE: {
2146 - return null;
2143 + return previousIONode;
2144 }
2145 case AWAIT_NODE: {
2146 const awaited = node.awaited;
2150 - let match = null;
2147 + let match: void | null | PromiseNode | IONode = previousIONode;
2148 if (awaited !== null) {
2149 const ioNode = visitAsyncNode(request, task, awaited, visited, cutOff);
2150 if (ioNode === undefined) {
packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js
+385 -240
@@ -112,7 +112,8 @@ function filterStackFrame(filename, functionName) {
112 !filename.includes('node_modules') &&
113 // Filter out our own internal source code since it'll typically be in node_modules
114 (!filename.includes('/packages/') || filename.includes('/__tests__/')) &&
115 - !filename.includes('/build/')
115 + !filename.includes('/build/') &&
116 + !functionName.includes('internal_')
117 );
118 }
119
@@ -233,9 +234,9 @@ describe('ReactFlightAsyncDebugInfo', () => {
234 [
235 "Object.<anonymous>",
236 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
236 - 202,
237 + 203,
238 109,
238 - 182,
239 + 183,
240 50,
241 ],
242 ],
@@ -257,9 +258,9 @@ describe('ReactFlightAsyncDebugInfo', () => {
258 [
259 "Object.<anonymous>",
260 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
260 - 202,
261 + 203,
262 109,
262 - 182,
263 + 183,
264 50,
265 ],
266 ],
@@ -268,25 +269,25 @@ describe('ReactFlightAsyncDebugInfo', () => {
269 [
270 "delay",
271 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
271 - 160,
272 + 161,
273 12,
273 - 159,
274 + 160,
275 3,
276 ],
277 [
278 "getData",
279 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
279 - 184,
280 + 185,
281 13,
281 - 183,
282 + 184,
283 5,
284 ],
285 [
286 "Component",
287 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
287 - 191,
288 + 192,
289 26,
289 - 190,
290 + 191,
291 5,
292 ],
293 ],
@@ -305,9 +306,9 @@ describe('ReactFlightAsyncDebugInfo', () => {
306 [
307 "Object.<anonymous>",
308 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
308 - 202,
309 + 203,
310 109,
310 - 182,
311 + 183,
312 50,
313 ],
314 ],
@@ -316,17 +317,17 @@ describe('ReactFlightAsyncDebugInfo', () => {
317 [
318 "getData",
319 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
319 - 184,
320 + 185,
321 13,
321 - 183,
322 + 184,
323 5,
324 ],
325 [
326 "Component",
327 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
327 - 191,
328 + 192,
329 26,
329 - 190,
330 + 191,
331 5,
332 ],
333 ],
@@ -351,9 +352,9 @@ describe('ReactFlightAsyncDebugInfo', () => {
352 [
353 "Object.<anonymous>",
354 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
354 - 202,
355 + 203,
356 109,
356 - 182,
357 + 183,
358 50,
359 ],
360 ],
@@ -362,25 +363,25 @@ describe('ReactFlightAsyncDebugInfo', () => {
363 [
364 "delay",
365 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
365 - 160,
366 + 161,
367 12,
367 - 159,
368 + 160,
369 3,
370 ],
371 [
372 "getData",
373 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
373 - 185,
374 + 186,
375 21,
375 - 183,
376 + 184,
377 5,
378 ],
379 [
380 "Component",
381 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
381 - 191,
382 + 192,
383 20,
383 - 190,
384 + 191,
385 5,
386 ],
387 ],
@@ -401,9 +402,9 @@ describe('ReactFlightAsyncDebugInfo', () => {
402 [
403 "Object.<anonymous>",
404 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
404 - 202,
405 + 203,
406 109,
406 - 182,
407 + 183,
408 50,
409 ],
410 ],
@@ -412,17 +413,17 @@ describe('ReactFlightAsyncDebugInfo', () => {
413 [
414 "getData",
415 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
415 - 186,
416 + 187,
417 21,
417 - 183,
418 + 184,
419 5,
420 ],
421 [
422 "Component",
423 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
423 - 191,
424 + 192,
425 20,
425 - 190,
426 + 191,
427 5,
428 ],
429 ],
@@ -442,9 +443,9 @@ describe('ReactFlightAsyncDebugInfo', () => {
443 [
444 "Component",
445 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
445 - 193,
446 + 194,
447 60,
447 - 190,
448 + 191,
449 5,
450 ],
451 ],
@@ -466,9 +467,9 @@ describe('ReactFlightAsyncDebugInfo', () => {
467 [
468 "Object.<anonymous>",
469 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
469 - 202,
470 + 203,
471 109,
471 - 182,
472 + 183,
473 50,
474 ],
475 ],
@@ -477,17 +478,17 @@ describe('ReactFlightAsyncDebugInfo', () => {
478 [
479 "delay",
480 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
480 - 160,
481 + 161,
482 12,
482 - 159,
483 + 160,
484 3,
485 ],
486 [
487 "getData",
488 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
488 - 185,
489 + 186,
490 21,
490 - 183,
491 + 184,
492 5,
493 ],
494 ],
@@ -506,9 +507,9 @@ describe('ReactFlightAsyncDebugInfo', () => {
507 [
508 "Component",
509 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
509 - 193,
510 + 194,
511 60,
511 - 190,
512 + 191,
513 5,
514 ],
515 ],
@@ -517,9 +518,9 @@ describe('ReactFlightAsyncDebugInfo', () => {
518 [
519 "InnerComponent",
520 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
520 - 199,
521 + 200,
522 35,
522 - 196,
523 + 197,
524 5,
525 ],
526 ],
@@ -593,9 +594,9 @@ describe('ReactFlightAsyncDebugInfo', () => {
594 [
595 "Object.<anonymous>",
596 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
596 - 557,
597 + 558,
598 40,
598 - 538,
599 + 539,
600 49,
601 ],
602 ],
@@ -617,9 +618,9 @@ describe('ReactFlightAsyncDebugInfo', () => {
618 [
619 "Object.<anonymous>",
620 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
620 - 557,
621 + 558,
622 40,
622 - 538,
623 + 539,
624 49,
625 ],
626 ],
@@ -628,25 +629,25 @@ describe('ReactFlightAsyncDebugInfo', () => {
629 [
630 "delay",
631 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
631 - 160,
632 + 161,
633 12,
633 - 159,
634 + 160,
635 3,
636 ],
637 [
638 "getData",
639 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
639 - 540,
640 + 541,
641 13,
641 - 539,
642 + 540,
643 5,
644 ],
645 [
646 "Component",
647 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
647 - 545,
648 + 546,
649 36,
649 - 544,
650 + 545,
651 5,
652 ],
653 ],
@@ -665,9 +666,9 @@ describe('ReactFlightAsyncDebugInfo', () => {
666 [
667 "Object.<anonymous>",
668 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
668 - 557,
669 + 558,
670 40,
670 - 538,
671 + 539,
672 49,
673 ],
674 ],
@@ -676,17 +677,17 @@ describe('ReactFlightAsyncDebugInfo', () => {
677 [
678 "getData",
679 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
679 - 540,
680 + 541,
681 13,
681 - 539,
682 + 540,
683 5,
684 ],
685 [
686 "Component",
687 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
687 - 545,
688 + 546,
689 36,
689 - 544,
690 + 545,
691 5,
692 ],
693 ],
@@ -706,9 +707,9 @@ describe('ReactFlightAsyncDebugInfo', () => {
707 [
708 "Component",
709 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
709 - 547,
710 + 548,
711 60,
711 - 544,
712 + 545,
713 5,
714 ],
715 ],
@@ -727,9 +728,9 @@ describe('ReactFlightAsyncDebugInfo', () => {
728 [
729 "Object.<anonymous>",
730 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
730 - 557,
731 + 558,
732 40,
732 - 538,
733 + 539,
734 49,
735 ],
736 ],
@@ -738,25 +739,25 @@ describe('ReactFlightAsyncDebugInfo', () => {
739 [
740 "delay",
741 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
741 - 160,
742 + 161,
743 12,
743 - 159,
744 + 160,
745 3,
746 ],
747 [
748 "getData",
749 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
749 - 540,
750 + 541,
751 13,
751 - 539,
752 + 540,
753 5,
754 ],
755 [
756 "Component",
757 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
757 - 546,
758 + 547,
759 22,
759 - 544,
760 + 545,
761 5,
762 ],
763 ],
@@ -775,9 +776,9 @@ describe('ReactFlightAsyncDebugInfo', () => {
776 [
777 "Component",
778 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
778 - 547,
779 + 548,
780 60,
780 - 544,
781 + 545,
782 5,
783 ],
784 ],
@@ -786,9 +787,9 @@ describe('ReactFlightAsyncDebugInfo', () => {
787 [
788 "InnerComponent",
789 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
789 - 553,
790 + 554,
791 40,
791 - 550,
792 + 551,
793 5,
794 ],
795 ],
@@ -851,9 +852,9 @@ describe('ReactFlightAsyncDebugInfo', () => {
852 [
853 "Object.<anonymous>",
854 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
854 - 820,
855 + 821,
856 109,
856 - 807,
857 + 808,
858 67,
859 ],
860 ],
@@ -872,9 +873,9 @@ describe('ReactFlightAsyncDebugInfo', () => {
873 [
874 "Object.<anonymous>",
875 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
875 - 820,
876 + 821,
877 109,
877 - 807,
878 + 808,
879 67,
880 ],
881 ],
@@ -883,9 +884,9 @@ describe('ReactFlightAsyncDebugInfo', () => {
884 [
885 "Component",
886 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
886 - 810,
887 + 811,
888 7,
888 - 808,
889 + 809,
890 5,
891 ],
892 ],
@@ -947,9 +948,9 @@ describe('ReactFlightAsyncDebugInfo', () => {
948 [
949 "Object.<anonymous>",
950 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
950 - 916,
951 + 917,
952 109,
952 - 907,
953 + 908,
954 94,
955 ],
956 ],
@@ -1020,9 +1021,9 @@ describe('ReactFlightAsyncDebugInfo', () => {
1021 [
1022 "Object.<anonymous>",
1023 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
1023 - 989,
1024 + 990,
1025 109,
1025 - 965,
1026 + 966,
1027 50,
1028 ],
1029 ],
@@ -1104,9 +1105,9 @@ describe('ReactFlightAsyncDebugInfo', () => {
1105 [
1106 "Object.<anonymous>",
1107 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
1107 - 1073,
1108 + 1074,
1109 109,
1109 - 1056,
1110 + 1057,
1111 63,
1112 ],
1113 ],
@@ -1123,17 +1124,17 @@ describe('ReactFlightAsyncDebugInfo', () => {
1124 [
1125 "fetchThirdParty",
1126 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
1126 - 167,
1127 + 168,
1128 40,
1128 - 165,
1129 + 166,
1130 3,
1131 ],
1132 [
1133 "Component",
1134 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
1134 - 1069,
1135 + 1070,
1136 24,
1136 - 1068,
1137 + 1069,
1138 5,
1139 ],
1140 ],
@@ -1155,17 +1156,17 @@ describe('ReactFlightAsyncDebugInfo', () => {
1156 [
1157 "fetchThirdParty",
1158 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
1158 - 167,
1159 + 168,
1160 40,
1160 - 165,
1161 + 166,
1162 3,
1163 ],
1164 [
1165 "Component",
1166 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
1166 - 1069,
1167 + 1070,
1168 24,
1168 - 1068,
1169 + 1069,
1170 5,
1171 ],
1172 ],
@@ -1174,25 +1175,25 @@ describe('ReactFlightAsyncDebugInfo', () => {
1175 [
1176 "delay",
1177 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
1177 - 160,
1178 + 161,
1179 12,
1179 - 159,
1180 + 160,
1181 3,
1182 ],
1183 [
1184 "getData",
1185 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
1185 - 1058,
1186 + 1059,
1187 13,
1187 - 1057,
1188 + 1058,
1189 5,
1190 ],
1191 [
1192 "ThirdPartyComponent",
1193 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
1193 - 1064,
1194 + 1065,
1195 24,
1195 - 1063,
1196 + 1064,
1197 5,
1198 ],
1199 ],
@@ -1211,17 +1212,17 @@ describe('ReactFlightAsyncDebugInfo', () => {
1212 [
1213 "fetchThirdParty",
1214 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
1214 - 167,
1215 + 168,
1216 40,
1216 - 165,
1217 + 166,
1218 3,
1219 ],
1220 [
1221 "Component",
1222 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
1222 - 1069,
1223 + 1070,
1224 24,
1224 - 1068,
1225 + 1069,
1226 5,
1227 ],
1228 ],
@@ -1230,17 +1231,17 @@ describe('ReactFlightAsyncDebugInfo', () => {
1231 [
1232 "getData",
1233 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
1233 - 1058,
1234 + 1059,
1235 13,
1235 - 1057,
1236 + 1058,
1237 5,
1238 ],
1239 [
1240 "ThirdPartyComponent",
1241 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
1241 - 1064,
1242 + 1065,
1243 24,
1243 - 1063,
1244 + 1064,
1245 5,
1246 ],
1247 ],
@@ -1265,17 +1266,17 @@ describe('ReactFlightAsyncDebugInfo', () => {
1266 [
1267 "fetchThirdParty",
1268 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
1268 - 167,
1269 + 168,
1270 40,
1270 - 165,
1271 + 166,
1272 3,
1273 ],
1274 [
1275 "Component",
1276 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
1276 - 1069,
1277 + 1070,
1278 24,
1278 - 1068,
1279 + 1069,
1280 5,
1281 ],
1282 ],
@@ -1284,25 +1285,25 @@ describe('ReactFlightAsyncDebugInfo', () => {
1285 [
1286 "delay",
1287 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
1287 - 160,
1288 + 161,
1289 12,
1289 - 159,
1290 + 160,
1291 3,
1292 ],
1293 [
1294 "getData",
1295 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
1295 - 1059,
1296 + 1060,
1297 13,
1297 - 1057,
1298 + 1058,
1299 5,
1300 ],
1301 [
1302 "ThirdPartyComponent",
1303 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
1303 - 1064,
1304 + 1065,
1305 18,
1305 - 1063,
1306 + 1064,
1307 5,
1308 ],
1309 ],
@@ -1321,17 +1322,17 @@ describe('ReactFlightAsyncDebugInfo', () => {
1322 [
1323 "fetchThirdParty",
1324 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
1324 - 167,
1325 + 168,
1326 40,
1326 - 165,
1327 + 166,
1328 3,
1329 ],
1330 [
1331 "Component",
1332 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
1332 - 1069,
1333 + 1070,
1334 24,
1334 - 1068,
1335 + 1069,
1336 5,
1337 ],
1338 ],
@@ -1340,17 +1341,17 @@ describe('ReactFlightAsyncDebugInfo', () => {
1341 [
1342 "getData",
1343 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
1343 - 1059,
1344 + 1060,
1345 13,
1345 - 1057,
1346 + 1058,
1347 5,
1348 ],
1349 [
1350 "ThirdPartyComponent",
1351 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
1351 - 1064,
1352 + 1065,
1353 18,
1353 - 1063,
1354 + 1064,
1355 5,
1356 ],
1357 ],
@@ -1425,9 +1426,9 @@ describe('ReactFlightAsyncDebugInfo', () => {
1426 [
1427 "Object.<anonymous>",
1428 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
1428 - 1389,
1429 + 1390,
1430 40,
1430 - 1372,
1431 + 1373,
1432 62,
1433 ],
1434 ],
@@ -1449,9 +1450,9 @@ describe('ReactFlightAsyncDebugInfo', () => {
1450 [
1451 "Object.<anonymous>",
1452 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
1452 - 1389,
1453 + 1390,
1454 40,
1454 - 1372,
1455 + 1373,
1456 62,
1457 ],
1458 ],
@@ -1460,25 +1461,25 @@ describe('ReactFlightAsyncDebugInfo', () => {
1461 [
1462 "delay",
1463 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
1463 - 160,
1464 + 161,
1465 12,
1465 - 159,
1466 + 160,
1467 3,
1468 ],
1469 [
1470 "getData",
1471 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
1471 - 1374,
1472 + 1375,
1473 13,
1473 - 1373,
1474 + 1374,
1475 25,
1476 ],
1477 [
1478 "Component",
1479 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
1479 - 1384,
1480 + 1385,
1481 13,
1481 - 1383,
1482 + 1384,
1483 5,
1484 ],
1485 ],
@@ -1497,9 +1498,9 @@ describe('ReactFlightAsyncDebugInfo', () => {
1498 [
1499 "Object.<anonymous>",
1500 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
1500 - 1389,
1501 + 1390,
1502 40,
1502 - 1372,
1503 + 1373,
1504 62,
1505 ],
1506 ],
@@ -1508,17 +1509,17 @@ describe('ReactFlightAsyncDebugInfo', () => {
1509 [
1510 "getData",
1511 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
1511 - 1374,
1512 + 1375,
1513 13,
1513 - 1373,
1514 + 1374,
1515 25,
1516 ],
1517 [
1518 "Component",
1519 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
1519 - 1384,
1520 + 1385,
1521 13,
1521 - 1383,
1522 + 1384,
1523 5,
1524 ],
1525 ],
@@ -1538,9 +1539,9 @@ describe('ReactFlightAsyncDebugInfo', () => {
1539 [
1540 "Component",
1541 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
1541 - 1385,
1542 + 1386,
1543 60,
1543 - 1383,
1544 + 1384,
1545 5,
1546 ],
1547 ],
@@ -1562,9 +1563,9 @@ describe('ReactFlightAsyncDebugInfo', () => {
1563 [
1564 "Object.<anonymous>",
1565 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
1565 - 1389,
1566 + 1390,
1567 40,
1567 - 1372,
1568 + 1373,
1569 62,
1570 ],
1571 ],
@@ -1573,25 +1574,25 @@ describe('ReactFlightAsyncDebugInfo', () => {
1574 [
1575 "delay",
1576 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
1576 - 160,
1577 + 161,
1578 12,
1578 - 159,
1579 + 160,
1580 3,
1581 ],
1582 [
1583 "getData",
1584 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
1584 - 1374,
1585 + 1375,
1586 13,
1586 - 1373,
1587 + 1374,
1588 25,
1589 ],
1590 [
1591 "Component",
1592 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
1592 - 1384,
1593 + 1385,
1594 13,
1594 - 1383,
1595 + 1384,
1596 5,
1597 ],
1598 ],
@@ -1610,9 +1611,9 @@ describe('ReactFlightAsyncDebugInfo', () => {
1611 [
1612 "Component",
1613 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
1613 - 1385,
1614 + 1386,
1615 60,
1615 - 1383,
1616 + 1384,
1617 5,
1618 ],
1619 ],
@@ -1621,9 +1622,9 @@ describe('ReactFlightAsyncDebugInfo', () => {
1622 [
1623 "Child",
1624 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
1624 - 1379,
1625 + 1380,
1626 28,
1626 - 1378,
1627 + 1379,
1628 5,
1629 ],
1630 ],
@@ -1694,9 +1695,9 @@ describe('ReactFlightAsyncDebugInfo', () => {
1695 [
1696 "Object.<anonymous>",
1697 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
1697 - 1658,
1698 + 1659,
1699 40,
1699 - 1642,
1700 + 1643,
1701 57,
1702 ],
1703 ],
@@ -1718,9 +1719,9 @@ describe('ReactFlightAsyncDebugInfo', () => {
1719 [
1720 "Object.<anonymous>",
1721 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
1721 - 1658,
1722 + 1659,
1723 40,
1723 - 1642,
1724 + 1643,
1725 57,
1726 ],
1727 ],
@@ -1729,25 +1730,25 @@ describe('ReactFlightAsyncDebugInfo', () => {
1730 [
1731 "delay",
1732 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
1732 - 160,
1733 + 161,
1734 12,
1734 - 159,
1735 + 160,
1736 3,
1737 ],
1738 [
1739 "getData",
1740 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
1740 - 1644,
1741 + 1645,
1742 13,
1742 - 1643,
1743 + 1644,
1744 25,
1745 ],
1746 [
1747 "Component",
1748 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
1748 - 1653,
1749 + 1654,
1750 23,
1750 - 1652,
1751 + 1653,
1752 5,
1753 ],
1754 ],
@@ -1766,9 +1767,9 @@ describe('ReactFlightAsyncDebugInfo', () => {
1767 [
1768 "Object.<anonymous>",
1769 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
1769 - 1658,
1770 + 1659,
1771 40,
1771 - 1642,
1772 + 1643,
1773 57,
1774 ],
1775 ],
@@ -1777,17 +1778,17 @@ describe('ReactFlightAsyncDebugInfo', () => {
1778 [
1779 "getData",
1780 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
1780 - 1644,
1781 + 1645,
1782 13,
1782 - 1643,
1783 + 1644,
1784 25,
1785 ],
1786 [
1787 "Component",
1788 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
1788 - 1653,
1789 + 1654,
1790 23,
1790 - 1652,
1791 + 1653,
1792 5,
1793 ],
1794 ],
@@ -1807,9 +1808,9 @@ describe('ReactFlightAsyncDebugInfo', () => {
1808 [
1809 "Component",
1810 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
1810 - 1654,
1811 + 1655,
1812 60,
1812 - 1652,
1813 + 1653,
1814 5,
1815 ],
1816 ],
@@ -1828,9 +1829,9 @@ describe('ReactFlightAsyncDebugInfo', () => {
1829 [
1830 "Object.<anonymous>",
1831 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
1831 - 1658,
1832 + 1659,
1833 40,
1833 - 1642,
1834 + 1643,
1835 57,
1836 ],
1837 ],
@@ -1839,25 +1840,25 @@ describe('ReactFlightAsyncDebugInfo', () => {
1840 [
1841 "delay",
1842 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
1842 - 160,
1843 + 161,
1844 12,
1844 - 159,
1845 + 160,
1846 3,
1847 ],
1848 [
1849 "getData",
1850 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
1850 - 1644,
1851 + 1645,
1852 13,
1852 - 1643,
1853 + 1644,
1854 25,
1855 ],
1856 [
1857 "Component",
1858 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
1858 - 1653,
1859 + 1654,
1860 23,
1860 - 1652,
1861 + 1653,
1862 5,
1863 ],
1864 ],
@@ -1936,9 +1937,9 @@ describe('ReactFlightAsyncDebugInfo', () => {
1937 [
1938 "Object.<anonymous>",
1939 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
1939 - 1900,
1940 + 1901,
1941 40,
1941 - 1882,
1942 + 1883,
1943 80,
1944 ],
1945 ],
@@ -1960,9 +1961,9 @@ describe('ReactFlightAsyncDebugInfo', () => {
1961 [
1962 "Object.<anonymous>",
1963 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
1963 - 1900,
1964 + 1901,
1965 40,
1965 - 1882,
1966 + 1883,
1967 80,
1968 ],
1969 ],
@@ -1971,25 +1972,25 @@ describe('ReactFlightAsyncDebugInfo', () => {
1972 [
1973 "delay",
1974 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
1974 - 160,
1975 + 161,
1976 12,
1976 - 159,
1977 + 160,
1978 3,
1979 ],
1980 [
1981 "delayTrice",
1982 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
1982 - 1890,
1983 + 1891,
1984 13,
1984 - 1888,
1985 + 1889,
1986 5,
1987 ],
1988 [
1989 "Bar",
1990 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
1990 - 1895,
1991 + 1896,
1992 13,
1992 - 1894,
1993 + 1895,
1994 5,
1995 ],
1996 ],
@@ -2008,9 +2009,9 @@ describe('ReactFlightAsyncDebugInfo', () => {
2009 [
2010 "Object.<anonymous>",
2011 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
2011 - 1900,
2012 + 1901,
2013 40,
2013 - 1882,
2014 + 1883,
2015 80,
2016 ],
2017 ],
@@ -2019,17 +2020,17 @@ describe('ReactFlightAsyncDebugInfo', () => {
2020 [
2021 "delayTrice",
2022 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
2022 - 1890,
2023 + 1891,
2024 13,
2024 - 1888,
2025 + 1889,
2026 5,
2027 ],
2028 [
2029 "Bar",
2030 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
2030 - 1895,
2031 + 1896,
2032 13,
2032 - 1894,
2033 + 1895,
2034 5,
2035 ],
2036 ],
@@ -2051,9 +2052,9 @@ describe('ReactFlightAsyncDebugInfo', () => {
2052 [
2053 "Object.<anonymous>",
2054 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
2054 - 1900,
2055 + 1901,
2056 40,
2056 - 1882,
2057 + 1883,
2058 80,
2059 ],
2060 ],
@@ -2062,33 +2063,33 @@ describe('ReactFlightAsyncDebugInfo', () => {
2063 [
2064 "delay",
2065 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
2065 - 160,
2066 + 161,
2067 12,
2067 - 159,
2068 + 160,
2069 3,
2070 ],
2071 [
2072 "delayTwice",
2073 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
2073 - 1884,
2074 + 1885,
2075 13,
2075 - 1883,
2076 + 1884,
2077 5,
2078 ],
2079 [
2080 "delayTrice",
2081 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
2081 - 1889,
2082 + 1890,
2083 15,
2083 - 1888,
2084 + 1889,
2085 5,
2086 ],
2087 [
2088 "Bar",
2089 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
2089 - 1895,
2090 + 1896,
2091 13,
2091 - 1894,
2092 + 1895,
2093 5,
2094 ],
2095 ],
@@ -2107,9 +2108,9 @@ describe('ReactFlightAsyncDebugInfo', () => {
2108 [
2109 "Object.<anonymous>",
2110 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
2110 - 1900,
2111 + 1901,
2112 40,
2112 - 1882,
2113 + 1883,
2114 80,
2115 ],
2116 ],
@@ -2118,25 +2119,25 @@ describe('ReactFlightAsyncDebugInfo', () => {
2119 [
2120 "delayTwice",
2121 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
2121 - 1884,
2122 + 1885,
2123 13,
2123 - 1883,
2124 + 1884,
2125 5,
2126 ],
2127 [
2128 "delayTrice",
2129 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
2129 - 1889,
2130 + 1890,
2131 15,
2131 - 1888,
2132 + 1889,
2133 5,
2134 ],
2135 [
2136 "Bar",
2137 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
2137 - 1895,
2138 + 1896,
2139 13,
2139 - 1894,
2140 + 1895,
2141 5,
2142 ],
2143 ],
@@ -2158,9 +2159,9 @@ describe('ReactFlightAsyncDebugInfo', () => {
2159 [
2160 "Object.<anonymous>",
2161 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
2161 - 1900,
2162 + 1901,
2163 40,
2163 - 1882,
2164 + 1883,
2165 80,
2166 ],
2167 ],
@@ -2169,17 +2170,17 @@ describe('ReactFlightAsyncDebugInfo', () => {
2170 [
2171 "delay",
2172 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
2172 - 160,
2173 + 161,
2174 12,
2174 - 159,
2175 + 160,
2176 3,
2177 ],
2178 [
2179 "delayTwice",
2180 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
2180 - 1885,
2181 + 1886,
2182 13,
2182 - 1883,
2183 + 1884,
2184 5,
2185 ],
2186 ],
@@ -2198,9 +2199,9 @@ describe('ReactFlightAsyncDebugInfo', () => {
2199 [
2200 "Object.<anonymous>",
2201 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
2201 - 1900,
2202 + 1901,
2203 40,
2203 - 1882,
2204 + 1883,
2205 80,
2206 ],
2207 ],
@@ -2209,9 +2210,9 @@ describe('ReactFlightAsyncDebugInfo', () => {
2210 [
2211 "delayTwice",
2212 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
2212 - 1885,
2213 + 1886,
2214 13,
2214 - 1883,
2215 + 1884,
2216 5,
2217 ],
2218 ],
@@ -2272,9 +2273,9 @@ describe('ReactFlightAsyncDebugInfo', () => {
2273 [
2274 "Object.<anonymous>",
2275 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
2275 - 2241,
2276 + 2242,
2277 109,
2277 - 2230,
2278 + 2231,
2279 58,
2280 ],
2281 ],
@@ -2296,9 +2297,9 @@ describe('ReactFlightAsyncDebugInfo', () => {
2297 [
2298 "Object.<anonymous>",
2299 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
2299 - 2241,
2300 + 2242,
2301 109,
2301 - 2230,
2302 + 2231,
2303 58,
2304 ],
2305 ],
@@ -2307,25 +2308,25 @@ describe('ReactFlightAsyncDebugInfo', () => {
2308 [
2309 "delay",
2310 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
2310 - 160,
2311 + 161,
2312 12,
2312 - 159,
2313 + 160,
2314 3,
2315 ],
2316 [
2317 "getData",
2318 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
2318 - 2232,
2319 + 2233,
2320 14,
2320 - 2231,
2321 + 2232,
2322 5,
2323 ],
2324 [
2325 "Component",
2326 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
2326 - 2238,
2327 + 2239,
2328 20,
2328 - 2237,
2329 + 2238,
2330 5,
2331 ],
2332 ],
@@ -2344,9 +2345,9 @@ describe('ReactFlightAsyncDebugInfo', () => {
2345 [
2346 "Object.<anonymous>",
2347 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
2347 - 2241,
2348 + 2242,
2349 109,
2349 - 2230,
2350 + 2231,
2351 58,
2352 ],
2353 ],
@@ -2355,17 +2356,161 @@ describe('ReactFlightAsyncDebugInfo', () => {
2356 [
2357 "getData",
2358 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
2358 - 2232,
2359 + 2233,
2360 23,
2360 - 2231,
2361 + 2232,
2362 5,
2363 ],
2364 [
2365 "Component",
2366 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
2367 + 2239,
2368 + 20,
2369 2238,
2370 + 5,
2371 + ],
2372 + ],
2373 + },
2374 + {
2375 + "time": 0,
2376 + },
2377 + {
2378 + "time": 0,
2379 + },
2380 + ]
2381 + `);
2382 + }
2383 + });
2384 +
2385 + it('can track IO that is not awaited in user space', async () => {
2386 + function internal_API(text) {
2387 + return delay(1).then(async () => {
2388 + return text.toUpperCase();
2389 + });
2390 + }
2391 +
2392 + async function Component({text, promise}) {
2393 + return await internal_API('hi, seb');
2394 + }
2395 +
2396 + const stream = ReactServerDOMServer.renderToPipeableStream(
2397 + <Component />,
2398 + {},
2399 + {
2400 + filterStackFrame,
2401 + },
2402 + );
2403 +
2404 + const readable = new Stream.PassThrough(streamOptions);
2405 +
2406 + const result = ReactServerDOMClient.createFromNodeStream(readable, {
2407 + moduleMap: {},
2408 + moduleLoading: {},
2409 + });
2410 + stream.pipe(readable);
2411 +
2412 + expect(await result).toBe('HI, SEB');
2413 +
2414 + await finishLoadingStream(readable);
2415 + if (
2416 + __DEV__ &&
2417 + gate(
2418 + flags =>
2419 + flags.enableComponentPerformanceTrack && flags.enableAsyncDebugInfo,
2420 + )
2421 + ) {
2422 + expect(getDebugInfo(result)).toMatchInlineSnapshot(`
2423 + [
2424 + {
2425 + "time": 0,
2426 + },
2427 + {
2428 + "env": "Server",
2429 + "key": null,
2430 + "name": "Component",
2431 + "props": {},
2432 + "stack": [
2433 + [
2434 + "Object.<anonymous>",
2435 + "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
2436 + 2397,
2437 + 40,
2438 + 2385,
2439 + 56,
2440 + ],
2441 + ],
2442 + },
2443 + {
2444 + "time": 0,
2445 + },
2446 + {
2447 + "awaited": {
2448 + "end": 0,
2449 + "env": "Server",
2450 + "name": "delay",
2451 + "owner": {
2452 + "env": "Server",
2453 + "key": null,
2454 + "name": "Component",
2455 + "props": {},
2456 + "stack": [
2457 + [
2458 + "Object.<anonymous>",
2459 + "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
2460 + 2397,
2461 + 40,
2462 + 2385,
2463 + 56,
2464 + ],
2465 + ],
2466 + },
2467 + "stack": [
2468 + [
2469 + "delay",
2470 + "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
2471 + 161,
2472 + 12,
2473 + 160,
2474 + 3,
2475 + ],
2476 + [
2477 + "Component",
2478 + "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
2479 + 2393,
2480 + 20,
2481 + 2392,
2482 + 5,
2483 + ],
2484 + ],
2485 + "start": 0,
2486 + "value": {
2487 + "value": "HI, SEB",
2488 + },
2489 + },
2490 + "env": "Server",
2491 + "owner": {
2492 + "env": "Server",
2493 + "key": null,
2494 + "name": "Component",
2495 + "props": {},
2496 + "stack": [
2497 + [
2498 + "Object.<anonymous>",
2499 + "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
2500 + 2397,
2501 + 40,
2502 + 2385,
2503 + 56,
2504 + ],
2505 + ],
2506 + },
2507 + "stack": [
2508 + [
2509 + "Component",
2510 + "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
2511 + 2393,
2512 20,
2368 - 2237,
2513 + 2392,
2514 5,
2515 ],
2516 ],