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.js207
1 files changed, 99 insertions, 108 deletions
diff --git a/runtime/js/40_spawn.js b/runtime/js/40_spawn.js
index f153b93a5..f75d83f9b 100644
--- a/runtime/js/40_spawn.js
+++ b/runtime/js/40_spawn.js
@@ -55,16 +55,19 @@ function spawnChildInner(opFn, command, apiName, {
stderr,
windowsRawArguments,
}, apiName);
- return new Child(illegalConstructorKey, {
+ return new ChildProcess(illegalConstructorKey, {
...child,
signal,
});
}
-function createSpawnChild(opFn) {
- return function spawnChild(command, options = {}) {
- return spawnChildInner(opFn, command, "Deno.Command().spawn()", options);
- };
+function spawnChild(command, options = {}) {
+ return spawnChildInner(
+ ops.op_spawn_child,
+ command,
+ "Deno.Command().spawn()",
+ options,
+ );
}
function collectOutput(readableStream) {
@@ -77,7 +80,7 @@ function collectOutput(readableStream) {
return readableStreamCollectIntoUint8Array(readableStream);
}
-class Child {
+class ChildProcess {
#rid;
#waitPromiseId;
#unrefed = false;
@@ -95,7 +98,6 @@ class Child {
return this.#stdin;
}
- #stdoutPromiseId;
#stdoutRid;
#stdout = null;
get stdout() {
@@ -105,7 +107,6 @@ class Child {
return this.#stdout;
}
- #stderrPromiseId;
#stderrRid;
#stderr = null;
get stderr() {
@@ -220,116 +221,106 @@ class Child {
}
}
-function createSpawn(opFn) {
- return function spawn(command, options) {
- if (options?.stdin === "piped") {
- throw new TypeError(
- "Piped stdin is not supported for this function, use 'Deno.Command().spawn()' instead",
- );
- }
- return spawnChildInner(opFn, command, "Deno.Command().output()", options)
- .output();
- };
+function spawn(command, options) {
+ if (options?.stdin === "piped") {
+ throw new TypeError(
+ "Piped stdin is not supported for this function, use 'Deno.Command().spawn()' instead",
+ );
+ }
+ return spawnChildInner(
+ ops.op_spawn_child,
+ command,
+ "Deno.Command().output()",
+ options,
+ )
+ .output();
}
-function createSpawnSync(opFn) {
- return function spawnSync(command, {
- args = [],
- cwd = undefined,
- clearEnv = false,
- env = {},
- uid = undefined,
- gid = undefined,
- stdin = "null",
- stdout = "piped",
- stderr = "piped",
- windowsRawArguments = false,
- } = {}) {
- if (stdin === "piped") {
- throw new TypeError(
- "Piped stdin is not supported for this function, use 'Deno.Command().spawn()' instead",
- );
- }
- const result = opFn({
- cmd: pathFromURL(command),
- args: ArrayPrototypeMap(args, String),
- cwd: pathFromURL(cwd),
- clearEnv,
- env: ObjectEntries(env),
- uid,
- gid,
- stdin,
- stdout,
- stderr,
- windowsRawArguments,
- });
- return {
- success: result.status.success,
- code: result.status.code,
- signal: result.status.signal,
- get stdout() {
- if (result.stdout == null) {
- throw new TypeError("stdout is not piped");
- }
- return result.stdout;
- },
- get stderr() {
- if (result.stderr == null) {
- throw new TypeError("stderr is not piped");
- }
- return result.stderr;
- },
- };
+function spawnSync(command, {
+ args = [],
+ cwd = undefined,
+ clearEnv = false,
+ env = {},
+ uid = undefined,
+ gid = undefined,
+ stdin = "null",
+ stdout = "piped",
+ stderr = "piped",
+ windowsRawArguments = false,
+} = {}) {
+ if (stdin === "piped") {
+ throw new TypeError(
+ "Piped stdin is not supported for this function, use 'Deno.Command().spawn()' instead",
+ );
+ }
+ const result = ops.op_spawn_sync({
+ cmd: pathFromURL(command),
+ args: ArrayPrototypeMap(args, String),
+ cwd: pathFromURL(cwd),
+ clearEnv,
+ env: ObjectEntries(env),
+ uid,
+ gid,
+ stdin,
+ stdout,
+ stderr,
+ windowsRawArguments,
+ });
+ return {
+ success: result.status.success,
+ code: result.status.code,
+ signal: result.status.signal,
+ get stdout() {
+ if (result.stdout == null) {
+ throw new TypeError("stdout is not piped");
+ }
+ return result.stdout;
+ },
+ get stderr() {
+ if (result.stderr == null) {
+ throw new TypeError("stderr is not piped");
+ }
+ return result.stderr;
+ },
};
}
-function createCommand(spawn, spawnSync, spawnChild) {
- return class Command {
- #command;
- #options;
+class Command {
+ #command;
+ #options;
- constructor(command, options) {
- this.#command = command;
- this.#options = options;
- }
+ constructor(command, options) {
+ this.#command = command;
+ this.#options = options;
+ }
- output() {
- if (this.#options?.stdin === "piped") {
- throw new TypeError(
- "Piped stdin is not supported for this function, use 'Deno.Command.spawn()' instead",
- );
- }
- return spawn(this.#command, this.#options);
+ output() {
+ if (this.#options?.stdin === "piped") {
+ throw new TypeError(
+ "Piped stdin is not supported for this function, use 'Deno.Command.spawn()' instead",
+ );
}
+ return spawn(this.#command, this.#options);
+ }
- outputSync() {
- if (this.#options?.stdin === "piped") {
- throw new TypeError(
- "Piped stdin is not supported for this function, use 'Deno.Command.spawn()' instead",
- );
- }
- return spawnSync(this.#command, this.#options);
+ outputSync() {
+ if (this.#options?.stdin === "piped") {
+ throw new TypeError(
+ "Piped stdin is not supported for this function, use 'Deno.Command.spawn()' instead",
+ );
}
+ return spawnSync(this.#command, this.#options);
+ }
- spawn() {
- const options = {
- ...(this.#options ?? {}),
- stdout: this.#options?.stdout ?? "inherit",
- stderr: this.#options?.stderr ?? "inherit",
- stdin: this.#options?.stdin ?? "inherit",
- };
- return spawnChild(this.#command, options);
- }
- };
+ spawn() {
+ const options = {
+ ...(this.#options ?? {}),
+ stdout: this.#options?.stdout ?? "inherit",
+ stderr: this.#options?.stderr ?? "inherit",
+ stdin: this.#options?.stdin ?? "inherit",
+ };
+ return spawnChild(this.#command, options);
+ }
}
-const ChildProcess = Child;
-
-export {
- Child,
- ChildProcess,
- createCommand,
- createSpawn,
- createSpawnChild,
- createSpawnSync,
-};
+export { ChildProcess, Command };