diff options
Diffstat (limited to 'src/bun.js/builtins/js/ProcessObjectInternals.js')
-rw-r--r-- | src/bun.js/builtins/js/ProcessObjectInternals.js | 84 |
1 files changed, 35 insertions, 49 deletions
diff --git a/src/bun.js/builtins/js/ProcessObjectInternals.js b/src/bun.js/builtins/js/ProcessObjectInternals.js index bcbc7873e..5c5fab9ea 100644 --- a/src/bun.js/builtins/js/ProcessObjectInternals.js +++ b/src/bun.js/builtins/js/ProcessObjectInternals.js @@ -439,10 +439,12 @@ function getStdinStream(fd, rawRequire, Bun) { var module = { path: "node:process", require: rawRequire }; var require = (path) => module.require(path); - var { Readable, Duplex, eos, destroy } = require("node:stream"); + var { Duplex, eos, destroy } = require("node:stream"); var StdinStream = class StdinStream extends Duplex { - #readStream; + #reader; + // TODO: investigate https://github.com/oven-sh/bun/issues/1607 + #readRef; #writeStream; #readable = true; @@ -451,7 +453,6 @@ function getStdinStream(fd, rawRequire, Bun) { #onFinish; #onClose; #onDrain; - #onReadable; get isTTY() { return require("tty").isatty(fd); @@ -461,10 +462,13 @@ function getStdinStream(fd, rawRequire, Bun) { return fd_; } + // TODO: investigate https://github.com/oven-sh/bun/issues/1608 + _construct(callback) { + callback(); + } + constructor() { super({ readable: true, writable: true }); - - this.#onReadable = (...args) => this._read(...args); } #onFinished(err) { @@ -505,63 +509,45 @@ function getStdinStream(fd, rawRequire, Bun) { callback(err); } else { this.#onClose = callback; - if (this.#readStream) destroy(this.#readStream, err); if (this.#writeStream) destroy(this.#writeStream, err); } } - on(ev, cb) { - super.on(ev, cb); - if (!this.#readStream && (ev === "readable" || ev === "data")) { - this.#loadReadStream(); - } - - return this; + pause() { + this.unref(); + return super.pause(); } - once(ev, cb) { - super.once(ev, cb); - if (!this.#readStream && (ev === "readable" || ev === "data")) { - this.#loadReadStream(); - } - - return this; - } - - #loadReadStream() { - var readStream = (this.#readStream = Readable.fromWeb( - Bun.stdin.stream(), - )); - - readStream.on("data", (data) => { - this.push(data); - }); - readStream.ref(); - - readStream.on("end", () => { - this.push(null); - }); - - eos(readStream, (err) => { - this.#readable = false; - if (err) { - destroy(readStream, err); - } - this.#onFinished(err); - }); + resume() { + this.#reader = Bun.stdin.stream().getReader(); + this.ref(); + return super.resume(); } ref() { - this.#readStream?.ref?.(); + this.#readRef ??= setInterval(() => {}, 1 << 30); } unref() { - this.#readStream?.unref?.(); + if (this.#readRef) { + clearInterval(this.#readRef); + this.#readRef = null; + } } - _read(encoding, callback) { - if (!this.#readStream) this.#loadReadStream(); - - return this.#readStream._read(...arguments); + _read(size) { + this.#reader.read().then((data) => { + if (data.done) { + this.push(null); + this.pause(); + this.#readable = false; + this.#onFinished(); + } else { + this.push(data.value); + } + }).catch((err) => { + this.#readable = false; + this.#onFinished(err); + }); } #constructWriteStream() { |