From 70244d0b571210476a7e3f4b9550034d423c5cfa Mon Sep 17 00:00:00 2001 From: Robert Nagy Date: Sun, 23 Oct 2022 15:49:24 +0200 Subject: [PATCH] stream: fix duplexify premature destroy MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The duplexified Duplex should be autoDestroyed instead of prematurely destroyed when the readable and writable sides have finished without error. Fixes: https://github.com/nodejs/node/issues/44925 PR-URL: https://github.com/nodejs/node/pull/45133 Reviewed-By: Matteo Collina Reviewed-By: Benjamin Gruenbaum Reviewed-By: Juan José Arboleda --- lib/internal/streams/duplexify.js | 2 -- test/parallel/test-stream-duplex-from.js | 23 ++++++++++++++++++++++- 2 files changed, 22 insertions(+), 3 deletions(-) diff --git a/lib/internal/streams/duplexify.js b/lib/internal/streams/duplexify.js index 6fb4e35bafa099..bfcd51233ac786 100644 --- a/lib/internal/streams/duplexify.js +++ b/lib/internal/streams/duplexify.js @@ -262,8 +262,6 @@ function _duplexify(pair) { cb(err); } else if (err) { d.destroy(err); - } else if (!readable && !writable) { - d.destroy(); } } diff --git a/test/parallel/test-stream-duplex-from.js b/test/parallel/test-stream-duplex-from.js index ba445f892e4bb6..0e69592ae24990 100644 --- a/test/parallel/test-stream-duplex-from.js +++ b/test/parallel/test-stream-duplex-from.js @@ -2,7 +2,7 @@ const common = require('../common'); const assert = require('assert'); -const { Duplex, Readable, Writable, pipeline } = require('stream'); +const { Duplex, Readable, Writable, pipeline, PassThrough } = require('stream'); const { Blob } = require('buffer'); { @@ -278,3 +278,24 @@ const { Blob } = require('buffer'); duplex.write('test'); } + +{ + const through = new PassThrough({ objectMode: true }); + + let res = ''; + const d = Readable.from(['foo', 'bar'], { objectMode: true }) + .pipe(Duplex.from({ + writable: through, + readable: through + })); + + d.on('data', (data) => { + d.pause(); + setImmediate(() => { + d.resume(); + }); + res += data; + }).on('end', common.mustCall(() => { + assert.strictEqual(res, 'foobar'); + })).on('close', common.mustCall()); +}