@@ -77,6 +77,24 @@ async function complete(document: DocumentNode, rootValue: unknown = {}) {
77
77
return result ;
78
78
}
79
79
80
+ async function completeAsync (
81
+ document : DocumentNode ,
82
+ numCalls : number ,
83
+ rootValue : unknown = { } ,
84
+ ) {
85
+ const result = await execute ( { schema, document, rootValue } ) ;
86
+
87
+ assert ( isAsyncIterable ( result ) ) ;
88
+
89
+ const iterator = result [ Symbol . asyncIterator ] ( ) ;
90
+
91
+ const promises = [ ] ;
92
+ for ( let i = 0 ; i < numCalls ; i ++ ) {
93
+ promises . push ( iterator . next ( ) ) ;
94
+ }
95
+ return Promise . all ( promises ) ;
96
+ }
97
+
80
98
function createResolvablePromise < T > ( ) : [ Promise < T > , ( value ?: T ) => void ] {
81
99
let resolveFn ;
82
100
const promise = new Promise < T > ( ( resolve ) => {
@@ -566,6 +584,51 @@ describe('Execute: stream directive', () => {
566
584
} ,
567
585
} ) ;
568
586
} ) ;
587
+ it ( 'Can handle concurrent calls to .next() without waiting' , async ( ) => {
588
+ const document = parse ( `
589
+ query {
590
+ friendList @stream(initialCount: 2) {
591
+ name
592
+ id
593
+ }
594
+ }
595
+ ` ) ;
596
+ const result = await completeAsync ( document , 4 , {
597
+ async * friendList ( ) {
598
+ yield await Promise . resolve ( friends [ 0 ] ) ;
599
+ yield await Promise . resolve ( friends [ 1 ] ) ;
600
+ yield await Promise . resolve ( friends [ 2 ] ) ;
601
+ } ,
602
+ } ) ;
603
+ expectJSON ( result ) . toDeepEqual ( [
604
+ {
605
+ done : false ,
606
+ value : {
607
+ data : {
608
+ friendList : [
609
+ { name : 'Luke' , id : '1' } ,
610
+ { name : 'Han' , id : '2' } ,
611
+ ] ,
612
+ } ,
613
+ hasNext : true ,
614
+ } ,
615
+ } ,
616
+ {
617
+ done : false ,
618
+ value : {
619
+ incremental : [
620
+ {
621
+ items : [ { name : 'Leia' , id : '3' } ] ,
622
+ path : [ 'friendList' , 2 ] ,
623
+ } ,
624
+ ] ,
625
+ hasNext : true ,
626
+ } ,
627
+ } ,
628
+ { done : false , value : { hasNext : false } } ,
629
+ { done : true , value : undefined } ,
630
+ ] ) ;
631
+ } ) ;
569
632
it ( 'Handles error thrown in async iterable before initialCount is reached' , async ( ) => {
570
633
const document = parse ( `
571
634
query {
0 commit comments