diff options
author | Bartek IwaĆczuk <biwanczuk@gmail.com> | 2020-02-19 17:51:10 -0500 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-02-19 17:51:10 -0500 |
commit | 742a16b5069b2a6dee200d908df54fab77408581 (patch) | |
tree | 8c3a60db56eb0fc15c5bb709b49626c7e3ad89a1 /cli/ops/compiler.rs | |
parent | 90125566bbaed8b5c6e55ca8dbc432e3433fb73c (diff) |
refactor: rewrite file_fetcher to use async fns, lift blocking call (#4037)
Diffstat (limited to 'cli/ops/compiler.rs')
-rw-r--r-- | cli/ops/compiler.rs | 55 |
1 files changed, 31 insertions, 24 deletions
diff --git a/cli/ops/compiler.rs b/cli/ops/compiler.rs index f61bf6820..4d67a8009 100644 --- a/cli/ops/compiler.rs +++ b/cli/ops/compiler.rs @@ -8,6 +8,7 @@ use crate::ops::json_op; use crate::state::State; use deno_core::Loader; use deno_core::*; +use futures::future::FutureExt; pub fn init(i: &mut Isolate, s: &State) { i.register_op("cache", s.core_op(json_op(s.stateful_op(op_cache)))); @@ -43,16 +44,15 @@ fn op_cache( let module_specifier = ModuleSpecifier::resolve_url(&args.module_id) .expect("Should be valid module specifier"); - state - .borrow() - .global_state - .ts_compiler - .cache_compiler_output( - &module_specifier, - &args.extension, - &args.contents, - )?; + let state_ = &state.borrow().global_state; + let ts_compiler = state_.ts_compiler.clone(); + let fut = ts_compiler.cache_compiler_output( + &module_specifier, + &args.extension, + &args.contents, + ); + futures::executor::block_on(fut)?; Ok(JsonOp::Sync(json!({}))) } @@ -102,21 +102,27 @@ fn op_fetch_source_files( None }; - let mut futures = vec![]; let global_state = state.borrow().global_state.clone(); - - for specifier in &args.specifiers { - let resolved_specifier = - ModuleSpecifier::resolve_url(&specifier).expect("Invalid specifier"); - let fut = global_state - .file_fetcher - .fetch_source_file_async(&resolved_specifier, ref_specifier.clone()); - futures.push(fut); - } - - let future = Box::pin(async move { - let files = try_join_all(futures).await?; - + let file_fetcher = global_state.file_fetcher.clone(); + let specifiers = args.specifiers.clone(); + let future = async move { + let file_futures: Vec<_> = specifiers + .into_iter() + .map(|specifier| { + let file_fetcher_ = file_fetcher.clone(); + let ref_specifier_ = ref_specifier.clone(); + async move { + let resolved_specifier = ModuleSpecifier::resolve_url(&specifier) + .expect("Invalid specifier"); + file_fetcher_ + .fetch_source_file_async(&resolved_specifier, ref_specifier_) + .await + } + .boxed_local() + }) + .collect(); + + let files = try_join_all(file_futures).await?; // We want to get an array of futures that resolves to let v = files.into_iter().map(|f| { async { @@ -156,7 +162,8 @@ fn op_fetch_source_files( let v = try_join_all(v).await?; Ok(v.into()) - }); + } + .boxed_local(); Ok(JsonOp::Async(future)) } |