From ba3fe3ffe21df61b7fe2e7076fdf541eac765510 Mon Sep 17 00:00:00 2001 From: Robert Nagy Date: Sun, 5 Jan 2020 11:55:34 +0100 Subject: [PATCH 1/4] stream: sync stream unpipe resume pipe() ondata should not control flow state if cleaned up. Fixes: https://github.com/nodejs/node/issues/31190 --- lib/_stream_readable.js | 2 +- .../test-stream-readable-unpipe-resume.js | 21 +++++++++++++++++++ 2 files changed, 22 insertions(+), 1 deletion(-) create mode 100644 test/parallel/test-stream-readable-unpipe-resume.js diff --git a/lib/_stream_readable.js b/lib/_stream_readable.js index 4c287b996fba40..cfc9a0d922c985 100644 --- a/lib/_stream_readable.js +++ b/lib/_stream_readable.js @@ -739,6 +739,7 @@ Readable.prototype.pipe = function(dest, pipeOpts) { debug('false write response, pause', state.awaitDrainWriters.size); state.awaitDrainWriters.add(dest); } + src.pause(); } if (!ondrain) { // When the dest drains, it reduces the awaitDrain counter @@ -748,7 +749,6 @@ Readable.prototype.pipe = function(dest, pipeOpts) { ondrain = pipeOnDrain(src, dest); dest.on('drain', ondrain); } - src.pause(); } } diff --git a/test/parallel/test-stream-readable-unpipe-resume.js b/test/parallel/test-stream-readable-unpipe-resume.js new file mode 100644 index 00000000000000..375315cf9230bb --- /dev/null +++ b/test/parallel/test-stream-readable-unpipe-resume.js @@ -0,0 +1,21 @@ +'use strict'; + +const common = require('../common'); + +const stream = require('stream') + +const fs = require('fs'); +const readStream = fs.createReadStream('out/Release/node') + +const transformStream = new class extends stream.Transform { + _transform() { + readStream.unpipe() + readStream.resume() + } +} + +readStream.on('end', common.mustCall()); + +readStream + .pipe(transformStream) + .resume() From a88db4f1d61003080f2d8632ede85d9a353e5411 Mon Sep 17 00:00:00 2001 From: Robert Nagy Date: Sun, 5 Jan 2020 12:03:49 +0100 Subject: [PATCH 2/4] fixup: process.execPath --- test/parallel/test-stream-readable-unpipe-resume.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/parallel/test-stream-readable-unpipe-resume.js b/test/parallel/test-stream-readable-unpipe-resume.js index 375315cf9230bb..c89954f312bcc1 100644 --- a/test/parallel/test-stream-readable-unpipe-resume.js +++ b/test/parallel/test-stream-readable-unpipe-resume.js @@ -5,7 +5,7 @@ const common = require('../common'); const stream = require('stream') const fs = require('fs'); -const readStream = fs.createReadStream('out/Release/node') +const readStream = fs.createReadStream(process.execPath) const transformStream = new class extends stream.Transform { _transform() { From 9d6a9a521c96ff27ec20f76ee6675eb513368a54 Mon Sep 17 00:00:00 2001 From: Robert Nagy Date: Sun, 5 Jan 2020 12:04:49 +0100 Subject: [PATCH 3/4] fixup: common.mustCall transform --- test/parallel/test-stream-readable-unpipe-resume.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/test/parallel/test-stream-readable-unpipe-resume.js b/test/parallel/test-stream-readable-unpipe-resume.js index c89954f312bcc1..5539ded12a4514 100644 --- a/test/parallel/test-stream-readable-unpipe-resume.js +++ b/test/parallel/test-stream-readable-unpipe-resume.js @@ -7,12 +7,12 @@ const stream = require('stream') const fs = require('fs'); const readStream = fs.createReadStream(process.execPath) -const transformStream = new class extends stream.Transform { - _transform() { +const transformStream = new stream.Transform ({ + transform: common.mustCall(() => { readStream.unpipe() readStream.resume() - } -} + }) +}); readStream.on('end', common.mustCall()); From c9cd4450b03650dbcddef6b76a48c290b31a596c Mon Sep 17 00:00:00 2001 From: Robert Nagy Date: Sun, 5 Jan 2020 12:06:03 +0100 Subject: [PATCH 4/4] fixup: linting --- .../test-stream-readable-unpipe-resume.js | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/test/parallel/test-stream-readable-unpipe-resume.js b/test/parallel/test-stream-readable-unpipe-resume.js index 5539ded12a4514..b40f724bccfc83 100644 --- a/test/parallel/test-stream-readable-unpipe-resume.js +++ b/test/parallel/test-stream-readable-unpipe-resume.js @@ -1,16 +1,15 @@ 'use strict'; const common = require('../common'); - -const stream = require('stream') - +const stream = require('stream'); const fs = require('fs'); -const readStream = fs.createReadStream(process.execPath) -const transformStream = new stream.Transform ({ +const readStream = fs.createReadStream(process.execPath); + +const transformStream = new stream.Transform({ transform: common.mustCall(() => { - readStream.unpipe() - readStream.resume() + readStream.unpipe(); + readStream.resume(); }) }); @@ -18,4 +17,4 @@ readStream.on('end', common.mustCall()); readStream .pipe(transformStream) - .resume() + .resume();