@@ -573,7 +573,11 @@ export abstract class AbstractRemote {
573573
574574 const stream = new DataStream < T , string > ( {
575575 logger : this . logger ,
576- mapLine : mapLine
576+ mapLine : mapLine ,
577+ pressure : {
578+ highWaterMark : 20 ,
579+ lowWaterMark : 10
580+ }
577581 } ) ;
578582
579583 abortSignal ?. addEventListener ( 'abort' , ( ) => {
@@ -585,46 +589,54 @@ export abstract class AbstractRemote {
585589 let buffer = '' ;
586590
587591
592+ const consumeStream = async ( ) => {
593+ while ( ! stream . closed && ! abortSignal ?. aborted && ! readerReleased ) {
594+ const { done, value } = await reader . read ( ) ;
595+ if ( done ) {
596+ const remaining = buffer . trim ( ) ;
597+ if ( remaining . length != 0 ) {
598+ stream . enqueueData ( remaining ) ;
599+ }
588600
589- const l = stream . registerListener ( {
590- lowWater : async ( ) => {
591- if ( stream . closed || abortSignal ?. aborted || readerReleased ) {
592- return
593- }
594- try {
595- let didCompleteLine = false ;
596- while ( ! didCompleteLine ) {
597- const { done, value } = await reader . read ( ) ;
598- if ( done ) {
599- const remaining = buffer . trim ( ) ;
600- if ( remaining . length != 0 ) {
601- stream . enqueueData ( remaining ) ;
602- }
601+ stream . close ( ) ;
602+ await closeReader ( ) ;
603+ return ;
604+ }
603605
604- stream . close ( ) ;
605- await closeReader ( ) ;
606- return ;
607- }
606+ const data = decoder . decode ( value , { stream : true } ) ;
607+ buffer += data ;
608608
609- const data = decoder . decode ( value , { stream : true } ) ;
610- buffer += data ;
609+ const lines = buffer . split ( '\n' ) ;
610+ for ( var i = 0 ; i < lines . length - 1 ; i ++ ) {
611+ var l = lines [ i ] . trim ( ) ;
612+ if ( l . length > 0 ) {
613+ stream . enqueueData ( l ) ;
614+ }
615+ }
611616
612- const lines = buffer . split ( '\n' ) ;
613- for ( var i = 0 ; i < lines . length - 1 ; i ++ ) {
614- var l = lines [ i ] . trim ( ) ;
615- if ( l . length > 0 ) {
616- stream . enqueueData ( l ) ;
617- didCompleteLine = true ;
617+ buffer = lines [ lines . length - 1 ] ;
618+
619+ // Implement backpressure by waiting for the low water mark to be reached
620+ if ( stream . dataQueue . length > stream . highWatermark ) {
621+ await new Promise < void > ( ( resolve ) => {
622+ const dispose = stream . registerListener ( {
623+ lowWater : async ( ) => {
624+ resolve ( ) ;
625+ dispose ( ) ;
626+ } ,
627+ closed : ( ) => {
628+ resolve ( ) ;
629+ dispose ( ) ;
618630 }
619- }
620-
621- buffer = lines [ lines . length - 1 ] ;
622- }
623- } catch ( ex ) {
624- stream . close ( ) ;
625- throw ex ;
631+ } )
632+ } )
626633 }
627- } ,
634+ }
635+ }
636+
637+ consumeStream ( ) . catch ( ex => this . logger . error ( 'Error consuming stream' , ex ) ) ;
638+
639+ const l = stream . registerListener ( {
628640 closed : ( ) => {
629641 closeReader ( ) ;
630642 l ?.( ) ;
0 commit comments