Skip to content

Commit d4fbeff

Browse files
committed
use module_fetcher to load modules
1 parent 342aa5a commit d4fbeff

File tree

8 files changed

+277
-393
lines changed

8 files changed

+277
-393
lines changed

Cargo.lock

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

base/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ deno_web = { version = "0.116.0" }
2121
deno_websocket = { version = "0.90.0" }
2222
httparse = { version = "1.8.0" }
2323
log = { workspace = true }
24+
module_fetcher = { path = "../module_fetcher" }
2425
reqwest = { version = "0.11.13" }
2526
tokio = { version = "1.24", features = ["full"] }
2627
v8 = { version = "0.60.1", default-features = false }

base/src/js_worker.rs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -90,10 +90,13 @@ fn start_runtime(
9090
permissions::init(),
9191
];
9292

93+
// FIXME: module_loader can panic
94+
let module_loader = DefaultModuleLoader::new().unwrap();
95+
9396
let mut js_runtime = JsRuntime::new(RuntimeOptions {
9497
extensions,
9598
extensions_with_js,
96-
module_loader: Some(Rc::new(DefaultModuleLoader)),
99+
module_loader: Some(Rc::new(module_loader)),
97100
is_main: true,
98101
create_params: Some(v8::CreateParams::default().heap_limits(
99102
mib_to_bytes(1) as usize,

base/src/js_worker/module_loader.rs

Lines changed: 55 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -3,26 +3,25 @@ use deno_ast::EmitOptions;
33
use deno_ast::MediaType;
44
use deno_ast::ParseParams;
55
use deno_ast::SourceTextInfo;
6+
use deno_core::error::AnyError;
67
use deno_core::futures::FutureExt;
78
use deno_core::ModuleLoader;
89
use deno_core::ModuleSource;
910
use deno_core::ModuleSourceFuture;
1011
use deno_core::ModuleSpecifier;
1112
use deno_core::ModuleType;
1213
use deno_core::ResolutionKind;
14+
use module_fetcher::cache::{DenoDir, HttpCache};
15+
use module_fetcher::file_fetcher::{CacheSetting, FileFetcher};
16+
use module_fetcher::http_util::HttpClient;
1317
use std::pin::Pin;
1418

1519
struct ModuleTypeResult {
16-
media_type: MediaType,
1720
module_type: ModuleType,
1821
should_transpile: bool,
1922
}
2023

21-
fn get_module_type(
22-
module_specifier: ModuleSpecifier,
23-
content_type: &str,
24-
) -> Result<ModuleTypeResult, Error> {
25-
let media_type = MediaType::from_content_type(&module_specifier, content_type);
24+
fn get_module_type(media_type: MediaType) -> Result<ModuleTypeResult, Error> {
2625
let (module_type, should_transpile) = match media_type {
2726
MediaType::JavaScript | MediaType::Mjs | MediaType::Cjs => (ModuleType::JavaScript, false),
2827
MediaType::Jsx => (ModuleType::JavaScript, true),
@@ -34,21 +33,52 @@ fn get_module_type(
3433
| MediaType::Dcts
3534
| MediaType::Tsx => (ModuleType::JavaScript, true),
3635
MediaType::Json => (ModuleType::Json, false),
37-
_ => bail!(
38-
"{:?} module type not supported (specifier {:?})",
39-
media_type,
40-
module_specifier.as_str()
41-
),
36+
_ => bail!("{:?} module type not supported", media_type,),
4237
};
4338

4439
Ok(ModuleTypeResult {
45-
media_type,
4640
module_type,
4741
should_transpile,
4842
})
4943
}
5044

51-
pub struct DefaultModuleLoader;
45+
fn make_http_client() -> Result<HttpClient, AnyError> {
46+
let root_cert_store = None;
47+
let unsafely_ignore_certificate_errors = None;
48+
HttpClient::new(root_cert_store, unsafely_ignore_certificate_errors)
49+
}
50+
51+
pub struct DefaultModuleLoader {
52+
file_fetcher: FileFetcher,
53+
permissions: module_fetcher::permissions::Permissions,
54+
}
55+
56+
impl DefaultModuleLoader {
57+
pub fn new() -> Result<Self, AnyError> {
58+
// Note: we are reusing Deno dependency cache path
59+
let deno_dir = DenoDir::new(None)?;
60+
let deps_cache_location = deno_dir.deps_folder_path();
61+
62+
let http_cache = HttpCache::new(&deps_cache_location);
63+
let cache_setting = CacheSetting::Use;
64+
let allow_remote = true;
65+
let http_client = make_http_client()?;
66+
let blob_store = deno_web::BlobStore::default();
67+
let file_fetcher = FileFetcher::new(
68+
http_cache,
69+
cache_setting,
70+
allow_remote,
71+
http_client,
72+
blob_store,
73+
)?;
74+
let permissions = module_fetcher::permissions::Permissions::default();
75+
76+
Ok(Self {
77+
file_fetcher,
78+
permissions,
79+
})
80+
}
81+
}
5282

5383
impl ModuleLoader for DefaultModuleLoader {
5484
fn resolve(
@@ -60,55 +90,30 @@ impl ModuleLoader for DefaultModuleLoader {
6090
Ok(deno_core::resolve_import(specifier, referrer)?)
6191
}
6292

93+
// TODO: implement prepare_load method
6394
fn load(
6495
&self,
6596
module_specifier: &ModuleSpecifier,
6697
_maybe_referrer: Option<ModuleSpecifier>,
6798
_is_dyn_import: bool,
6899
) -> Pin<Box<ModuleSourceFuture>> {
100+
let file_fetcher = self.file_fetcher.clone();
101+
let permissions = self.permissions.clone();
69102
let module_specifier = module_specifier.clone();
103+
70104
async move {
71-
let (media_type, module_type, code, should_transpile) = match module_specifier.scheme()
72-
{
73-
"file" => {
74-
let content_type = "text/plain";
75-
let ModuleTypeResult {
76-
media_type,
77-
module_type,
78-
should_transpile,
79-
} = get_module_type(module_specifier.clone(), &content_type)?;
80-
let path = module_specifier.to_file_path().unwrap();
81-
let code = std::fs::read_to_string(&path)?;
82-
(media_type, module_type, code, should_transpile)
83-
}
84-
"http" | "https" => {
85-
let res = reqwest::get(module_specifier.clone()).await?;
86-
let content_type = res
87-
.headers()
88-
.get("content-type")
89-
.map(|v| v.to_str())
90-
.unwrap()?;
91-
let ModuleTypeResult {
92-
media_type,
93-
module_type,
94-
should_transpile,
95-
} = get_module_type(module_specifier.clone(), content_type)?;
96-
let code = res.text().await?;
97-
(media_type, module_type, code, should_transpile)
98-
}
99-
_ => {
100-
bail!(
101-
"unsupported module url scheme: {:?}",
102-
module_specifier.scheme()
103-
)
104-
}
105-
};
105+
let fetched_file = file_fetcher.fetch(&module_specifier, permissions).await?;
106+
let ModuleTypeResult {
107+
module_type,
108+
should_transpile,
109+
} = get_module_type(fetched_file.media_type)?;
106110

111+
let code = fetched_file.source.to_string();
107112
let code = if should_transpile {
108113
let parsed = deno_ast::parse_module(ParseParams {
109114
specifier: module_specifier.to_string(),
110115
text_info: SourceTextInfo::from_string(code),
111-
media_type,
116+
media_type: fetched_file.media_type,
112117
capture_tokens: false,
113118
scope_analysis: false,
114119
maybe_syntax: None,
@@ -129,7 +134,7 @@ impl ModuleLoader for DefaultModuleLoader {
129134
code: code.into_bytes().into_boxed_slice(),
130135
module_type,
131136
module_url_specified: module_specifier.to_string(),
132-
module_url_found: module_specifier.to_string(),
137+
module_url_found: fetched_file.specifier.to_string(),
133138
};
134139
Ok(module)
135140
}

0 commit comments

Comments
 (0)