mirror of
https://github.com/denoland/deno.git
synced 2024-11-25 15:29:32 -05:00
fix(jsr): ensure proper storage of ahead of time module infos (#21918)
This was incorrectly being stored so the AOT cache for JSR specifiers wasn't being used. I added a wrapper type to help prevent the API being used incorrectly.
This commit is contained in:
parent
248fb9c946
commit
3298ca06f5
2 changed files with 66 additions and 14 deletions
5
cli/cache/mod.rs
vendored
5
cli/cache/mod.rs
vendored
|
@ -96,6 +96,8 @@ pub type LocalLspHttpCache =
|
||||||
deno_cache_dir::LocalLspHttpCache<RealDenoCacheEnv>;
|
deno_cache_dir::LocalLspHttpCache<RealDenoCacheEnv>;
|
||||||
pub use deno_cache_dir::HttpCache;
|
pub use deno_cache_dir::HttpCache;
|
||||||
|
|
||||||
|
use self::module_info::ModuleInfoCacheSourceHash;
|
||||||
|
|
||||||
/// A "wrapper" for the FileFetcher and DiskCache for the Deno CLI that provides
|
/// A "wrapper" for the FileFetcher and DiskCache for the Deno CLI that provides
|
||||||
/// a concise interface to the DENO_DIR when building module graphs.
|
/// a concise interface to the DENO_DIR when building module graphs.
|
||||||
pub struct FetchCacher {
|
pub struct FetchCacher {
|
||||||
|
@ -280,10 +282,11 @@ impl Loader for FetchCacher {
|
||||||
source: &str,
|
source: &str,
|
||||||
module_info: &deno_graph::ModuleInfo,
|
module_info: &deno_graph::ModuleInfo,
|
||||||
) {
|
) {
|
||||||
|
let source_hash = ModuleInfoCacheSourceHash::from_source(source.as_bytes());
|
||||||
let result = self.module_info_cache.set_module_info(
|
let result = self.module_info_cache.set_module_info(
|
||||||
specifier,
|
specifier,
|
||||||
MediaType::from_specifier(specifier),
|
MediaType::from_specifier(specifier),
|
||||||
source,
|
&source_hash,
|
||||||
module_info,
|
module_info,
|
||||||
);
|
);
|
||||||
if let Err(err) = result {
|
if let Err(err) = result {
|
||||||
|
|
75
cli/cache/module_info.rs
vendored
75
cli/cache/module_info.rs
vendored
|
@ -39,6 +39,22 @@ pub static MODULE_INFO_CACHE_DB: CacheDBConfiguration = CacheDBConfiguration {
|
||||||
on_failure: CacheFailure::InMemory,
|
on_failure: CacheFailure::InMemory,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
pub struct ModuleInfoCacheSourceHash(String);
|
||||||
|
|
||||||
|
impl ModuleInfoCacheSourceHash {
|
||||||
|
pub fn new(hash: u64) -> Self {
|
||||||
|
Self(hash.to_string())
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn from_source(source: &[u8]) -> Self {
|
||||||
|
Self::new(FastInsecureHasher::hash(source))
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn as_str(&self) -> &str {
|
||||||
|
&self.0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// A cache of `deno_graph::ModuleInfo` objects. Using this leads to a considerable
|
/// A cache of `deno_graph::ModuleInfo` objects. Using this leads to a considerable
|
||||||
/// performance improvement because when it exists we can skip parsing a module for
|
/// performance improvement because when it exists we can skip parsing a module for
|
||||||
/// deno_graph.
|
/// deno_graph.
|
||||||
|
@ -68,7 +84,7 @@ impl ModuleInfoCache {
|
||||||
&self,
|
&self,
|
||||||
specifier: &ModuleSpecifier,
|
specifier: &ModuleSpecifier,
|
||||||
media_type: MediaType,
|
media_type: MediaType,
|
||||||
expected_source_hash: &str,
|
expected_source_hash: &ModuleInfoCacheSourceHash,
|
||||||
) -> Result<Option<ModuleInfo>, AnyError> {
|
) -> Result<Option<ModuleInfo>, AnyError> {
|
||||||
let query = SELECT_MODULE_INFO;
|
let query = SELECT_MODULE_INFO;
|
||||||
let res = self.conn.query_row(
|
let res = self.conn.query_row(
|
||||||
|
@ -76,7 +92,7 @@ impl ModuleInfoCache {
|
||||||
params![
|
params![
|
||||||
&specifier.as_str(),
|
&specifier.as_str(),
|
||||||
serialize_media_type(media_type),
|
serialize_media_type(media_type),
|
||||||
&expected_source_hash,
|
expected_source_hash.as_str(),
|
||||||
],
|
],
|
||||||
|row| {
|
|row| {
|
||||||
let module_info: String = row.get(0)?;
|
let module_info: String = row.get(0)?;
|
||||||
|
@ -91,7 +107,7 @@ impl ModuleInfoCache {
|
||||||
&self,
|
&self,
|
||||||
specifier: &ModuleSpecifier,
|
specifier: &ModuleSpecifier,
|
||||||
media_type: MediaType,
|
media_type: MediaType,
|
||||||
source_hash: &str,
|
source_hash: &ModuleInfoCacheSourceHash,
|
||||||
module_info: &ModuleInfo,
|
module_info: &ModuleInfo,
|
||||||
) -> Result<(), AnyError> {
|
) -> Result<(), AnyError> {
|
||||||
let sql = "
|
let sql = "
|
||||||
|
@ -104,7 +120,7 @@ impl ModuleInfoCache {
|
||||||
params![
|
params![
|
||||||
specifier.as_str(),
|
specifier.as_str(),
|
||||||
serialize_media_type(media_type),
|
serialize_media_type(media_type),
|
||||||
&source_hash,
|
source_hash.as_str(),
|
||||||
&serde_json::to_string(&module_info)?,
|
&serde_json::to_string(&module_info)?,
|
||||||
],
|
],
|
||||||
)?;
|
)?;
|
||||||
|
@ -135,7 +151,7 @@ impl<'a> deno_graph::ModuleAnalyzer for ModuleInfoCacheModuleAnalyzer<'a> {
|
||||||
media_type: MediaType,
|
media_type: MediaType,
|
||||||
) -> Result<ModuleInfo, deno_ast::Diagnostic> {
|
) -> Result<ModuleInfo, deno_ast::Diagnostic> {
|
||||||
// attempt to load from the cache
|
// attempt to load from the cache
|
||||||
let source_hash = FastInsecureHasher::hash(source.as_bytes()).to_string();
|
let source_hash = ModuleInfoCacheSourceHash::from_source(source.as_bytes());
|
||||||
match self.module_info_cache.get_module_info(
|
match self.module_info_cache.get_module_info(
|
||||||
specifier,
|
specifier,
|
||||||
media_type,
|
media_type,
|
||||||
|
@ -214,7 +230,11 @@ mod test {
|
||||||
ModuleSpecifier::parse("https://localhost/mod2.ts").unwrap();
|
ModuleSpecifier::parse("https://localhost/mod2.ts").unwrap();
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
cache
|
cache
|
||||||
.get_module_info(&specifier1, MediaType::JavaScript, "1")
|
.get_module_info(
|
||||||
|
&specifier1,
|
||||||
|
MediaType::JavaScript,
|
||||||
|
&ModuleInfoCacheSourceHash::new(1)
|
||||||
|
)
|
||||||
.unwrap(),
|
.unwrap(),
|
||||||
None
|
None
|
||||||
);
|
);
|
||||||
|
@ -234,31 +254,52 @@ mod test {
|
||||||
text: "test".to_string(),
|
text: "test".to_string(),
|
||||||
});
|
});
|
||||||
cache
|
cache
|
||||||
.set_module_info(&specifier1, MediaType::JavaScript, "1", &module_info)
|
.set_module_info(
|
||||||
|
&specifier1,
|
||||||
|
MediaType::JavaScript,
|
||||||
|
&ModuleInfoCacheSourceHash::new(1),
|
||||||
|
&module_info,
|
||||||
|
)
|
||||||
.unwrap();
|
.unwrap();
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
cache
|
cache
|
||||||
.get_module_info(&specifier1, MediaType::JavaScript, "1")
|
.get_module_info(
|
||||||
|
&specifier1,
|
||||||
|
MediaType::JavaScript,
|
||||||
|
&ModuleInfoCacheSourceHash::new(1)
|
||||||
|
)
|
||||||
.unwrap(),
|
.unwrap(),
|
||||||
Some(module_info.clone())
|
Some(module_info.clone())
|
||||||
);
|
);
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
cache
|
cache
|
||||||
.get_module_info(&specifier2, MediaType::JavaScript, "1")
|
.get_module_info(
|
||||||
|
&specifier2,
|
||||||
|
MediaType::JavaScript,
|
||||||
|
&ModuleInfoCacheSourceHash::new(1)
|
||||||
|
)
|
||||||
.unwrap(),
|
.unwrap(),
|
||||||
None,
|
None,
|
||||||
);
|
);
|
||||||
// different media type
|
// different media type
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
cache
|
cache
|
||||||
.get_module_info(&specifier1, MediaType::TypeScript, "1")
|
.get_module_info(
|
||||||
|
&specifier1,
|
||||||
|
MediaType::TypeScript,
|
||||||
|
&ModuleInfoCacheSourceHash::new(1)
|
||||||
|
)
|
||||||
.unwrap(),
|
.unwrap(),
|
||||||
None,
|
None,
|
||||||
);
|
);
|
||||||
// different source hash
|
// different source hash
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
cache
|
cache
|
||||||
.get_module_info(&specifier1, MediaType::JavaScript, "2")
|
.get_module_info(
|
||||||
|
&specifier1,
|
||||||
|
MediaType::JavaScript,
|
||||||
|
&ModuleInfoCacheSourceHash::new(2)
|
||||||
|
)
|
||||||
.unwrap(),
|
.unwrap(),
|
||||||
None,
|
None,
|
||||||
);
|
);
|
||||||
|
@ -269,7 +310,11 @@ mod test {
|
||||||
// should get it
|
// should get it
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
cache
|
cache
|
||||||
.get_module_info(&specifier1, MediaType::JavaScript, "1")
|
.get_module_info(
|
||||||
|
&specifier1,
|
||||||
|
MediaType::JavaScript,
|
||||||
|
&ModuleInfoCacheSourceHash::new(1)
|
||||||
|
)
|
||||||
.unwrap(),
|
.unwrap(),
|
||||||
Some(module_info)
|
Some(module_info)
|
||||||
);
|
);
|
||||||
|
@ -280,7 +325,11 @@ mod test {
|
||||||
// should no longer exist
|
// should no longer exist
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
cache
|
cache
|
||||||
.get_module_info(&specifier1, MediaType::JavaScript, "1")
|
.get_module_info(
|
||||||
|
&specifier1,
|
||||||
|
MediaType::JavaScript,
|
||||||
|
&ModuleInfoCacheSourceHash::new(1)
|
||||||
|
)
|
||||||
.unwrap(),
|
.unwrap(),
|
||||||
None,
|
None,
|
||||||
);
|
);
|
||||||
|
|
Loading…
Reference in a new issue