summaryrefslogtreecommitdiff
path: root/runtime/js/40_spawn.js
diff options
context:
space:
mode:
Diffstat (limited to 'runtime/js/40_spawn.js')
-rw-r--r--runtime/js/40_spawn.js34
1 files changed, 31 insertions, 3 deletions
diff --git a/runtime/js/40_spawn.js b/runtime/js/40_spawn.js
index 54914dc09..a00b8cfda 100644
--- a/runtime/js/40_spawn.js
+++ b/runtime/js/40_spawn.js
@@ -13,10 +13,13 @@
TypeError,
Uint8Array,
PromiseAll,
+ SymbolFor,
} = window.__bootstrap.primordials;
const { readableStreamForRid, writableStreamForRid } =
window.__bootstrap.streamUtils;
+ const promiseIdSymbol = SymbolFor("Deno.core.internalPromiseId");
+
function spawnChild(command, {
args = [],
cwd = undefined,
@@ -71,6 +74,7 @@
class Child {
#rid;
+ #waitPromiseId;
#pid;
get pid() {
@@ -85,6 +89,8 @@
return this.#stdin;
}
+ #stdoutPromiseId;
+ #stdoutRid;
#stdout = null;
get stdout() {
if (this.#stdout == null) {
@@ -93,6 +99,8 @@
return this.#stdout;
}
+ #stderrPromiseId;
+ #stderrRid;
#stderr = null;
get stderr() {
if (this.#stderr == null) {
@@ -121,17 +129,25 @@
}
if (stdoutRid !== null) {
- this.#stdout = readableStreamForRid(stdoutRid);
+ this.#stdoutRid = stdoutRid;
+ this.#stdout = readableStreamForRid(stdoutRid, (promise) => {
+ this.#stdoutPromiseId = promise[promiseIdSymbol];
+ });
}
if (stderrRid !== null) {
- this.#stderr = readableStreamForRid(stderrRid);
+ this.#stderrRid = stderrRid;
+ this.#stderr = readableStreamForRid(stderrRid, (promise) => {
+ this.#stderrPromiseId = promise[promiseIdSymbol];
+ });
}
const onAbort = () => this.kill("SIGTERM");
signal?.[add](onAbort);
- this.#status = core.opAsync("op_spawn_wait", this.#rid).then((res) => {
+ const waitPromise = core.opAsync("op_spawn_wait", this.#rid);
+ this.#waitPromiseId = waitPromise[promiseIdSymbol];
+ this.#status = waitPromise.then((res) => {
this.#rid = null;
signal?.[remove](onAbort);
return res;
@@ -186,6 +202,18 @@
}
core.opSync("op_kill", this.#pid, signo);
}
+
+ ref() {
+ core.refOp(this.#waitPromiseId);
+ if (this.#stdoutPromiseId) core.refOp(this.#stdoutPromiseId);
+ if (this.#stderrPromiseId) core.refOp(this.#stderrPromiseId);
+ }
+
+ unref() {
+ core.unrefOp(this.#waitPromiseId);
+ if (this.#stdoutPromiseId) core.unrefOp(this.#stdoutPromiseId);
+ if (this.#stderrPromiseId) core.unrefOp(this.#stderrPromiseId);
+ }
}
function spawn(command, options) {