diff options
Diffstat (limited to 'cli/worker.rs')
-rw-r--r-- | cli/worker.rs | 101 |
1 files changed, 66 insertions, 35 deletions
diff --git a/cli/worker.rs b/cli/worker.rs index 3dad2fbe1..1beaa27ba 100644 --- a/cli/worker.rs +++ b/cli/worker.rs @@ -13,7 +13,9 @@ use deno_core::url::Url; use deno_core::CompiledWasmModuleStore; use deno_core::Extension; use deno_core::ModuleId; +use deno_core::ModuleLoader; use deno_core::SharedArrayBufferStore; +use deno_core::SourceMapGetter; use deno_runtime::colors; use deno_runtime::deno_broadcast_channel::InMemoryBroadcastChannel; use deno_runtime::deno_node; @@ -35,8 +37,6 @@ use deno_semver::npm::NpmPackageReqReference; use crate::args::StorageKeyResolver; use crate::errors; -use crate::graph_util::ModuleGraphContainer; -use crate::module_loader::CliModuleLoaderFactory; use crate::npm::CliNpmResolver; use crate::ops; use crate::tools; @@ -44,6 +44,28 @@ use crate::tools::coverage::CoverageCollector; use crate::util::checksum; use crate::version; +pub trait ModuleLoaderFactory: Send + Sync { + fn create_for_main( + &self, + root_permissions: PermissionsContainer, + dynamic_permissions: PermissionsContainer, + ) -> Rc<dyn ModuleLoader>; + + fn create_for_worker( + &self, + root_permissions: PermissionsContainer, + dynamic_permissions: PermissionsContainer, + ) -> Rc<dyn ModuleLoader>; + + fn create_source_map_getter(&self) -> Option<Box<dyn SourceMapGetter>>; +} + +// todo(dsherret): this is temporary and we should remove this +// once we no longer conditionally initialize the node runtime +pub trait HasNodeSpecifierChecker: Send + Sync { + fn has_node_specifier(&self) -> bool; +} + pub struct CliMainWorkerOptions { pub argv: Vec<String>, pub debug: bool, @@ -56,26 +78,34 @@ pub struct CliMainWorkerOptions { pub is_npm_main: bool, pub location: Option<Url>, pub maybe_binary_npm_command_name: Option<String>, - pub origin_data_folder_path: PathBuf, + pub origin_data_folder_path: Option<PathBuf>, pub seed: Option<u64>, pub unsafely_ignore_certificate_errors: Option<Vec<String>>, pub unstable: bool, } struct SharedWorkerState { - pub options: CliMainWorkerOptions, - pub storage_key_resolver: StorageKeyResolver, - pub npm_resolver: Arc<CliNpmResolver>, - pub node_resolver: Arc<NodeResolver>, - pub graph_container: Arc<ModuleGraphContainer>, - pub blob_store: BlobStore, - pub broadcast_channel: InMemoryBroadcastChannel, - pub shared_array_buffer_store: SharedArrayBufferStore, - pub compiled_wasm_module_store: CompiledWasmModuleStore, - pub module_loader_factory: CliModuleLoaderFactory, - pub root_cert_store: RootCertStore, - pub node_fs: Arc<dyn deno_node::NodeFs>, - pub maybe_inspector_server: Option<Arc<InspectorServer>>, + options: CliMainWorkerOptions, + storage_key_resolver: StorageKeyResolver, + npm_resolver: Arc<CliNpmResolver>, + node_resolver: Arc<NodeResolver>, + has_node_specifier_checker: Box<dyn HasNodeSpecifierChecker>, + blob_store: BlobStore, + broadcast_channel: InMemoryBroadcastChannel, + shared_array_buffer_store: SharedArrayBufferStore, + compiled_wasm_module_store: CompiledWasmModuleStore, + module_loader_factory: Box<dyn ModuleLoaderFactory>, + root_cert_store: RootCertStore, + node_fs: Arc<dyn deno_node::NodeFs>, + maybe_inspector_server: Option<Arc<InspectorServer>>, +} + +impl SharedWorkerState { + pub fn should_initialize_node_runtime(&self) -> bool { + self.npm_resolver.has_packages() + || self.has_node_specifier_checker.has_node_specifier() + || self.options.is_npm_main + } } pub struct CliMainWorker { @@ -227,9 +257,7 @@ impl CliMainWorker { &mut self, id: ModuleId, ) -> Result<(), AnyError> { - if self.shared.npm_resolver.has_packages() - || self.shared.graph_container.graph().has_node_specifier - { + if self.shared.should_initialize_node_runtime() { self.initialize_main_module_for_node()?; } self.worker.evaluate_module(id).await @@ -275,9 +303,9 @@ impl CliMainWorkerFactory { storage_key_resolver: StorageKeyResolver, npm_resolver: Arc<CliNpmResolver>, node_resolver: Arc<NodeResolver>, - graph_container: Arc<ModuleGraphContainer>, + has_node_specifier_checker: Box<dyn HasNodeSpecifierChecker>, blob_store: BlobStore, - module_loader_factory: CliModuleLoaderFactory, + module_loader_factory: Box<dyn ModuleLoaderFactory>, root_cert_store: RootCertStore, node_fs: Arc<dyn deno_node::NodeFs>, maybe_inspector_server: Option<Arc<InspectorServer>>, @@ -289,7 +317,7 @@ impl CliMainWorkerFactory { storage_key_resolver, npm_resolver, node_resolver, - graph_container, + has_node_specifier_checker, blob_store, broadcast_channel: Default::default(), shared_array_buffer_store: Default::default(), @@ -345,11 +373,11 @@ impl CliMainWorkerFactory { (main_module, false) }; - let module_loader = - Rc::new(shared.module_loader_factory.create_for_main( - PermissionsContainer::allow_all(), - permissions.clone(), - )); + let module_loader = shared + .module_loader_factory + .create_for_main(PermissionsContainer::allow_all(), permissions.clone()); + let maybe_source_map_getter = + shared.module_loader_factory.create_source_map_getter(); let maybe_inspector_server = shared.maybe_inspector_server.clone(); let create_web_worker_cb = @@ -366,6 +394,8 @@ impl CliMainWorkerFactory { shared .options .origin_data_folder_path + .as_ref() + .unwrap() // must be set if storage key resolver returns a value .join(checksum::gen(&[key.as_bytes()])) }); let cache_storage_dir = maybe_storage_key.map(|key| { @@ -405,7 +435,7 @@ impl CliMainWorkerFactory { .clone(), root_cert_store: Some(shared.root_cert_store.clone()), seed: shared.options.seed, - source_map_getter: Some(Box::new(module_loader.clone())), + source_map_getter: maybe_source_map_getter, format_js_error_fn: Some(Arc::new(format_js_error)), create_web_worker_cb, web_worker_preload_module_cb, @@ -461,7 +491,7 @@ fn create_web_worker_pre_execute_module_callback( let shared = shared.clone(); let fut = async move { // this will be up to date after pre-load - if shared.npm_resolver.has_packages() { + if shared.should_initialize_node_runtime() { deno_node::initialize_runtime( &mut worker.js_runtime, shared.options.has_node_modules_dir, @@ -482,11 +512,12 @@ fn create_web_worker_callback( Arc::new(move |args| { let maybe_inspector_server = shared.maybe_inspector_server.clone(); - let module_loader = - Rc::new(shared.module_loader_factory.create_for_worker( - args.parent_permissions.clone(), - args.permissions.clone(), - )); + let module_loader = shared.module_loader_factory.create_for_worker( + args.parent_permissions.clone(), + args.permissions.clone(), + ); + let maybe_source_map_getter = + shared.module_loader_factory.create_source_map_getter(); let create_web_worker_cb = create_web_worker_callback(shared.clone(), stdio.clone()); let preload_module_cb = create_web_worker_preload_module_callback(&shared); @@ -536,7 +567,7 @@ fn create_web_worker_callback( preload_module_cb, pre_execute_module_cb, format_js_error_fn: Some(Arc::new(format_js_error)), - source_map_getter: Some(Box::new(module_loader.clone())), + source_map_getter: maybe_source_map_getter, module_loader, node_fs: Some(shared.node_fs.clone()), npm_resolver: Some(shared.npm_resolver.clone()), |