nstdlib-nightly
Version:
Node.js standard library converted to runtime-agnostic ES modules.
60 lines (50 loc) • 1.43 kB
JavaScript
// Source: https://github.com/nodejs/node/blob/65eff1eb/lib/internal/streams/duplexpair.js
import { Duplex } from "nstdlib/lib/stream";
import * as assert from "nstdlib/lib/internal/assert";
const kCallback = Symbol("Callback");
const kInitOtherSide = Symbol("InitOtherSide");
class DuplexSide extends Duplex {
#otherSide = null;
constructor(options) {
super(options);
this[kCallback] = null;
this.#otherSide = null;
}
[kInitOtherSide](otherSide) {
// Ensure this can only be set once, to enforce encapsulation.
if (this.#otherSide === null) {
this.#otherSide = otherSide;
} else {
assert(this.#otherSide === null);
}
}
_read() {
const callback = this[kCallback];
if (callback) {
this[kCallback] = null;
callback();
}
}
_write(chunk, encoding, callback) {
assert(this.#otherSide !== null);
assert(this.#otherSide[kCallback] === null);
if (chunk.length === 0) {
process.nextTick(callback);
} else {
this.#otherSide.push(chunk);
this.#otherSide[kCallback] = callback;
}
}
_final(callback) {
this.#otherSide.on("end", callback);
this.#otherSide.push(null);
}
}
function duplexPair(options) {
const side0 = new DuplexSide(options);
const side1 = new DuplexSide(options);
side0[kInitOtherSide](side1);
side1[kInitOtherSide](side0);
return [side0, side1];
}
export default duplexPair;