diff options
author | David Mark Clements <huperekchuno@googlemail.com> | 2019-07-05 20:02:08 +0200 |
---|---|---|
committer | Rich Trott <rtrott@gmail.com> | 2019-07-20 22:32:08 -0700 |
commit | 34997417b35bb1c5707d833e2a3588d2e9827460 (patch) | |
tree | d7f9de384dd8075a6bdda839660ee9be2436e00f /test/parallel/test-stream-readable-async-iterators.js | |
parent | f02dfdb2b5e266a057eda1e07eafc62b55f468d3 (diff) | |
download | android-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.js | 26 |
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, |