summaryrefslogtreecommitdiff
path: root/cli/args
diff options
context:
space:
mode:
authorNathan Whitaker <17734409+nathanwhit@users.noreply.github.com>2024-09-27 12:35:37 -0700
committerGitHub <noreply@github.com>2024-09-27 12:35:37 -0700
commitfbddd5a2ebfb11dd376a751e9fc4cf09a6286ada (patch)
tree75c13ee9f26f61fe8c1d6f80df2580a523177c1b /cli/args
parenta8d1ab52761516b7f9b6069d6e433254794ed48c (diff)
fix(node): Pass NPM_PROCESS_STATE to subprocesses via temp file instead of env var (#25896)
Fixes https://github.com/denoland/deno/issues/25401. Fixes https://github.com/denoland/deno/issues/25841. Fixes https://github.com/denoland/deno/issues/25891.
Diffstat (limited to 'cli/args')
-rw-r--r--cli/args/mod.rs36
1 files changed, 28 insertions, 8 deletions
diff --git a/cli/args/mod.rs b/cli/args/mod.rs
index 995a04823..c3a4c2937 100644
--- a/cli/args/mod.rs
+++ b/cli/args/mod.rs
@@ -69,6 +69,8 @@ use std::collections::HashMap;
use std::env;
use std::io::BufReader;
use std::io::Cursor;
+use std::io::Read;
+use std::io::Seek;
use std::net::SocketAddr;
use std::num::NonZeroUsize;
use std::path::Path;
@@ -742,15 +744,33 @@ pub enum NpmProcessStateKind {
Byonm,
}
-pub(crate) const NPM_RESOLUTION_STATE_ENV_VAR_NAME: &str =
- "DENO_DONT_USE_INTERNAL_NODE_COMPAT_STATE";
-
static NPM_PROCESS_STATE: Lazy<Option<NpmProcessState>> = Lazy::new(|| {
- let state = std::env::var(NPM_RESOLUTION_STATE_ENV_VAR_NAME).ok()?;
- let state: NpmProcessState = serde_json::from_str(&state).ok()?;
- // remove the environment variable so that sub processes
- // that are spawned do not also use this.
- std::env::remove_var(NPM_RESOLUTION_STATE_ENV_VAR_NAME);
+ use deno_runtime::ops::process::NPM_RESOLUTION_STATE_FD_ENV_VAR_NAME;
+ let fd = std::env::var(NPM_RESOLUTION_STATE_FD_ENV_VAR_NAME).ok()?;
+ std::env::remove_var(NPM_RESOLUTION_STATE_FD_ENV_VAR_NAME);
+ let fd = fd.parse::<usize>().ok()?;
+ let mut file = {
+ use deno_runtime::deno_io::FromRawIoHandle;
+ unsafe { std::fs::File::from_raw_io_handle(fd as _) }
+ };
+ let mut buf = Vec::new();
+ // seek to beginning. after the file is written the position will be inherited by this subprocess,
+ // and also this file might have been read before
+ file.seek(std::io::SeekFrom::Start(0)).unwrap();
+ file
+ .read_to_end(&mut buf)
+ .inspect_err(|e| {
+ log::error!("failed to read npm process state from fd {fd}: {e}");
+ })
+ .ok()?;
+ let state: NpmProcessState = serde_json::from_slice(&buf)
+ .inspect_err(|e| {
+ log::error!(
+ "failed to deserialize npm process state: {e} {}",
+ String::from_utf8_lossy(&buf)
+ )
+ })
+ .ok()?;
Some(state)
});