Stream.drainableProtocol
- 值:
Symbol.for('Stream.drainableProtocol')
实现以使写入器与 ondrain() 兼容。该方法应返回一个在背压清除时解决的 Promise,或者如果没有背压则返回 null。
🌐 Implement to make a writer compatible with ondrain(). The method should
return a promise that resolves when backpressure clears, or null if no
backpressure.
import { ondrain } from 'node:stream/iter';
class CustomWriter {
#queue = [];
#drain = null;
#closed = false;
[Symbol.for('Stream.drainableProtocol')]() {
if (this.#closed) return null;
if (this.#queue.length < 3) return Promise.resolve(true);
this.#drain ??= Promise.withResolvers();
return this.#drain.promise;
}
write(chunk) {
this.#queue.push(chunk);
}
flush() {
this.#queue.length = 0;
this.#drain?.resolve(true);
this.#drain = null;
}
close() {
this.#closed = true;
}
}
const writer = new CustomWriter();
const ready = ondrain(writer);
console.log(ready); // Promise { true } -- no backpressureconst { ondrain } = require('node:stream/iter');
class CustomWriter {
#queue = [];
#drain = null;
#closed = false;
[Symbol.for('Stream.drainableProtocol')]() {
if (this.#closed) return null;
if (this.#queue.length < 3) return Promise.resolve(true);
this.#drain ??= Promise.withResolvers();
return this.#drain.promise;
}
write(chunk) {
this.#queue.push(chunk);
}
flush() {
this.#queue.length = 0;
this.#drain?.resolve(true);
this.#drain = null;
}
close() {
this.#closed = true;
}
}
const writer = new CustomWriter();
const ready = ondrain(writer);
console.log(ready); // Promise { true } -- no backpressure