0
0
mirror of https://github.com/nodejs/node.git synced 2024-12-01 16:10:02 +01:00
nodejs/test/parallel/test-stream-readable-pause-and-resume.js
Robert Nagy 3d47c8592d
stream: reset flowing state if no 'readable' or 'data' listeners
If we don't have any 'readable' or 'data' listeners and we are
not about to resume. Then reset flowing state to initial null state.

PR-URL: https://github.com/nodejs/node/pull/31036
Fixes: https://github.com/nodejs/node/issues/24474
Reviewed-By: Luigi Pinca <luigipinca@gmail.com>
Reviewed-By: Matteo Collina <matteo.collina@gmail.com>
Reviewed-By: Rich Trott <rtrott@gmail.com>
2019-12-25 12:12:59 +01:00

59 lines
1.1 KiB
JavaScript

'use strict';
const common = require('../common');
const assert = require('assert');
const { Readable } = require('stream');
let ticks = 18;
let expectedData = 19;
const rs = new Readable({
objectMode: true,
read: () => {
if (ticks-- > 0)
return process.nextTick(() => rs.push({}));
rs.push({});
rs.push(null);
}
});
rs.on('end', common.mustCall());
readAndPause();
function readAndPause() {
// Does a on(data) -> pause -> wait -> resume -> on(data) ... loop.
// Expects on(data) to never fire if the stream is paused.
const ondata = common.mustCall((data) => {
rs.pause();
expectedData--;
if (expectedData <= 0)
return;
setImmediate(function() {
rs.removeListener('data', ondata);
readAndPause();
rs.resume();
});
}, 1); // Only call ondata once
rs.on('data', ondata);
}
{
const readable = new Readable({
read() {}
});
function read() {}
readable.setEncoding('utf8');
readable.on('readable', read);
readable.removeListener('readable', read);
readable.pause();
process.nextTick(function() {
assert(readable.isPaused());
});
}