summaryrefslogtreecommitdiff
path: root/runtime/js/40_process.js
diff options
context:
space:
mode:
authorNayeem Rahman <nayeemrmn99@gmail.com>2020-12-17 16:37:57 +0000
committerGitHub <noreply@github.com>2020-12-17 17:37:57 +0100
commitffb5f7a4e1d5d4ac488058ca3ec3c0805587fe44 (patch)
treedc7b79a699732680fa309d97e5b4c2bc5f486a4a /runtime/js/40_process.js
parent55dc467b419b8e5897b1c832b04d63e383253d84 (diff)
refactor: Rename runtime/rt to runtime/js (#8806)
Diffstat (limited to 'runtime/js/40_process.js')
-rw-r--r--runtime/js/40_process.js122
1 files changed, 122 insertions, 0 deletions
diff --git a/runtime/js/40_process.js b/runtime/js/40_process.js
new file mode 100644
index 000000000..b46a1aead
--- /dev/null
+++ b/runtime/js/40_process.js
@@ -0,0 +1,122 @@
+// Copyright 2018-2020 the Deno authors. All rights reserved. MIT license.
+
+((window) => {
+ const core = window.Deno.core;
+ const { File } = window.__bootstrap.files;
+ const { readAll } = window.__bootstrap.buffer;
+ const { assert, pathFromURL } = window.__bootstrap.util;
+
+ function opKill(pid, signo) {
+ core.jsonOpSync("op_kill", { pid, signo });
+ }
+
+ function opRunStatus(rid) {
+ return core.jsonOpAsync("op_run_status", { rid });
+ }
+
+ function opRun(request) {
+ assert(request.cmd.length > 0);
+ return core.jsonOpSync("op_run", request);
+ }
+
+ async function runStatus(rid) {
+ const res = await opRunStatus(rid);
+
+ if (res.gotSignal) {
+ const signal = res.exitSignal;
+ return { success: false, code: 128 + signal, signal };
+ } else if (res.exitCode != 0) {
+ return { success: false, code: res.exitCode };
+ } else {
+ return { success: true, code: 0 };
+ }
+ }
+
+ class Process {
+ constructor(res) {
+ this.rid = res.rid;
+ this.pid = res.pid;
+
+ if (res.stdinRid && res.stdinRid > 0) {
+ this.stdin = new File(res.stdinRid);
+ }
+
+ if (res.stdoutRid && res.stdoutRid > 0) {
+ this.stdout = new File(res.stdoutRid);
+ }
+
+ if (res.stderrRid && res.stderrRid > 0) {
+ this.stderr = new File(res.stderrRid);
+ }
+ }
+
+ status() {
+ return runStatus(this.rid);
+ }
+
+ async output() {
+ if (!this.stdout) {
+ throw new TypeError("stdout was not piped");
+ }
+ try {
+ return await readAll(this.stdout);
+ } finally {
+ this.stdout.close();
+ }
+ }
+
+ async stderrOutput() {
+ if (!this.stderr) {
+ throw new TypeError("stderr was not piped");
+ }
+ try {
+ return await readAll(this.stderr);
+ } finally {
+ this.stderr.close();
+ }
+ }
+
+ close() {
+ core.close(this.rid);
+ }
+
+ kill(signo) {
+ opKill(this.pid, signo);
+ }
+ }
+
+ function isRid(arg) {
+ return !isNaN(arg);
+ }
+
+ function run({
+ cmd,
+ cwd = undefined,
+ env = {},
+ stdout = "inherit",
+ stderr = "inherit",
+ stdin = "inherit",
+ }) {
+ if (cmd[0] != null) {
+ cmd[0] = pathFromURL(cmd[0]);
+ }
+ const res = opRun({
+ cmd: cmd.map(String),
+ cwd,
+ env: Object.entries(env),
+ stdin: isRid(stdin) ? "" : stdin,
+ stdout: isRid(stdout) ? "" : stdout,
+ stderr: isRid(stderr) ? "" : stderr,
+ stdinRid: isRid(stdin) ? stdin : 0,
+ stdoutRid: isRid(stdout) ? stdout : 0,
+ stderrRid: isRid(stderr) ? stderr : 0,
+ });
+ return new Process(res);
+ }
+
+ window.__bootstrap.process = {
+ run,
+ Process,
+ kill: opKill,
+ };
+})(this);