perf: use const-str's include_asset!

This commit is contained in:
2026-03-24 22:31:12 +01:00
parent 8a65bb2c92
commit 70f77f3501
4 changed files with 67 additions and 32 deletions

59
Cargo.lock generated
View File

@@ -457,6 +457,23 @@ dependencies = [
"crossbeam-utils", "crossbeam-utils",
] ]
[[package]]
name = "const-macros"
version = "0.1.1"
source = "git+https://git.javalsai.tuxcord.net/rust/const-macros.git#6a37f26eaa6349c18ac7c74b1d3938d287013942"
dependencies = [
"const-macros-proc",
]
[[package]]
name = "const-macros-proc"
version = "0.1.0"
source = "git+https://git.javalsai.tuxcord.net/rust/const-macros.git#6a37f26eaa6349c18ac7c74b1d3938d287013942"
dependencies = [
"magic",
"sha2",
]
[[package]] [[package]]
name = "const-str" name = "const-str"
version = "1.1.0" version = "1.1.0"
@@ -1075,7 +1092,7 @@ checksum = "5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897"
[[package]] [[package]]
name = "magic" name = "magic"
version = "0.16.7" version = "0.16.7"
source = "git+https://github.com/javalsai/rust-magic.git?branch=dbpaths-clone#c5a357bd482b7625e407c39f5f5af5f2d425a2fb" source = "git+https://github.com/javalsai/rust-magic.git?branch=dbpaths-clone#211e458a706c728aebffb1a48175b5c6edef3493"
dependencies = [ dependencies = [
"bitflags", "bitflags",
"magic-sys", "magic-sys",
@@ -1083,9 +1100,9 @@ dependencies = [
[[package]] [[package]]
name = "magic-sys" name = "magic-sys"
version = "0.4.2" version = "0.4.3"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "82b275c342ee5dd5b19e51905dcc092b8fd1bb1187abbc600ac8910bbb15840e" checksum = "9a7813c89073ddea0d1979d29786cfb5bd5c8bfe19fdede15a9e6e27fe919b23"
dependencies = [ dependencies = [
"pkg-config", "pkg-config",
"vcpkg", "vcpkg",
@@ -1175,6 +1192,7 @@ dependencies = [
"anstyle", "anstyle",
"anyhow", "anyhow",
"clap", "clap",
"const-macros",
"const-str", "const-str",
"futures-util", "futures-util",
"libc", "libc",
@@ -1519,9 +1537,9 @@ dependencies = [
[[package]] [[package]]
name = "serde_spanned" name = "serde_spanned"
version = "1.0.4" version = "1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f8bbf91e5a4d6315eee45e704372590b30e260ee83af6639d64557f51b067776" checksum = "876ac351060d4f882bb1032b6369eb0aef79ad9df1ea8bc404874d8cc3d0cd98"
dependencies = [ dependencies = [
"serde_core", "serde_core",
] ]
@@ -1549,6 +1567,17 @@ dependencies = [
"digest", "digest",
] ]
[[package]]
name = "sha2"
version = "0.10.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283"
dependencies = [
"cfg-if",
"cpufeatures",
"digest",
]
[[package]] [[package]]
name = "shlex" name = "shlex"
version = "1.3.0" version = "1.3.0"
@@ -1758,9 +1787,9 @@ dependencies = [
[[package]] [[package]]
name = "toml" name = "toml"
version = "1.0.7+spec-1.1.0" version = "1.1.0+spec-1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "dd28d57d8a6f6e458bc0b8784f8fdcc4b99a437936056fa122cb234f18656a96" checksum = "f8195ca05e4eb728f4ba94f3e3291661320af739c4e43779cbdfae82ab239fcc"
dependencies = [ dependencies = [
"indexmap", "indexmap",
"serde_core", "serde_core",
@@ -1773,27 +1802,27 @@ dependencies = [
[[package]] [[package]]
name = "toml_datetime" name = "toml_datetime"
version = "1.0.1+spec-1.1.0" version = "1.1.0+spec-1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9b320e741db58cac564e26c607d3cc1fdc4a88fd36c879568c07856ed83ff3e9" checksum = "97251a7c317e03ad83774a8752a7e81fb6067740609f75ea2b585b569a59198f"
dependencies = [ dependencies = [
"serde_core", "serde_core",
] ]
[[package]] [[package]]
name = "toml_parser" name = "toml_parser"
version = "1.0.10+spec-1.1.0" version = "1.1.0+spec-1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7df25b4befd31c4816df190124375d5a20c6b6921e2cad937316de3fccd63420" checksum = "2334f11ee363607eb04df9b8fc8a13ca1715a72ba8662a26ac285c98aabb4011"
dependencies = [ dependencies = [
"winnow", "winnow",
] ]
[[package]] [[package]]
name = "toml_writer" name = "toml_writer"
version = "1.0.7+spec-1.1.0" version = "1.1.0+spec-1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f17aaa1c6e3dc22b1da4b6bba97d066e354c7945cac2f7852d4e4e7ca7a6b56d" checksum = "d282ade6016312faf3e41e57ebbba0c073e4056dab1232ab1cb624199648f8ed"
[[package]] [[package]]
name = "tracing" name = "tracing"
@@ -1841,9 +1870,9 @@ checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75"
[[package]] [[package]]
name = "unicode-segmentation" name = "unicode-segmentation"
version = "1.12.0" version = "1.13.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" checksum = "da36089a805484bcccfffe0739803392c8298778a2d2f09febf76fac5ad9025b"
[[package]] [[package]]
name = "unicode-xid" name = "unicode-xid"

View File

@@ -25,11 +25,11 @@ actix-web = "4.13"
anstyle = "1.0" anstyle = "1.0"
anyhow = "1.0" anyhow = "1.0"
clap = { version = "4.5", features = ["derive"] } clap = { version = "4.5", features = ["derive"] }
const-macros = { git = "https://git.javalsai.tuxcord.net/rust/const-macros.git", version = "0.1.1" }
const-str = { version = "1.1", features = ["proc"] } const-str = { version = "1.1", features = ["proc"] }
futures-util = "0.3" futures-util = "0.3"
libc = "0.2" libc = "0.2"
# https://github.com/robo9k/rust-magic/issues/434 magic = "0.16"
magic = { version = "0.16", git = "https://github.com/javalsai/rust-magic.git", branch = "dbpaths-clone" }
moka = { version = "0.12", features = ["async-lock", "future"] } moka = { version = "0.12", features = ["async-lock", "future"] }
serde = { version = "1.0", features = ["derive"] } serde = { version = "1.0", features = ["derive"] }
thiserror = "2.0" thiserror = "2.0"
@@ -37,13 +37,17 @@ tokio = { version = "1.49", features = ["full"] }
toml = "1.0" toml = "1.0"
users = "0.11" users = "0.11"
[patch.crates-io]
# https://github.com/robo9k/rust-magic/issues/434
magic = { git = "https://github.com/javalsai/rust-magic.git", branch = "dbpaths-clone" }
[lints.clippy] [lints.clippy]
cargo = { level = "warn", priority = -1 } cargo = { level = "warn", priority = -1 }
multiple_crate_versions = { level = "allow" } # otherwise there's too much multiple_crate_versions = { level = "allow" } # otherwise there's too much
correctness = { level = "deny", priority = -1 } correctness = { level = "deny", priority = -1 }
nursery = { level = "deny", priority = -1 } nursery = { level = "deny", priority = -1 }
option_if_let_else = { level = "allow" } # I personally sometimes prefer what this prevents option_if_let_else = { level = "allow" } # I personally sometimes prefer what this prevents
pedantic = { level = "deny", priority = -1 } pedantic = { level = "deny", priority = -1 }
perf = { level = "deny", priority = -1 } perf = { level = "deny", priority = -1 }

View File

@@ -2,6 +2,8 @@
use std::time::Duration; use std::time::Duration;
use const_macros::{file::FileAsset, include_asset};
/// Max [`moka`] pfp cache capacity /// Max [`moka`] pfp cache capacity
pub const MAX_PFP_CACHE_CAPACITY: u64 = 1024; pub const MAX_PFP_CACHE_CAPACITY: u64 = 1024;
@@ -9,8 +11,7 @@ pub const MAX_PFP_CACHE_CAPACITY: u64 = 1024;
pub const MAX_PFP_SIZE: u64 = 8 * 1024 * 1024; // 8 MiB; TODO: might lower, high for prototyping pub const MAX_PFP_SIZE: u64 = 8 * 1024 * 1024; // 8 MiB; TODO: might lower, high for prototyping
/// Default user image to use if users have none /// Default user image to use if users have none
pub const DEFAULT_USER_PFP: &[u8] = include_bytes!("../assets/default-pfp.png"); pub const DEFAULT_USER_PFP: FileAsset = include_asset!("assets/default-pfp.png");
pub const DEFAULT_USER_PFP_MIME: &str = "image/png; charset=binary";
/// Basically [`USER_CACHES_HEADER`] but much longer for the [`DEFAULT_USER_PFP`] /// Basically [`USER_CACHES_HEADER`] but much longer for the [`DEFAULT_USER_PFP`]
pub const DEFAULT_USER_PFP_CACHES_HEADER: &str = pub const DEFAULT_USER_PFP_CACHES_HEADER: &str =
crate::utils::web::make_static_cache_header!(Duration::from_hours(2), Duration::from_days(1)); crate::utils::web::make_static_cache_header!(Duration::from_hours(2), Duration::from_days(1));

View File

@@ -1,6 +1,6 @@
//! Scope for the image get backend. //! Scope for the image get backend.
//! - `/`: Gives the default image. //! - `/default`: Gives the default image.
//! - `/{username}`: Gives username's pfp or redirects to the default image's path (for better //! - `/user/{username}`: Gives username's pfp or redirects to the default image's path (for better
//! cache control) if there's no image. //! cache control) if there's no image.
//! //!
//! Must be scoped at [`ws::IMAGES`] //! Must be scoped at [`ws::IMAGES`]
@@ -15,7 +15,7 @@ use actix_web::{
use crate::{ use crate::{
consts::{self, web_scopes as ws}, consts::{self, web_scopes as ws},
server::{self, AppData}, server::AppData,
}; };
#[must_use] #[must_use]
@@ -25,21 +25,18 @@ pub fn make_scope(path: &str) -> actix_web::Scope {
.service(get_image) .service(get_image)
} }
#[get("/")] #[get("/default")]
async fn get_default_image( async fn get_default_image() -> HttpResponse {
data: AppData,
_username: web::Path<String>,
) -> HttpResponse {
HttpResponse::Ok() HttpResponse::Ok()
.insert_header(( .insert_header((
header::CACHE_CONTROL, header::CACHE_CONTROL,
consts::DEFAULT_USER_PFP_CACHES_HEADER, consts::DEFAULT_USER_PFP_CACHES_HEADER,
)) ))
.content_type(consts::DEFAULT_USER_PFP_MIME) .content_type(consts::DEFAULT_USER_PFP.mime)
.body(web::Bytes::from_static(consts::DEFAULT_USER_PFP)) .body(web::Bytes::from_static(consts::DEFAULT_USER_PFP.bytes))
} }
#[get("/{username}")] #[get("/user/{username}")]
async fn get_image( async fn get_image(
data: AppData, data: AppData,
username: web::Path<String>, username: web::Path<String>,
@@ -47,7 +44,11 @@ async fn get_image(
let cached_pfp = data.cache.get_pfp(username.to_string()).await; let cached_pfp = data.cache.get_pfp(username.to_string()).await;
cached_pfp.as_ref().map_or_else( cached_pfp.as_ref().map_or_else(
|| web::Either::Left(web::Redirect::to(ws::IMAGES).temporary()), || {
web::Either::Left(
web::Redirect::to(const_str::concat!(ws::IMAGES, "/default")).temporary(),
)
},
|img| { |img| {
web::Either::Right( web::Either::Right(
HttpResponse::Ok() HttpResponse::Ok()