Skip to content

Commit b903121

Browse files
Merge pull request #220 from supabase/accept-module-code
fix: Support module_code for eszipping code only
2 parents ca246a4 + 84db52a commit b903121

File tree

6 files changed

+89
-20
lines changed

6 files changed

+89
-20
lines changed

crates/base/src/deno_runtime.rs

Lines changed: 37 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -135,7 +135,8 @@ impl DenoRuntime {
135135

136136
// TODO: check for other potential main paths (eg: index.js, index.tsx)
137137
let mut main_module_url = base_url.join("index.ts")?;
138-
if maybe_entrypoint.is_some() {
138+
let is_some_entry_point = maybe_entrypoint.is_some();
139+
if is_some_entry_point {
139140
main_module_url = Url::parse(&maybe_entrypoint.unwrap())?;
140141
}
141142

@@ -148,6 +149,8 @@ impl DenoRuntime {
148149
}
149150

150151
let mut maybe_arc_import_map = None;
152+
let only_module_code =
153+
maybe_module_code.is_some() && maybe_eszip.is_none() && !is_some_entry_point;
151154

152155
let eszip = if let Some(eszip_payload) = maybe_eszip {
153156
eszip_payload
@@ -170,8 +173,16 @@ impl DenoRuntime {
170173
let arc_emitter_factory = Arc::new(emitter_factory);
171174

172175
let main_module_url_file_path = main_module_url.clone().to_file_path().unwrap();
176+
177+
let maybe_code = if only_module_code {
178+
maybe_module_code
179+
} else {
180+
None
181+
};
182+
173183
let eszip =
174-
generate_binary_eszip(main_module_url_file_path, arc_emitter_factory).await?;
184+
generate_binary_eszip(main_module_url_file_path, arc_emitter_factory, maybe_code)
185+
.await?;
175186

176187
EszipPayloadKind::Eszip(eszip)
177188
};
@@ -240,7 +251,7 @@ impl DenoRuntime {
240251
module_code,
241252
} = rt_provider;
242253

243-
let mod_code = module_code.or(maybe_module_code);
254+
let mod_code = module_code;
244255

245256
let extensions = vec![
246257
sb_core_permissions::init_ops(net_access_disabled),
@@ -426,7 +437,7 @@ impl DenoRuntime {
426437
#[cfg(test)]
427438
mod test {
428439
use crate::deno_runtime::DenoRuntime;
429-
use deno_core::ModuleCode;
440+
use deno_core::{FastString, ModuleCode};
430441
use sb_graph::emitter::EmitterFactory;
431442
use sb_graph::{generate_binary_eszip, EszipPayloadKind};
432443
use sb_workers::context::{
@@ -442,6 +453,26 @@ mod test {
442453
use tokio::net::UnixStream;
443454
use tokio::sync::mpsc;
444455

456+
#[tokio::test]
457+
async fn test_module_code_no_eszip() {
458+
let (worker_pool_tx, _) = mpsc::unbounded_channel::<UserWorkerMsgs>();
459+
DenoRuntime::new(WorkerContextInitOpts {
460+
service_path: PathBuf::from("./test_cases/"),
461+
no_module_cache: false,
462+
import_map_path: None,
463+
env_vars: Default::default(),
464+
events_rx: None,
465+
maybe_eszip: None,
466+
maybe_entrypoint: None,
467+
maybe_module_code: Some(FastString::from(String::from(
468+
"Deno.serve((req) => new Response('Hello World'));",
469+
))),
470+
conf: { WorkerRuntimeOpts::MainWorker(MainWorkerRuntimeOpts { worker_pool_tx }) },
471+
})
472+
.await
473+
.expect("It should not panic");
474+
}
475+
445476
#[tokio::test]
446477
#[allow(clippy::arc_with_non_send_sync)]
447478
async fn test_eszip_with_source_file() {
@@ -451,7 +482,7 @@ mod test {
451482
.unwrap();
452483
let path_buf = PathBuf::from("./test_cases/eszip-source-test.ts");
453484
let emitter_factory = Arc::new(EmitterFactory::new());
454-
let bin_eszip = generate_binary_eszip(path_buf, emitter_factory.clone())
485+
let bin_eszip = generate_binary_eszip(path_buf, emitter_factory.clone(), None)
455486
.await
456487
.unwrap();
457488
fs::remove_file("./test_cases/eszip-source-test.ts").unwrap();
@@ -500,7 +531,7 @@ mod test {
500531
let file = PathBuf::from("./test_cases/eszip-silly-test/index.ts");
501532
let service_path = PathBuf::from("./test_cases/eszip-silly-test");
502533
let emitter_factory = Arc::new(EmitterFactory::new());
503-
let binary_eszip = generate_binary_eszip(file, emitter_factory.clone())
534+
let binary_eszip = generate_binary_eszip(file, emitter_factory.clone(), None)
504535
.await
505536
.unwrap();
506537

crates/cli/src/main.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,7 @@ fn main() -> Result<(), anyhow::Error> {
135135
let eszip = generate_binary_eszip(
136136
path.canonicalize().unwrap(),
137137
Arc::new(EmitterFactory::new()),
138+
None,
138139
)
139140
.await?;
140141
let bin = eszip.into_bytes();

crates/module_fetcher/src/file_fetcher.rs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ pub struct File {
6161
/// Simple struct implementing in-process caching to prevent multiple
6262
/// fs reads/net fetches for same file.
6363
#[derive(Debug, Clone, Default)]
64-
struct FileCache(Arc<Mutex<HashMap<ModuleSpecifier, File>>>);
64+
pub struct FileCache(Arc<Mutex<HashMap<ModuleSpecifier, File>>>);
6565

6666
impl FileCache {
6767
pub fn get(&self, specifier: &ModuleSpecifier) -> Option<File> {
@@ -166,7 +166,7 @@ pub struct FetchOptions {
166166
pub struct FileFetcher {
167167
auth_tokens: AuthTokens,
168168
allow_remote: bool,
169-
cache: FileCache,
169+
cache: Arc<FileCache>,
170170
cache_setting: CacheSetting,
171171
http_cache: Arc<dyn HttpCache>,
172172
http_client: Arc<HttpClient>,
@@ -181,11 +181,12 @@ impl FileFetcher {
181181
allow_remote: bool,
182182
http_client: Arc<HttpClient>,
183183
blob_store: Arc<BlobStore>,
184+
file_cache: Arc<FileCache>,
184185
) -> Self {
185186
Self {
186187
auth_tokens: AuthTokens::new(env::var("DENO_AUTH_TOKENS").ok()),
187188
allow_remote,
188-
cache: Default::default(),
189+
cache: file_cache,
189190
cache_setting,
190191
http_cache,
191192
http_client,

crates/sb_graph/emitter.rs

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ use module_fetcher::cache::{
1616
RealDenoCacheEnv,
1717
};
1818
use module_fetcher::emit::Emitter;
19-
use module_fetcher::file_fetcher::FileFetcher;
19+
use module_fetcher::file_fetcher::{FileCache, FileFetcher};
2020
use module_fetcher::http_util::HttpClient;
2121
use module_fetcher::permissions::Permissions;
2222
use sb_node::{NodeResolver, PackageJson};
@@ -89,6 +89,7 @@ pub struct EmitterFactory {
8989
file_fetcher_cache_strategy: Option<CacheSetting>,
9090
file_fetcher_allow_remote: bool,
9191
pub maybe_import_map: Option<Arc<ImportMap>>,
92+
file_cache: Deferred<Arc<FileCache>>,
9293
}
9394

9495
impl Default for EmitterFactory {
@@ -118,6 +119,7 @@ impl EmitterFactory {
118119
file_fetcher_cache_strategy: None,
119120
file_fetcher_allow_remote: true,
120121
maybe_import_map: None,
122+
file_cache: Default::default(),
121123
}
122124
}
123125

@@ -253,6 +255,10 @@ impl EmitterFactory {
253255
})
254256
}
255257

258+
pub fn file_cache(&self) -> &Arc<FileCache> {
259+
self.file_cache.get_or_init(Default::default)
260+
}
261+
256262
pub fn get_lock_file_deferred(&self) -> &Option<Arc<Mutex<Lockfile>>> {
257263
self.lockfile.get_or_init(|| {
258264
if let Some(lockfile_data) = self.maybe_lockfile.clone() {
@@ -359,6 +365,7 @@ impl EmitterFactory {
359365
self.file_fetcher_allow_remote,
360366
http_client,
361367
blob_store,
368+
self.file_cache().clone(),
362369
)
363370
}
364371

crates/sb_graph/graph_util.rs

Lines changed: 30 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
use crate::emitter::EmitterFactory;
22
use crate::graph_resolver::CliGraphResolver;
3+
use deno_ast::MediaType;
34
use deno_core::error::{custom_error, AnyError};
45
use deno_core::parking_lot::Mutex;
5-
use deno_core::ModuleSpecifier;
6+
use deno_core::{FastString, ModuleSpecifier};
67
use deno_graph::ModuleError;
78
use deno_graph::ResolutionError;
89
use deno_semver::package::{PackageNv, PackageReq};
@@ -11,6 +12,7 @@ use eszip::deno_graph::{GraphKind, ModuleGraph, ModuleGraphError};
1112
use eszip::{deno_graph, EszipV2};
1213
use module_fetcher::args::lockfile::Lockfile;
1314
use module_fetcher::cache::ParsedSourceCache;
15+
use module_fetcher::file_fetcher::File;
1416
use sb_core::errors_rt::get_error_class_name;
1517
use sb_npm::CliNpmResolver;
1618
use std::path::PathBuf;
@@ -303,11 +305,33 @@ pub async fn create_eszip_from_graph_raw(
303305
eszip::EszipV2::from_graph(graph, &parser, Default::default())
304306
}
305307

306-
pub async fn create_graph(file: PathBuf, emitter_factory: Arc<EmitterFactory>) -> ModuleGraph {
307-
let binding = std::fs::canonicalize(&file).unwrap();
308-
let specifier = binding.to_str().unwrap();
309-
let format_specifier = format!("file:///{}", specifier);
310-
let module_specifier = ModuleSpecifier::parse(&format_specifier).unwrap();
308+
pub async fn create_graph(
309+
file: PathBuf,
310+
emitter_factory: Arc<EmitterFactory>,
311+
maybe_code: &Option<FastString>,
312+
) -> ModuleGraph {
313+
let module_specifier = if let Some(code) = maybe_code {
314+
let specifier = ModuleSpecifier::parse("file:///src/index.ts").unwrap();
315+
316+
emitter_factory.file_cache().insert(
317+
specifier.clone(),
318+
File {
319+
maybe_types: None,
320+
media_type: MediaType::TypeScript,
321+
source: code.as_str().into(),
322+
specifier: specifier.clone(),
323+
maybe_headers: None,
324+
},
325+
);
326+
327+
specifier
328+
} else {
329+
let binding = std::fs::canonicalize(&file).unwrap();
330+
let specifier = binding.to_str().unwrap();
331+
let format_specifier = format!("file:///{}", specifier);
332+
333+
ModuleSpecifier::parse(&format_specifier).unwrap()
334+
};
311335

312336
let builder = ModuleGraphBuilder::new(emitter_factory, false);
313337

crates/sb_graph/lib.rs

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ use crate::emitter::EmitterFactory;
22
use crate::graph_util::{create_eszip_from_graph_raw, create_graph};
33
use deno_ast::MediaType;
44
use deno_core::error::AnyError;
5-
use deno_core::{serde_json, JsBuffer, ModuleSpecifier};
5+
use deno_core::{serde_json, FastString, JsBuffer, ModuleSpecifier};
66
use deno_fs::{FileSystem, RealFs};
77
use deno_npm::NpmSystemInfo;
88
use eszip::EszipV2;
@@ -27,14 +27,19 @@ pub enum EszipPayloadKind {
2727
pub async fn generate_binary_eszip(
2828
file: PathBuf,
2929
emitter_factory: Arc<EmitterFactory>,
30+
maybe_module_code: Option<FastString>,
3031
) -> Result<EszipV2, AnyError> {
31-
let graph = create_graph(file.clone(), emitter_factory.clone()).await;
32+
let graph = create_graph(file.clone(), emitter_factory.clone(), &maybe_module_code).await;
3233
let eszip = create_eszip_from_graph_raw(graph, Some(emitter_factory.clone())).await;
3334

3435
if let Ok(mut eszip) = eszip {
3536
let fs_path = file.clone();
36-
let entry_content = RealFs.read_file_sync(fs_path.clone().as_path()).unwrap();
37-
let source_code: Arc<str> = String::from_utf8(entry_content.clone())?.into();
37+
let source_code: Arc<str> = if let Some(code) = maybe_module_code {
38+
code.as_str().into()
39+
} else {
40+
let entry_content = RealFs.read_file_sync(fs_path.clone().as_path()).unwrap();
41+
String::from_utf8(entry_content.clone())?.into()
42+
};
3843
let emit_source = emitter_factory.emitter().unwrap().emit_parsed_source(
3944
&ModuleSpecifier::parse("http://localhost").unwrap(),
4045
MediaType::from_path(fs_path.clone().as_path()),

0 commit comments

Comments
 (0)