summaryrefslogtreecommitdiff
path: root/runtime/js
diff options
context:
space:
mode:
authorLeo Kettmeir <crowlkats@toaxl.com>2022-07-18 22:24:35 +0200
committerGitHub <noreply@github.com>2022-07-18 22:24:35 +0200
commit2bebdc9116f0824f0eb6241445de6fb1925f4c15 (patch)
tree55b2dbe9f7022b7693165b75a97e26cef0c2eb9c /runtime/js
parent9eb70bdb5fda8e66895e0e4cc1f356c2717f74c5 (diff)
feat(unstable): Ability to ref/unref "Child" in "Deno.spawnChild()" API (#15151)
Co-authored-by: Bartek IwaƄczuk <biwanczuk@gmail.com> Co-authored-by: Colin Ihrig <cjihrig@gmail.com>
Diffstat (limited to 'runtime/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) {