summaryrefslogtreecommitdiff
path: root/cli/npm/managed/resolvers/local.rs
diff options
context:
space:
mode:
Diffstat (limited to 'cli/npm/managed/resolvers/local.rs')
-rw-r--r--cli/npm/managed/resolvers/local.rs62
1 files changed, 34 insertions, 28 deletions
diff --git a/cli/npm/managed/resolvers/local.rs b/cli/npm/managed/resolvers/local.rs
index f0c2a3f65..5c3b1f15e 100644
--- a/cli/npm/managed/resolvers/local.rs
+++ b/cli/npm/managed/resolvers/local.rs
@@ -14,6 +14,7 @@ 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;
@@ -27,16 +28,15 @@ use deno_ast::ModuleSpecifier;
use deno_core::anyhow::bail;
use deno_core::anyhow::Context;
use deno_core::error::AnyError;
+use deno_core::futures::stream::FuturesUnordered;
+use deno_core::futures::StreamExt;
use deno_core::parking_lot::Mutex;
-use deno_core::unsync::spawn;
-use deno_core::unsync::JoinHandle;
use deno_core::url::Url;
use deno_npm::resolution::NpmResolutionSnapshot;
use deno_npm::NpmPackageCacheFolderId;
use deno_npm::NpmPackageId;
use deno_npm::NpmResolutionPackage;
use deno_npm::NpmSystemInfo;
-use deno_runtime::deno_core::futures;
use deno_runtime::deno_fs;
use deno_runtime::deno_node::NodePermissions;
use deno_runtime::deno_node::NodeResolutionMode;
@@ -48,6 +48,7 @@ use crate::npm::cache_dir::mixed_case_package_name_encode;
use super::super::super::common::types_package_name;
use super::super::cache::NpmCache;
+use super::super::cache::TarballCache;
use super::super::resolution::NpmResolution;
use super::common::NpmPackageFsResolver;
use super::common::RegistryReadPermissionChecker;
@@ -56,10 +57,11 @@ use super::common::RegistryReadPermissionChecker;
/// and resolves packages from it.
#[derive(Debug)]
pub struct LocalNpmPackageResolver {
- fs: Arc<dyn deno_fs::FileSystem>,
cache: Arc<NpmCache>,
+ fs: Arc<dyn deno_fs::FileSystem>,
progress_bar: ProgressBar,
resolution: Arc<NpmResolution>,
+ tarball_cache: Arc<TarballCache>,
root_node_modules_path: PathBuf,
root_node_modules_url: Url,
system_info: NpmSystemInfo,
@@ -68,26 +70,28 @@ pub struct LocalNpmPackageResolver {
impl LocalNpmPackageResolver {
pub fn new(
- fs: Arc<dyn deno_fs::FileSystem>,
cache: Arc<NpmCache>,
+ fs: Arc<dyn deno_fs::FileSystem>,
progress_bar: ProgressBar,
- node_modules_folder: PathBuf,
resolution: Arc<NpmResolution>,
+ tarball_cache: Arc<TarballCache>,
+ node_modules_folder: PathBuf,
system_info: NpmSystemInfo,
) -> Self {
Self {
- fs: fs.clone(),
cache,
+ fs: fs.clone(),
progress_bar,
resolution,
- root_node_modules_url: Url::from_directory_path(&node_modules_folder)
- .unwrap(),
- root_node_modules_path: node_modules_folder.clone(),
- system_info,
+ tarball_cache,
registry_read_permission_checker: RegistryReadPermissionChecker::new(
fs,
- node_modules_folder,
+ node_modules_folder.clone(),
),
+ root_node_modules_url: Url::from_directory_path(&node_modules_folder)
+ .unwrap(),
+ root_node_modules_path: node_modules_folder,
+ system_info,
}
}
@@ -225,11 +229,16 @@ impl NpmPackageFsResolver for LocalNpmPackageResolver {
Ok(get_package_folder_id_from_folder_name(&folder_name))
}
- async fn cache_packages(&self) -> Result<(), AnyError> {
+ async fn cache_packages(
+ &self,
+ http_client: &Arc<HttpClient>,
+ ) -> Result<(), AnyError> {
sync_resolution_with_fs(
&self.resolution.snapshot(),
&self.cache,
+ http_client,
&self.progress_bar,
+ &self.tarball_cache,
&self.root_node_modules_path,
&self.system_info,
)
@@ -251,7 +260,9 @@ 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,
system_info: &NpmSystemInfo,
) -> Result<(), AnyError> {
@@ -288,8 +299,7 @@ async fn sync_resolution_with_fs(
// node_modules/.deno/<package_folder_id_folder_name>/node_modules/<package_name>
let package_partitions =
snapshot.all_system_packages_partitioned(system_info);
- let mut handles: Vec<JoinHandle<Result<(), AnyError>>> =
- Vec::with_capacity(package_partitions.packages.len());
+ let mut cache_futures = FuturesUnordered::new();
let mut newest_packages_by_name: HashMap<&String, &NpmResolutionPackage> =
HashMap::with_capacity(package_partitions.packages.len());
let bin_entries = Arc::new(Mutex::new(bin_entries::BinEntries::new()));
@@ -317,21 +327,19 @@ async fn sync_resolution_with_fs(
// are forced to be recreated
setup_cache.remove_dep(&package_folder_name);
- let pb = progress_bar.clone();
- let cache = cache.clone();
- let package = package.clone();
let bin_entries_to_setup = bin_entries.clone();
- let handle = spawn(async move {
- cache.ensure_package(&package.id.nv, &package.dist).await?;
- let pb_guard = pb.update_with_prompt(
+ cache_futures.push(async move {
+ tarball_cache
+ .ensure_package(&package.id.nv, &package.dist, http_client)
+ .await?;
+ let pb_guard = progress_bar.update_with_prompt(
ProgressMessagePrompt::Initialize,
&package.id.nv.to_string(),
);
let sub_node_modules = folder_path.join("node_modules");
let package_path =
join_package_name(&sub_node_modules, &package.id.nv.name);
- let cache_folder =
- cache.package_folder_for_name_and_version(&package.id.nv);
+ let cache_folder = cache.package_folder_for_nv(&package.id.nv);
deno_core::unsync::spawn_blocking({
let package_path = package_path.clone();
@@ -353,15 +361,13 @@ async fn sync_resolution_with_fs(
// finally stop showing the progress bar
drop(pb_guard); // explicit for clarity
- Ok(())
+ Ok::<_, AnyError>(())
});
- handles.push(handle);
}
}
- let results = futures::future::join_all(handles).await;
- for result in results {
- result??; // surface the first error
+ while let Some(result) = cache_futures.next().await {
+ result?; // surface the first error
}
// 2. Create any "copy" packages, which are used for peer dependencies