implement a blake3 content version layer for cache busting
works pretty much the same as our previous `?cache` parameter, but is implemented in a less ad-hoc way
This commit is contained in:
parent
32f25ce863
commit
7169e65244
15
Cargo.lock
generated
15
Cargo.lock
generated
|
@ -438,6 +438,20 @@ dependencies = [
|
||||||
"typenum",
|
"typenum",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "dashmap"
|
||||||
|
version = "6.1.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "5041cc499144891f3790297212f32a74fb938e5136a14943f338ef9e0ae276cf"
|
||||||
|
dependencies = [
|
||||||
|
"cfg-if",
|
||||||
|
"crossbeam-utils",
|
||||||
|
"hashbrown",
|
||||||
|
"lock_api",
|
||||||
|
"once_cell",
|
||||||
|
"parking_lot_core",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "digest"
|
name = "digest"
|
||||||
version = "0.10.7"
|
version = "0.10.7"
|
||||||
|
@ -1583,6 +1597,7 @@ dependencies = [
|
||||||
"clap",
|
"clap",
|
||||||
"codespan-reporting",
|
"codespan-reporting",
|
||||||
"copy_dir",
|
"copy_dir",
|
||||||
|
"dashmap",
|
||||||
"env_logger",
|
"env_logger",
|
||||||
"git2",
|
"git2",
|
||||||
"handlebars",
|
"handlebars",
|
||||||
|
|
|
@ -6,7 +6,7 @@
|
||||||
<style>
|
<style>
|
||||||
@font-face {
|
@font-face {
|
||||||
font-family: "Determination Sans";
|
font-family: "Determination Sans";
|
||||||
src: url('/static/font/DTM-Sans.otf?cache=b3-4fe96c14');
|
src: url('/static/font/DTM-Sans.otf?v=b3-4fe96c14');
|
||||||
}
|
}
|
||||||
|
|
||||||
.undertale-save-box {
|
.undertale-save-box {
|
||||||
|
|
|
@ -15,6 +15,7 @@ chrono = "0.4.35"
|
||||||
clap = { version = "4.3.22", features = ["derive"] }
|
clap = { version = "4.3.22", features = ["derive"] }
|
||||||
codespan-reporting = "0.11.1"
|
codespan-reporting = "0.11.1"
|
||||||
copy_dir = "0.1.3"
|
copy_dir = "0.1.3"
|
||||||
|
dashmap = "6.1.0"
|
||||||
env_logger = "0.10.0"
|
env_logger = "0.10.0"
|
||||||
git2 = { version = "0.19.0", default-features = false, features = ["vendored-libgit2"] }
|
git2 = { version = "0.19.0", default-features = false, features = ["vendored-libgit2"] }
|
||||||
handlebars = "4.3.7"
|
handlebars = "4.3.7"
|
||||||
|
|
|
@ -9,7 +9,7 @@ use treehouse::cli::serve::serve;
|
||||||
use treehouse::dirs::Dirs;
|
use treehouse::dirs::Dirs;
|
||||||
use treehouse::generate::{self, Sources};
|
use treehouse::generate::{self, Sources};
|
||||||
use treehouse::vfs::asynch::AsyncDir;
|
use treehouse::vfs::asynch::AsyncDir;
|
||||||
use treehouse::vfs::{AnchoredAtExt, DynDir, ToDynDir, VPathBuf};
|
use treehouse::vfs::{AnchoredAtExt, Blake3ContentVersionCache, DynDir, ToDynDir, VPathBuf};
|
||||||
use treehouse::vfs::{Cd, PhysicalDir};
|
use treehouse::vfs::{Cd, PhysicalDir};
|
||||||
use treehouse::{
|
use treehouse::{
|
||||||
cli::{
|
cli::{
|
||||||
|
@ -42,6 +42,8 @@ fn vfs_sources() -> anyhow::Result<DynDir> {
|
||||||
PhysicalDir::new(PathBuf::from("content")).to_dyn(),
|
PhysicalDir::new(PathBuf::from("content")).to_dyn(),
|
||||||
);
|
);
|
||||||
|
|
||||||
|
let root = Blake3ContentVersionCache::new(root);
|
||||||
|
|
||||||
Ok(root.to_dyn())
|
Ok(root.to_dyn())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -52,6 +52,7 @@ use std::{
|
||||||
mod anchored;
|
mod anchored;
|
||||||
pub mod asynch;
|
pub mod asynch;
|
||||||
mod cd;
|
mod cd;
|
||||||
|
mod content_version_cache;
|
||||||
mod edit;
|
mod edit;
|
||||||
mod empty;
|
mod empty;
|
||||||
mod file;
|
mod file;
|
||||||
|
@ -62,6 +63,7 @@ mod physical;
|
||||||
|
|
||||||
pub use anchored::*;
|
pub use anchored::*;
|
||||||
pub use cd::*;
|
pub use cd::*;
|
||||||
|
pub use content_version_cache::*;
|
||||||
pub use edit::*;
|
pub use edit::*;
|
||||||
pub use empty::*;
|
pub use empty::*;
|
||||||
pub use file::*;
|
pub use file::*;
|
||||||
|
|
62
crates/treehouse/src/vfs/content_version_cache.rs
Normal file
62
crates/treehouse/src/vfs/content_version_cache.rs
Normal file
|
@ -0,0 +1,62 @@
|
||||||
|
use std::fmt::{self, Debug};
|
||||||
|
|
||||||
|
use dashmap::DashMap;
|
||||||
|
use log::debug;
|
||||||
|
|
||||||
|
use super::{Dir, DirEntry, EditPath, VPath, VPathBuf};
|
||||||
|
|
||||||
|
pub struct Blake3ContentVersionCache<T> {
|
||||||
|
inner: T,
|
||||||
|
cache: DashMap<VPathBuf, Option<String>>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<T> Blake3ContentVersionCache<T> {
|
||||||
|
pub fn new(inner: T) -> Self {
|
||||||
|
Self {
|
||||||
|
inner,
|
||||||
|
cache: DashMap::new(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<T> Dir for Blake3ContentVersionCache<T>
|
||||||
|
where
|
||||||
|
T: Dir,
|
||||||
|
{
|
||||||
|
fn dir(&self, path: &VPath) -> Vec<DirEntry> {
|
||||||
|
self.inner.dir(path)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn content(&self, path: &VPath) -> Option<Vec<u8>> {
|
||||||
|
self.inner.content(path)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn content_version(&self, path: &VPath) -> Option<String> {
|
||||||
|
self.cache
|
||||||
|
.entry(path.to_owned())
|
||||||
|
.or_insert_with(|| {
|
||||||
|
self.content(path).map(|content| {
|
||||||
|
let hash = blake3::hash(&content).to_hex();
|
||||||
|
format!("b3-{}", &hash[0..8])
|
||||||
|
})
|
||||||
|
})
|
||||||
|
.clone()
|
||||||
|
}
|
||||||
|
|
||||||
|
fn anchor(&self, path: &VPath) -> Option<VPathBuf> {
|
||||||
|
self.inner.anchor(path)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn edit_path(&self, path: &VPath) -> Option<EditPath> {
|
||||||
|
self.inner.edit_path(path)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<T> fmt::Debug for Blake3ContentVersionCache<T>
|
||||||
|
where
|
||||||
|
T: Debug,
|
||||||
|
{
|
||||||
|
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
||||||
|
write!(f, "Blake3ContentVersionCache({:?})", self.inner)
|
||||||
|
}
|
||||||
|
}
|
|
@ -117,12 +117,12 @@ body {
|
||||||
Other assets are referenced rarely enough that caching probably isn't gonna make too much of
|
Other assets are referenced rarely enough that caching probably isn't gonna make too much of
|
||||||
an impact.
|
an impact.
|
||||||
It's unlikely I'll ever update the font anyways, so eh, whatever. */
|
It's unlikely I'll ever update the font anyways, so eh, whatever. */
|
||||||
src: url("../font/Recursive_VF_1.085.woff2?cache=b3-445487d5");
|
src: url("../font/Recursive_VF_1.085.woff2?v=b3-445487d5");
|
||||||
}
|
}
|
||||||
|
|
||||||
@font-face {
|
@font-face {
|
||||||
font-family: "RecVarMono";
|
font-family: "RecVarMono";
|
||||||
src: url("../font/Recursive_VF_1.085.woff2?cache=b3-445487d5");
|
src: url("../font/Recursive_VF_1.085.woff2?v=b3-445487d5");
|
||||||
font-variation-settings: "MONO" 1;
|
font-variation-settings: "MONO" 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue