Skip to content

Commit faf9505

Browse files
authored
fix(node): support advanced serialization in IPC (denoland#31380)
Fixes denoland#31354.
1 parent 3e22a73 commit faf9505

File tree

21 files changed

+1095
-97
lines changed

21 files changed

+1095
-97
lines changed

Cargo.lock

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -201,7 +201,7 @@ jupyter_runtime = "=0.19.0"
201201
lazy-regex = "3"
202202
libc = "0.2.168"
203203
libz-sys = { version = "1.1.20", default-features = false }
204-
log = { version = "0.4.20", features = ["kv"] }
204+
log = { version = "0.4.28", features = ["kv"] }
205205
lsp-types = "=0.97.0" # used by tower-lsp and "proposed" feature is unstable in patch releases
206206
memchr = "2.7.4"
207207
mime = "0.3.16"

cli/args/mod.rs

Lines changed: 21 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ use deno_npm_installer::LifecycleScriptsConfig;
4848
use deno_npm_installer::graph::NpmCachingStrategy;
4949
use deno_path_util::resolve_url_or_path;
5050
use deno_resolver::factory::resolve_jsr_url;
51+
use deno_runtime::deno_node::ops::ipc::ChildIpcSerialization;
5152
use deno_runtime::deno_permissions::AllowRunDescriptor;
5253
use deno_runtime::deno_permissions::PathDescriptor;
5354
use deno_runtime::deno_permissions::PermissionsOptions;
@@ -586,18 +587,31 @@ impl CliOptions {
586587
)
587588
}
588589

589-
pub fn node_ipc_fd(&self) -> Option<i64> {
590+
pub fn node_ipc_init(
591+
&self,
592+
) -> Result<Option<(i64, ChildIpcSerialization)>, AnyError> {
590593
let maybe_node_channel_fd = std::env::var("NODE_CHANNEL_FD").ok();
594+
let maybe_node_channel_serialization = if let Ok(serialization) =
595+
std::env::var("NODE_CHANNEL_SERIALIZATION_MODE")
596+
{
597+
Some(serialization.parse::<ChildIpcSerialization>()?)
598+
} else {
599+
None
600+
};
591601
if let Some(node_channel_fd) = maybe_node_channel_fd {
592-
// Remove so that child processes don't inherit this environment variable.
593-
602+
// Remove so that child processes don't inherit this environment variables.
594603
#[allow(clippy::undocumented_unsafe_blocks)]
595604
unsafe {
596-
std::env::remove_var("NODE_CHANNEL_FD")
597-
};
598-
node_channel_fd.parse::<i64>().ok()
605+
std::env::remove_var("NODE_CHANNEL_FD");
606+
std::env::remove_var("NODE_CHANNEL_SERIALIZATION_MODE");
607+
}
608+
let node_channel_fd = node_channel_fd.parse::<i64>()?;
609+
Ok(Some((
610+
node_channel_fd,
611+
maybe_node_channel_serialization.unwrap_or(ChildIpcSerialization::Json),
612+
)))
599613
} else {
600-
None
614+
Ok(None)
601615
}
602616
}
603617

cli/factory.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1134,7 +1134,7 @@ impl CliFactory {
11341134
unsafely_ignore_certificate_errors: cli_options
11351135
.unsafely_ignore_certificate_errors()
11361136
.clone(),
1137-
node_ipc: cli_options.node_ipc_fd(),
1137+
node_ipc_init: cli_options.node_ipc_init()?,
11381138
serve_port: cli_options.serve_port(),
11391139
serve_host: cli_options.serve_host(),
11401140
otel_config: cli_options.otel_config(),

cli/lib/worker.rs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ use std::sync::Arc;
88
use deno_bundle_runtime::BundleProvider;
99
use deno_core::error::JsError;
1010
use deno_node::NodeRequireLoaderRc;
11+
use deno_node::ops::ipc::ChildIpcSerialization;
1112
use deno_path_util::url_from_file_path;
1213
use deno_path_util::url_to_file_path;
1314
use deno_resolver::npm::DenoInNpmPackageChecker;
@@ -345,7 +346,7 @@ pub struct LibMainWorkerOptions {
345346
pub seed: Option<u64>,
346347
pub unsafely_ignore_certificate_errors: Option<Vec<String>>,
347348
pub skip_op_registration: bool,
348-
pub node_ipc: Option<i64>,
349+
pub node_ipc_init: Option<(i64, ChildIpcSerialization)>,
349350
pub no_legacy_abort: bool,
350351
pub startup_snapshot: Option<&'static [u8]>,
351352
pub serve_port: Option<u16>,
@@ -489,7 +490,7 @@ impl<TSys: DenoLibSys> LibWorkerFactorySharedState<TSys> {
489490
has_node_modules_dir: shared.options.has_node_modules_dir,
490491
argv0: shared.options.argv0.clone(),
491492
node_debug: shared.options.node_debug.clone(),
492-
node_ipc_fd: None,
493+
node_ipc_init: None,
493494
mode: WorkerExecutionMode::Worker,
494495
serve_port: shared.options.serve_port,
495496
serve_host: shared.options.serve_host.clone(),
@@ -688,7 +689,7 @@ impl<TSys: DenoLibSys> LibMainWorkerFactory<TSys> {
688689
has_node_modules_dir: shared.options.has_node_modules_dir,
689690
argv0: shared.options.argv0.clone(),
690691
node_debug: shared.options.node_debug.clone(),
691-
node_ipc_fd: shared.options.node_ipc,
692+
node_ipc_init: shared.options.node_ipc_init,
692693
mode,
693694
no_legacy_abort: shared.options.no_legacy_abort,
694695
serve_port: shared.options.serve_port,

cli/rt/run.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1029,7 +1029,7 @@ pub async fn run(
10291029
seed: metadata.seed,
10301030
unsafely_ignore_certificate_errors: metadata
10311031
.unsafely_ignore_certificate_errors,
1032-
node_ipc: None,
1032+
node_ipc_init: None,
10331033
serve_port: None,
10341034
serve_host: None,
10351035
otel_config: metadata.otel_config,

ext/node/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@ ipnetwork.workspace = true
6262
k256.workspace = true
6363
libc.workspace = true
6464
libz-sys.workspace = true
65+
log.workspace = true
6566
md-5 = { workspace = true, features = ["oid"] }
6667
md4.workspace = true
6768
node_resolver.workspace = true

ext/node/lib.rs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -367,8 +367,11 @@ deno_core::extension!(deno_node,
367367
ops::util::op_node_in_npm_package<TInNpmPackageChecker, TNpmPackageFolderResolver, TSys>,
368368
ops::worker_threads::op_worker_threads_filename<TSys>,
369369
ops::ipc::op_node_child_ipc_pipe,
370-
ops::ipc::op_node_ipc_write,
371-
ops::ipc::op_node_ipc_read,
370+
ops::ipc::op_node_ipc_write_json,
371+
ops::ipc::op_node_ipc_read_json,
372+
ops::ipc::op_node_ipc_read_advanced,
373+
ops::ipc::op_node_ipc_write_advanced,
374+
ops::ipc::op_node_ipc_buffer_constructor,
372375
ops::ipc::op_node_ipc_ref,
373376
ops::ipc::op_node_ipc_unref,
374377
ops::process::op_node_process_kill,

0 commit comments

Comments
 (0)