@@ -477,9 +477,13 @@ class ReadableStream {
477
477
478
478
// eslint-disable-next-line no-use-before-define
479
479
const reader = new ReadableStreamDefaultReader ( this ) ;
480
- let done = false ;
480
+
481
+ // No __proto__ here to avoid the performance hit.
482
+ const state = {
483
+ done : false ,
484
+ current : undefined ,
485
+ } ;
481
486
let started = false ;
482
- let current ;
483
487
484
488
// The nextSteps function is not an async function in order
485
489
// to make it more efficient. Because nextSteps explicitly
@@ -488,7 +492,7 @@ class ReadableStream {
488
492
// unnecessary Promise allocations to occur, which just add
489
493
// cost.
490
494
function nextSteps ( ) {
491
- if ( done )
495
+ if ( state . done )
492
496
return PromiseResolve ( { done : true , value : undefined } ) ;
493
497
494
498
if ( reader [ kState ] . stream === undefined ) {
@@ -498,31 +502,15 @@ class ReadableStream {
498
502
}
499
503
const promise = createDeferredPromise ( ) ;
500
504
501
- readableStreamDefaultReaderRead ( reader , {
502
- [ kChunk ] ( chunk ) {
503
- current = undefined ;
504
- promise . resolve ( { value : chunk , done : false } ) ;
505
- } ,
506
- [ kClose ] ( ) {
507
- current = undefined ;
508
- done = true ;
509
- readableStreamReaderGenericRelease ( reader ) ;
510
- promise . resolve ( { done : true , value : undefined } ) ;
511
- } ,
512
- [ kError ] ( error ) {
513
- current = undefined ;
514
- done = true ;
515
- readableStreamReaderGenericRelease ( reader ) ;
516
- promise . reject ( error ) ;
517
- } ,
518
- } ) ;
505
+ // eslint-disable-next-line no-use-before-define
506
+ readableStreamDefaultReaderRead ( reader , new ReadableStreamAsyncIteratorReadRequest ( reader , state , promise ) ) ;
519
507
return promise . promise ;
520
508
}
521
509
522
510
async function returnSteps ( value ) {
523
- if ( done )
511
+ if ( state . done )
524
512
return { done : true , value } ; // eslint-disable-line node-core/avoid-prototype-pollution
525
- done = true ;
513
+ state . done = true ;
526
514
527
515
if ( reader [ kState ] . stream === undefined ) {
528
516
throw new ERR_INVALID_STATE . TypeError (
@@ -559,19 +547,19 @@ class ReadableStream {
559
547
// need to investigate if it's a bug in our impl or
560
548
// the spec.
561
549
if ( ! started ) {
562
- current = PromiseResolve ( ) ;
550
+ state . current = PromiseResolve ( ) ;
563
551
started = true ;
564
552
}
565
- current = current !== undefined ?
566
- PromisePrototypeThen ( current , nextSteps , nextSteps ) :
553
+ state . current = state . current !== undefined ?
554
+ PromisePrototypeThen ( state . current , nextSteps , nextSteps ) :
567
555
nextSteps ( ) ;
568
- return current ;
556
+ return state . current ;
569
557
} ,
570
558
571
559
return ( error ) {
572
- return current ?
560
+ return state . current ?
573
561
PromisePrototypeThen (
574
- current ,
562
+ state . current ,
575
563
( ) => returnSteps ( error ) ,
576
564
( ) => returnSteps ( error ) ) :
577
565
returnSteps ( error ) ;
@@ -773,6 +761,33 @@ function createReadableStreamBYOBRequest(controller, view) {
773
761
return stream ;
774
762
}
775
763
764
+ class ReadableStreamAsyncIteratorReadRequest {
765
+ constructor ( reader , state , promise ) {
766
+ this . reader = reader ;
767
+ this . state = state ;
768
+ this . promise = promise ;
769
+ }
770
+
771
+ [ kChunk ] ( chunk ) {
772
+ this . state . current = undefined ;
773
+ this . promise . resolve ( { value : chunk , done : false } ) ;
774
+ }
775
+
776
+ [ kClose ] ( ) {
777
+ this . state . current = undefined ;
778
+ this . state . done = true ;
779
+ readableStreamReaderGenericRelease ( this . reader ) ;
780
+ this . promise . resolve ( { done : true , value : undefined } ) ;
781
+ }
782
+
783
+ [ kError ] ( error ) {
784
+ this . state . current = undefined ;
785
+ this . state . done = true ;
786
+ readableStreamReaderGenericRelease ( this . reader ) ;
787
+ this . promise . reject ( error ) ;
788
+ }
789
+ }
790
+
776
791
class DefaultReadRequest {
777
792
constructor ( ) {
778
793
this [ kState ] = createDeferredPromise ( ) ;
0 commit comments