Skip to content

Commit 7647860

Browse files
ronagBethGriggs
authored andcommitted
stream: finished should complete with read-only Duplex
If passed a Duplex where readable or writable has been explicitly disabled then don't assume 'close' will be emitted. Fixes: #32965 PR-URL: #32967 Reviewed-By: Matteo Collina <[email protected]> Reviewed-By: Mathias Buus <[email protected]> Reviewed-By: Rich Trott <[email protected]> Reviewed-By: Juan José Arboleda <[email protected]>
1 parent aec7bc7 commit 7647860

File tree

2 files changed

+36
-2
lines changed

2 files changed

+36
-2
lines changed

lib/internal/streams/end-of-stream.js

+3-1
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,9 @@ function eos(stream, opts, callback) {
7676
state &&
7777
state.autoDestroy &&
7878
state.emitClose &&
79-
state.closed === false
79+
state.closed === false &&
80+
isReadable(stream) === readable &&
81+
isWritable(stream) === writable
8082
);
8183

8284
let writableFinished = stream.writableFinished ||

test/parallel/test-stream-finished.js

+33-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
'use strict';
22

33
const common = require('../common');
4-
const { Writable, Readable, Transform, finished } = require('stream');
4+
const { Writable, Readable, Transform, finished, Duplex } = require('stream');
55
const assert = require('assert');
66
const EE = require('events');
77
const fs = require('fs');
@@ -352,3 +352,35 @@ testClosed((opts) => new Writable({ write() {}, ...opts }));
352352
r.push(null);
353353
r.destroy();
354354
}
355+
356+
{
357+
const d = new Duplex({
358+
final(cb) { }, // Never close writable side for test purpose
359+
read() {
360+
this.push(null);
361+
}
362+
});
363+
364+
d.on('end', common.mustCall());
365+
366+
finished(d, { readable: true, writable: false }, common.mustCall());
367+
368+
d.end();
369+
d.resume();
370+
}
371+
372+
{
373+
const d = new Duplex({
374+
final(cb) { }, // Never close writable side for test purpose
375+
read() {
376+
this.push(null);
377+
}
378+
});
379+
380+
d.on('end', common.mustCall());
381+
382+
d.end();
383+
finished(d, { readable: true, writable: false }, common.mustCall());
384+
385+
d.resume();
386+
}

0 commit comments

Comments
 (0)