-
Notifications
You must be signed in to change notification settings - Fork 29.8k
/
test-readline-async-iterators-backpressure.js
58 lines (48 loc) · 1.72 KB
/
test-readline-async-iterators-backpressure.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
'use strict';
const common = require('../common');
const assert = require('assert');
const { Readable } = require('stream');
const readline = require('readline');
const CONTENT = 'content';
const LINES_PER_PUSH = 2051;
const REPETITIONS = 3;
(async () => {
const readable = new Readable({ read() {} });
let salt = 0;
for (let i = 0; i < REPETITIONS; i++) {
readable.push(`${CONTENT}\n`.repeat(LINES_PER_PUSH + i));
salt += i;
}
const TOTAL_LINES = LINES_PER_PUSH * REPETITIONS + salt;
const rli = readline.createInterface({
input: readable,
crlfDelay: Infinity
});
const it = rli[Symbol.asyncIterator]();
const watermarkData = it[Symbol.for('nodejs.watermarkData')];
const highWaterMark = watermarkData.high;
// 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, `TOTAL_LINES (${TOTAL_LINES}) isn't greater than highWaterMark (${highWaterMark})`);
let iterations = 0;
let readableEnded = false;
let notPaused = 0;
for await (const line of it) {
assert.strictEqual(readableEnded, false);
assert.strictEqual(line, CONTENT);
assert.ok(watermarkData.size <= TOTAL_LINES);
assert.strictEqual(readable.isPaused(), watermarkData.size >= 1);
if (!readable.isPaused()) {
notPaused++;
}
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);
assert.strictEqual(notPaused, REPETITIONS);
})().then(common.mustCall());