summaryrefslogtreecommitdiff
path: root/test/parallel/test-stream-readable-async-iterators.js
diff options
context:
space:
mode:
authorDavid Mark Clements <huperekchuno@googlemail.com>2019-07-05 20:02:08 +0200
committerRich Trott <rtrott@gmail.com>2019-07-20 22:32:08 -0700
commit34997417b35bb1c5707d833e2a3588d2e9827460 (patch)
treed7f9de384dd8075a6bdda839660ee9be2436e00f /test/parallel/test-stream-readable-async-iterators.js
parentf02dfdb2b5e266a057eda1e07eafc62b55f468d3 (diff)
downloadandroid-node-v8-34997417b35bb1c5707d833e2a3588d2e9827460.tar.gz
android-node-v8-34997417b35bb1c5707d833e2a3588d2e9827460.tar.bz2
android-node-v8-34997417b35bb1c5707d833e2a3588d2e9827460.zip
stream: add null push transform in async_iterator
when the readable side of a transform ends any for await loop on that transform stream should also complete. This fix prevents for await loop on a transform stream from hanging indefinitely. PR-URL: https://github.com/nodejs/node/pull/28566 Reviewed-By: Anna Henningsen <anna@addaleax.net> Reviewed-By: Jeremiah Senkpiel <fishrock123@rocketmail.com> Reviewed-By: Ruben Bridgewater <ruben@bridgewater.de> Reviewed-By: James M Snell <jasnell@gmail.com> Reviewed-By: Rich Trott <rtrott@gmail.com>
Diffstat (limited to 'test/parallel/test-stream-readable-async-iterators.js')
-rw-r--r--test/parallel/test-stream-readable-async-iterators.js26
1 files changed, 25 insertions, 1 deletions
diff --git a/test/parallel/test-stream-readable-async-iterators.js b/test/parallel/test-stream-readable-async-iterators.js
index b50a6b1734..12971cb236 100644
--- a/test/parallel/test-stream-readable-async-iterators.js
+++ b/test/parallel/test-stream-readable-async-iterators.js
@@ -1,7 +1,7 @@
'use strict';
const common = require('../common');
-const { Readable, PassThrough, pipeline } = require('stream');
+const { Readable, Transform, PassThrough, pipeline } = require('stream');
const assert = require('assert');
async function tests() {
@@ -397,6 +397,30 @@ async function tests() {
}
{
+ console.log('readable side of a transform stream pushes null');
+ const transform = new Transform({
+ objectMode: true,
+ transform: (chunk, enc, cb) => { cb(null, chunk); }
+ });
+ transform.push(0);
+ transform.push(1);
+ process.nextTick(() => {
+ transform.push(null);
+ });
+
+ const mustReach = [ common.mustCall(), common.mustCall() ];
+
+ const iter = transform[Symbol.asyncIterator]();
+ assert.strictEqual((await iter.next()).value, 0);
+
+ for await (const d of iter) {
+ assert.strictEqual(d, 1);
+ mustReach[0]();
+ }
+ mustReach[1]();
+ }
+
+ {
console.log('all next promises must be resolved on end');
const r = new Readable({
objectMode: true,