From 98a98a9e384542414a736c9652457b960fe4940c Mon Sep 17 00:00:00 2001 From: mbround18 Date: Thu, 7 Aug 2025 16:11:13 -0700 Subject: [PATCH 1/2] remove lock --- packages/actix-backend/src/main.rs | 5 - packages/actix-backend/src/maps/mod.rs | 2 +- packages/actix-backend/src/maps/rebuild.rs | 320 +-------------------- 3 files changed, 16 insertions(+), 311 deletions(-) diff --git a/packages/actix-backend/src/main.rs b/packages/actix-backend/src/main.rs index c6c4811..99a4c29 100644 --- a/packages/actix-backend/src/main.rs +++ b/packages/actix-backend/src/main.rs @@ -109,11 +109,6 @@ async fn main() -> std::io::Result<()> { .route(web::post().to(maps::maps_rebuild)), ) .route("/rebuild/status", web::get().to(maps::rebuild_status)) - .service( - web::resource("/rebuild/clear") - .wrap(hooks::admin_auth::AdminAuth) - .route(web::delete().to(maps::clear_rebuild_lock)), - ) .route("/download/{id}", web::get().to(maps::download_map)) .route("/tiled/{id}", web::get().to(maps::tiled_map)) .route("/content/{id}", web::get().to(maps::map_content)), diff --git a/packages/actix-backend/src/maps/mod.rs b/packages/actix-backend/src/maps/mod.rs index ece650d..65b14d6 100644 --- a/packages/actix-backend/src/maps/mod.rs +++ b/packages/actix-backend/src/maps/mod.rs @@ -10,5 +10,5 @@ pub use all::maps_all; pub use content::map_content; pub use detail::map_detail; pub use download::download_map; -pub use rebuild::{clear_rebuild_lock, maps_rebuild, rebuild_maps_init, rebuild_status}; +pub use rebuild::{maps_rebuild, rebuild_maps_init, rebuild_status}; pub use tiled::tiled_map; diff --git a/packages/actix-backend/src/maps/rebuild.rs b/packages/actix-backend/src/maps/rebuild.rs index 26944c6..3271a2f 100644 --- a/packages/actix-backend/src/maps/rebuild.rs +++ b/packages/actix-backend/src/maps/rebuild.rs @@ -1,14 +1,8 @@ use actix_web::{HttpResponse, error::ErrorInternalServerError}; -use serde::{Deserialize, Serialize}; -use std::env; -use std::{ - fs::{File, OpenOptions}, - io::{Read, Write}, - path::{Path, PathBuf}, - time::Instant, -}; +use std::{env, path::Path}; +use std::{path::PathBuf, time::Instant}; use tokio::task; -use tracing::{debug, error, info, instrument, warn}; +use tracing::{debug, error, info, instrument}; use crate::utils::folders::thumbnails_dir; use crate::utils::repo::{get_sha, update_repo}; @@ -21,111 +15,6 @@ use shared::utils::root_dir::{maps_dir, root_dir}; const TASK_BATCH_SIZE: usize = 10; -#[derive(Serialize, Deserialize)] -#[serde(tag = "status", rename_all = "snake_case")] -enum BuildLock { - Processing { - processed: usize, - total: usize, - sha: String, - }, - Complete { - maps: usize, - sha: String, - }, -} - -fn lock_path() -> PathBuf { - thumbnails_dir().unwrap().join(".map_rebuild_lock.json") -} - -/// Atomically create lock (fails if exists) -fn try_acquire_lock(path: &Path) -> std::io::Result { - // Create parent directory if it doesn't exist - if let Some(parent) = path.parent() { - std::fs::create_dir_all(parent)?; - } - OpenOptions::new().write(true).create_new(true).open(path) -} - -/// Read current lock state -fn read_lock(path: &Path) -> Option { - let mut file = File::open(path).ok()?; - let mut buf = String::new(); - file.read_to_string(&mut buf).ok()?; - drop(file); // Explicit file handle cleanup - serde_json::from_str(&buf).ok() -} - -/// Atomically overwrite lock file -fn write_lock(path: &Path, data: &BuildLock) -> std::io::Result<()> { - // Create parent directory if it doesn't exist - if let Some(parent) = path.parent() { - std::fs::create_dir_all(parent)?; - } - - let tmp = path.with_extension("lock.tmp"); - let mut f = OpenOptions::new() - .write(true) - .create(true) - .truncate(true) - .open(&tmp)?; - write!(f, "{}", serde_json::to_string(data).unwrap())?; - std::fs::rename(tmp, path)?; - Ok(()) -} - -/// Remove lock file -fn remove_lock(path: &Path) -> std::io::Result<()> { - if path.exists() { - std::fs::remove_file(path)?; - info!("๐Ÿงน Removed stale lock file: {}", path.display()); - } - Ok(()) -} - -/// Check if lock is stale (from previous container run) -fn is_lock_stale(_lock_data: &BuildLock) -> bool { - // For container environments, we can consider any existing lock as potentially stale - // since containers don't persist process state across restarts - if env::var("CONTAINER").is_ok() || env::var("DOCKER_CONTAINER").is_ok() { - warn!("๐Ÿณ Container environment detected - treating existing lock as potentially stale"); - return true; - } - - // Additional heuristics could be added here: - // - Check if the lock is older than X minutes - // - Check if the process that created it is still running - false -} - -/// Get container uptime information -fn get_container_info() -> String { - // Check container uptime via /proc/1/stat if available - if let Ok(stat) = std::fs::read_to_string("/proc/1/stat") { - if let Some(start_time) = stat.split_whitespace().nth(21) { - let boot_time_result = std::fs::read_to_string("/proc/stat") - .unwrap_or_default() - .lines() - .find(|line| line.starts_with("btime")) - .and_then(|line| line.split_whitespace().nth(1)) - .and_then(|t| t.parse::().ok()); - - if let (Ok(start), Some(_boot_time)) = (start_time.parse::(), boot_time_result) { - let uptime_seconds = start / 100; // Convert from jiffies to seconds (assuming 100 Hz) - return format!("Container uptime: ~{uptime_seconds} seconds"); - } - } - } - - // Fallback: check container environment variables - if env::var("CONTAINER").is_ok() || env::var("DOCKER_CONTAINER").is_ok() { - "Running in container environment".to_string() - } else { - "Not in container".to_string() - } -} - // find all .dd2vtt files #[instrument(level = "debug")] fn find_dd2vtt_paths() -> Result, Box> { @@ -223,38 +112,6 @@ pub async fn rebuild_maps_core() -> Result { - if is_lock_stale(&existing_lock) { - warn!( - "๐Ÿงน Detected stale lock from previous run ({}/{} processed) - removing", - processed, total - ); - if let Err(e) = remove_lock(&lockfile) { - error!("โŒ Failed to remove stale lock: {}", e); - return Err("Failed to clean up stale lock".into()); - } - } else { - warn!( - "โš ๏ธ Rebuild already in progress: {}/{} maps processed", - processed, total - ); - return Err("Rebuild already in progress".into()); - } - } - BuildLock::Complete { maps, .. } => { - info!("โœ… Previous rebuild completed successfully ({} maps)", maps); - } - } - } - let base = maps_dir()?; std::fs::create_dir_all(&base)?; @@ -265,22 +122,6 @@ pub async fn rebuild_maps_core() -> Result Result Result Result Result Result Result> { - let lockfile = lock_path(); - info!("๐Ÿ” Container info: {}", get_container_info()); - - // During initialization, we should clear any existing locks as they are likely stale - if let Some(existing_lock) = read_lock(&lockfile) { - match &existing_lock { - BuildLock::Processing { - processed, total, .. - } => { - warn!( - "๐Ÿงน Detected lock from previous run during initialization ({}/{} processed) - clearing", - processed, total - ); - if let Err(e) = remove_lock(&lockfile) { - error!( - "โŒ Failed to remove stale lock during initialization: {}", - e - ); - return Err("Failed to clean up stale lock during initialization".into()); - } - } - BuildLock::Complete { maps, .. } => { - info!( - "โœ… Previous rebuild completed successfully ({} maps) - clearing for fresh start", - maps - ); - if let Err(e) = remove_lock(&lockfile) { - error!( - "โŒ Failed to remove completed lock during initialization: {}", - e - ); - return Err("Failed to clean up completed lock during initialization".into()); - } - } - } - } - - // Now proceed with normal rebuild + info!("๏ฟฝ Initializing map rebuild process"); rebuild_maps_core().await } @@ -446,47 +241,10 @@ pub async fn rebuild_maps_init() -> Result Result { info!("๐ŸŒ Map rebuild requested via HTTP endpoint"); - let lockfile = lock_path(); - info!("๐Ÿ” Container info: {}", get_container_info()); - - // Check for existing lock and handle stale locks - if let Some(existing_lock) = read_lock(&lockfile) { - match &existing_lock { - BuildLock::Processing { - processed, total, .. - } => { - if is_lock_stale(&existing_lock) { - warn!( - "๐Ÿงน Detected stale lock from previous run ({}/{} processed) - removing", - processed, total - ); - if let Err(e) = remove_lock(&lockfile) { - error!("โŒ Failed to remove stale lock: {}", e); - return Ok(HttpResponse::InternalServerError().json(serde_json::json!({ - "error": "Failed to clean up stale lock" - }))); - } - } else { - info!( - "๐Ÿ“Š Rebuild in progress: {}/{} maps processed", - processed, total - ); - return Ok(HttpResponse::Ok().json(serde_json::json!({ - "status":"processing","processed":processed,"total":total - }))); - } - } - BuildLock::Complete { maps, .. } => { - info!("โœ… Previous rebuild completed successfully ({} maps)", maps); - } - } - } - // Start rebuild in background actix_web::rt::spawn(async move { if let Err(e) = rebuild_maps_core().await { error!("โŒ Background rebuild failed: {:?}", e); - let _ = std::fs::remove_file(&lockfile); } }); @@ -498,62 +256,14 @@ pub async fn maps_rebuild() -> Result { info!("๐Ÿš€ Background rebuild started for {} maps", total); Ok(HttpResponse::Accepted().json(serde_json::json!({ - "status":"processing","processed":0,"total":total + "status":"processing","total":total }))) } /// Rebuild status handler pub async fn rebuild_status() -> Result { - let lockfile = lock_path(); - let container_info = get_container_info(); - - if let Some(lock_data) = read_lock(&lockfile) { - match lock_data { - BuildLock::Processing { - processed, - total, - sha, - } => Ok(HttpResponse::Ok().json(serde_json::json!({ - "status": "processing", - "processed": processed, - "total": total, - "sha": sha, - "container_info": container_info, - "progress_percentage": if total > 0 { (processed * 100) / total } else { 0 } - }))), - BuildLock::Complete { maps, sha } => Ok(HttpResponse::Ok().json(serde_json::json!({ - "status": "complete", - "maps": maps, - "sha": sha, - "container_info": container_info - }))), - } - } else { - Ok(HttpResponse::Ok().json(serde_json::json!({ - "status": "idle", - "container_info": container_info - }))) - } -} - -/// Clear rebuild lock handler (admin-only) -pub async fn clear_rebuild_lock() -> Result { - let lockfile = lock_path(); - - info!("๐Ÿ” Admin requested rebuild lock clear via API"); - - match remove_lock(&lockfile) { - Ok(()) => { - info!("๐Ÿงน Lock file cleared successfully by admin"); - Ok(HttpResponse::Ok().json(serde_json::json!({ - "message": "Lock file cleared successfully" - }))) - } - Err(e) => { - error!("โŒ Failed to clear lock file: {}", e); - Ok(HttpResponse::InternalServerError().json(serde_json::json!({ - "error": format!("Failed to clear lock file: {}", e) - }))) - } - } + Ok(HttpResponse::Ok().json(serde_json::json!({ + "status": "no_lock_system", + "message": "Lock system has been removed - rebuild status not available" + }))) } From 307d3947a7b60587a412dd0aa7c4d4c07dba200f Mon Sep 17 00:00:00 2001 From: mbround18 Date: Sat, 16 Aug 2025 13:40:32 -0700 Subject: [PATCH 2/2] 2.1 release --- Cargo.lock | 375 +++++++++++------- docker-compose.yml | 2 +- packages/actix-backend/Cargo.toml | 17 +- packages/actix-backend/src/main.rs | 10 +- packages/actix-backend/src/maps/mod.rs | 2 +- .../actix-backend/src/utils/admin_token.rs | 4 +- .../src/wrappers/seo/inject_seo_metadata.rs | 27 +- packages/shared/Cargo.toml | 4 +- packages/yew-frontend/Cargo.toml | 4 +- 9 files changed, 255 insertions(+), 190 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index d633c12..1176135 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -18,11 +18,12 @@ dependencies = [ "futures-util", "git2", "glob", - "html5ever", + "html5ever 0.35.0", "kuchikiki", + "markup5ever 0.35.0", "meilisearch-sdk", "pulldown-cmark", - "rand 0.8.5", + "rand 0.9.2", "serde", "serde_json", "shared", @@ -38,7 +39,7 @@ version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5f7b0a21988c1bf877cf4759ef5ddaac04c1c9fe808c9142ecb78ba97d97a28a" dependencies = [ - "bitflags 2.9.1", + "bitflags 2.9.2", "bytes", "futures-core", "futures-sink", @@ -74,7 +75,7 @@ dependencies = [ "actix-service", "actix-utils", "actix-web", - "bitflags 2.9.1", + "bitflags 2.9.2", "bytes", "derive_more 0.99.20", "futures-core", @@ -98,7 +99,7 @@ dependencies = [ "actix-service", "actix-utils", "base64 0.22.1", - "bitflags 2.9.1", + "bitflags 2.9.2", "brotli", "bytes", "bytestring", @@ -107,7 +108,7 @@ dependencies = [ "flate2", "foldhash", "futures-core", - "h2 0.3.26", + "h2 0.3.27", "http 0.2.12", "httparse", "httpdate", @@ -117,7 +118,7 @@ dependencies = [ "mime", "percent-encoding", "pin-project-lite", - "rand 0.9.1", + "rand 0.9.2", "sha1", "smallvec", "tokio", @@ -149,7 +150,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e01ed3140b2f8d422c68afa1ed2e85d996ea619c988ac834d255db32138655cb" dependencies = [ "quote", - "syn 2.0.104", + "syn 2.0.106", ] [[package]] @@ -189,7 +190,7 @@ dependencies = [ "futures-core", "futures-util", "mio", - "socket2", + "socket2 0.5.10", "tokio", "tracing", ] @@ -268,7 +269,7 @@ dependencies = [ "serde_json", "serde_urlencoded", "smallvec", - "socket2", + "socket2 0.5.10", "time", "tracing", "url", @@ -283,7 +284,7 @@ dependencies = [ "actix-router", "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", ] [[package]] @@ -371,9 +372,9 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.98" +version = "1.0.99" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e16d2d3311acee920a9eb8d33b8cbc1787ce4a264e85f964c2404b969bdcd487" +checksum = "b0674a1ddeecb70197781e945de4b3b8ffb61fa939a5597bcf48503737663100" [[package]] name = "anymap2" @@ -383,9 +384,9 @@ checksum = "d301b3b94cb4b2f23d7917810addbbaff90738e0ca2be692bd027e70d7e0330c" [[package]] name = "arbitrary" -version = "1.4.1" +version = "1.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dde20b3d026af13f561bdd0f15edf01fc734f0dafcedbaf42bba506a9517f223" +checksum = "c3d036a3c4ab069c7b410a2ce876bd74808d2d0888a82667669f8e783a898bf1" [[package]] name = "arg_enum_proc_macro" @@ -395,7 +396,7 @@ checksum = "0ae92a5119aa49cdbcf6b9f893fe4e1d98b04ccbf82ee0584ad948a44a734dea" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", ] [[package]] @@ -406,13 +407,13 @@ checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" [[package]] name = "async-trait" -version = "0.1.88" +version = "0.1.89" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e539d3fca749fcee5236ab05e93a52867dd549cc157c8cb7f99595f3cedffdb5" +checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", ] [[package]] @@ -443,9 +444,9 @@ dependencies = [ [[package]] name = "avif-serialize" -version = "0.8.4" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19135c0c7a60bfee564dbe44ab5ce0557c6bf3884e5291a50be76a15640c4fbd" +checksum = "47c8fbc0f831f4519fe8b810b6a7a91410ec83031b8233f730a0480029f6a23f" dependencies = [ "arrayvec", ] @@ -500,9 +501,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.9.1" +version = "2.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b8e56985ec62d17e9c1001dc89c88ecd7dc08e47eba5ec7c29c7b5eeecde967" +checksum = "6a65b545ab31d687cff52899d4890855fec459eb6afe0da6417b8a18da87aa29" [[package]] name = "bitstream-io" @@ -527,9 +528,9 @@ checksum = "cfa8873f51c92e232f9bac4065cddef41b714152812bfc5f7672ba16d6ef8cd9" [[package]] name = "brotli" -version = "8.0.1" +version = "8.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9991eea70ea4f293524138648e41ee89b0b2b12ddef3b255effa43c8056e0e0d" +checksum = "4bd8b9603c7aa97359dbd97ecf258968c95f3adddd6db2f7e7a5bef101c84560" dependencies = [ "alloc-no-stdlib", "alloc-stdlib", @@ -560,9 +561,9 @@ checksum = "46c5e41b57b8bba42a04676d81cb89e9ee8e859a1a66f80a5a72e1cb76b34d43" [[package]] name = "bytemuck" -version = "1.23.1" +version = "1.23.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c76a5792e44e4abe34d3abf15636779261d45a7450612059293d1d2cfc63422" +checksum = "3995eaeebcdf32f91f980d360f78732ddc061097ab4e39991ae7a6ace9194677" [[package]] name = "byteorder" @@ -593,9 +594,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.2.27" +version = "1.2.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d487aa071b5f64da6f19a3e848e3578944b726ee5a4854b82172f02aa876bfdc" +checksum = "3ee0f8803222ba5a7e2777dd72ca451868909b1ac410621b676adf07280e9b5f" dependencies = [ "jobserver", "libc", @@ -694,9 +695,9 @@ dependencies = [ [[package]] name = "crc32fast" -version = "1.4.2" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3" +checksum = "9481c1c90cbf2ac953f07c8d4a58aa3945c425b7185c9154d67a65e4230da511" dependencies = [ "cfg-if", ] @@ -767,7 +768,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "13b588ba4ac1a99f7f2964d24b3d896ddc6bf847ee3855dbd4366f058cfcd331" dependencies = [ "quote", - "syn 2.0.104", + "syn 2.0.106", ] [[package]] @@ -799,7 +800,7 @@ dependencies = [ "proc-macro2", "quote", "rustc_version", - "syn 2.0.104", + "syn 2.0.106", ] [[package]] @@ -828,7 +829,7 @@ checksum = "cb7330aeadfbe296029522e6c40f315320aba36fc43a5b3632f3795348f3bd22" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", "unicode-xid", ] @@ -840,7 +841,7 @@ checksum = "bda628edc44c4bb645fbe0f758797143e4e07926f7ebf4e9bdfbd3d2ce621df3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", "unicode-xid", ] @@ -863,7 +864,7 @@ checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", ] [[package]] @@ -916,7 +917,7 @@ checksum = "44f23cf4b44bfce11a86ace86f8a73ffdec849c9fd00a386a53d278bd9e81fb3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", ] [[package]] @@ -1046,7 +1047,7 @@ checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", ] [[package]] @@ -1177,7 +1178,7 @@ version = "0.20.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2deb07a133b1520dc1a5690e9bd08950108873d7ed5de38dcc74d3b5ebffa110" dependencies = [ - "bitflags 2.9.1", + "bitflags 2.9.2", "libc", "libgit2-sys", "log", @@ -1188,9 +1189,9 @@ dependencies = [ [[package]] name = "glob" -version = "0.3.2" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8d1add55171497b4705a648c6b583acafb01d58050a51727785f0b2c8e0a2b2" +checksum = "0cc23270f6e1808e30a928bdc84dea0b9b4136a8bc82338574f23baf47bbd280" [[package]] name = "gloo" @@ -1619,14 +1620,14 @@ dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", ] [[package]] name = "h2" -version = "0.3.26" +version = "0.3.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81fe527a889e1532da5c525686d96d4c2e74cdd345badf8dfef9f6b39dd5f5e8" +checksum = "0beca50380b1fc32983fc1cb4587bfa4bb9e78fc259aad4a0032d2080309222d" dependencies = [ "bytes", "fnv", @@ -1643,9 +1644,9 @@ dependencies = [ [[package]] name = "h2" -version = "0.4.10" +version = "0.4.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9421a676d1b147b16b82c9225157dc629087ef8ec4d5e2960f9437a90dac0a5" +checksum = "f3c0b69cfcb4e1b9f1bf2f53f95f766e4661169728ec61cd3fe5a0166f2d1386" dependencies = [ "atomic-waker", "bytes", @@ -1672,9 +1673,9 @@ dependencies = [ [[package]] name = "hashbrown" -version = "0.15.4" +version = "0.15.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5971ac85611da7067dbfcabef3c70ebb5606018acd9e2a3903a0da507521e0d5" +checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" [[package]] name = "heck" @@ -1714,8 +1715,19 @@ checksum = "3b7410cae13cbc75623c98ac4cbfd1f0bedddf3227afc24f370cf0f50a44a11c" dependencies = [ "log", "mac", - "markup5ever", - "match_token", + "markup5ever 0.14.1", + "match_token 0.1.0", +] + +[[package]] +name = "html5ever" +version = "0.35.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55d958c2f74b664487a2035fe1dadb032c48718a03b63f3ab0b8537db8549ed4" +dependencies = [ + "log", + "markup5ever 0.35.0", + "match_token 0.35.0", ] [[package]] @@ -1790,7 +1802,7 @@ dependencies = [ "bytes", "futures-channel", "futures-util", - "h2 0.4.10", + "h2 0.4.12", "http 1.3.1", "http-body", "httparse", @@ -1820,9 +1832,9 @@ dependencies = [ [[package]] name = "hyper-util" -version = "0.1.14" +version = "0.1.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc2fdfdbff08affe55bb779f33b053aa1fe5dd5b54c257343c17edfa55711bdb" +checksum = "8d9b05277c7e8da2c93a568989bb6207bef0112e8d17df7a6eda4a3cf143bc5e" dependencies = [ "base64 0.22.1", "bytes", @@ -1836,7 +1848,7 @@ dependencies = [ "libc", "percent-encoding", "pin-project-lite", - "socket2", + "socket2 0.6.0", "tokio", "tower-service", "tracing", @@ -2011,14 +2023,14 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "699c1b6d335e63d0ba5c1e1c7f647371ce989c3bcbe1f7ed2b85fa56e3bd1a21" dependencies = [ "quote", - "syn 2.0.104", + "syn 2.0.106", ] [[package]] name = "indexmap" -version = "2.9.0" +version = "2.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cea70ddb795996207ad57735b50c5982d8844f38ba9ee5f1aedcfb708a2aa11e" +checksum = "fe4cd85333e22411419a0bcae1297d25e58c9443848b11dc6a86fefe8c78a661" dependencies = [ "equivalent", "hashbrown", @@ -2041,7 +2053,18 @@ checksum = "c34819042dc3d3971c46c2190835914dfbe0c3c13f61449b2997f4e9722dfa60" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", +] + +[[package]] +name = "io-uring" +version = "0.7.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d93587f37623a1a17d94ef2bc9ada592f5465fe7732084ab7beefabe5c77c0c4" +dependencies = [ + "bitflags 2.9.2", + "cfg-if", + "libc", ] [[package]] @@ -2130,7 +2153,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "02cb977175687f33fa4afa0c95c112b987ea1443e5a51c8f8ff27dc618270cc2" dependencies = [ "cssparser", - "html5ever", + "html5ever 0.29.1", "indexmap", "selectors", ] @@ -2155,15 +2178,15 @@ checksum = "03087c2bad5e1034e8cace5926dec053fb3790248370865f5117a7d0213354c8" [[package]] name = "libc" -version = "0.2.174" +version = "0.2.175" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1171693293099992e19cddea4e8b849964e9846f4acee11b3948bcc337be8776" +checksum = "6a82ae493e598baaea5209805c49bbf2ea7de956d50d7da0da1164f9c6d28543" [[package]] name = "libfuzzer-sys" -version = "0.4.9" +version = "0.4.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf78f52d400cf2d84a3a973a78a592b4adc535739e0a5597a0da6f0c357adc75" +checksum = "5037190e1f70cbeef565bd267599242926f724d3b8a9f510fd7e0b540cfa4404" dependencies = [ "arbitrary", "cc", @@ -2283,6 +2306,17 @@ dependencies = [ "tendril", ] +[[package]] +name = "markup5ever" +version = "0.35.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "311fe69c934650f8f19652b3946075f0fc41ad8757dbb68f1ca14e7900ecc1c3" +dependencies = [ + "log", + "tendril", + "web_atoms", +] + [[package]] name = "match_token" version = "0.1.0" @@ -2291,7 +2325,18 @@ checksum = "88a9689d8d44bf9964484516275f5cd4c9b59457a6940c1d5d0ecbb94510a36b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", +] + +[[package]] +name = "match_token" +version = "0.35.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac84fd3f360fcc43dc5f5d186f02a94192761a080e8bc58621ad4d12296a58cf" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.106", ] [[package]] @@ -2329,7 +2374,7 @@ dependencies = [ "proc-macro2", "quote", "structmeta", - "syn 2.0.104", + "syn 2.0.106", ] [[package]] @@ -2351,7 +2396,7 @@ dependencies = [ "reqwest", "serde", "serde_json", - "thiserror 2.0.12", + "thiserror 2.0.15", "time", "uuid", "wasm-bindgen-futures", @@ -2486,7 +2531,7 @@ checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", ] [[package]] @@ -2745,7 +2790,7 @@ checksum = "6e918e4ff8c4549eb882f14b3a4bc8c8bc93de829416eacf579f1207a8fbf861" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", ] [[package]] @@ -2834,12 +2879,12 @@ checksum = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c" [[package]] name = "prettyplease" -version = "0.2.35" +version = "0.2.36" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "061c1221631e079b26479d25bbf2275bfe5917ae8419cd7e34f13bfc2aa7539a" +checksum = "ff24dfcda44452b9816fff4cd4227e1bb73ff5a2f1bc1105aa92fb8565ce44d2" dependencies = [ "proc-macro2", - "syn 2.0.104", + "syn 2.0.106", ] [[package]] @@ -2884,9 +2929,9 @@ checksum = "dc375e1527247fe1a97d8b7156678dfe7c1af2fc075c9a4db3690ecd2a148068" [[package]] name = "proc-macro2" -version = "1.0.95" +version = "1.0.101" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02b3e5e68a3a1a02aad3ec490a98007cbc13c37cbe84a3cd7b8e406d76e7f778" +checksum = "89ae43fd86e4158d6db51ad8e2b80f313af9cc74f5c0e03ccb87de09998732de" dependencies = [ "unicode-ident", ] @@ -2907,7 +2952,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "52717f9a02b6965224f95ca2a81e2e0c5c43baacd28ca057577988930b6c3d5b" dependencies = [ "quote", - "syn 2.0.104", + "syn 2.0.106", ] [[package]] @@ -2933,7 +2978,7 @@ version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1e8bbe1a966bd2f362681a44f6edce3c2310ac21e4d5067a6e7ec396297a6ea0" dependencies = [ - "bitflags 2.9.1", + "bitflags 2.9.2", "getopts", "memchr", "pulldown-cmark-escape", @@ -2974,8 +3019,8 @@ dependencies = [ "quinn-udp", "rustc-hash", "rustls", - "socket2", - "thiserror 2.0.12", + "socket2 0.5.10", + "thiserror 2.0.15", "tokio", "tracing", "web-time", @@ -2990,13 +3035,13 @@ dependencies = [ "bytes", "getrandom 0.3.3", "lru-slab", - "rand 0.9.1", + "rand 0.9.2", "ring", "rustc-hash", "rustls", "rustls-pki-types", "slab", - "thiserror 2.0.12", + "thiserror 2.0.15", "tinyvec", "tracing", "web-time", @@ -3011,7 +3056,7 @@ dependencies = [ "cfg_aliases", "libc", "once_cell", - "socket2", + "socket2 0.5.10", "tracing", "windows-sys 0.59.0", ] @@ -3058,9 +3103,9 @@ dependencies = [ [[package]] name = "rand" -version = "0.9.1" +version = "0.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fbfd9d094a40bf3ae768db9361049ace4c0e04a4fd6b359518bd7b73a73dd97" +checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1" dependencies = [ "rand_chacha 0.9.0", "rand_core 0.9.3", @@ -3193,9 +3238,9 @@ dependencies = [ [[package]] name = "rayon" -version = "1.10.0" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b418a60154510ca1a002a752ca9714984e21e4241e804d32555251faf8b78ffa" +checksum = "368f01d005bf8fd9b1206fb6fa653e6c4a81ceb1466406b81792d87c5677a58f" dependencies = [ "either", "rayon-core", @@ -3203,9 +3248,9 @@ dependencies = [ [[package]] name = "rayon-core" -version = "1.12.1" +version = "1.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1465873a3dfdaa8ae7cb14b4383657caab0b3e8a0aa9ae8e04b044854c8dfce2" +checksum = "22e18b0f0062d30d4230b2e85ff77fdfe4326feb054b9783a3460d8435c8ab91" dependencies = [ "crossbeam-deque", "crossbeam-utils", @@ -3213,11 +3258,11 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.5.13" +version = "0.5.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d04b7d0ee6b4a0207a0a7adb104d23ecb0b47d6beae7152d0fa34b692b29fd6" +checksum = "5407465600fb0548f1442edf71dd20683c6ed326200ace4b1ef0763521bb3b77" dependencies = [ - "bitflags 2.9.1", + "bitflags 2.9.2", ] [[package]] @@ -3272,15 +3317,15 @@ checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" [[package]] name = "reqwest" -version = "0.12.22" +version = "0.12.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cbc931937e6ca3a06e3b6c0aa7841849b160a90351d6ab467a8b9b9959767531" +checksum = "d429f34c8092b2d42c7c93cec323bb4adeb7c67698f70839adec842ec10c7ceb" dependencies = [ "base64 0.22.1", "bytes", "futures-core", "futures-util", - "h2 0.4.10", + "h2 0.4.12", "http 1.3.1", "http-body", "http-body-util", @@ -3314,9 +3359,9 @@ dependencies = [ [[package]] name = "rgb" -version = "0.8.50" +version = "0.8.52" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57397d16646700483b67d2dd6511d79318f9d057fdbd21a4066aeac8b41d310a" +checksum = "0c6a884d2998352bb4daf0183589aec883f16a6da1f4dde84d8e2e9a5409a1ce" [[package]] name = "ring" @@ -3340,9 +3385,9 @@ checksum = "afab94fb28594581f62d981211a9a4d53cc8130bbcbbb89a0440d9b8e81a7746" [[package]] name = "rustc-demangle" -version = "0.1.25" +version = "0.1.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "989e6739f80c4ad5b13e0fd7fe89531180375b18520cc8c82080e4dc4035b84f" +checksum = "56f7d92ca342cea22a06f2121d944b4fd82af56988c270852495420f961d4ace" [[package]] name = "rustc-hash" @@ -3361,9 +3406,9 @@ dependencies = [ [[package]] name = "rustls" -version = "0.23.28" +version = "0.23.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7160e3e10bf4535308537f3c4e1641468cd0e485175d6163087c0393c7d46643" +checksum = "c0ebcbd2f03de0fc1122ad9bb24b127a5a6cd51d72604a3f3c50ac459762b6cc" dependencies = [ "once_cell", "ring", @@ -3385,9 +3430,9 @@ dependencies = [ [[package]] name = "rustls-webpki" -version = "0.103.3" +version = "0.103.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e4a72fe2bcf7a6ac6fd7d0b9e5cb68aeb7d4c0a0271730218b3e92d43b4eb435" +checksum = "0a17884ae0c1b773f1ccd2bd4a8c72f16da897310a98b0e84bf349ad5ead92fc" dependencies = [ "ring", "rustls-pki-types", @@ -3396,9 +3441,9 @@ dependencies = [ [[package]] name = "rustversion" -version = "1.0.21" +version = "1.0.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a0d197bd2c9dc6e53b84da9556a69ba4cdfab8619eb41a8bd1cc2027a0f6b1d" +checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" [[package]] name = "ryu" @@ -3475,14 +3520,14 @@ checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", ] [[package]] name = "serde_json" -version = "1.0.140" +version = "1.0.142" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "20068b6e96dc6c9bd23e01df8827e6c7e1f2fddd43c21810382803c136b99373" +checksum = "030fedb782600dcbd6f02d479bf0d817ac3bb40d644745b769d6a96bc3afc5a7" dependencies = [ "itoa", "memchr", @@ -3561,7 +3606,7 @@ dependencies = [ "serde", "serde_json", "sha2", - "thiserror 2.0.12", + "thiserror 2.0.15", ] [[package]] @@ -3572,9 +3617,9 @@ checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" [[package]] name = "signal-hook-registry" -version = "1.4.5" +version = "1.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9203b8055f63a2a00e2f593bb0510367fe707d7ff1e5c872de2f537b339e5410" +checksum = "b2a4719bff48cee6b39d12c020eeb490953ad2443b7055bd0b21fca26bd8c28b" dependencies = [ "libc", ] @@ -3608,9 +3653,9 @@ checksum = "56199f7ddabf13fe5074ce809e7d3f42b42ae711800501b5b16ea82ad029c39d" [[package]] name = "slab" -version = "0.4.10" +version = "0.4.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04dc19736151f35336d325007ac991178d504a119863a2fcb3758cdb5e52c50d" +checksum = "7a2ae44ef20feb57a68b23d846850f861394c2e02dc425a50098ae8c90267589" [[package]] name = "smallvec" @@ -3628,6 +3673,16 @@ dependencies = [ "windows-sys 0.52.0", ] +[[package]] +name = "socket2" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "233504af464074f9d066d7b5416c5f9b894a5862a6506e306f7b816cdd6f1807" +dependencies = [ + "libc", + "windows-sys 0.59.0", +] + [[package]] name = "stable_deref_trait" version = "1.2.0" @@ -3668,7 +3723,7 @@ dependencies = [ "proc-macro2", "quote", "structmeta-derive", - "syn 2.0.104", + "syn 2.0.106", ] [[package]] @@ -3679,7 +3734,7 @@ checksum = "152a0b65a590ff6c3da95cabe2353ee04e6167c896b28e3b14478c2636c922fc" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", ] [[package]] @@ -3701,9 +3756,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.104" +version = "2.0.106" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17b6f705963418cdb9927482fa304bc562ece2fdd4f616084c50b7023b435a40" +checksum = "ede7c438028d4436d71104916910f5bb611972c5cfd7f89b8300a8186e6fada6" dependencies = [ "proc-macro2", "quote", @@ -3727,7 +3782,7 @@ checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", ] [[package]] @@ -3771,11 +3826,11 @@ dependencies = [ [[package]] name = "thiserror" -version = "2.0.12" +version = "2.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "567b8a2dae586314f7be2a752ec7474332959c6460e02bde30d702a66d488708" +checksum = "80d76d3f064b981389ecb4b6b7f45a0bf9fdac1d5b9204c7bd6714fecc302850" dependencies = [ - "thiserror-impl 2.0.12", + "thiserror-impl 2.0.15", ] [[package]] @@ -3786,18 +3841,18 @@ checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", ] [[package]] name = "thiserror-impl" -version = "2.0.12" +version = "2.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f7cf42b4507d8ea322120659672cf1b9dbb93f8f2d4ecfd6e51350ff5b17a1d" +checksum = "44d29feb33e986b6ea906bd9c3559a856983f92371b3eaa5e83782a351623de0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", ] [[package]] @@ -3878,20 +3933,22 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.45.1" +version = "1.47.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75ef51a33ef1da925cea3e4eb122833cb377c61439ca401b770f54902b806779" +checksum = "89e49afdadebb872d3145a5638b59eb0691ea23e46ca484037cfab3b76b95038" dependencies = [ "backtrace", "bytes", + "io-uring", "libc", "mio", "parking_lot", "pin-project-lite", "signal-hook-registry", - "socket2", + "slab", + "socket2 0.6.0", "tokio-macros", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -3902,7 +3959,7 @@ checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", ] [[package]] @@ -3928,9 +3985,9 @@ dependencies = [ [[package]] name = "tokio-util" -version = "0.7.15" +version = "0.7.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "66a539a9ad6d5d281510d5bd368c973d636c02dbf8a67300bfb6b950696ad7df" +checksum = "14307c986784f72ef81c89db7d9e28d6ac26d16213b109ea501696195e6e3ce5" dependencies = [ "bytes", "futures-core", @@ -3981,7 +4038,7 @@ dependencies = [ "serde", "serde_spanned", "toml_datetime", - "winnow 0.7.11", + "winnow 0.7.12", ] [[package]] @@ -4005,7 +4062,7 @@ version = "0.6.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "adc82fd73de2a9722ac5da747f12383d2bfdb93591ee6c58486e0097890f05f2" dependencies = [ - "bitflags 2.9.1", + "bitflags 2.9.2", "bytes", "futures-util", "http 1.3.1", @@ -4062,7 +4119,7 @@ checksum = "81383ab64e72a7a8b8e13130c49e3dab29def6d0c7d76a03087b3cf71c5c6903" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", ] [[package]] @@ -4204,9 +4261,9 @@ checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" [[package]] name = "uuid" -version = "1.17.0" +version = "1.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3cf4199d1e5d15ddd86a694e4d0dffa9c323ce759fea589f00fef9d81cc1931d" +checksum = "f33196643e165781c20a5ead5582283a7dacbb87855d867fbc2df3f81eddc1be" dependencies = [ "getrandom 0.3.3", "js-sys", @@ -4306,7 +4363,7 @@ dependencies = [ "log", "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", "wasm-bindgen-shared", ] @@ -4341,7 +4398,7 @@ checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -4388,11 +4445,23 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "web_atoms" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57ffde1dc01240bdf9992e3205668b235e59421fd085e8a317ed98da0178d414" +dependencies = [ + "phf 0.11.3", + "phf_codegen 0.11.3", + "string_cache", + "string_cache_codegen", +] + [[package]] name = "webpki-roots" -version = "1.0.1" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8782dd5a41a24eed3a4f40b606249b3e236ca61adf1f25ea4d45c73de122b502" +checksum = "7e8983c3ab33d6fb807cfcdad2491c4ea8cbc8ed839181c7dfd9c67c83e261b2" dependencies = [ "rustls-pki-types", ] @@ -4518,9 +4587,9 @@ dependencies = [ [[package]] name = "winnow" -version = "0.7.11" +version = "0.7.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74c7b26e3480b707944fc872477815d29a8e429d2f93a1ce000f5fa84a15cbcd" +checksum = "f3edebf492c8125044983378ecb5766203ad3b4c2f7a922bd7dd207f6d443e95" dependencies = [ "memchr", ] @@ -4531,7 +4600,7 @@ version = "0.39.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6f42320e61fe2cfd34354ecb597f86f413484a798ba44a8ca1165c58d42da6c1" dependencies = [ - "bitflags 2.9.1", + "bitflags 2.9.2", ] [[package]] @@ -4597,9 +4666,9 @@ dependencies = [ [[package]] name = "yew-hooks" -version = "0.3.3" +version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e4a023bfdcec05c9a0f6fd84f0caff8869fed4b0b73ba06e9418c8e45ce7ca5" +checksum = "640157ac2d80cf6bf5e7fe4143b90cd6c9ef61c9cb6180f60a50c3074521a142" dependencies = [ "gloo 0.11.0", "js-sys", @@ -4623,7 +4692,7 @@ dependencies = [ "proc-macro-error", "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", ] [[package]] @@ -4653,7 +4722,7 @@ checksum = "42bfd190a07ca8cfde7cd4c52b3ac463803dc07323db8c34daa697e86365978c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", ] [[package]] @@ -4676,7 +4745,7 @@ checksum = "38da3c9736e16c5d3c8c597a9aaa5d1fa565d0532ae05e27c24aa62fb32c0ab6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", "synstructure", ] @@ -4697,7 +4766,7 @@ checksum = "9ecf5b4cc5364572d7f4c329661bcc82724222973f2cab6f050a4e5c22f75181" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", ] [[package]] @@ -4717,7 +4786,7 @@ checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", "synstructure", ] @@ -4740,9 +4809,9 @@ dependencies = [ [[package]] name = "zerovec" -version = "0.11.2" +version = "0.11.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a05eb080e015ba39cc9e23bbe5e7fb04d5fb040350f99f34e338d5fdd294428" +checksum = "e7aa2bd55086f1ab526693ecbe444205da57e25f4489879da80635a46d90e73b" dependencies = [ "yoke", "zerofrom", @@ -4757,7 +4826,7 @@ checksum = "5b96237efa0c878c64bd89c436f661be4e46b2f3eff1ebb976f7ef2321d2f58f" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", ] [[package]] @@ -4805,9 +4874,9 @@ dependencies = [ [[package]] name = "zune-jpeg" -version = "0.4.18" +version = "0.4.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7384255a918371b5af158218d131530f694de9ad3815ebdd0453a940485cb0fa" +checksum = "fc1f7e205ce79eb2da3cd71c5f55f3589785cb7c79f6a03d1c8d1491bda5d089" dependencies = [ "zune-core", ] diff --git a/docker-compose.yml b/docker-compose.yml index 3e4e00a..89cc6f5 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,6 +1,6 @@ services: backend: - image: mbround18/vtt-maps:latest + image: mbround18/vtt-maps:${VERSION:-latest} build: context: . dockerfile: Dockerfile diff --git a/packages/actix-backend/Cargo.toml b/packages/actix-backend/Cargo.toml index 3d34dde..ade3479 100644 --- a/packages/actix-backend/Cargo.toml +++ b/packages/actix-backend/Cargo.toml @@ -8,23 +8,24 @@ git2 = "0" actix-web = "4.11.0" actix-files = "0.6.6" actix-cors = "0.7.1" -tokio = { version = "1.45.1", features = ["full"] } +tokio = { version = "1.47.1", features = ["full"] } serde = { version = "1.0.219", features = ["derive"] } -serde_json = "1.0.140" -glob = "0.3.2" +serde_json = "1.0.142" +glob = "0.3.3" shared = { path = "../shared" } -meilisearch-sdk = "0.29.0" -anyhow = "1.0.98" +meilisearch-sdk = "0.29.1" +anyhow = "1.0.99" tracing = "0.1.41" tracing-subscriber = { version = "0.3.19", features = ["env-filter", "fmt"] } -tracing-actix-web = "0.7.18" +tracing-actix-web = "0.7.19" pulldown-cmark = "0.13.0" base64 = "0.22.1" futures = "0.3.31" kuchikiki = "0.8.8-speedreader" futures-util = "0.3.31" -html5ever = "0.29" +html5ever = "0.35" bytes = "1.10.1" actix-session = { version = "0.10.1", features = ["cookie-session"] } actix-identity = "0.8.0" -rand = "0.8.5" +rand = "0.9.2" +markup5ever = "0.35.0" diff --git a/packages/actix-backend/src/main.rs b/packages/actix-backend/src/main.rs index 99a4c29..85c51fe 100644 --- a/packages/actix-backend/src/main.rs +++ b/packages/actix-backend/src/main.rs @@ -103,11 +103,11 @@ async fn main() -> std::io::Result<()> { web::scope("/maps") .route("/all", web::get().to(maps::maps_all)) .route("/{id}", web::get().to(maps::map_detail)) - .service( - web::resource("/rebuild") - .wrap(hooks::admin_auth::AdminAuth) - .route(web::post().to(maps::maps_rebuild)), - ) + // .service( + // web::resource("/rebuild") + // .wrap(hooks::admin_auth::AdminAuth) + // .route(web::post().to(maps::maps_rebuild)), + // ) .route("/rebuild/status", web::get().to(maps::rebuild_status)) .route("/download/{id}", web::get().to(maps::download_map)) .route("/tiled/{id}", web::get().to(maps::tiled_map)) diff --git a/packages/actix-backend/src/maps/mod.rs b/packages/actix-backend/src/maps/mod.rs index 65b14d6..4908890 100644 --- a/packages/actix-backend/src/maps/mod.rs +++ b/packages/actix-backend/src/maps/mod.rs @@ -10,5 +10,5 @@ pub use all::maps_all; pub use content::map_content; pub use detail::map_detail; pub use download::download_map; -pub use rebuild::{maps_rebuild, rebuild_maps_init, rebuild_status}; +pub use rebuild::{rebuild_maps_init, rebuild_status}; pub use tiled::tiled_map; diff --git a/packages/actix-backend/src/utils/admin_token.rs b/packages/actix-backend/src/utils/admin_token.rs index b832aba..1e509f6 100644 --- a/packages/actix-backend/src/utils/admin_token.rs +++ b/packages/actix-backend/src/utils/admin_token.rs @@ -78,10 +78,10 @@ fn admin_token_path() -> Result { /// Generates a cryptographically secure random token. fn generate_secure_token() -> String { - let mut rng = rand::thread_rng(); + let mut rng = rand::rng(); (0..TOKEN_LENGTH) .map(|_| { - let idx = rng.gen_range(0..62); + let idx = rng.random_range(0..62); match idx { 0..=25 => (b'A' + idx) as char, 26..=51 => (b'a' + (idx - 26)) as char, diff --git a/packages/actix-backend/src/wrappers/seo/inject_seo_metadata.rs b/packages/actix-backend/src/wrappers/seo/inject_seo_metadata.rs index 5d14250..65d5eb7 100644 --- a/packages/actix-backend/src/wrappers/seo/inject_seo_metadata.rs +++ b/packages/actix-backend/src/wrappers/seo/inject_seo_metadata.rs @@ -1,6 +1,5 @@ use actix_web::{HttpRequest, error::ErrorInternalServerError}; -use html5ever::{QualName, local_name, namespace_url}; -use kuchikiki::{parse_fragment, parse_html, traits::TendrilSink}; +use kuchikiki::{parse_html, traits::TendrilSink}; pub struct SeoData { pub title: String, @@ -49,22 +48,18 @@ pub fn inject_seo_metadata( img = seo.image_url, ); - // 2) Parse the blob as a fragment: - let fragment = parse_fragment( - QualName::new( - None, - namespace_url!("http://www.w3.org/1999/xhtml"), - local_name!("head"), - ), - Vec::new(), - ) - .one(blob); - + // Parse the main HTML document let document = parse_html().one(html); + + // Parse the SEO metadata as HTML fragment and extract the elements + let seo_fragment = parse_html().one(format!("{}", blob)); + if let Ok(head) = document.document_node.select_first("head") { - // 4) Move each child from the parsed fragment into the document's head: - for child in fragment.document_node.children() { - head.as_node().append(child.clone()); + if let Ok(seo_head) = seo_fragment.document_node.select_first("head") { + // Move each child from the SEO fragment into the document's head + for child in seo_head.as_node().children() { + head.as_node().append(child.clone()); + } } } diff --git a/packages/shared/Cargo.toml b/packages/shared/Cargo.toml index eaccb33..169cdf6 100644 --- a/packages/shared/Cargo.toml +++ b/packages/shared/Cargo.toml @@ -9,7 +9,7 @@ default = [] [dependencies] base64 = "0.22.1" serde = { version = "1.0.219" , features = ["derive"] } -serde_json = "1.0.140" +serde_json = "1.0.142" image = { version = "0.25.6", features = [] } -thiserror = "2.0.12" +thiserror = "2.0.15" sha2 ="0.10.9" diff --git a/packages/yew-frontend/Cargo.toml b/packages/yew-frontend/Cargo.toml index 0d7a538..9e01bd7 100644 --- a/packages/yew-frontend/Cargo.toml +++ b/packages/yew-frontend/Cargo.toml @@ -9,10 +9,10 @@ shared = { path = "../shared" } # you can check the latest version here: https://crates.io/crates/yew yew = { version = "0.21.0" , features = ["csr"]} yew-router = "0.18.0" -yew-hooks = "0.3.3" +yew-hooks = "0.3.4" gloo-net = "0.6.0" serde = {version = "1.0.219", features = ["derive"]} -serde_json = "1.0.140" +serde_json = "1.0.142" gloo-console = "0.3.0" web-sys = {version = "0.3.77", features = [ "HtmlElement",