Open
Description
Version
16.14.2
Platform
x64
Subsystem
No response
What steps will reproduce the bug?
async function start() {
const { Transform } = require('stream');
const transformStream = new Transform({
objectMode: true,
highWaterMark: 0,
transform(item, enc, callback) {
console.error("writing", item);
this.push(item);
callback();
}
});
transformStream.write('hello1');
transformStream.write('hello2');
transformStream.write('hello3');
transformStream.write('hello4');
transformStream.write('hello5');
transformStream.write('hello6');
transformStream.write('hello7');
transformStream.write('hello8');
transformStream.write('hello9');
transformStream.end();
for await (const text of transformStream) {
await wait();
console.error(text);
}
};
async function wait() {
return new Promise(resolve => {
setTimeout(() => resolve(), 1000);
});
}
start();
I wouldn't expect the transform
method to be called, while the highWaterMark is already reached.
How often does it reproduce? Is there a required condition?
Always
What is the expected behavior?
Node 14 and older, backpressure is handled properly (even with highWaterMark: 0):
Expected output:
writing hello1
writing hello2
hello1
hello2
writing hello3
hello3
writing hello4
hello4
writing hello5
hello5
writing hello6
hello6
writing hello7
hello7
writing hello8
hello8
writing hello9
hello9
What do you see instead?
PS > node .\backpressure.js
writing hello1
writing hello2
writing hello3
writing hello4
writing hello5
writing hello6
writing hello7
writing hello8
writing hello9
hello1
hello2
hello3
hello4
hello5
hello6
hello7
hello8
hello9
Additional information
When using highWaterMark: 1
in Node 16.x, backpressure works as expected again.
Did anything change around using highWaterMark:0
in Node16? It doesn't seem backwards compatible.