@@ -8,6 +8,59 @@ import { Channel } from '../Channel'
88import CancellationToken from 'cancellationtoken'
99import * as assert from 'assert'
1010import { nextTick } from 'process'
11+ import { Duplex } from 'stream'
12+
13+ it ( 'highWatermark threshold does not clog' , async ( ) => {
14+ // Brokered service
15+ let bytesToReceive = 0
16+ let receivedAllBytes = new Deferred ( )
17+ function receiver ( pipe : Duplex ) {
18+ let lengths : number [ ] = [ ]
19+ pipe . on ( 'data' , ( data : Buffer ) => {
20+ lengths . push ( data . length )
21+
22+ bytesToReceive -= data . length
23+ // console.log(`recv ${data.length}. ${bytesToReceive} remaining`)
24+ if ( bytesToReceive <= 0 ) {
25+ receivedAllBytes . resolve ( undefined )
26+ }
27+ } )
28+ }
29+
30+ // IServiceBroker
31+ const { first : localServicePipe , second : servicePipe } = FullDuplexStream . CreatePair ( )
32+ receiver ( localServicePipe )
33+
34+ // MultiplexingStreamServiceBroker
35+ const simulatedMxStream = FullDuplexStream . CreatePair ( )
36+ const [ mx1 , mx2 ] = await Promise . all ( [ MultiplexingStream . CreateAsync ( simulatedMxStream . first ) , MultiplexingStream . CreateAsync ( simulatedMxStream . second ) ] )
37+ const [ local , remote ] = await Promise . all ( [ mx1 . offerChannelAsync ( '' ) , mx2 . acceptChannelAsync ( '' ) ] )
38+ servicePipe . pipe ( local . stream )
39+ local . stream . pipe ( servicePipe )
40+
41+ global . test_servicePipe = servicePipe
42+ global . test_d = local . stream
43+ global . test_localServicePipe = localServicePipe
44+
45+ // brokered service client
46+ function writeHelper ( buffer : Buffer ) : boolean {
47+ bytesToReceive += buffer . length
48+ const result = remote . stream . write ( buffer )
49+ // console.log('written', buffer.length, result)
50+ return result
51+ }
52+ for ( let i = 15 ; i < 20 ; i ++ ) {
53+ const buffer = Buffer . alloc ( i * 1024 )
54+ writeHelper ( buffer )
55+ await nextTickAsync ( )
56+ writeHelper ( Buffer . alloc ( 10 ) )
57+ await nextTickAsync ( )
58+ }
59+
60+ if ( bytesToReceive > 0 ) {
61+ await receivedAllBytes . promise
62+ }
63+ } )
1164; [ 1 , 2 , 3 ] . forEach ( protocolMajorVersion => {
1265 describe ( `MultiplexingStream v${ protocolMajorVersion } ` , ( ) => {
1366 let mx1 : MultiplexingStream
0 commit comments