diff options
author | Jimmy Wärting <jimmy@warting.se> | 2021-07-05 15:34:37 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-07-05 15:34:37 +0200 |
commit | 2c0b0e45b72ef1b5d7fa95e1e110d07ddbc720f7 (patch) | |
tree | 3b54a6f1f156f8d105cf41ac290035c8b5f8f1c9 /cli/file_fetcher.rs | |
parent | ea87d860beda7cd40eb6857199a00e5ba8700fd2 (diff) |
refactor: asynchronous blob backing store (#10969)
Co-authored-by: Luca Casonato <hello@lcas.dev>
Diffstat (limited to 'cli/file_fetcher.rs')
-rw-r--r-- | cli/file_fetcher.rs | 81 |
1 files changed, 44 insertions, 37 deletions
diff --git a/cli/file_fetcher.rs b/cli/file_fetcher.rs index bd16cb1e1..a326d130e 100644 --- a/cli/file_fetcher.rs +++ b/cli/file_fetcher.rs @@ -19,7 +19,7 @@ use deno_core::futures; use deno_core::futures::future::FutureExt; use deno_core::ModuleSpecifier; use deno_runtime::deno_fetch::reqwest; -use deno_runtime::deno_web::BlobUrlStore; +use deno_runtime::deno_web::BlobStore; use deno_runtime::permissions::Permissions; use log::debug; use log::info; @@ -212,7 +212,7 @@ pub struct FileFetcher { cache_setting: CacheSetting, http_cache: HttpCache, http_client: reqwest::Client, - blob_url_store: BlobUrlStore, + blob_store: BlobStore, } impl FileFetcher { @@ -221,7 +221,7 @@ impl FileFetcher { cache_setting: CacheSetting, allow_remote: bool, ca_data: Option<Vec<u8>>, - blob_url_store: BlobUrlStore, + blob_store: BlobStore, ) -> Result<Self, AnyError> { Ok(Self { auth_tokens: AuthTokens::new(env::var(DENO_AUTH_TOKENS).ok()), @@ -230,7 +230,7 @@ impl FileFetcher { cache_setting, http_cache, http_client: create_http_client(get_user_agent(), ca_data)?, - blob_url_store, + blob_store, }) } @@ -360,7 +360,7 @@ impl FileFetcher { } /// Get a blob URL. - fn fetch_blob_url( + async fn fetch_blob_url( &self, specifier: &ModuleSpecifier, ) -> Result<File, AnyError> { @@ -381,20 +381,24 @@ impl FileFetcher { )); } - let blob_url_storage = self.blob_url_store.borrow(); - let blob = blob_url_storage.get(specifier.clone())?.ok_or_else(|| { - custom_error( - "NotFound", - format!("Blob URL not found: \"{}\".", specifier), - ) - })?; + let blob = { + let blob_store = self.blob_store.borrow(); + blob_store + .get_object_url(specifier.clone())? + .ok_or_else(|| { + custom_error( + "NotFound", + format!("Blob URL not found: \"{}\".", specifier), + ) + })? + }; - let content_type = blob.media_type; + let content_type = blob.media_type.clone(); + let bytes = blob.read_all().await?; let (media_type, maybe_charset) = map_content_type(specifier, Some(content_type.clone())); - let source = - strip_shebang(get_source_from_bytes(blob.data, maybe_charset)?); + let source = strip_shebang(get_source_from_bytes(bytes, maybe_charset)?); let local = self @@ -525,7 +529,7 @@ impl FileFetcher { } result } else if scheme == "blob" { - let result = self.fetch_blob_url(specifier); + let result = self.fetch_blob_url(specifier).await; if let Ok(file) = &result { self.cache.insert(specifier.clone(), file.clone()); } @@ -580,6 +584,7 @@ mod tests { use deno_core::resolve_url; use deno_core::resolve_url_or_path; use deno_runtime::deno_web::Blob; + use deno_runtime::deno_web::InMemoryBlobPart; use std::rc::Rc; use tempfile::TempDir; @@ -588,28 +593,28 @@ mod tests { maybe_temp_dir: Option<Rc<TempDir>>, ) -> (FileFetcher, Rc<TempDir>) { let (file_fetcher, temp_dir, _) = - setup_with_blob_url_store(cache_setting, maybe_temp_dir); + setup_with_blob_store(cache_setting, maybe_temp_dir); (file_fetcher, temp_dir) } - fn setup_with_blob_url_store( + fn setup_with_blob_store( cache_setting: CacheSetting, maybe_temp_dir: Option<Rc<TempDir>>, - ) -> (FileFetcher, Rc<TempDir>, BlobUrlStore) { + ) -> (FileFetcher, Rc<TempDir>, BlobStore) { let temp_dir = maybe_temp_dir.unwrap_or_else(|| { Rc::new(TempDir::new().expect("failed to create temp directory")) }); let location = temp_dir.path().join("deps"); - let blob_url_store = BlobUrlStore::default(); + let blob_store = BlobStore::default(); let file_fetcher = FileFetcher::new( HttpCache::new(&location), cache_setting, true, None, - blob_url_store.clone(), + blob_store.clone(), ) .expect("setup failed"); - (file_fetcher, temp_dir, blob_url_store) + (file_fetcher, temp_dir, blob_store) } macro_rules! file_url { @@ -948,16 +953,18 @@ mod tests { #[tokio::test] async fn test_fetch_blob_url() { - let (file_fetcher, _, blob_url_store) = - setup_with_blob_url_store(CacheSetting::Use, None); + let (file_fetcher, _, blob_store) = + setup_with_blob_store(CacheSetting::Use, None); + + let bytes = + "export const a = \"a\";\n\nexport enum A {\n A,\n B,\n C,\n}\n" + .as_bytes() + .to_vec(); - let specifier = blob_url_store.insert( + let specifier = blob_store.insert_object_url( Blob { - data: - "export const a = \"a\";\n\nexport enum A {\n A,\n B,\n C,\n}\n" - .as_bytes() - .to_vec(), media_type: "application/typescript".to_string(), + parts: vec![Arc::new(Box::new(InMemoryBlobPart::from(bytes)))], }, None, ); @@ -1049,7 +1056,7 @@ mod tests { CacheSetting::ReloadAll, true, None, - BlobUrlStore::default(), + BlobStore::default(), ) .expect("setup failed"); let result = file_fetcher @@ -1076,7 +1083,7 @@ mod tests { CacheSetting::Use, true, None, - BlobUrlStore::default(), + BlobStore::default(), ) .expect("could not create file fetcher"); let specifier = @@ -1104,7 +1111,7 @@ mod tests { CacheSetting::Use, true, None, - BlobUrlStore::default(), + BlobStore::default(), ) .expect("could not create file fetcher"); let result = file_fetcher_02 @@ -1265,7 +1272,7 @@ mod tests { CacheSetting::Use, true, None, - BlobUrlStore::default(), + BlobStore::default(), ) .expect("could not create file fetcher"); let specifier = @@ -1296,7 +1303,7 @@ mod tests { CacheSetting::Use, true, None, - BlobUrlStore::default(), + BlobStore::default(), ) .expect("could not create file fetcher"); let result = file_fetcher_02 @@ -1406,7 +1413,7 @@ mod tests { CacheSetting::Use, false, None, - BlobUrlStore::default(), + BlobStore::default(), ) .expect("could not create file fetcher"); let specifier = @@ -1433,7 +1440,7 @@ mod tests { CacheSetting::Only, true, None, - BlobUrlStore::default(), + BlobStore::default(), ) .expect("could not create file fetcher"); let file_fetcher_02 = FileFetcher::new( @@ -1441,7 +1448,7 @@ mod tests { CacheSetting::Use, true, None, - BlobUrlStore::default(), + BlobStore::default(), ) .expect("could not create file fetcher"); let specifier = |