diff options
author | Leo Kettmeir <crowlkats@toaxl.com> | 2022-07-18 22:24:35 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-07-18 22:24:35 +0200 |
commit | 2bebdc9116f0824f0eb6241445de6fb1925f4c15 (patch) | |
tree | 55b2dbe9f7022b7693165b75a97e26cef0c2eb9c /runtime/js/40_spawn.js | |
parent | 9eb70bdb5fda8e66895e0e4cc1f356c2717f74c5 (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/40_spawn.js')
-rw-r--r-- | runtime/js/40_spawn.js | 34 |
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) { |