diff options
Diffstat (limited to 'runtime')
-rw-r--r-- | runtime/js/40_spawn.js | 207 | ||||
-rw-r--r-- | runtime/js/90_deno_ns.js | 6 | ||||
-rw-r--r-- | runtime/js/99_main.js | 29 | ||||
-rw-r--r-- | runtime/ops/spawn.rs | 104 |
4 files changed, 102 insertions, 244 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 }; diff --git a/runtime/js/90_deno_ns.js b/runtime/js/90_deno_ns.js index fe59ea1a7..7b9d8e6e6 100644 --- a/runtime/js/90_deno_ns.js +++ b/runtime/js/90_deno_ns.js @@ -152,6 +152,9 @@ const denoNs = { consoleSize: tty.consoleSize, gid: os.gid, uid: os.uid, + Command: spawn.Command, + // TODO(bartlomieju): why is this exported? + ChildProcess: spawn.ChildProcess, }; const denoNsUnstable = { @@ -171,9 +174,6 @@ const denoNsUnstable = { flockSync: fs.flockSync, funlock: fs.funlock, funlockSync: fs.funlockSync, - Child: spawn.Child, - ChildProcess: spawn.ChildProcess, - Command: spawn.Command, upgradeHttp: http.upgradeHttp, upgradeHttpRaw: flash.upgradeHttpRaw, }; diff --git a/runtime/js/99_main.js b/runtime/js/99_main.js index a4301ed3a..cfddb143d 100644 --- a/runtime/js/99_main.js +++ b/runtime/js/99_main.js @@ -62,7 +62,6 @@ import { errors } from "internal:runtime/js/01_errors.js"; import * as webidl from "internal:deno_webidl/00_webidl.js"; import DOMException from "internal:deno_web/01_dom_exception.js"; import * as flash from "internal:deno_flash/01_http.js"; -import * as spawn from "internal:runtime/js/40_spawn.js"; import { mainRuntimeGlobalProperties, setLanguage, @@ -466,15 +465,6 @@ function bootstrapMainRuntime(runtimeOptions) { // a snapshot ObjectAssign(internals, { nodeUnstable: { - Command: spawn.createCommand( - spawn.createSpawn(ops.op_node_unstable_spawn_child), - spawn.createSpawnSync( - ops.op_node_unstable_spawn_sync, - ), - spawn.createSpawnChild( - ops.op_node_unstable_spawn_child, - ), - ), serve: flash.createServe(ops.op_node_unstable_flash_serve), upgradeHttpRaw: flash.upgradeHttpRaw, listenDatagram: net.createListenDatagram( @@ -513,11 +503,6 @@ function bootstrapMainRuntime(runtimeOptions) { // the op function that needs to be passed will be invalidated by creating // a snapshot ObjectAssign(finalDenoNs, { - Command: spawn.createCommand( - spawn.createSpawn(ops.op_spawn_child), - spawn.createSpawnSync(ops.op_spawn_sync), - spawn.createSpawnChild(ops.op_spawn_child), - ), serve: flash.createServe(ops.op_flash_serve), listenDatagram: net.createListenDatagram( ops.op_net_listen_udp, @@ -611,15 +596,6 @@ function bootstrapWorkerRuntime( // a snapshot ObjectAssign(internals, { nodeUnstable: { - Command: spawn.createCommand( - spawn.createSpawn(ops.op_node_unstable_spawn_child), - spawn.createSpawnSync( - ops.op_node_unstable_spawn_sync, - ), - spawn.createSpawnChild( - ops.op_node_unstable_spawn_child, - ), - ), serve: flash.createServe(ops.op_node_unstable_flash_serve), upgradeHttpRaw: flash.upgradeHttpRaw, listenDatagram: net.createListenDatagram( @@ -650,11 +626,6 @@ function bootstrapWorkerRuntime( // the op function that needs to be passed will be invalidated by creating // a snapshot ObjectAssign(finalDenoNs, { - Command: spawn.createCommand( - spawn.createSpawn(ops.op_spawn_child), - spawn.createSpawnSync(ops.op_spawn_sync), - spawn.createSpawnChild(ops.op_spawn_child), - ), serve: flash.createServe(ops.op_flash_serve), listenDatagram: net.createListenDatagram( ops.op_net_listen_udp, diff --git a/runtime/ops/spawn.rs b/runtime/ops/spawn.rs index e5454371e..089a53c23 100644 --- a/runtime/ops/spawn.rs +++ b/runtime/ops/spawn.rs @@ -31,10 +31,8 @@ pub fn init() -> Extension { Extension::builder("deno_spawn") .ops(vec![ op_spawn_child::decl(), - op_node_unstable_spawn_child::decl(), op_spawn_wait::decl(), op_spawn_sync::decl(), - op_node_unstable_spawn_sync::decl(), ]) .build() } @@ -125,75 +123,11 @@ pub struct SpawnOutput { stderr: Option<ZeroCopyBuf>, } -fn node_unstable_create_command( - state: &mut OpState, - args: SpawnArgs, - api_name: &str, -) -> Result<std::process::Command, AnyError> { - state - .borrow_mut::<PermissionsContainer>() - .check_run(&args.cmd, api_name)?; - - let mut command = std::process::Command::new(args.cmd); - - #[cfg(windows)] - if args.windows_raw_arguments { - for arg in args.args.iter() { - command.raw_arg(arg); - } - } else { - command.args(args.args); - } - - #[cfg(not(windows))] - command.args(args.args); - - if let Some(cwd) = args.cwd { - command.current_dir(cwd); - } - - if args.clear_env { - command.env_clear(); - } - command.envs(args.env); - - #[cfg(unix)] - if let Some(gid) = args.gid { - command.gid(gid); - } - #[cfg(unix)] - if let Some(uid) = args.uid { - command.uid(uid); - } - #[cfg(unix)] - // TODO(bartlomieju): - #[allow(clippy::undocumented_unsafe_blocks)] - unsafe { - command.pre_exec(|| { - libc::setgroups(0, std::ptr::null()); - Ok(()) - }); - } - - command.stdin(args.stdio.stdin.as_stdio()); - command.stdout(match args.stdio.stdout { - Stdio::Inherit => StdioOrRid::Rid(1).as_stdio(state)?, - value => value.as_stdio(), - }); - command.stderr(match args.stdio.stderr { - Stdio::Inherit => StdioOrRid::Rid(2).as_stdio(state)?, - value => value.as_stdio(), - }); - - Ok(command) -} - fn create_command( state: &mut OpState, args: SpawnArgs, api_name: &str, ) -> Result<std::process::Command, AnyError> { - super::check_unstable(state, "Deno.Command"); state .borrow_mut::<PermissionsContainer>() .check_run(&args.cmd, api_name)?; @@ -223,12 +157,10 @@ fn create_command( #[cfg(unix)] if let Some(gid) = args.gid { - super::check_unstable(state, "Deno.CommandOptions.gid"); command.gid(gid); } #[cfg(unix)] if let Some(uid) = args.uid { - super::check_unstable(state, "Deno.CommandOptions.uid"); command.uid(uid); } #[cfg(unix)] @@ -314,16 +246,6 @@ fn op_spawn_child( } #[op] -fn op_node_unstable_spawn_child( - state: &mut OpState, - args: SpawnArgs, - api_name: String, -) -> Result<Child, AnyError> { - let command = node_unstable_create_command(state, args, &api_name)?; - spawn_child(state, command) -} - -#[op] async fn op_spawn_wait( state: Rc<RefCell<OpState>>, rid: ResourceId, @@ -365,29 +287,3 @@ fn op_spawn_sync( }, }) } - -#[op] -fn op_node_unstable_spawn_sync( - state: &mut OpState, - args: SpawnArgs, -) -> Result<SpawnOutput, AnyError> { - let stdout = matches!(args.stdio.stdout, Stdio::Piped); - let stderr = matches!(args.stdio.stderr, Stdio::Piped); - let output = - node_unstable_create_command(state, args, "Deno.Command().outputSync()")? - .output()?; - - Ok(SpawnOutput { - status: output.status.try_into()?, - stdout: if stdout { - Some(output.stdout.into()) - } else { - None - }, - stderr: if stderr { - Some(output.stderr.into()) - } else { - None - }, - }) -} |