0
0
mirror of https://github.com/nodejs/node.git synced 2024-12-01 16:10:02 +01:00
nodejs/test/parallel/test-readline-async-iterators-backpressure.js
Timothy Gu 2a7432dade readline: add support for async iteration
Co-authored-by: Ivan Filenko <ivan.filenko@protonmail.com>
Fixes: https://github.com/nodejs/node/issues/18603
Refs: https://github.com/nodejs/node/pull/18904
PR-URL: https://github.com/nodejs/node/pull/23916
Reviewed-By: Matteo Collina <matteo.collina@gmail.com>
Reviewed-By: Gus Caplan <me@gus.host>
2018-11-20 15:41:16 -08:00

49 lines
1.3 KiB
JavaScript

'use strict';
const common = require('../common');
const assert = require('assert');
const { Readable } = require('stream');
const readline = require('readline');
const CONTENT = 'content';
const TOTAL_LINES = 18;
(async () => {
const readable = new Readable({ read() {} });
readable.push(`${CONTENT}\n`.repeat(TOTAL_LINES));
const rli = readline.createInterface({
input: readable,
crlfDelay: Infinity
});
const it = rli[Symbol.asyncIterator]();
const highWaterMark = it.stream.readableHighWaterMark;
// For this test to work, we have to queue up more than the number of
// highWaterMark items in rli. Make sure that is the case.
assert(TOTAL_LINES > highWaterMark);
let iterations = 0;
let readableEnded = false;
for await (const line of it) {
assert.strictEqual(readableEnded, false);
assert.strictEqual(line, CONTENT);
const expectedPaused = TOTAL_LINES - iterations > highWaterMark;
assert.strictEqual(readable.isPaused(), expectedPaused);
iterations += 1;
// We have to end the input stream asynchronously for back pressure to work.
// Only end when we have reached the final line.
if (iterations === TOTAL_LINES) {
readable.push(null);
readableEnded = true;
}
}
assert.strictEqual(iterations, TOTAL_LINES);
})().then(common.mustCall());