`Duplex.allowHalfOpen` not behaving according to the docs?
It seems like Duplex's allowHalfOpen option is not following the documentation behavior:
If set to
false, then the stream will automatically end the readable side when the writable side ends and vice versa.
'use strict'; var stream = require('stream'); class RangeSource extends stream.Readable { constructor(min, max, options) { super(options); this.min = min|0; this.max = max|0; this.next = this.min; } _read() { for (let data = this.next; data <= this.max; ++data) { if (!this.push(data.toString())) { this.next = data + 1; return; } } this.push(null); } } class Sink extends stream.Writable { _write(data, encoding, next) { next() } } class PushDuplex extends stream.Duplex { constructor(options) { super(options); // uncomment for the correct (?) behavior: /* this.on('finish', () => { if (!this.allowHalfOpen) { this.push(null); } }); //*/ } _read() {} _write(data, enc, next) { this.push(data); next(); } } var source = new RangeSource(1, 3); var allow = new PushDuplex({ allowHalfOpen: true }); var disallow = new PushDuplex({ allowHalfOpen: false }); var sink = new Sink(); source .on('data', (data) => console.log('source data:', data.toString())) .on('end', () => console.log('source ended')); source.pipe(allow, { end: true }) .on('data', (data) => console.log('allow data:', data.toString())) .on('end', () => console.log('allow ended')) .pipe(sink); source.pipe(disallow, { end: true }) .on('data', (data) => console.log('disallow data:', data.toString())) .on('end', () => console.log('disallow ended')) .pipe(sink);
You can see the readable side isn't closed when the writable side ends. Are the docs, Duplex or am I wrong?