diff options
Diffstat (limited to 'cli/npm/managed')
-rw-r--r-- | cli/npm/managed/cache/registry_info.rs | 28 | ||||
-rw-r--r-- | cli/npm/managed/cache/tarball.rs | 20 | ||||
-rw-r--r-- | cli/npm/managed/mod.rs | 43 | ||||
-rw-r--r-- | cli/npm/managed/registry.rs | 8 | ||||
-rw-r--r-- | cli/npm/managed/resolvers/common.rs | 9 | ||||
-rw-r--r-- | cli/npm/managed/resolvers/global.rs | 14 | ||||
-rw-r--r-- | cli/npm/managed/resolvers/local.rs | 10 | ||||
-rw-r--r-- | cli/npm/managed/resolvers/mod.rs | 9 |
8 files changed, 50 insertions, 91 deletions
diff --git a/cli/npm/managed/cache/registry_info.rs b/cli/npm/managed/cache/registry_info.rs index ea6b47969..24f0a12e7 100644 --- a/cli/npm/managed/cache/registry_info.rs +++ b/cli/npm/managed/cache/registry_info.rs @@ -19,7 +19,7 @@ use deno_npm::npm_rc::ResolvedNpmRc; use deno_npm::registry::NpmPackageInfo; use crate::args::CacheSetting; -use crate::http_util::HttpClient; +use crate::http_util::HttpClientProvider; use crate::npm::common::maybe_auth_header_for_npm_registry; use crate::util::progress_bar::ProgressBar; @@ -56,6 +56,7 @@ type PendingRegistryLoadFuture = #[derive(Debug)] pub struct RegistryInfoDownloader { cache: Arc<NpmCache>, + http_client_provider: Arc<HttpClientProvider>, npmrc: Arc<ResolvedNpmRc>, progress_bar: ProgressBar, memory_cache: Mutex<HashMap<String, MemoryCacheItem>>, @@ -64,11 +65,13 @@ pub struct RegistryInfoDownloader { impl RegistryInfoDownloader { pub fn new( cache: Arc<NpmCache>, + http_client_provider: Arc<HttpClientProvider>, npmrc: Arc<ResolvedNpmRc>, progress_bar: ProgressBar, ) -> Self { Self { cache, + http_client_provider, npmrc, progress_bar, memory_cache: Default::default(), @@ -78,18 +81,12 @@ impl RegistryInfoDownloader { pub async fn load_package_info( &self, name: &str, - current_runtime_http_client: &Arc<HttpClient>, ) -> Result<Option<Arc<NpmPackageInfo>>, AnyError> { let registry_url = self.npmrc.get_registry_url(name); let registry_config = self.npmrc.get_registry_config(name); self - .load_package_info_inner( - name, - registry_url, - registry_config, - current_runtime_http_client, - ) + .load_package_info_inner(name, registry_url, registry_config) .await .with_context(|| { format!( @@ -105,7 +102,6 @@ impl RegistryInfoDownloader { name: &str, registry_url: &Url, registry_config: &RegistryConfig, - current_runtime_http_client: &Arc<HttpClient>, ) -> Result<Option<Arc<NpmPackageInfo>>, AnyError> { if *self.cache.cache_setting() == CacheSetting::Only { return Err(custom_error( @@ -121,12 +117,8 @@ impl RegistryInfoDownloader { if let Some(cache_item) = mem_cache.get(name) { (false, cache_item.clone()) } else { - let future = self.create_load_future( - name, - registry_url, - registry_config, - current_runtime_http_client, - ); + let future = + self.create_load_future(name, registry_url, registry_config); let cache_item = MemoryCacheItem::PendingFuture(future); mem_cache.insert(name.to_string(), cache_item.clone()); (true, cache_item) @@ -215,20 +207,20 @@ impl RegistryInfoDownloader { name: &str, registry_url: &Url, registry_config: &RegistryConfig, - current_runtime_http_client: &Arc<HttpClient>, ) -> Shared<PendingRegistryLoadFuture> { let package_url = self.get_package_url(name, registry_url); let maybe_auth_header = maybe_auth_header_for_npm_registry(registry_config); let guard = self.progress_bar.update(package_url.as_str()); let cache = self.cache.clone(); - let http_client = current_runtime_http_client.clone(); + let http_client_provider = self.http_client_provider.clone(); let name = name.to_string(); // force this future to be polled on the current runtime because it's not // safe to share `HttpClient`s across runtimes and because a restart of // npm resolution might cause this package not to be resolved again // causing the future to never be polled deno_core::unsync::spawn(async move { - let maybe_bytes = http_client + let maybe_bytes = http_client_provider + .get_or_create()? .download_with_progress(package_url, maybe_auth_header, &guard) .await?; match maybe_bytes { diff --git a/cli/npm/managed/cache/tarball.rs b/cli/npm/managed/cache/tarball.rs index 9848aca13..a116ad1cf 100644 --- a/cli/npm/managed/cache/tarball.rs +++ b/cli/npm/managed/cache/tarball.rs @@ -18,7 +18,7 @@ use deno_runtime::deno_fs::FileSystem; use deno_semver::package::PackageNv; use crate::args::CacheSetting; -use crate::http_util::HttpClient; +use crate::http_util::HttpClientProvider; use crate::npm::common::maybe_auth_header_for_npm_registry; use crate::util::progress_bar::ProgressBar; @@ -46,6 +46,7 @@ enum MemoryCacheItem { pub struct TarballCache { cache: Arc<NpmCache>, fs: Arc<dyn FileSystem>, + http_client_provider: Arc<HttpClientProvider>, npmrc: Arc<ResolvedNpmRc>, progress_bar: ProgressBar, memory_cache: Mutex<HashMap<PackageNv, MemoryCacheItem>>, @@ -55,12 +56,14 @@ impl TarballCache { pub fn new( cache: Arc<NpmCache>, fs: Arc<dyn FileSystem>, + http_client_provider: Arc<HttpClientProvider>, npmrc: Arc<ResolvedNpmRc>, progress_bar: ProgressBar, ) -> Self { Self { cache, fs, + http_client_provider, npmrc, progress_bar, memory_cache: Default::default(), @@ -71,11 +74,9 @@ impl TarballCache { &self, package: &PackageNv, dist: &NpmPackageVersionDistInfo, - // it's not safe to share these across runtimes - http_client_for_runtime: &Arc<HttpClient>, ) -> Result<(), AnyError> { self - .ensure_package_inner(package, dist, http_client_for_runtime) + .ensure_package_inner(package, dist) .await .with_context(|| format!("Failed caching npm package '{}'.", package)) } @@ -84,18 +85,13 @@ impl TarballCache { &self, package_nv: &PackageNv, dist: &NpmPackageVersionDistInfo, - http_client_for_runtime: &Arc<HttpClient>, ) -> Result<(), AnyError> { let (created, cache_item) = { let mut mem_cache = self.memory_cache.lock(); if let Some(cache_item) = mem_cache.get(package_nv) { (false, cache_item.clone()) } else { - let future = self.create_setup_future( - package_nv.clone(), - dist.clone(), - http_client_for_runtime.clone(), - ); + let future = self.create_setup_future(package_nv.clone(), dist.clone()); let cache_item = MemoryCacheItem::PendingFuture(future); mem_cache.insert(package_nv.clone(), cache_item.clone()); (true, cache_item) @@ -131,7 +127,6 @@ impl TarballCache { &self, package_nv: PackageNv, dist: NpmPackageVersionDistInfo, - http_client_for_runtime: Arc<HttpClient>, ) -> Shared<BoxFuture<'static, Result<(), Arc<AnyError>>>> { let registry_url = self.npmrc.get_registry_url(&package_nv.name); let registry_config = @@ -142,6 +137,7 @@ impl TarballCache { let progress_bar = self.progress_bar.clone(); let package_folder = cache.package_folder_for_nv_and_url(&package_nv, registry_url); + let http_client_provider = self.http_client_provider.clone(); deno_core::unsync::spawn(async move { let should_use_cache = cache.should_use_cache_for_package(&package_nv); @@ -167,7 +163,7 @@ impl TarballCache { maybe_auth_header_for_npm_registry(®istry_config); let guard = progress_bar.update(&dist.tarball); - let maybe_bytes = http_client_for_runtime + let maybe_bytes = http_client_provider.get_or_create()? .download_with_progress(&dist.tarball, maybe_auth_header, &guard) .await?; match maybe_bytes { diff --git a/cli/npm/managed/mod.rs b/cli/npm/managed/mod.rs index 718806ced..7c20ceedc 100644 --- a/cli/npm/managed/mod.rs +++ b/cli/npm/managed/mod.rs @@ -5,6 +5,7 @@ use std::path::PathBuf; use std::sync::Arc; use cache::RegistryInfoDownloader; +use cache::TarballCache; use deno_ast::ModuleSpecifier; use deno_core::anyhow::Context; use deno_core::error::AnyError; @@ -31,7 +32,7 @@ use crate::args::NpmProcessState; use crate::args::NpmProcessStateKind; use crate::args::PackageJsonDepsProvider; use crate::cache::FastInsecureHasher; -use crate::http_util::HttpClient; +use crate::http_util::HttpClientProvider; use crate::util::fs::canonicalize_path_maybe_not_exists_with_fs; use crate::util::progress_bar::ProgressBar; @@ -66,7 +67,7 @@ pub struct CliNpmResolverManagedCreateOptions { pub snapshot: CliNpmResolverManagedSnapshotOption, pub maybe_lockfile: Option<Arc<Mutex<Lockfile>>>, pub fs: Arc<dyn deno_runtime::deno_fs::FileSystem>, - pub http_client: Arc<crate::http_util::HttpClient>, + pub http_client_provider: Arc<crate::http_util::HttpClientProvider>, pub npm_global_cache_dir: PathBuf, pub cache_setting: crate::args::CacheSetting, pub text_only_progress_bar: crate::util::progress_bar::ProgressBar, @@ -90,7 +91,7 @@ pub async fn create_managed_npm_resolver_for_lsp( }; create_inner( options.fs, - options.http_client, + options.http_client_provider, options.maybe_lockfile, npm_api, npm_cache, @@ -111,7 +112,7 @@ pub async fn create_managed_npm_resolver( let snapshot = resolve_snapshot(&npm_api, options.snapshot).await?; Ok(create_inner( options.fs, - options.http_client, + options.http_client_provider, options.maybe_lockfile, npm_api, npm_cache, @@ -127,7 +128,7 @@ pub async fn create_managed_npm_resolver( #[allow(clippy::too_many_arguments)] fn create_inner( fs: Arc<dyn deno_runtime::deno_fs::FileSystem>, - http_client: Arc<HttpClient>, + http_client_provider: Arc<HttpClientProvider>, maybe_lockfile: Option<Arc<Mutex<Lockfile>>>, npm_api: Arc<CliNpmRegistryApi>, npm_cache: Arc<NpmCache>, @@ -143,12 +144,19 @@ fn create_inner( snapshot, maybe_lockfile.clone(), )); + let tarball_cache = Arc::new(TarballCache::new( + npm_cache.clone(), + fs.clone(), + http_client_provider.clone(), + npm_rc.clone(), + text_only_progress_bar.clone(), + )); let fs_resolver = create_npm_fs_resolver( fs.clone(), npm_cache.clone(), - npm_rc.clone(), &text_only_progress_bar, resolution.clone(), + tarball_cache.clone(), node_modules_dir_path, npm_system_info.clone(), ); @@ -167,13 +175,12 @@ fn create_inner( Arc::new(ManagedCliNpmResolver::new( fs, fs_resolver, - http_client, maybe_lockfile, npm_api, npm_cache, - npm_rc, package_json_deps_installer, resolution, + tarball_cache, text_only_progress_bar, npm_system_info, )) @@ -196,9 +203,9 @@ fn create_api( ) -> Arc<CliNpmRegistryApi> { Arc::new(CliNpmRegistryApi::new( npm_cache.clone(), - options.http_client.clone(), RegistryInfoDownloader::new( npm_cache, + options.http_client_provider.clone(), options.npmrc.clone(), options.text_only_progress_bar.clone(), ), @@ -256,13 +263,12 @@ async fn snapshot_from_lockfile( pub struct ManagedCliNpmResolver { fs: Arc<dyn FileSystem>, fs_resolver: Arc<dyn NpmPackageFsResolver>, - http_client: Arc<HttpClient>, maybe_lockfile: Option<Arc<Mutex<Lockfile>>>, npm_api: Arc<CliNpmRegistryApi>, npm_cache: Arc<NpmCache>, - npm_rc: Arc<ResolvedNpmRc>, package_json_deps_installer: Arc<PackageJsonDepsInstaller>, resolution: Arc<NpmResolution>, + tarball_cache: Arc<TarballCache>, text_only_progress_bar: ProgressBar, npm_system_info: NpmSystemInfo, } @@ -280,27 +286,25 @@ impl ManagedCliNpmResolver { pub fn new( fs: Arc<dyn FileSystem>, fs_resolver: Arc<dyn NpmPackageFsResolver>, - http_client: Arc<HttpClient>, maybe_lockfile: Option<Arc<Mutex<Lockfile>>>, npm_api: Arc<CliNpmRegistryApi>, npm_cache: Arc<NpmCache>, - npm_rc: Arc<ResolvedNpmRc>, package_json_deps_installer: Arc<PackageJsonDepsInstaller>, resolution: Arc<NpmResolution>, + tarball_cache: Arc<TarballCache>, text_only_progress_bar: ProgressBar, npm_system_info: NpmSystemInfo, ) -> Self { Self { fs, fs_resolver, - http_client, maybe_lockfile, npm_api, npm_cache, - npm_rc, package_json_deps_installer, text_only_progress_bar, resolution, + tarball_cache, npm_system_info, } } @@ -381,7 +385,7 @@ impl ManagedCliNpmResolver { } self.resolution.add_package_reqs(packages).await?; - self.fs_resolver.cache_packages(&self.http_client).await?; + self.fs_resolver.cache_packages().await?; // If there's a lock file, update it with all discovered npm packages if let Some(lockfile) = &self.maybe_lockfile { @@ -435,7 +439,7 @@ impl ManagedCliNpmResolver { } pub async fn cache_packages(&self) -> Result<(), AnyError> { - self.fs_resolver.cache_packages(&self.http_client).await + self.fs_resolver.cache_packages().await } /// Resolves a package requirement for deno graph. This should only be @@ -567,19 +571,18 @@ impl CliNpmResolver for ManagedCliNpmResolver { create_npm_fs_resolver( self.fs.clone(), self.npm_cache.clone(), - self.npm_rc.clone(), &self.text_only_progress_bar, npm_resolution.clone(), + self.tarball_cache.clone(), self.root_node_modules_path().map(ToOwned::to_owned), self.npm_system_info.clone(), ), - self.http_client.clone(), self.maybe_lockfile.clone(), self.npm_api.clone(), self.npm_cache.clone(), - self.npm_rc.clone(), self.package_json_deps_installer.clone(), npm_resolution, + self.tarball_cache.clone(), self.text_only_progress_bar.clone(), self.npm_system_info.clone(), )) diff --git a/cli/npm/managed/registry.rs b/cli/npm/managed/registry.rs index 364529ed2..32161f235 100644 --- a/cli/npm/managed/registry.rs +++ b/cli/npm/managed/registry.rs @@ -16,20 +16,18 @@ use deno_npm::registry::NpmRegistryApi; use deno_npm::registry::NpmRegistryPackageInfoLoadError; use crate::args::CacheSetting; -use crate::http_util::HttpClient; use crate::util::sync::AtomicFlag; use super::cache::NpmCache; use super::cache::RegistryInfoDownloader; -// todo(dsherret): make this per worker and make HttpClient an Rc<HttpClient> +// todo(dsherret): make this per worker #[derive(Debug)] pub struct CliNpmRegistryApi(Option<Arc<CliNpmRegistryApiInner>>); impl CliNpmRegistryApi { pub fn new( cache: Arc<NpmCache>, - http_client: Arc<HttpClient>, registry_info_downloader: RegistryInfoDownloader, ) -> Self { Self(Some(Arc::new(CliNpmRegistryApiInner { @@ -37,7 +35,6 @@ impl CliNpmRegistryApi { force_reload_flag: Default::default(), mem_cache: Default::default(), previously_reloaded_packages: Default::default(), - http_client, registry_info_downloader, }))) } @@ -111,7 +108,6 @@ struct CliNpmRegistryApiInner { force_reload_flag: AtomicFlag, mem_cache: Mutex<HashMap<String, CacheItem>>, previously_reloaded_packages: Mutex<HashSet<String>>, - http_client: Arc<HttpClient>, registry_info_downloader: RegistryInfoDownloader, } @@ -144,7 +140,7 @@ impl CliNpmRegistryApiInner { } } api.registry_info_downloader - .load_package_info(&name, &api.http_client) + .load_package_info(&name) .await .map_err(Arc::new) } diff --git a/cli/npm/managed/resolvers/common.rs b/cli/npm/managed/resolvers/common.rs index 2d540accd..4cdad1f99 100644 --- a/cli/npm/managed/resolvers/common.rs +++ b/cli/npm/managed/resolvers/common.rs @@ -21,7 +21,6 @@ use deno_runtime::deno_fs::FileSystem; use deno_runtime::deno_node::NodePermissions; use deno_runtime::deno_node::NodeResolutionMode; -use crate::http_util::HttpClient; use crate::npm::managed::cache::TarballCache; /// Part of the resolution that interacts with the file system. @@ -50,10 +49,7 @@ pub trait NpmPackageFsResolver: Send + Sync { specifier: &ModuleSpecifier, ) -> Result<Option<NpmPackageCacheFolderId>, AnyError>; - async fn cache_packages( - &self, - http_client: &Arc<HttpClient>, - ) -> Result<(), AnyError>; + async fn cache_packages(&self) -> Result<(), AnyError>; fn ensure_read_permission( &self, @@ -131,13 +127,12 @@ impl RegistryReadPermissionChecker { pub async fn cache_packages( packages: Vec<NpmResolutionPackage>, tarball_cache: &Arc<TarballCache>, - http_client: &Arc<HttpClient>, ) -> Result<(), AnyError> { let mut futures_unordered = futures::stream::FuturesUnordered::new(); for package in packages { futures_unordered.push(async move { tarball_cache - .ensure_package(&package.id.nv, &package.dist, http_client) + .ensure_package(&package.id.nv, &package.dist) .await }); } diff --git a/cli/npm/managed/resolvers/global.rs b/cli/npm/managed/resolvers/global.rs index 4ffcb251f..a6a071e07 100644 --- a/cli/npm/managed/resolvers/global.rs +++ b/cli/npm/managed/resolvers/global.rs @@ -20,8 +20,6 @@ use deno_runtime::deno_fs::FileSystem; use deno_runtime::deno_node::NodePermissions; use deno_runtime::deno_node::NodeResolutionMode; -use crate::http_util::HttpClient; - use super::super::super::common::types_package_name; use super::super::cache::NpmCache; use super::super::cache::TarballCache; @@ -129,20 +127,12 @@ impl NpmPackageFsResolver for GlobalNpmPackageResolver { ) } - async fn cache_packages( - &self, - http_client: &Arc<HttpClient>, - ) -> Result<(), AnyError> { + async fn cache_packages(&self) -> Result<(), AnyError> { let package_partitions = self .resolution .all_system_packages_partitioned(&self.system_info); - cache_packages( - package_partitions.packages, - &self.tarball_cache, - http_client, - ) - .await?; + cache_packages(package_partitions.packages, &self.tarball_cache).await?; // create the copy package folders for copy in package_partitions.copy_packages { diff --git a/cli/npm/managed/resolvers/local.rs b/cli/npm/managed/resolvers/local.rs index 5c3b1f15e..1de8f4066 100644 --- a/cli/npm/managed/resolvers/local.rs +++ b/cli/npm/managed/resolvers/local.rs @@ -14,7 +14,6 @@ use std::path::PathBuf; use std::sync::Arc; use crate::cache::CACHE_PERM; -use crate::http_util::HttpClient; use crate::npm::cache_dir::mixed_case_package_name_decode; use crate::util::fs::atomic_write_file; use crate::util::fs::canonicalize_path_maybe_not_exists_with_fs; @@ -229,14 +228,10 @@ impl NpmPackageFsResolver for LocalNpmPackageResolver { Ok(get_package_folder_id_from_folder_name(&folder_name)) } - async fn cache_packages( - &self, - http_client: &Arc<HttpClient>, - ) -> Result<(), AnyError> { + async fn cache_packages(&self) -> Result<(), AnyError> { sync_resolution_with_fs( &self.resolution.snapshot(), &self.cache, - http_client, &self.progress_bar, &self.tarball_cache, &self.root_node_modules_path, @@ -260,7 +255,6 @@ impl NpmPackageFsResolver for LocalNpmPackageResolver { async fn sync_resolution_with_fs( snapshot: &NpmResolutionSnapshot, cache: &Arc<NpmCache>, - http_client: &Arc<HttpClient>, progress_bar: &ProgressBar, tarball_cache: &Arc<TarballCache>, root_node_modules_dir_path: &Path, @@ -330,7 +324,7 @@ async fn sync_resolution_with_fs( let bin_entries_to_setup = bin_entries.clone(); cache_futures.push(async move { tarball_cache - .ensure_package(&package.id.nv, &package.dist, http_client) + .ensure_package(&package.id.nv, &package.dist) .await?; let pb_guard = progress_bar.update_with_prompt( ProgressMessagePrompt::Initialize, diff --git a/cli/npm/managed/resolvers/mod.rs b/cli/npm/managed/resolvers/mod.rs index 5f0343805..2d812a2be 100644 --- a/cli/npm/managed/resolvers/mod.rs +++ b/cli/npm/managed/resolvers/mod.rs @@ -7,7 +7,6 @@ mod local; use std::path::PathBuf; use std::sync::Arc; -use deno_npm::npm_rc::ResolvedNpmRc; use deno_npm::NpmSystemInfo; use deno_runtime::deno_fs::FileSystem; @@ -25,18 +24,12 @@ use super::resolution::NpmResolution; pub fn create_npm_fs_resolver( fs: Arc<dyn FileSystem>, npm_cache: Arc<NpmCache>, - npm_rc: Arc<ResolvedNpmRc>, progress_bar: &ProgressBar, resolution: Arc<NpmResolution>, + tarball_cache: Arc<TarballCache>, maybe_node_modules_path: Option<PathBuf>, system_info: NpmSystemInfo, ) -> Arc<dyn NpmPackageFsResolver> { - let tarball_cache = Arc::new(TarballCache::new( - npm_cache.clone(), - fs.clone(), - npm_rc, - progress_bar.clone(), - )); match maybe_node_modules_path { Some(node_modules_folder) => Arc::new(LocalNpmPackageResolver::new( npm_cache, |