117
});
118
}
119
120
+ function fetchThirdParty(Component) {
121
+ const stream = ReactServerDOMServer.renderToPipeableStream(
122
+ <Component />,
123
+ {},
124
+ {
125
+ environmentName: 'third-party',
126
+ },
127
+ );
128
+ const readable = new Stream.PassThrough(streamOptions);
129
+ const result = ReactServerDOMClient.createFromNodeStream(readable, {
130
+ moduleMap: {},
131
+ moduleLoading: {},
132
+ });
133
+ stream.pipe(readable);
134
+ return result;
135
+ }
136
+
137
it('can track async information when awaited', async () => {
138
async function getData() {
139
await delay(1);
180
[
181
"Object.<anonymous>",
182
"/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
166
- 133,
183
+ 150,
184
109,
168
- 120,
185
+ 137,
186
50,
187
],
188
],
205
[
206
"Object.<anonymous>",
207
"/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
191
- 133,
208
+ 150,
209
109,
193
- 120,
210
+ 137,
211
50,
212
],
213
],
224
[
225
"getData",
226
"/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
210
- 122,
227
+ 139,
228
13,
212
- 121,
229
+ 138,
230
5,
231
],
232
[
233
"Component",
234
"/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
218
- 129,
235
+ 146,
236
26,
220
- 128,
237
+ 145,
238
5,
239
],
240
],
251
[
252
"Object.<anonymous>",
253
"/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
237
- 133,
254
+ 150,
255
109,
239
- 120,
256
+ 137,
257
50,
258
],
259
],
262
[
263
"getData",
264
"/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
248
- 122,
265
+ 139,
266
13,
250
- 121,
267
+ 138,
268
5,
269
],
270
[
271
"Component",
272
"/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
256
- 129,
273
+ 146,
274
26,
258
- 128,
275
+ 145,
276
5,
277
],
278
],
298
[
299
"Object.<anonymous>",
300
"/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
284
- 133,
301
+ 150,
302
109,
286
- 120,
303
+ 137,
304
50,
305
],
306
],
317
[
318
"getData",
319
"/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
303
- 123,
320
+ 140,
321
21,
305
- 121,
322
+ 138,
323
5,
324
],
325
[
326
"Component",
327
"/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
311
- 129,
328
+ 146,
329
20,
313
- 128,
330
+ 145,
331
5,
332
],
333
],
344
[
345
"Object.<anonymous>",
346
"/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
330
- 133,
347
+ 150,
348
109,
332
- 120,
349
+ 137,
350
50,
351
],
352
],
355
[
356
"getData",
357
"/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
341
- 124,
358
+ 141,
359
21,
343
- 121,
360
+ 138,
361
5,
362
],
363
[
364
"Component",
365
"/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
349
- 129,
366
+ 146,
367
20,
351
- 128,
368
+ 145,
369
5,
370
],
371
],
427
[
428
"Object.<anonymous>",
429
"/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
413
- 380,
430
+ 397,
431
109,
415
- 367,
432
+ 384,
433
67,
434
],
435
],
452
[
453
"Object.<anonymous>",
454
"/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
438
- 380,
455
+ 397,
456
109,
440
- 367,
457
+ 384,
458
67,
459
],
460
],
463
[
464
"Component",
465
"/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
449
- 370,
466
+ 387,
467
7,
451
- 368,
468
+ 385,
469
5,
470
],
471
],
483
`);
484
}
485
});
486
+
487
+ it('can ingores the start of I/O when immediately resolved non-native promise is awaited', async () => {
488
+ async function Component() {
489
+ return await {
490
+ then(callback) {
491
+ callback('hi');
492
+ },
493
+ };
494
+ }
495
+
496
+ const stream = ReactServerDOMServer.renderToPipeableStream(<Component />);
497
+
498
+ const readable = new Stream.PassThrough(streamOptions);
499
+
500
+ const result = ReactServerDOMClient.createFromNodeStream(readable, {
501
+ moduleMap: {},
502
+ moduleLoading: {},
503
+ });
504
+ stream.pipe(readable);
505
+
506
+ expect(await result).toBe('hi');
507
+ if (
508
+ __DEV__ &&
509
+ gate(
510
+ flags =>
511
+ flags.enableComponentPerformanceTrack && flags.enableAsyncDebugInfo,
512
+ )
513
+ ) {
514
+ expect(getDebugInfo(result)).toMatchInlineSnapshot(`
515
+ [
516
+ {
517
+ "time": 0,
518
+ },
519
+ {
520
+ "env": "Server",
521
+ "key": null,
522
+ "name": "Component",
523
+ "owner": null,
524
+ "props": {},
525
+ "stack": [
526
+ [
527
+ "Object.<anonymous>",
528
+ "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
529
+ 496,
530
+ 109,
531
+ 487,
532
+ 94,
533
+ ],
534
+ ],
535
+ },
536
+ {
537
+ "time": 0,
538
+ },
539
+ ]
540
+ `);
541
+ }
542
+ });
543
+
544
+ it('forwards debugInfo from awaited Promises', async () => {
545
+ async function Component() {
546
+ let resolve;
547
+ const promise = new Promise(r => (resolve = r));
548
+ promise._debugInfo = [
549
+ {time: performance.now()},
550
+ {
551
+ name: 'Virtual Component',
552
+ },
553
+ {time: performance.now()},
554
+ ];
555
+ const promise2 = promise.then(value => value);
556
+ promise2._debugInfo = [
557
+ {time: performance.now()},
558
+ {
559
+ name: 'Virtual Component2',
560
+ },
561
+ {time: performance.now()},
562
+ ];
563
+ resolve('hi');
564
+ const result = await promise2;
565
+ return result.toUpperCase();
566
+ }
567
+
568
+ const stream = ReactServerDOMServer.renderToPipeableStream(<Component />);
569
+
570
+ const readable = new Stream.PassThrough(streamOptions);
571
+
572
+ const result = ReactServerDOMClient.createFromNodeStream(readable, {
573
+ moduleMap: {},
574
+ moduleLoading: {},
575
+ });
576
+ stream.pipe(readable);
577
+
578
+ expect(await result).toBe('HI');
579
+ if (
580
+ __DEV__ &&
581
+ gate(
582
+ flags =>
583
+ flags.enableComponentPerformanceTrack && flags.enableAsyncDebugInfo,
584
+ )
585
+ ) {
586
+ expect(getDebugInfo(result)).toMatchInlineSnapshot(`
587
+ [
588
+ {
589
+ "time": 0,
590
+ },
591
+ {
592
+ "env": "Server",
593
+ "key": null,
594
+ "name": "Component",
595
+ "owner": null,
596
+ "props": {},
597
+ "stack": [
598
+ [
599
+ "Object.<anonymous>",
600
+ "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
601
+ 568,
602
+ 109,
603
+ 544,
604
+ 50,
605
+ ],
606
+ ],
607
+ },
608
+ {
609
+ "time": 0,
610
+ },
611
+ {
612
+ "name": "Virtual Component",
613
+ },
614
+ {
615
+ "time": 0,
616
+ },
617
+ {
618
+ "time": 0,
619
+ },
620
+ {
621
+ "name": "Virtual Component2",
622
+ },
623
+ {
624
+ "time": 0,
625
+ },
626
+ {
627
+ "time": 0,
628
+ },
629
+ ]
630
+ `);
631
+ }
632
+ });
633
+
634
+ it('forwards async debug info one environment to the next', async () => {
635
+ async function getData() {
636
+ await delay(1);
637
+ await delay(2);
638
+ return 'hi';
639
+ }
640
+
641
+ async function ThirdPartyComponent() {
642
+ const data = await getData();
643
+ return data;
644
+ }
645
+
646
+ async function Component() {
647
+ const data = await fetchThirdParty(ThirdPartyComponent);
648
+ return data.toUpperCase();
649
+ }
650
+
651
+ const stream = ReactServerDOMServer.renderToPipeableStream(<Component />);
652
+
653
+ const readable = new Stream.PassThrough(streamOptions);
654
+
655
+ const result = ReactServerDOMClient.createFromNodeStream(readable, {
656
+ moduleMap: {},
657
+ moduleLoading: {},
658
+ });
659
+ stream.pipe(readable);
660
+
661
+ expect(await result).toBe('HI');
662
+ if (
663
+ __DEV__ &&
664
+ gate(
665
+ flags =>
666
+ flags.enableComponentPerformanceTrack && flags.enableAsyncDebugInfo,
667
+ )
668
+ ) {
669
+ expect(getDebugInfo(result)).toMatchInlineSnapshot(`
670
+ [
671
+ {
672
+ "time": 0,
673
+ },
674
+ {
675
+ "env": "Server",
676
+ "key": null,
677
+ "name": "Component",
678
+ "owner": null,
679
+ "props": {},
680
+ "stack": [
681
+ [
682
+ "Object.<anonymous>",
683
+ "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
684
+ 651,
685
+ 109,
686
+ 634,
687
+ 63,
688
+ ],
689
+ ],
690
+ },
691
+ {
692
+ "time": 0,
693
+ },
694
+ {
695
+ "env": "third-party",
696
+ "key": null,
697
+ "name": "ThirdPartyComponent",
698
+ "owner": null,
699
+ "props": {},
700
+ "stack": [
701
+ [
702
+ "fetchThirdParty",
703
+ "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
704
+ 122,
705
+ 40,
706
+ 120,
707
+ 3,
708
+ ],
709
+ [
710
+ "Component",
711
+ "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
712
+ 647,
713
+ 24,
714
+ 646,
715
+ 5,
716
+ ],
717
+ ],
718
+ },
719
+ {
720
+ "time": 0,
721
+ },
722
+ {
723
+ "awaited": {
724
+ "end": 0,
725
+ "env": "third-party",
726
+ "name": "delay",
727
+ "owner": {
728
+ "env": "third-party",
729
+ "key": null,
730
+ "name": "ThirdPartyComponent",
731
+ "owner": null,
732
+ "props": {},
733
+ "stack": [
734
+ [
735
+ "fetchThirdParty",
736
+ "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
737
+ 122,
738
+ 40,
739
+ 120,
740
+ 3,
741
+ ],
742
+ [
743
+ "Component",
744
+ "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
745
+ 647,
746
+ 24,
747
+ 646,
748
+ 5,
749
+ ],
750
+ ],
751
+ },
752
+ "stack": [
753
+ [
754
+ "delay",
755
+ "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
756
+ 115,
757
+ 12,
758
+ 114,
759
+ 3,
760
+ ],
761
+ [
762
+ "getData",
763
+ "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
764
+ 636,
765
+ 13,
766
+ 635,
767
+ 5,
768
+ ],
769
+ [
770
+ "ThirdPartyComponent",
771
+ "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
772
+ 642,
773
+ 24,
774
+ 641,
775
+ 5,
776
+ ],
777
+ ],
778
+ "start": 0,
779
+ },
780
+ "env": "third-party",
781
+ "owner": {
782
+ "env": "third-party",
783
+ "key": null,
784
+ "name": "ThirdPartyComponent",
785
+ "owner": null,
786
+ "props": {},
787
+ "stack": [
788
+ [
789
+ "fetchThirdParty",
790
+ "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
791
+ 122,
792
+ 40,
793
+ 120,
794
+ 3,
795
+ ],
796
+ [
797
+ "Component",
798
+ "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
799
+ 647,
800
+ 24,
801
+ 646,
802
+ 5,
803
+ ],
804
+ ],
805
+ },
806
+ "stack": [
807
+ [
808
+ "getData",
809
+ "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
810
+ 636,
811
+ 13,
812
+ 635,
813
+ 5,
814
+ ],
815
+ [
816
+ "ThirdPartyComponent",
817
+ "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
818
+ 642,
819
+ 24,
820
+ 641,
821
+ 5,
822
+ ],
823
+ ],
824
+ },
825
+ {
826
+ "time": 0,
827
+ },
828
+ {
829
+ "time": 0,
830
+ },
831
+ {
832
+ "awaited": {
833
+ "end": 0,
834
+ "env": "third-party",
835
+ "name": "delay",
836
+ "owner": {
837
+ "env": "third-party",
838
+ "key": null,
839
+ "name": "ThirdPartyComponent",
840
+ "owner": null,
841
+ "props": {},
842
+ "stack": [
843
+ [
844
+ "fetchThirdParty",
845
+ "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
846
+ 122,
847
+ 40,
848
+ 120,
849
+ 3,
850
+ ],
851
+ [
852
+ "Component",
853
+ "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
854
+ 647,
855
+ 24,
856
+ 646,
857
+ 5,
858
+ ],
859
+ ],
860
+ },
861
+ "stack": [
862
+ [
863
+ "delay",
864
+ "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
865
+ 115,
866
+ 12,
867
+ 114,
868
+ 3,
869
+ ],
870
+ [
871
+ "getData",
872
+ "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
873
+ 637,
874
+ 13,
875
+ 635,
876
+ 5,
877
+ ],
878
+ [
879
+ "ThirdPartyComponent",
880
+ "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
881
+ 642,
882
+ 18,
883
+ 641,
884
+ 5,
885
+ ],
886
+ ],
887
+ "start": 0,
888
+ },
889
+ "env": "third-party",
890
+ "owner": {
891
+ "env": "third-party",
892
+ "key": null,
893
+ "name": "ThirdPartyComponent",
894
+ "owner": null,
895
+ "props": {},
896
+ "stack": [
897
+ [
898
+ "fetchThirdParty",
899
+ "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
900
+ 122,
901
+ 40,
902
+ 120,
903
+ 3,
904
+ ],
905
+ [
906
+ "Component",
907
+ "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
908
+ 647,
909
+ 24,
910
+ 646,
911
+ 5,
912
+ ],
913
+ ],
914
+ },
915
+ "stack": [
916
+ [
917
+ "getData",
918
+ "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
919
+ 637,
920
+ 13,
921
+ 635,
922
+ 5,
923
+ ],
924
+ [
925
+ "ThirdPartyComponent",
926
+ "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
927
+ 642,
928
+ 18,
929
+ 641,
930
+ 5,
931
+ ],
932
+ ],
933
+ },
934
+ {
935
+ "time": 0,
936
+ },
937
+ {
938
+ "time": 0,
939
+ },
940
+ {
941
+ "time": 0,
942
+ },
943
+ ]
944
+ `);
945
+ }
946
+ });
947
});