| '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()); |