From 2bd91fb867cd4e8ef2934135c9a74541c0edcf36 Mon Sep 17 00:00:00 2001 From: Peter Holloway Date: Wed, 10 Dec 2025 17:19:20 +0000 Subject: [PATCH 01/22] Make logging level configurable Read initial log level from config file if present. Once the server is running the level can be changed via a POST request to /loglevel/{level} where level is one of info, debug or trace. --- src/config.rs | 24 ++++++++++++++++++++++++ src/main.rs | 30 +++++++++++++++++++++++++----- src/model.rs | 3 +-- 3 files changed, 50 insertions(+), 7 deletions(-) diff --git a/src/config.rs b/src/config.rs index 706c325..51e1bc6 100644 --- a/src/config.rs +++ b/src/config.rs @@ -10,6 +10,8 @@ pub struct GlazedConfig { pub bind_address: SocketAddr, pub public_address: Option, pub tiled_client: TiledClientConfig, + #[serde(default)] + pub log_level: LogLevel, } impl GlazedConfig { pub fn from_file(path: &Path) -> Result { @@ -24,6 +26,7 @@ impl GlazedConfig { tiled_client: TiledClientConfig { address: Url::parse("http://localhost:8000").expect("Static URL is valid"), }, + log_level: LogLevel::Info, } } } @@ -32,3 +35,24 @@ impl GlazedConfig { pub struct TiledClientConfig { pub address: Url, } + +#[derive(Debug, Default, Deserialize, Clone, Copy)] +pub enum LogLevel { + #[default] + #[serde(alias = "info")] + Info, + #[serde(alias = "debug")] + Debug, + #[serde(alias = "trace")] + Trace, +} + +impl From for tracing::level_filters::LevelFilter { + fn from(value: LogLevel) -> Self { + match value { + LogLevel::Info => Self::INFO, + LogLevel::Debug => Self::DEBUG, + LogLevel::Trace => Self::TRACE, + } + } +} diff --git a/src/main.rs b/src/main.rs index 4d8bcfb..1d3e69d 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,4 +1,5 @@ use async_graphql::{EmptyMutation, EmptySubscription, Schema}; +use axum::extract::Path; use axum::http::StatusCode; use axum::response::{Html, IntoResponse}; use axum::routing::{get, post}; @@ -18,17 +19,24 @@ use serde_json::json; use tokio::select; use tokio::signal::unix::{SignalKind, signal}; use tracing::info; +use tracing::level_filters::LevelFilter; +use tracing_subscriber::layer::SubscriberExt as _; +use tracing_subscriber::util::SubscriberInitExt; +use tracing_subscriber::{Registry, fmt, reload}; use url::Url; use crate::clients::TiledClient; -use crate::config::GlazedConfig; +use crate::config::{GlazedConfig, LogLevel}; use crate::handlers::{download_handler, graphiql_handler, graphql_handler}; use crate::model::TiledQuery; #[tokio::main] async fn main() -> Result<(), Box> { - let subscriber = tracing_subscriber::FmtSubscriber::new(); - tracing::subscriber::set_global_default(subscriber)?; + let (filter, filter_reload) = reload::Layer::new(LevelFilter::INFO); + tracing_subscriber::registry() + .with(filter) + .with(fmt::Layer::default()) + .init(); let cli = Cli::init(); let config; @@ -41,15 +49,21 @@ async fn main() -> Result<(), Box> { info!("Using default config"); config = GlazedConfig::default(); } + filter_reload + .modify(|f| *f = config.log_level.into()) + .unwrap(); match cli.command { - Commands::Serve => serve(config).await, + Commands::Serve => serve(config, filter_reload).await, } } #[derive(Clone)] pub struct RootAddress(Url); -async fn serve(config: GlazedConfig) -> Result<(), Box> { +async fn serve( + config: GlazedConfig, + reload: reload::Handle, +) -> Result<(), Box> { let client = TiledClient::new(config.tiled_client.address); let public_address = config .public_address @@ -72,6 +86,12 @@ async fn serve(config: GlazedConfig) -> Result<(), Box> { get(Json(json!({"version": env!("CARGO_PKG_VERSION")}))), ) .route("/asset/{run}/{stream}/{det}/{id}", get(download_handler)) + .route( + "/loglevel/{level}", + post(|level: Path| async move { + reload.clone().modify(|f| *f = level.0.into()).unwrap(); + }), + ) .with_state(client) .fallback(( StatusCode::NOT_FOUND, diff --git a/src/model.rs b/src/model.rs index 0acabf8..d418a91 100644 --- a/src/model.rs +++ b/src/model.rs @@ -10,7 +10,7 @@ use std::collections::HashMap; use async_graphql::{Context, Object, Result, Union}; use serde_json::Value; -use tracing::{info, instrument}; +use tracing::instrument; use crate::RootAddress; use crate::clients::{ClientError, TiledClient}; @@ -174,7 +174,6 @@ impl TableData { .map(|s| s.as_str()) .collect::>() .join("/"); - info!("path: {:?}", p); let table_data = client.table_full(&p, columns, headers).await?; Ok(table_data) From 4bb20a3ebf2b893d053fb93f6fffe4d4f4a3b899 Mon Sep 17 00:00:00 2001 From: Zoheb Shaikh <26975142+ZohebShaikh@users.noreply.github.com> Date: Fri, 24 Apr 2026 11:51:45 +0100 Subject: [PATCH 02/22] Add subscription --- Cargo.lock | 232 +++++++++++++++++++++++++-- Cargo.toml | 6 + src/clients.rs | 3 + src/handlers.rs | 143 ++++++++++++++++- src/main.rs | 8 +- src/model.rs | 10 +- src/model/subscription.rs | 318 ++++++++++++++++++++++++++++++++++++++ 7 files changed, 695 insertions(+), 25 deletions(-) create mode 100644 src/model/subscription.rs diff --git a/Cargo.lock b/Cargo.lock index 109b47b..10e32e0 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -21,6 +21,15 @@ dependencies = [ "memchr", ] +[[package]] +name = "android_system_properties" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" +dependencies = [ + "libc", +] + [[package]] name = "anstream" version = "0.6.21" @@ -373,6 +382,20 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" +[[package]] +name = "chrono" +version = "0.4.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c673075a2e0e5f4a1dde27ce9dee1ea4558c7ffe648f576438a20ca1d2acc4b0" +dependencies = [ + "iana-time-zone", + "js-sys", + "num-traits", + "serde", + "wasm-bindgen", + "windows-link", +] + [[package]] name = "clap" version = "4.5.51" @@ -477,6 +500,22 @@ dependencies = [ "unicode-segmentation", ] +[[package]] +name = "core-foundation" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2a6cd9ae233e7f62ba4e9353e81a88df7fc8a5987b8d445b4d90c879bd156f6" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "core-foundation-sys" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" + [[package]] name = "cpufeatures" version = "0.2.17" @@ -689,21 +728,21 @@ dependencies = [ [[package]] name = "futures-core" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" +checksum = "7e3450815272ef58cec6d564423f6e755e25379b217b0bc688e295ba24df6b1d" [[package]] name = "futures-io" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" +checksum = "cecba35d7ad927e23624b22ad55235f2239cfa44fd10428eecbeba6d6a717718" [[package]] name = "futures-macro" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" +checksum = "e835b70203e41293343137df5c0664546da5745f82ec9b84d40be8336958447b" dependencies = [ "proc-macro2", "quote", @@ -712,15 +751,15 @@ dependencies = [ [[package]] name = "futures-sink" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" +checksum = "c39754e157331b013978ec91992bde1ac089843443c49cbc7f46150b0fad0893" [[package]] name = "futures-task" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" +checksum = "037711b3d59c33004d3856fbdc83b99d4ff37a24768fa1be9ce3538a1cde4393" [[package]] name = "futures-timer" @@ -730,9 +769,9 @@ checksum = "f288b0a4f20f9a56b5d1da57e2227c661b7b16168e2f72365f57b63326e29b24" [[package]] name = "futures-util" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" +checksum = "389ca41296e6190b48053de0321d02a77f32f8a5d2461dd38762c0593805c6d6" dependencies = [ "futures-core", "futures-io", @@ -741,7 +780,6 @@ dependencies = [ "futures-task", "memchr", "pin-project-lite", - "pin-utils", "slab", ] @@ -788,15 +826,21 @@ version = "0.0.0" dependencies = [ "async-graphql", "async-graphql-axum", + "async-stream", "axum", + "chrono", "clap", "config", + "futures-util", "http-body-util", "httpmock", "reqwest", + "rmp-serde", "serde", + "serde_bytes", "serde_json", "tokio", + "tokio-tungstenite", "tower", "tracing", "tracing-subscriber", @@ -1041,6 +1085,30 @@ dependencies = [ "tracing", ] +[[package]] +name = "iana-time-zone" +version = "0.1.65" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e31bc9ad994ba00e440a8aa5c9ef0ec67d5cb5e5cb0cc7f8b744a35b389cc470" +dependencies = [ + "android_system_properties", + "core-foundation-sys", + "iana-time-zone-haiku", + "js-sys", + "log", + "wasm-bindgen", + "windows-core", +] + +[[package]] +name = "iana-time-zone-haiku" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" +dependencies = [ + "cc", +] + [[package]] name = "icu_collections" version = "2.1.1" @@ -1331,6 +1399,12 @@ version = "1.70.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "384b8ab6d37215f3c5301a95a4accb5d64aa607f1fcb26a11b5303878451b4fe" +[[package]] +name = "openssl-probe" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c87def4c32ab89d880effc9e097653c8da5d6ef28e6b539d313baaacfbafcbe" + [[package]] name = "ordered-multimap" version = "0.7.3" @@ -1674,6 +1748,25 @@ dependencies = [ "windows-sys 0.52.0", ] +[[package]] +name = "rmp" +version = "0.8.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ba8be72d372b2c9b35542551678538b562e7cf86c3315773cae48dfbfe7790c" +dependencies = [ + "num-traits", +] + +[[package]] +name = "rmp-serde" +version = "1.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72f81bee8c8ef9b577d1681a70ebbc962c232461e397b22c208c43c04b67a155" +dependencies = [ + "rmp", + "serde", +] + [[package]] name = "ron" version = "0.8.1" @@ -1729,6 +1822,18 @@ dependencies = [ "zeroize", ] +[[package]] +name = "rustls-native-certs" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "612460d5f7bea540c490b2b6395d8e34a953e52b491accd6c86c8164c5932a63" +dependencies = [ + "openssl-probe", + "rustls-pki-types", + "schannel", + "security-framework", +] + [[package]] name = "rustls-pki-types" version = "1.13.0" @@ -1762,12 +1867,44 @@ version = "1.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" +[[package]] +name = "schannel" +version = "0.1.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91c1b7e4904c873ef0710c1f407dde2e6287de2bebc1bbbf7d430bb7cbffd939" +dependencies = [ + "windows-sys 0.61.2", +] + [[package]] name = "scopeguard" version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" +[[package]] +name = "security-framework" +version = "3.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d17b898a6d6948c3a8ee4372c17cb384f90d2e6e912ef00895b14fd7ab54ec38" +dependencies = [ + "bitflags", + "core-foundation", + "core-foundation-sys", + "libc", + "security-framework-sys", +] + +[[package]] +name = "security-framework-sys" +version = "2.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ce2691df843ecc5d231c0b14ece2acc3efb62c0a398c7e1d875f3983ce020e3" +dependencies = [ + "core-foundation-sys", + "libc", +] + [[package]] name = "serde" version = "1.0.228" @@ -1790,6 +1927,16 @@ dependencies = [ "typeid", ] +[[package]] +name = "serde_bytes" +version = "0.11.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5d440709e79d88e51ac01c4b72fc6cb7314017bb7da9eeff678aa94c10e3ea8" +dependencies = [ + "serde", + "serde_core", +] + [[package]] name = "serde_core" version = "1.0.228" @@ -2190,7 +2337,11 @@ checksum = "d25a406cddcc431a75d3d9afc6a7c0f7428d4891dd973e4d54c56b46127bf857" dependencies = [ "futures-util", "log", + "rustls", + "rustls-native-certs", + "rustls-pki-types", "tokio", + "tokio-rustls", "tungstenite", ] @@ -2373,6 +2524,8 @@ dependencies = [ "httparse", "log", "rand", + "rustls", + "rustls-pki-types", "sha1", "thiserror 2.0.17", "utf-8", @@ -2598,12 +2751,65 @@ dependencies = [ "rustls-pki-types", ] +[[package]] +name = "windows-core" +version = "0.62.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8e83a14d34d0623b51dce9581199302a221863196a1dde71a7663a4c2be9deb" +dependencies = [ + "windows-implement", + "windows-interface", + "windows-link", + "windows-result", + "windows-strings", +] + +[[package]] +name = "windows-implement" +version = "0.60.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "windows-interface" +version = "0.59.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "windows-link" version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" +[[package]] +name = "windows-result" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7781fa89eaf60850ac3d2da7af8e5242a5ea78d1a11c49bf2910bb5a73853eb5" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows-strings" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7837d08f69c77cf6b07689544538e017c1bfcf57e34b4c0ff58e6c2cd3b37091" +dependencies = [ + "windows-link", +] + [[package]] name = "windows-sys" version = "0.52.0" diff --git a/Cargo.toml b/Cargo.toml index f7a5b19..e622801 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -20,6 +20,12 @@ clap = { version = "4.5.48", features = ["derive"] } uuid = { version = "1.18.1", features = ["serde"] } tracing = "0.1.41" tracing-subscriber = "0.3.20" +tokio-tungstenite = { version = "0.28.0", features = ["rustls-tls-native-roots"] } +rmp-serde = "1.3.1" +futures-util = "0.3.32" +async-stream = "0.3.6" +chrono = { version = "0.4", features = ["serde"] } +serde_bytes="0.11.19" [dev-dependencies] http-body-util = "0.1.3" diff --git a/src/clients.rs b/src/clients.rs index e0cecd5..a54466a 100644 --- a/src/clients.rs +++ b/src/clients.rs @@ -30,6 +30,9 @@ impl TiledClient { address, } } + pub fn address(&self) -> &Url { + &self.address + } #[instrument(skip(self, headers))] async fn request( &self, diff --git a/src/handlers.rs b/src/handlers.rs index 705b1d6..2b5e45a 100644 --- a/src/handlers.rs +++ b/src/handlers.rs @@ -1,20 +1,22 @@ -use async_graphql::http::GraphiQLSource; -use async_graphql::{EmptyMutation, EmptySubscription, Schema}; -use async_graphql_axum::{GraphQLRequest, GraphQLResponse}; +use async_graphql::http::{ALL_WEBSOCKET_PROTOCOLS, GraphiQLSource}; +use async_graphql::{EmptyMutation, Schema}; +use async_graphql_axum::{GraphQLProtocol, GraphQLRequest, GraphQLResponse, GraphQLWebSocket}; use axum::Extension; use axum::body::Body; -use axum::extract::{OptionalFromRequestParts, Path, State}; +use axum::extract::{OptionalFromRequestParts, Path, State, WebSocketUpgrade}; use axum::http::{HeaderMap, HeaderValue, StatusCode}; use axum::response::{Html, IntoResponse}; use reqwest::header::AUTHORIZATION; +use serde_json::Value; use tracing::info; use crate::clients::TiledClient; use crate::model::TiledQuery; +use crate::model::subscription::TiledSubscription; pub async fn graphql_handler( auth_token: Option, - schema: Extension>, + schema: Extension>, req: GraphQLRequest, ) -> GraphQLResponse { schema @@ -23,10 +25,39 @@ pub async fn graphql_handler( .into() } +pub async fn graphql_ws_handler( + schema: Extension>, + protocol: GraphQLProtocol, + auth_token: Option, + websocket: WebSocketUpgrade, +) -> impl IntoResponse { + websocket + .protocols(ALL_WEBSOCKET_PROTOCOLS) + .on_upgrade(move |socket| { + GraphQLWebSocket::new(socket, schema.0, protocol) + .on_connection_init(|value| async move { + let mut data = async_graphql::Data::default(); + let mut auth_token = auth_token; + + if let Ok(value) = serde_json::from_value::(value) + && let Some(auth) = value.get("Authorization").and_then(|v| v.as_str()) + && let Ok(header_value) = HeaderValue::from_str(auth) + { + auth_token = Some(AuthHeader(header_value)); + } + + data.insert(auth_token); + Ok(data) + }) + .serve() + }) +} + pub async fn graphiql_handler(graphql_endpoint: Option) -> impl IntoResponse { Html( GraphiQLSource::build() .endpoint(graphql_endpoint.as_deref().unwrap_or("/graphql")) + .subscription_endpoint(graphql_endpoint.as_deref().unwrap_or("/ws")) .finish(), ) } @@ -88,6 +119,7 @@ mod tests { use tower::ServiceExt; use super::AuthHeader; + use crate::clients::TiledClient; async fn auth_echo(auth: Option) -> impl IntoResponse { match auth { @@ -98,6 +130,29 @@ mod tests { fn app() -> Router { Router::new().route("/", get(auth_echo)) } + use async_graphql::{EmptyMutation, Schema}; + use axum::Extension; + use axum::routing::any; + + fn ws_app(client: TiledClient) -> Router { + let schema = Schema::build( + crate::model::TiledQuery, + EmptyMutation, + crate::model::subscription::TiledSubscription, + ) + .data(client) + .finish(); + Router::new().route( + "/ws", + any( + move |protocol: async_graphql_axum::GraphQLProtocol, + websocket: axum::extract::WebSocketUpgrade| { + let schema = Extension(schema.clone()); + super::graphql_ws_handler(schema, protocol, None, websocket) + }, + ), + ) + } #[tokio::test] async fn auth_extract() { let app = app(); @@ -128,4 +183,82 @@ mod tests { "No auth" ); } + + #[tokio::test] + async fn test_graphql_ws_handler_auth_extraction() { + use futures_util::{SinkExt, StreamExt}; + use serde_json::json; + use tokio_tungstenite::connect_async; + use tokio_tungstenite::tungstenite::Message; + + use crate::clients::TiledClient; + + let server = httpmock::MockServer::start(); + let client = TiledClient::for_mock_server(&server); + + let app = ws_app(client); + + let listener = tokio::net::TcpListener::bind("127.0.0.1:0").await.unwrap(); + let addr = listener.local_addr().unwrap(); + tokio::spawn(async move { + axum::serve(listener, app).await.unwrap(); + }); + + let ws_url = format!("ws://{addr}/ws"); + let mut request = + tokio_tungstenite::tungstenite::client::IntoClientRequest::into_client_request(ws_url) + .unwrap(); + request.headers_mut().insert( + axum::http::header::SEC_WEBSOCKET_PROTOCOL, + "graphql-transport-ws".parse().unwrap(), + ); + let (mut ws_stream, _) = connect_async(request).await.unwrap(); + + let init_msg = json!({ + "type": "connection_init", + "payload": { + "Authorization": "Bearer ws-test-token" + } + }); + ws_stream + .send(Message::Text(init_msg.to_string().into())) + .await + .unwrap(); + + let ack = ws_stream.next().await.unwrap().unwrap(); + assert!(ack.is_text()); + assert!(ack.to_text().unwrap().contains("connection_ack")); + + let mock = server + .mock_async(|when, then| { + when.method("GET") + .path("/api/v1/metadata/5d8f5c3e-0e00-4c5c-816d-70b4b0f41498") + .header("Authorization", "Bearer ws-test-token"); + then.status(200) + .body_from_file("resources/metadata_run.json"); + }) + .await; + + let query = json!({ + "id": "1", + "type": "subscribe", + "payload": { + "query": "query { run(id: \"5d8f5c3e-0e00-4c5c-816d-70b4b0f41498\") { id } }" + } + }); + ws_stream + .send(Message::Text(query.to_string().into())) + .await + .unwrap(); + + let msg = ws_stream.next().await.unwrap().unwrap(); + assert!(msg.is_text()); + assert!( + msg.to_text() + .unwrap() + .contains("5d8f5c3e-0e00-4c5c-816d-70b4b0f41498") + ); + + mock.assert_async().await; + } } diff --git a/src/main.rs b/src/main.rs index 4d8bcfb..b4e6311 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,4 +1,4 @@ -use async_graphql::{EmptyMutation, EmptySubscription, Schema}; +use async_graphql::{EmptyMutation, Schema}; use axum::http::StatusCode; use axum::response::{Html, IntoResponse}; use axum::routing::{get, post}; @@ -22,8 +22,9 @@ use url::Url; use crate::clients::TiledClient; use crate::config::GlazedConfig; -use crate::handlers::{download_handler, graphiql_handler, graphql_handler}; +use crate::handlers::{download_handler, graphiql_handler, graphql_handler, graphql_ws_handler}; use crate::model::TiledQuery; +use crate::model::subscription::TiledSubscription; #[tokio::main] async fn main() -> Result<(), Box> { @@ -55,7 +56,7 @@ async fn serve(config: GlazedConfig) -> Result<(), Box> { .public_address .clone() .unwrap_or_else(|| Url::parse(&format!("http://{}", config.bind_address)).unwrap()); - let schema = Schema::build(TiledQuery, EmptyMutation, EmptySubscription) + let schema = Schema::build(TiledQuery, EmptyMutation, TiledSubscription) .data(RootAddress(public_address)) .data(client.clone()) .finish(); @@ -66,6 +67,7 @@ async fn serve(config: GlazedConfig) -> Result<(), Box> { let app = Router::new() .route("/graphql", post(graphql_handler).get(graphql_get_warning)) + .route("/ws", get(graphql_ws_handler)) .route("/graphiql", get(|| graphiql_handler(graphql_endpoint))) .route( "/status", diff --git a/src/model.rs b/src/model.rs index 0acabf8..b4b0eaa 100644 --- a/src/model.rs +++ b/src/model.rs @@ -4,6 +4,7 @@ pub(crate) mod container; pub(crate) mod event_stream; pub(crate) mod node; pub(crate) mod run; +pub(crate) mod subscription; pub(crate) mod table; use std::collections::HashMap; @@ -239,7 +240,7 @@ impl Run { #[cfg(test)] mod tests { - use async_graphql::{EmptyMutation, EmptySubscription, Schema, value}; + use async_graphql::{EmptyMutation, Schema, value}; use axum::http::HeaderValue; use httpmock::MockServer; use serde_json::json; @@ -247,9 +248,10 @@ mod tests { use crate::TiledQuery; use crate::clients::TiledClient; use crate::handlers::AuthHeader; + use crate::model::subscription::TiledSubscription; - fn build_schema(url: &str) -> Schema { - Schema::build(TiledQuery, EmptyMutation, EmptySubscription) + fn build_schema(url: &str) -> Schema { + Schema::build(TiledQuery, EmptyMutation, TiledSubscription) .data(Option::::None) .data(TiledClient::new(url.parse().unwrap())) .finish() @@ -320,7 +322,7 @@ mod tests { })); }) .await; - let schema = Schema::build(TiledQuery, EmptyMutation, EmptySubscription) + let schema = Schema::build(TiledQuery, EmptyMutation, TiledSubscription) .data(TiledClient::new(server.base_url().parse().unwrap())) .data(Some(AuthHeader::from(HeaderValue::from_static( "auth_value", diff --git a/src/model/subscription.rs b/src/model/subscription.rs new file mode 100644 index 0000000..3d13d03 --- /dev/null +++ b/src/model/subscription.rs @@ -0,0 +1,318 @@ +use async_graphql::{Context, SimpleObject, Subscription, Union}; +use axum::http::HeaderMap; +use futures_util::{Stream, StreamExt}; +use serde::Deserialize; +use serde_json::Value; +use tokio_tungstenite::connect_async; +use tokio_tungstenite::tungstenite::client::IntoClientRequest; +use tracing::{error, info}; + +use crate::clients::TiledClient; +use crate::handlers::AuthHeader; +use crate::model::array::{ArrayStructure, DataType}; + +pub struct TiledSubscription; + +#[Subscription] +impl TiledSubscription { + async fn events(&self, ctx: &Context<'_>) -> impl Stream { + let client = ctx + .data::() + .expect("TiledClient not found in context"); + let auth = ctx + .data_opt::>() + .and_then(|a| a.as_ref()); + let headers = auth.map(|a| a.as_header_map()); + + stream_events(client, None, headers) + } + + async fn node_events(&self, ctx: &Context<'_>, node: String) -> impl Stream { + let client = ctx + .data::() + .expect("TiledClient not found in context"); + let auth = ctx + .data_opt::>() + .and_then(|a| a.as_ref()); + let headers = auth.map(|a| a.as_header_map()); + stream_events(client, Some(node), headers) + } +} + +#[derive(Debug, Deserialize, SimpleObject)] +pub struct ContainerSchema { + pub version: u32, +} + +#[derive(Debug, Deserialize, SimpleObject)] +pub struct ArraySchema { + pub version: u32, + pub data_type: DataType, +} + +#[derive(Debug, Deserialize, SimpleObject)] +pub struct TableSchema { + pub version: u32, + pub arrow_schema: String, +} + +#[derive(Debug, Deserialize, SimpleObject)] +pub struct ChildCreated { + pub sequence: u32, + pub timestamp: String, + pub key: String, + pub structure_family: String, + pub specs: Value, + pub metadata: Value, + pub data_sources: Vec, + pub access_blob: Value, +} + +#[derive(Debug, Deserialize, SimpleObject)] +pub struct ChildMetadataUpdated { + pub sequence: u32, + pub timestamp: String, + pub key: String, + pub specs: Value, + pub metadata: Value, +} + +#[derive(Debug, Deserialize, SimpleObject)] +pub struct StreamArrayData { + pub sequence: u32, + pub timestamp: String, + pub mimetype: String, + pub shape: Value, + pub offset: Option, + pub block: Option, +} + +#[derive(Debug, Deserialize, SimpleObject)] +pub struct ArrayRef { + pub sequence: u32, + pub timestamp: String, + pub data_source: Value, + pub patch: Option, + pub uri: Option, + pub shape: Value, + pub data_type: DataType, +} + +#[derive(Debug, Deserialize, SimpleObject)] +pub struct StreamTableData { + pub sequence: u32, + pub timestamp: String, + pub partition: Option, + pub append: bool, + pub arrow_schema: String, +} + +#[derive(Debug, PartialEq, Clone, Deserialize, SimpleObject)] +pub struct DataSource { + pub structure: ArrayStructure, +} + +#[derive(Union, Deserialize, Debug)] +#[serde(tag = "type")] +pub enum TiledEvent { + #[serde(rename = "container-schema")] + Container(ContainerSchema), + #[serde(rename = "array-schema")] + Array(ArraySchema), + #[serde(rename = "table-schema")] + Table(TableSchema), + #[serde(rename = "container-child-created")] + ChildCreated(ChildCreated), + #[serde(rename = "container-child-metadata-updated")] + ChildMetadataUpdated(ChildMetadataUpdated), + #[serde(rename = "array-data")] + ArrayData(StreamArrayData), + #[serde(rename = "array-ref")] + ArrayRef(ArrayRef), + #[serde(rename = "table-data")] + TableData(StreamTableData), +} + +fn stream_events( + client: &TiledClient, + node: Option, + headers: Option, +) -> impl Stream { + let mut url = client.address().clone(); + + let scheme = match url.scheme() { + "http" => "ws", + "https" => "wss", + _ => "ws", + }; + url.set_scheme(scheme).ok(); + + let path = if let Some(node_id) = node { + format!("api/v1/stream/single/{}", node_id) + } else { + "api/v1/stream/single/".to_string() + }; + + let mut url = url.join(&path).expect("Invalid stream path"); + url.set_query(Some("envelope_format=msgpack")); + + let mut request = url.as_str().into_client_request().unwrap(); + if let Some(headers) = headers { + request.headers_mut().extend(headers); + } + async_stream::stream! { + info!("Connecting to WebSocket: {}", url); + let (ws_stream, _) = match connect_async(request).await { + Ok(ws) => ws, + Err(e) => { + error!("Failed to connect to WebSocket: {}", e); + return; + } + }; + + let (_, mut read) = ws_stream.split(); + + while let Some(msg) = read.next().await { + match msg { + Ok(tokio_tungstenite::tungstenite::Message::Binary(bin)) => { + match rmp_serde::from_slice::(&bin) { + Ok(event) => yield event, + Err(e) => { + error!("Failed to deserialize msgpack: {}, binary: {:?}", e, bin); + } + } + } + Ok(_) => {}, + Err(e) => { + error!("WebSocket error: {}", e); + break; + } + } + } + } +} + +#[cfg(test)] +mod tests { + use axum::http::HeaderMap; + use futures_util::{SinkExt, StreamExt}; + use tokio::net::TcpListener; + use tokio_tungstenite::accept_hdr_async; + use tokio_tungstenite::tungstenite::handshake::server::{Request, Response}; + use url::Url; + + use super::*; + use crate::clients::TiledClient; + + #[tokio::test] + async fn test_stream_events_headers() { + let listener = TcpListener::bind("127.0.0.1:0").await.unwrap(); + let addr = listener.local_addr().unwrap(); + let url = Url::parse(&format!("http://{addr}")).unwrap(); + let client = TiledClient::new(url); + + let mut headers = HeaderMap::new(); + headers.insert("Authorization", "Bearer test-token".parse().unwrap()); + + let headers_clone = headers.clone(); + + let server_handle = tokio::spawn(async move { + let (stream, _) = listener.accept().await.unwrap(); + let mut captured_headers = HeaderMap::new(); + + let callback = |req: &Request, response: Response| { + for (name, value) in req.headers() { + captured_headers.insert(name.clone(), value.clone()); + } + Ok(response) + }; + + let _ws_stream = accept_hdr_async(stream, callback).await.unwrap(); + captured_headers + }); + + let stream = stream_events(&client, None, Some(headers_clone)); + tokio::pin!(stream); + + let _ = stream.next().await; + + let captured_headers = server_handle.await.unwrap(); + + assert_eq!( + captured_headers.get("Authorization").unwrap(), + "Bearer test-token" + ); + } + + #[tokio::test] + async fn test_subscription_events_and_node_events() { + use async_graphql::{EmptyMutation, Schema}; + use tokio_tungstenite::tungstenite::Message; + + let listener = TcpListener::bind("127.0.0.1:0").await.unwrap(); + let addr = listener.local_addr().unwrap(); + let url = Url::parse(&format!("http://{addr}")).unwrap(); + let client = TiledClient::new(url); + + let server_handle = tokio::spawn(async move { + let (stream, _) = listener.accept().await.unwrap(); + let mut captured_path = String::new(); + let callback = |req: &Request, response: Response| { + captured_path = req.uri().path().to_string(); + Ok(response) + }; + let mut ws_stream = accept_hdr_async(stream, callback).await.unwrap(); + + let event = serde_json::json!({ + "type": "container-schema", + "version": 42 + }); + let bin = rmp_serde::to_vec(&event).unwrap(); + ws_stream.send(Message::Binary(bin.into())).await.unwrap(); + + let (stream, _) = listener.accept().await.unwrap(); + let mut captured_node_path = String::new(); + let callback = |req: &Request, response: Response| { + captured_node_path = req.uri().path().to_string(); + Ok(response) + }; + let mut ws_stream = accept_hdr_async(stream, callback).await.unwrap(); + + let event = serde_json::json!({ + "type": "container-schema", + "version": 43 + }); + let bin = rmp_serde::to_vec(&event).unwrap(); + ws_stream.send(Message::Binary(bin.into())).await.unwrap(); + + (captured_path, captured_node_path) + }); + + let schema = Schema::build(crate::model::TiledQuery, EmptyMutation, TiledSubscription) + .data(client) + .finish(); + + let stream = + schema.execute_stream("subscription { events { ... on ContainerSchema { version } } }"); + let mut stream = Box::pin(stream); + let res = stream.next().await.unwrap(); + assert_eq!( + res.data, + async_graphql::value!({ "events": { "version": 42 } }) + ); + + let stream = schema.execute_stream( + "subscription { nodeEvents(node: \"foo\") { ... on ContainerSchema { version } } }", + ); + let mut stream = Box::pin(stream); + let res = stream.next().await.unwrap(); + assert_eq!( + res.data, + async_graphql::value!({ "nodeEvents": { "version": 43 } }) + ); + + let (path, node_path) = server_handle.await.unwrap(); + assert_eq!(path, "/api/v1/stream/single/"); + assert_eq!(node_path, "/api/v1/stream/single/foo"); + } +} From 579ddb25405f84a63d92e2a6da27006e80b1048b Mon Sep 17 00:00:00 2001 From: Zoheb Shaikh <26975142+ZohebShaikh@users.noreply.github.com> Date: Fri, 24 Apr 2026 12:17:35 +0100 Subject: [PATCH 03/22] fix clippy errors --- src/model/subscription.rs | 134 ++++++++++++++++++++------------------ 1 file changed, 71 insertions(+), 63 deletions(-) diff --git a/src/model/subscription.rs b/src/model/subscription.rs index 3d13d03..8917e1c 100644 --- a/src/model/subscription.rs +++ b/src/model/subscription.rs @@ -194,11 +194,12 @@ fn stream_events( #[cfg(test)] mod tests { + use axum::Router; + use axum::extract::WebSocketUpgrade; use axum::http::HeaderMap; - use futures_util::{SinkExt, StreamExt}; + use axum::routing::any; + use futures_util::StreamExt; use tokio::net::TcpListener; - use tokio_tungstenite::accept_hdr_async; - use tokio_tungstenite::tungstenite::handshake::server::{Request, Response}; use url::Url; use super::*; @@ -206,37 +207,36 @@ mod tests { #[tokio::test] async fn test_stream_events_headers() { + let (tx, mut rx) = tokio::sync::mpsc::channel(1); + + let app = Router::new().fallback(any( + move |headers: HeaderMap, ws: WebSocketUpgrade| async move { + let _ = tx.send(headers).await; + ws.on_upgrade(|_| async move {}) + }, + )); + let listener = TcpListener::bind("127.0.0.1:0").await.unwrap(); let addr = listener.local_addr().unwrap(); + tokio::spawn(async move { + axum::serve(listener, app).await.unwrap(); + }); + let url = Url::parse(&format!("http://{addr}")).unwrap(); let client = TiledClient::new(url); let mut headers = HeaderMap::new(); headers.insert("Authorization", "Bearer test-token".parse().unwrap()); - let headers_clone = headers.clone(); - - let server_handle = tokio::spawn(async move { - let (stream, _) = listener.accept().await.unwrap(); - let mut captured_headers = HeaderMap::new(); - - let callback = |req: &Request, response: Response| { - for (name, value) in req.headers() { - captured_headers.insert(name.clone(), value.clone()); - } - Ok(response) - }; - - let _ws_stream = accept_hdr_async(stream, callback).await.unwrap(); - captured_headers - }); - - let stream = stream_events(&client, None, Some(headers_clone)); + let stream = stream_events(&client, None, Some(headers)); tokio::pin!(stream); - let _ = stream.next().await; + let _ = tokio::time::timeout(std::time::Duration::from_secs(5), stream.next()).await; - let captured_headers = server_handle.await.unwrap(); + let captured_headers = tokio::time::timeout(std::time::Duration::from_secs(5), rx.recv()) + .await + .expect("Timeout waiting for headers") + .expect("Channel closed"); assert_eq!( captured_headers.get("Authorization").unwrap(), @@ -247,72 +247,80 @@ mod tests { #[tokio::test] async fn test_subscription_events_and_node_events() { use async_graphql::{EmptyMutation, Schema}; - use tokio_tungstenite::tungstenite::Message; + use axum::http::Uri; + + let (tx, mut rx) = tokio::sync::mpsc::channel(2); + + let app = Router::new().fallback(any(move |uri: Uri, ws: WebSocketUpgrade| async move { + let path = uri.path().to_string(); + let is_first = path.ends_with("/api/v1/stream/single/"); + let tx = tx.clone(); + ws.on_upgrade(move |mut socket| async move { + let version = if is_first { 42 } else { 43 }; + let event = serde_json::json!({ + "type": "container-schema", + "version": version + }); + let bin = rmp_serde::to_vec(&event).unwrap(); + socket + .send(axum::extract::ws::Message::Binary(bin.into())) + .await + .unwrap(); + let _ = tx.send(path).await; + }) + })); let listener = TcpListener::bind("127.0.0.1:0").await.unwrap(); let addr = listener.local_addr().unwrap(); + tokio::spawn(async move { + axum::serve(listener, app).await.unwrap(); + }); + let url = Url::parse(&format!("http://{addr}")).unwrap(); let client = TiledClient::new(url); - let server_handle = tokio::spawn(async move { - let (stream, _) = listener.accept().await.unwrap(); - let mut captured_path = String::new(); - let callback = |req: &Request, response: Response| { - captured_path = req.uri().path().to_string(); - Ok(response) - }; - let mut ws_stream = accept_hdr_async(stream, callback).await.unwrap(); - - let event = serde_json::json!({ - "type": "container-schema", - "version": 42 - }); - let bin = rmp_serde::to_vec(&event).unwrap(); - ws_stream.send(Message::Binary(bin.into())).await.unwrap(); - - let (stream, _) = listener.accept().await.unwrap(); - let mut captured_node_path = String::new(); - let callback = |req: &Request, response: Response| { - captured_node_path = req.uri().path().to_string(); - Ok(response) - }; - let mut ws_stream = accept_hdr_async(stream, callback).await.unwrap(); - - let event = serde_json::json!({ - "type": "container-schema", - "version": 43 - }); - let bin = rmp_serde::to_vec(&event).unwrap(); - ws_stream.send(Message::Binary(bin.into())).await.unwrap(); - - (captured_path, captured_node_path) - }); - let schema = Schema::build(crate::model::TiledQuery, EmptyMutation, TiledSubscription) .data(client) .finish(); + // Test events() let stream = schema.execute_stream("subscription { events { ... on ContainerSchema { version } } }"); let mut stream = Box::pin(stream); - let res = stream.next().await.unwrap(); + let res = tokio::time::timeout(std::time::Duration::from_secs(5), stream.next()) + .await + .expect("Timeout waiting for events") + .unwrap(); assert_eq!( res.data, async_graphql::value!({ "events": { "version": 42 } }) ); + // Test node_events(node: "foo") let stream = schema.execute_stream( "subscription { nodeEvents(node: \"foo\") { ... on ContainerSchema { version } } }", ); let mut stream = Box::pin(stream); - let res = stream.next().await.unwrap(); + let res = tokio::time::timeout(std::time::Duration::from_secs(5), stream.next()) + .await + .expect("Timeout waiting for nodeEvents") + .unwrap(); assert_eq!( res.data, async_graphql::value!({ "nodeEvents": { "version": 43 } }) ); - let (path, node_path) = server_handle.await.unwrap(); - assert_eq!(path, "/api/v1/stream/single/"); - assert_eq!(node_path, "/api/v1/stream/single/foo"); + let path1 = tokio::time::timeout(std::time::Duration::from_secs(5), rx.recv()) + .await + .expect("Timeout waiting for path1") + .unwrap(); + let path2 = tokio::time::timeout(std::time::Duration::from_secs(5), rx.recv()) + .await + .expect("Timeout waiting for path2") + .unwrap(); + + let paths = [path1, path2]; + assert!(paths.contains(&"/api/v1/stream/single/".to_string())); + assert!(paths.contains(&"/api/v1/stream/single/foo".to_string())); } } From a6742f938c283ff735f330e675638afa8d87d612 Mon Sep 17 00:00:00 2001 From: Zoheb Shaikh <26975142+ZohebShaikh@users.noreply.github.com> Date: Fri, 8 May 2026 09:03:48 +0100 Subject: [PATCH 04/22] Move thinks around --- src/clients.rs | 65 +++++++++++++++++++++++++++++++++-- src/model/subscription.rs | 71 +++------------------------------------ 2 files changed, 66 insertions(+), 70 deletions(-) diff --git a/src/clients.rs b/src/clients.rs index a54466a..cec3842 100644 --- a/src/clients.rs +++ b/src/clients.rs @@ -1,16 +1,21 @@ use std::borrow::Cow; use std::fmt; +use futures_util::{Stream, StreamExt}; #[cfg(test)] use httpmock::MockServer; use reqwest::header::HeaderMap; use reqwest::{Client, Url}; use serde::de::DeserializeOwned; +use tokio_tungstenite::connect_async; +use tokio_tungstenite::tungstenite::client::IntoClientRequest; use tracing::{debug, info, instrument}; +use crate::model::subscription::TiledEvent; use crate::model::{app, node, table}; pub type ClientResult = Result; +use tracing::error; #[derive(Clone)] pub struct TiledClient { @@ -30,9 +35,7 @@ impl TiledClient { address, } } - pub fn address(&self) -> &Url { - &self.address - } + #[instrument(skip(self, headers))] async fn request( &self, @@ -133,6 +136,62 @@ impl TiledClient { .await } + pub(crate) fn stream_events( + &self, + node: Option, + headers: Option, + ) -> impl Stream { + let scheme = match self.address.scheme() { + "http" => "ws", + "https" => "wss", + _ => "ws", + }; + + let path = if let Some(node_id) = node { + format!("api/v1/stream/single/{}", node_id) + } else { + "api/v1/stream/single/".to_string() + }; + + let mut url = self.address.join(&path).expect("Invalid stream path"); + url.set_scheme(scheme).ok(); + url.set_query(Some("envelope_format=msgpack")); + + let mut request = url.as_str().into_client_request().unwrap(); + if let Some(headers) = headers { + request.headers_mut().extend(headers); + } + async_stream::stream! { + info!("Connecting to WebSocket: {}", url); + let (ws_stream, _) = match connect_async(request).await { + Ok(ws) => ws, + Err(e) => { + return error!("Failed to connect to WebSocket: {}", e); + } + }; + + let (_, mut read) = ws_stream.split(); + + while let Some(msg) = read.next().await { + match msg { + Ok(tokio_tungstenite::tungstenite::Message::Binary(bin)) => { + match rmp_serde::from_slice::(&bin) { + Ok(event) => yield event, + Err(e) => { + error!("Failed to deserialize msgpack: {}, binary: {:?}", e, bin); + } + } + } + Ok(_) => {}, + Err(e) => { + error!("WebSocket error: {}", e); + break; + } + } + } + } + } + /// Create a new client for the given mock server #[cfg(test)] pub fn for_mock_server(server: &MockServer) -> Self { diff --git a/src/model/subscription.rs b/src/model/subscription.rs index 8917e1c..f9b5237 100644 --- a/src/model/subscription.rs +++ b/src/model/subscription.rs @@ -1,11 +1,7 @@ use async_graphql::{Context, SimpleObject, Subscription, Union}; -use axum::http::HeaderMap; -use futures_util::{Stream, StreamExt}; +use futures_util::Stream; use serde::Deserialize; use serde_json::Value; -use tokio_tungstenite::connect_async; -use tokio_tungstenite::tungstenite::client::IntoClientRequest; -use tracing::{error, info}; use crate::clients::TiledClient; use crate::handlers::AuthHeader; @@ -24,7 +20,7 @@ impl TiledSubscription { .and_then(|a| a.as_ref()); let headers = auth.map(|a| a.as_header_map()); - stream_events(client, None, headers) + client.stream_events(None, headers) } async fn node_events(&self, ctx: &Context<'_>, node: String) -> impl Stream { @@ -35,7 +31,7 @@ impl TiledSubscription { .data_opt::>() .and_then(|a| a.as_ref()); let headers = auth.map(|a| a.as_header_map()); - stream_events(client, Some(node), headers) + client.stream_events(Some(node), headers) } } @@ -133,65 +129,6 @@ pub enum TiledEvent { TableData(StreamTableData), } -fn stream_events( - client: &TiledClient, - node: Option, - headers: Option, -) -> impl Stream { - let mut url = client.address().clone(); - - let scheme = match url.scheme() { - "http" => "ws", - "https" => "wss", - _ => "ws", - }; - url.set_scheme(scheme).ok(); - - let path = if let Some(node_id) = node { - format!("api/v1/stream/single/{}", node_id) - } else { - "api/v1/stream/single/".to_string() - }; - - let mut url = url.join(&path).expect("Invalid stream path"); - url.set_query(Some("envelope_format=msgpack")); - - let mut request = url.as_str().into_client_request().unwrap(); - if let Some(headers) = headers { - request.headers_mut().extend(headers); - } - async_stream::stream! { - info!("Connecting to WebSocket: {}", url); - let (ws_stream, _) = match connect_async(request).await { - Ok(ws) => ws, - Err(e) => { - error!("Failed to connect to WebSocket: {}", e); - return; - } - }; - - let (_, mut read) = ws_stream.split(); - - while let Some(msg) = read.next().await { - match msg { - Ok(tokio_tungstenite::tungstenite::Message::Binary(bin)) => { - match rmp_serde::from_slice::(&bin) { - Ok(event) => yield event, - Err(e) => { - error!("Failed to deserialize msgpack: {}, binary: {:?}", e, bin); - } - } - } - Ok(_) => {}, - Err(e) => { - error!("WebSocket error: {}", e); - break; - } - } - } - } -} - #[cfg(test)] mod tests { use axum::Router; @@ -228,7 +165,7 @@ mod tests { let mut headers = HeaderMap::new(); headers.insert("Authorization", "Bearer test-token".parse().unwrap()); - let stream = stream_events(&client, None, Some(headers)); + let stream = client.stream_events(None, Some(headers)); tokio::pin!(stream); let _ = tokio::time::timeout(std::time::Duration::from_secs(5), stream.next()).await; From 2cb777dd6bd1cdb7ac6991a8064460c3761e9102 Mon Sep 17 00:00:00 2001 From: Zoheb Shaikh <26975142+ZohebShaikh@users.noreply.github.com> Date: Fri, 8 May 2026 09:26:10 +0100 Subject: [PATCH 05/22] fix other issues --- Cargo.lock | 1140 ++++++++++++++++++++++--------------- Cargo.toml | 2 - src/clients.rs | 5 +- src/handlers.rs | 12 +- src/model/subscription.rs | 17 +- 5 files changed, 686 insertions(+), 490 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 10e32e0..d446544 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -7,10 +7,6 @@ name = "Inflector" version = "0.11.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fe438c63458706e03479442743baae6c88256498e6431708f6dfc520a26515d3" -dependencies = [ - "lazy_static", - "regex", -] [[package]] name = "aho-corasick" @@ -21,20 +17,11 @@ dependencies = [ "memchr", ] -[[package]] -name = "android_system_properties" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" -dependencies = [ - "libc", -] - [[package]] name = "anstream" -version = "0.6.21" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43d5b281e737544384e969a5ccad3f1cdd24b48086a0fc1b2a5262a26b8f4f4a" +checksum = "824a212faf96e9acacdbd09febd34438f8f711fb84e09a8916013cd7815ca28d" dependencies = [ "anstyle", "anstyle-parse", @@ -47,39 +34,45 @@ dependencies = [ [[package]] name = "anstyle" -version = "1.0.13" +version = "1.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5192cca8006f1fd4f7237516f40fa183bb07f8fbdfedaa0036de5ea9b0b45e78" +checksum = "940b3a0ca603d1eade50a4846a2afffd5ef57a9feac2c0e2ec2e14f9ead76000" [[package]] name = "anstyle-parse" -version = "0.2.7" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e7644824f0aa2c7b9384579234ef10eb7efb6a0deb83f9630a49594dd9c15c2" +checksum = "52ce7f38b242319f7cabaa6813055467063ecdc9d355bbb4ce0c68908cd8130e" dependencies = [ "utf8parse", ] [[package]] name = "anstyle-query" -version = "1.1.4" +version = "1.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e231f6134f61b71076a3eab506c379d4f36122f2af15a9ff04415ea4c3339e2" +checksum = "40c48f72fd53cd289104fc64099abca73db4166ad86ea0b4341abe65af83dadc" dependencies = [ - "windows-sys 0.60.2", + "windows-sys 0.61.2", ] [[package]] name = "anstyle-wincon" -version = "3.0.10" +version = "3.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e0633414522a32ffaac8ac6cc8f748e090c5717661fddeea04219e2344f5f2a" +checksum = "291e6a250ff86cd4a820112fb8898808a366d8f9f58ce16d1f538353ad55747d" dependencies = [ "anstyle", "once_cell_polyfill", - "windows-sys 0.60.2", + "windows-sys 0.61.2", ] +[[package]] +name = "anyhow" +version = "1.0.102" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f202df86484c868dbad7eaa557ef785d5c66295e41b460ef922eca0723b842c" + [[package]] name = "arraydeque" version = "0.5.1" @@ -104,20 +97,20 @@ dependencies = [ [[package]] name = "async-graphql" -version = "7.0.17" +version = "7.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "036618f842229ba0b89652ffe425f96c7c16a49f7e3cb23b56fca7f61fd74980" +checksum = "1057a9f7ccf2404d94571dec3451ade1cb524790df6f1ada0d19c2a49f6b0f40" dependencies = [ "async-graphql-derive", "async-graphql-parser", "async-graphql-value", - "async-stream", + "async-io", "async-trait", - "base64 0.22.1", + "asynk-strim", + "base64", "bytes", "fast_chemail", "fnv", - "futures-timer", "futures-util", "handlebars", "http", @@ -132,15 +125,15 @@ dependencies = [ "serde_urlencoded", "static_assertions_next", "tempfile", - "thiserror 1.0.69", + "thiserror", "uuid", ] [[package]] name = "async-graphql-axum" -version = "7.0.17" +version = "7.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8725874ecfbf399e071150b8619c4071d7b2b7a2f117e173dddef53c6bdb6bb1" +checksum = "a1e37c5532e4b686acf45e7162bc93da91fc2c702fb0d465efc2c20c8f973795" dependencies = [ "async-graphql", "axum", @@ -155,26 +148,26 @@ dependencies = [ [[package]] name = "async-graphql-derive" -version = "7.0.17" +version = "7.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd45deb3dbe5da5cdb8d6a670a7736d735ba65b455328440f236dfb113727a3d" +checksum = "2e6cbeadc8515e66450fba0985ce722192e28443697799988265d86304d7cc68" dependencies = [ "Inflector", "async-graphql-parser", - "darling", + "darling 0.23.0", "proc-macro-crate", "proc-macro2", "quote", "strum", "syn", - "thiserror 1.0.69", + "thiserror", ] [[package]] name = "async-graphql-parser" -version = "7.0.17" +version = "7.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60b7607e59424a35dadbc085b0d513aa54ec28160ee640cf79ec3b634eba66d3" +checksum = "e64ef70f77a1c689111e52076da1cd18f91834bcb847de0a9171f83624b07fbf" dependencies = [ "async-graphql-value", "pest", @@ -184,9 +177,9 @@ dependencies = [ [[package]] name = "async-graphql-value" -version = "7.0.17" +version = "7.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34ecdaff7c9cffa3614a9f9999bf9ee4c3078fe3ce4d6a6e161736b56febf2de" +checksum = "3e3ef112905abea9dea592fc868a6873b10ebd3f983e83308f995d6284e9ba41" dependencies = [ "bytes", "indexmap", @@ -194,11 +187,29 @@ dependencies = [ "serde_json", ] +[[package]] +name = "async-io" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "456b8a8feb6f42d237746d4b3e9a178494627745c3c56c6ea55d92ba50d026fc" +dependencies = [ + "autocfg", + "cfg-if", + "concurrent-queue", + "futures-io", + "futures-lite", + "parking", + "polling", + "rustix", + "slab", + "windows-sys 0.61.2", +] + [[package]] name = "async-lock" -version = "3.4.1" +version = "3.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5fd03604047cee9b6ce9de9f70c6cd540a0520c813cbd49bae61f33ab80ed1dc" +checksum = "290f7f2596bd5b78a9fec8088ccd89180d7f9f55b94b0576823bbbdc72ee8311" dependencies = [ "event-listener", "event-listener-strategy", @@ -248,6 +259,16 @@ dependencies = [ "syn", ] +[[package]] +name = "asynk-strim" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52697735bdaac441a29391a9e97102c74c6ef0f9b60a40cf109b1b404e29d2f6" +dependencies = [ + "futures-core", + "pin-project-lite", +] + [[package]] name = "atomic-waker" version = "1.1.2" @@ -262,12 +283,12 @@ checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" [[package]] name = "axum" -version = "0.8.6" +version = "0.8.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a18ed336352031311f4e0b4dd2ff392d4fbb370777c9d18d7fc9d7359f73871" +checksum = "31b698c5f9a010f6573133b09e0de5408834d0c82f8d7475a89fc1867a71cd90" dependencies = [ "axum-core", - "base64 0.22.1", + "base64", "bytes", "form_urlencoded", "futures-util", @@ -289,7 +310,7 @@ dependencies = [ "sha1", "sync_wrapper", "tokio", - "tokio-tungstenite", + "tokio-tungstenite 0.29.0", "tower", "tower-layer", "tower-service", @@ -298,9 +319,9 @@ dependencies = [ [[package]] name = "axum-core" -version = "0.5.5" +version = "0.5.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59446ce19cd142f8833f856eb31f3eb097812d1479ab224f54d72428ca21ea22" +checksum = "08c78f31d7b1291f7ee735c1c6780ccde7785daae9a9206026862dab7d8792d1" dependencies = [ "bytes", "futures-core", @@ -315,12 +336,6 @@ dependencies = [ "tracing", ] -[[package]] -name = "base64" -version = "0.21.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" - [[package]] name = "base64" version = "0.22.1" @@ -329,9 +344,9 @@ checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" [[package]] name = "bitflags" -version = "2.10.0" +version = "2.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "812e12b5285cc515a9c72a5c1d3b6d46a19dac5acfef5265968c166106e31dd3" +checksum = "c4512299f36f043ab09a583e57bceb5a5aab7a73db1805848e8fef3c9e8c78b3" dependencies = [ "serde_core", ] @@ -347,24 +362,24 @@ dependencies = [ [[package]] name = "bumpalo" -version = "3.19.0" +version = "3.20.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46c5e41b57b8bba42a04676d81cb89e9ee8e859a1a66f80a5a72e1cb76b34d43" +checksum = "5d20789868f4b01b2f2caec9f5c4e0213b41e3e5702a50157d699ae31ced2fcb" [[package]] name = "bytes" -version = "1.10.1" +version = "1.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" +checksum = "1e748733b7cbc798e1434b6ac524f0c1ff2ab456fe201501e6497c8417a4fc33" dependencies = [ "serde", ] [[package]] name = "cc" -version = "1.2.45" +version = "1.2.61" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35900b6c8d709fb1d854671ae27aeaa9eec2f8b01b364e1619a40da3e6fe2afe" +checksum = "d16d90359e986641506914ba71350897565610e87ce0ad9e6f28569db3dd5c6d" dependencies = [ "find-msvc-tools", "shlex", @@ -382,25 +397,11 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" -[[package]] -name = "chrono" -version = "0.4.44" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c673075a2e0e5f4a1dde27ce9dee1ea4558c7ffe648f576438a20ca1d2acc4b0" -dependencies = [ - "iana-time-zone", - "js-sys", - "num-traits", - "serde", - "wasm-bindgen", - "windows-link", -] - [[package]] name = "clap" -version = "4.5.51" +version = "4.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c26d721170e0295f191a69bd9a1f93efcdb0aff38684b61ab5750468972e5f5" +checksum = "1ddb117e43bbf7dacf0a4190fef4d345b9bad68dfc649cb349e7d17d28428e51" dependencies = [ "clap_builder", "clap_derive", @@ -408,9 +409,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.51" +version = "4.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75835f0c7bf681bfd05abe44e965760fea999a5286c6eb2d59883634fd02011a" +checksum = "714a53001bf66416adb0e2ef5ac857140e7dc3a0c48fb28b2f10762fc4b5069f" dependencies = [ "anstream", "anstyle", @@ -420,9 +421,9 @@ dependencies = [ [[package]] name = "clap_derive" -version = "4.5.49" +version = "4.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a0b5487afeab2deb2ff4e03a807ad1a03ac532ff5a2cee5d86884440c7f7671" +checksum = "f2ce8604710f6733aa641a2b3731eaa1e8b3d9973d5e3565da11800813f997a9" dependencies = [ "heck", "proc-macro2", @@ -432,15 +433,15 @@ dependencies = [ [[package]] name = "clap_lex" -version = "0.7.6" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1d728cc89cf3aee9ff92b05e62b19ee65a02b5702cff7d5a377e32c6ae29d8d" +checksum = "c8d4a3bb8b1e0c1050499d1815f5ab16d04f0959b233085fb31653fbfc9d98f9" [[package]] name = "colorchoice" -version = "1.0.4" +version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b05b61dc5112cbb17e4b6cd61790d9845d13888356391624cbe7e41efeac1e75" +checksum = "1d07550c9036bf2ae0c684c4297d503f838287c83c53686d05370d0e139ae570" [[package]] name = "concurrent-queue" @@ -453,9 +454,9 @@ dependencies = [ [[package]] name = "config" -version = "0.15.18" +version = "0.15.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "180e549344080374f9b32ed41bf3b6b57885ff6a289367b3dbc10eea8acc1918" +checksum = "8e68cfe19cd7d23ffde002c24ffa5cda73931913ef394d5eaaa32037dc940c0c" dependencies = [ "async-trait", "convert_case", @@ -486,7 +487,7 @@ version = "0.1.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f9d839f2a20b0aee515dc581a6172f2321f96cab76c1a38a4c584a194955390e" dependencies = [ - "getrandom 0.2.16", + "getrandom 0.2.17", "once_cell", "tiny-keccak", ] @@ -539,9 +540,9 @@ checksum = "460fbee9c2c2f33933d720630a6a0bac33ba7053db5344fac858d4b8952d77d5" [[package]] name = "crypto-common" -version = "0.1.6" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" +checksum = "78c8292055d1c1df0cce5d180393dc8cce0abec0a7102adb6c7b1eef6016d60a" dependencies = [ "generic-array", "typenum", @@ -553,8 +554,18 @@ version = "0.20.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fc7f46116c46ff9ab3eb1597a45688b6715c6e628b5c133e288e709a29bcb4ee" dependencies = [ - "darling_core", - "darling_macro", + "darling_core 0.20.11", + "darling_macro 0.20.11", +] + +[[package]] +name = "darling" +version = "0.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "25ae13da2f202d56bd7f91c25fba009e7717a1e4a1cc98a76d844b65ae912e9d" +dependencies = [ + "darling_core 0.23.0", + "darling_macro 0.23.0", ] [[package]] @@ -571,22 +582,77 @@ dependencies = [ "syn", ] +[[package]] +name = "darling_core" +version = "0.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9865a50f7c335f53564bb694ef660825eb8610e0a53d3e11bf1b0d3df31e03b0" +dependencies = [ + "ident_case", + "proc-macro2", + "quote", + "strsim", + "syn", +] + [[package]] name = "darling_macro" version = "0.20.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fc34b93ccb385b40dc71c6fceac4b2ad23662c7eeb248cf10d529b7e055b6ead" dependencies = [ - "darling_core", + "darling_core 0.20.11", + "quote", + "syn", +] + +[[package]] +name = "darling_macro" +version = "0.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3984ec7bd6cfa798e62b4a642426a5be0e68f9401cfc2a01e3fa9ea2fcdb8d" +dependencies = [ + "darling_core 0.23.0", "quote", "syn", ] [[package]] name = "data-encoding" -version = "2.9.0" +version = "2.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4ae5f15dda3c708c0ade84bfee31ccab44a3da4f88015ed22f63732abe300c8" + +[[package]] +name = "derive_builder" +version = "0.20.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "507dfb09ea8b7fa618fcf76e953f4f5e192547945816d5358edffe39f6f94947" +dependencies = [ + "derive_builder_macro", +] + +[[package]] +name = "derive_builder_core" +version = "0.20.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a2330da5de22e8a3cb63252ce2abb30116bf5265e89c0e01bc17015ce30a476" +checksum = "2d5bcf7b024d6835cfb3d473887cd966994907effbe9227e8c8219824d06c4e8" +dependencies = [ + "darling 0.20.11", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "derive_builder_macro" +version = "0.20.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab63b0e2bf4d5928aff72e83a7dace85d7bba5fe12dcc3c5a572d78caffd3f3c" +dependencies = [ + "derive_builder_core", + "syn", +] [[package]] name = "digest" @@ -635,9 +701,9 @@ checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" [[package]] name = "erased-serde" -version = "0.4.9" +version = "0.4.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89e8918065695684b2b0702da20382d5ae6065cf3327bc2d6436bd49a71ce9f3" +checksum = "d2add8a07dd6a8d93ff627029c51de145e12686fbc36ecb298ac22e74cf02dec" dependencies = [ "serde", "serde_core", @@ -686,15 +752,15 @@ dependencies = [ [[package]] name = "fastrand" -version = "2.3.0" +version = "2.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" +checksum = "9f1f227452a390804cdb637b74a86990f2a7d7ba4b7d5693aac9b4dd6defd8d6" [[package]] name = "find-msvc-tools" -version = "0.1.4" +version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52051878f80a721bb68ebfbc930e07b65ba72f2da88968ea5c06fd6ca3d3a127" +checksum = "5baebc0774151f905a1a2cc41989300b1e6fbb29aff0ceffa1064fdd3088d582" [[package]] name = "fnv" @@ -719,9 +785,9 @@ dependencies = [ [[package]] name = "futures-channel" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" +checksum = "07bbe89c50d7a535e539b8c17bc0b49bdb77747034daa8087407d655f3f7cc1d" dependencies = [ "futures-core", ] @@ -738,6 +804,16 @@ version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cecba35d7ad927e23624b22ad55235f2239cfa44fd10428eecbeba6d6a717718" +[[package]] +name = "futures-lite" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f78e10609fe0e0b3f4157ffab1876319b5b0db102a2c60dc4626306dc46b44ad" +dependencies = [ + "futures-core", + "pin-project-lite", +] + [[package]] name = "futures-macro" version = "0.3.32" @@ -785,9 +861,9 @@ dependencies = [ [[package]] name = "generic-array" -version = "0.14.9" +version = "0.14.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4bb6743198531e02858aeaea5398fcc883e71851fcbcb5a2f773e2fb6cb1edf2" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" dependencies = [ "typenum", "version_check", @@ -795,9 +871,9 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.2.16" +version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592" +checksum = "ff2abc00be7fca6ebc474524697ae276ad847ad0a6b3faa4bcb027e9a4614ad0" dependencies = [ "cfg-if", "js-sys", @@ -815,11 +891,24 @@ dependencies = [ "cfg-if", "js-sys", "libc", - "r-efi", + "r-efi 5.3.0", "wasip2", "wasm-bindgen", ] +[[package]] +name = "getrandom" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0de51e6874e94e7bf76d726fc5d13ba782deca734ff60d5bb2fb2607c7406555" +dependencies = [ + "cfg-if", + "libc", + "r-efi 6.0.0", + "wasip2", + "wasip3", +] + [[package]] name = "glazed" version = "0.0.0" @@ -828,7 +917,6 @@ dependencies = [ "async-graphql-axum", "async-stream", "axum", - "chrono", "clap", "config", "futures-util", @@ -837,10 +925,9 @@ dependencies = [ "reqwest", "rmp-serde", "serde", - "serde_bytes", "serde_json", "tokio", - "tokio-tungstenite", + "tokio-tungstenite 0.28.0", "tower", "tracing", "tracing-subscriber", @@ -850,9 +937,9 @@ dependencies = [ [[package]] name = "h2" -version = "0.4.12" +version = "0.4.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3c0b69cfcb4e1b9f1bf2f53f95f766e4661169728ec61cd3fe5a0166f2d1386" +checksum = "171fefbc92fe4a4de27e0698d6a5b392d6a0e333506bc49133760b3bcf948733" dependencies = [ "atomic-waker", "bytes", @@ -869,16 +956,18 @@ dependencies = [ [[package]] name = "handlebars" -version = "5.1.2" +version = "6.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d08485b96a0e6393e9e4d1b8d48cf74ad6c063cd905eb33f42c1ce3f0377539b" +checksum = "9b3f9296c208515b87bd915a2f5d1163d4b3f863ba83337d7713cf478055948e" dependencies = [ + "derive_builder", "log", + "num-order", "pest", "pest_derive", "serde", "serde_json", - "thiserror 1.0.69", + "thiserror", ] [[package]] @@ -898,9 +987,9 @@ dependencies = [ [[package]] name = "hashbrown" -version = "0.16.0" +version = "0.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5419bdc4f6a9207fbeba6d11b604d481addf78ecd10c11ad51e76c2f6482748d" +checksum = "4f467dd6dccf739c208452f8014c75c18bb8301b050ad1cfb27153803edb0f51" [[package]] name = "hashlink" @@ -917,7 +1006,7 @@ version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b3314d5adb5d94bcdf56771f2e50dbbc80bb4bdf88967526706205ac9eff24eb" dependencies = [ - "base64 0.22.1", + "base64", "bytes", "headers-core", "http", @@ -941,14 +1030,19 @@ version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" +[[package]] +name = "hermit-abi" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc0fef456e4baa96da950455cd02c081ca953b141298e41db3fc7e36b1da849c" + [[package]] name = "http" -version = "1.3.1" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4a85d31aea989eead29a3aaf9e1115a180df8282431156e533de47660892565" +checksum = "e3ba2a386d7f85a81f119ad7498ebe444d2e22c2af0b86b069416ace48b3311a" dependencies = [ "bytes", - "fnv", "itoa", ] @@ -989,14 +1083,14 @@ checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" [[package]] name = "httpmock" -version = "0.8.2" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "511f510e9b1888d67f10bab4397f8b019d2a9b249a2c10acbce2d705b1b32e26" +checksum = "bf4888a4d02d8e1f92ffb6b4965cf5ff56dda36ef41975f41c6fa0f6bde78c4e" dependencies = [ "assert-json-diff", "async-object-pool", "async-trait", - "base64 0.22.1", + "base64", "bytes", "crossbeam-utils", "form_urlencoded", @@ -1015,7 +1109,7 @@ dependencies = [ "similar", "stringmetrics", "tabwriter", - "thiserror 2.0.17", + "thiserror", "tokio", "tracing", "url", @@ -1023,9 +1117,9 @@ dependencies = [ [[package]] name = "hyper" -version = "1.7.0" +version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb3aa54a13a0dfe7fbe3a59e0c76093041720fdc77b110cc0fc260fafb4dc51e" +checksum = "6299f016b246a94207e63da54dbe807655bf9e00044f73ded42c3ac5305fbcca" dependencies = [ "atomic-waker", "bytes", @@ -1038,7 +1132,6 @@ dependencies = [ "httpdate", "itoa", "pin-project-lite", - "pin-utils", "smallvec", "tokio", "want", @@ -1046,15 +1139,14 @@ dependencies = [ [[package]] name = "hyper-rustls" -version = "0.27.7" +version = "0.27.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3c93eb611681b207e1fe55d5a71ecf91572ec8a6705cdb6857f7d8d5242cf58" +checksum = "33ca68d021ef39cf6463ab54c1d0f5daf03377b70561305bb89a8f83aab66e0f" dependencies = [ "http", "hyper", "hyper-util", "rustls", - "rustls-pki-types", "tokio", "tokio-rustls", "tower-service", @@ -1063,14 +1155,13 @@ dependencies = [ [[package]] name = "hyper-util" -version = "0.1.17" +version = "0.1.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c6995591a8f1380fcb4ba966a252a4b29188d51d2b89e3a252f5305be65aea8" +checksum = "96547c2556ec9d12fb1578c4eaf448b04993e7fb79cbaad930a656880a6bdfa0" dependencies = [ - "base64 0.22.1", + "base64", "bytes", "futures-channel", - "futures-core", "futures-util", "http", "http-body", @@ -1085,38 +1176,15 @@ dependencies = [ "tracing", ] -[[package]] -name = "iana-time-zone" -version = "0.1.65" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e31bc9ad994ba00e440a8aa5c9ef0ec67d5cb5e5cb0cc7f8b744a35b389cc470" -dependencies = [ - "android_system_properties", - "core-foundation-sys", - "iana-time-zone-haiku", - "js-sys", - "log", - "wasm-bindgen", - "windows-core", -] - -[[package]] -name = "iana-time-zone-haiku" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" -dependencies = [ - "cc", -] - [[package]] name = "icu_collections" -version = "2.1.1" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c6b649701667bbe825c3b7e6388cb521c23d88644678e83c0c4d0a621a34b43" +checksum = "2984d1cd16c883d7935b9e07e44071dca8d917fd52ecc02c04d5fa0b5a3f191c" dependencies = [ "displaydoc", "potential_utf", + "utf8_iter", "yoke", "zerofrom", "zerovec", @@ -1124,9 +1192,9 @@ dependencies = [ [[package]] name = "icu_locale_core" -version = "2.1.1" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "edba7861004dd3714265b4db54a3c390e880ab658fec5f7db895fae2046b5bb6" +checksum = "92219b62b3e2b4d88ac5119f8904c10f8f61bf7e95b640d25ba3075e6cac2c29" dependencies = [ "displaydoc", "litemap", @@ -1137,9 +1205,9 @@ dependencies = [ [[package]] name = "icu_normalizer" -version = "2.1.1" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f6c8828b67bf8908d82127b2054ea1b4427ff0230ee9141c54251934ab1b599" +checksum = "c56e5ee99d6e3d33bd91c5d85458b6005a22140021cc324cea84dd0e72cff3b4" dependencies = [ "icu_collections", "icu_normalizer_data", @@ -1151,15 +1219,15 @@ dependencies = [ [[package]] name = "icu_normalizer_data" -version = "2.1.1" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7aedcccd01fc5fe81e6b489c15b247b8b0690feb23304303a9e560f37efc560a" +checksum = "da3be0ae77ea334f4da67c12f149704f19f81d1adf7c51cf482943e84a2bad38" [[package]] name = "icu_properties" -version = "2.1.1" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e93fcd3157766c0c8da2f8cff6ce651a31f0810eaa1c51ec363ef790bbb5fb99" +checksum = "bee3b67d0ea5c2cca5003417989af8996f8604e34fb9ddf96208a033901e70de" dependencies = [ "icu_collections", "icu_locale_core", @@ -1171,15 +1239,15 @@ dependencies = [ [[package]] name = "icu_properties_data" -version = "2.1.1" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02845b3647bb045f1100ecd6480ff52f34c35f82d9880e029d329c21d1054899" +checksum = "8e2bbb201e0c04f7b4b3e14382af113e17ba4f63e2c9d2ee626b720cbce54a14" [[package]] name = "icu_provider" -version = "2.1.1" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85962cf0ce02e1e0a629cc34e7ca3e373ce20dda4c4d7294bbd0bf1fdb59e614" +checksum = "139c4cf31c8b5f33d7e199446eff9c1e02decfc2f0eec2c8d71f65befa45b421" dependencies = [ "displaydoc", "icu_locale_core", @@ -1190,6 +1258,12 @@ dependencies = [ "zerovec", ] +[[package]] +name = "id-arena" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d3067d79b975e8844ca9eb072e16b31c3c1c36928edf9c6789548c524d0d954" + [[package]] name = "ident_case" version = "1.0.1" @@ -1209,9 +1283,9 @@ dependencies = [ [[package]] name = "idna_adapter" -version = "1.2.1" +version = "1.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344" +checksum = "cb68373c0d6620ef8105e855e7745e18b0d00d3bdb07fb532e434244cdb9a714" dependencies = [ "icu_normalizer", "icu_properties", @@ -1219,31 +1293,21 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.12.0" +version = "2.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6717a8d2a5a929a1a2eb43a12812498ed141a0bcfb7e8f7844fbdbe4303bba9f" +checksum = "d466e9454f08e4a911e14806c24e16fba1b4c121d1ea474396f396069cf949d9" dependencies = [ "equivalent", - "hashbrown 0.16.0", + "hashbrown 0.17.0", "serde", "serde_core", ] [[package]] name = "ipnet" -version = "2.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130" - -[[package]] -name = "iri-string" -version = "0.7.9" +version = "2.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f867b9d1d896b67beb18518eda36fdb77a32ea590de864f1325b294a6d14397" -dependencies = [ - "memchr", - "serde", -] +checksum = "d98f6fed1fde3f8c21bc40a1abb88dd75e67924f9cffc3ef95607bad8017f8e2" [[package]] name = "is_terminal_polyfill" @@ -1253,16 +1317,18 @@ checksum = "a6cb138bb79a146c1bd460005623e142ef0181e3d0219cb493e02f7d08a35695" [[package]] name = "itoa" -version = "1.0.15" +version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" +checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682" [[package]] name = "js-sys" -version = "0.3.82" +version = "0.3.98" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b011eec8cc36da2aab2d5cff675ec18454fad408585853910a202391cf9f8e65" +checksum = "67df7112613f8bfd9150013a0314e196f4800d3201ae742489d999db2f979f08" dependencies = [ + "cfg-if", + "futures-util", "once_cell", "wasm-bindgen", ] @@ -1284,23 +1350,29 @@ version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" +[[package]] +name = "leb128fmt" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09edd9e8b54e49e587e4f6295a7d29c3ea94d469cb40ab8ca70b288248a81db2" + [[package]] name = "libc" -version = "0.2.177" +version = "0.2.186" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2874a2af47a2325c2001a6e6fad9b16a53b802102b528163885171cf92b15976" +checksum = "68ab91017fe16c622486840e4c83c9a37afeff978bd239b5293d61ece587de66" [[package]] name = "linux-raw-sys" -version = "0.11.0" +version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df1d3c3b53da64cf5760482273a98e575c651a67eec7f77df96b5b642de8f039" +checksum = "32a66949e030da00e8c7d4434b251670a91556f4144941d37452769c25d58a53" [[package]] name = "litemap" -version = "0.8.1" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6373607a59f0be73a39b6fe456b8192fcc3585f602af20751600e974dd455e77" +checksum = "92daf443525c4cce67b150400bc2316076100ce0b3686209eb8cf3c31612e6f0" [[package]] name = "lock_api" @@ -1313,9 +1385,9 @@ dependencies = [ [[package]] name = "log" -version = "0.4.28" +version = "0.4.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34080505efa8e45a4b816c349525ebe327ceaa8559756f0356cba97ef3bf7432" +checksum = "5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897" [[package]] name = "lru-slab" @@ -1331,9 +1403,9 @@ checksum = "47e1ffaa40ddd1f3ed91f717a33c8c0ee23fff369e3aa8772b9605cc1d22f4c3" [[package]] name = "memchr" -version = "2.7.6" +version = "2.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f52b00d39961fc5b2736ea853c9cc86238e165017a493d1d5c8eac6bdc4cc273" +checksum = "f8ca58f447f06ed17d5fc4043ce1b10dd205e060fb3ce5b979b8ed8e59ff3f79" [[package]] name = "mime" @@ -1343,9 +1415,9 @@ checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" [[package]] name = "mio" -version = "1.1.0" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69d83b0086dc8ecf3ce9ae2874b2d1290252e2a30720bea58a5c6639b0092873" +checksum = "50b7e5b27aa02a74bac8c3f23f448f8d87ff11f92d3aac1a6ed369ee08cc56c1" dependencies = [ "libc", "wasi", @@ -1378,6 +1450,21 @@ dependencies = [ "windows-sys 0.61.2", ] +[[package]] +name = "num-modular" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17bb261bf36fa7d83f4c294f834e91256769097b3cb505d44831e0a179ac647f" + +[[package]] +name = "num-order" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "537b596b97c40fcf8056d153049eb22f481c17ebce72a513ec9286e4986d1bb6" +dependencies = [ + "num-modular", +] + [[package]] name = "num-traits" version = "0.2.19" @@ -1389,9 +1476,9 @@ dependencies = [ [[package]] name = "once_cell" -version = "1.21.3" +version = "1.21.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" +checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50" [[package]] name = "once_cell_polyfill" @@ -1467,9 +1554,9 @@ checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" [[package]] name = "pest" -version = "2.8.3" +version = "2.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "989e7521a040efde50c3ab6bbadafbe15ab6dc042686926be59ac35d74607df4" +checksum = "e0848c601009d37dfa3430c4666e147e49cdcf1b92ecd3e63657d8a5f19da662" dependencies = [ "memchr", "ucd-trie", @@ -1477,9 +1564,9 @@ dependencies = [ [[package]] name = "pest_derive" -version = "2.8.3" +version = "2.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "187da9a3030dbafabbbfb20cb323b976dc7b7ce91fcd84f2f74d6e31d378e2de" +checksum = "11f486f1ea21e6c10ed15d5a7c77165d0ee443402f0780849d1768e7d9d6fe77" dependencies = [ "pest", "pest_generator", @@ -1487,9 +1574,9 @@ dependencies = [ [[package]] name = "pest_generator" -version = "2.8.3" +version = "2.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49b401d98f5757ebe97a26085998d6c0eecec4995cad6ab7fc30ffdf4b052843" +checksum = "8040c4647b13b210a963c1ed407c1ff4fdfa01c31d6d2a098218702e6664f94f" dependencies = [ "pest", "pest_meta", @@ -1500,9 +1587,9 @@ dependencies = [ [[package]] name = "pest_meta" -version = "2.8.3" +version = "2.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72f27a2cfee9f9039c4d86faa5af122a0ac3851441a34865b8a043b46be0065a" +checksum = "89815c69d36021a140146f26659a81d6c2afa33d216d736dd4be5381a7362220" dependencies = [ "pest", "sha2", @@ -1510,21 +1597,29 @@ dependencies = [ [[package]] name = "pin-project-lite" -version = "0.2.16" +version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" +checksum = "a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd" [[package]] -name = "pin-utils" -version = "0.1.0" +name = "polling" +version = "3.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" +checksum = "5d0e4f59085d47d8241c88ead0f274e8a0cb551f3625263c05eb8dd897c34218" +dependencies = [ + "cfg-if", + "concurrent-queue", + "hermit-abi", + "pin-project-lite", + "rustix", + "windows-sys 0.61.2", +] [[package]] name = "potential_utf" -version = "0.1.4" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b73949432f5e2a09657003c25bca5e19a0e9c84f8058ca374f49e0ebe605af77" +checksum = "0103b1cef7ec0cf76490e969665504990193874ea05c85ff9bab8b911d0a0564" dependencies = [ "zerovec", ] @@ -1538,20 +1633,30 @@ dependencies = [ "zerocopy", ] +[[package]] +name = "prettyplease" +version = "0.2.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b" +dependencies = [ + "proc-macro2", + "syn", +] + [[package]] name = "proc-macro-crate" -version = "3.4.0" +version = "3.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "219cb19e96be00ab2e37d6e299658a0cfa83e52429179969b0f0121b4ac46983" +checksum = "e67ba7e9b2b56446f1d419b1d807906278ffa1a658a8a5d8a39dcb1f5a78614f" dependencies = [ "toml_edit", ] [[package]] name = "proc-macro2" -version = "1.0.103" +version = "1.0.106" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ee95bc4ef87b8d5ba32e8b7714ccc834865276eab0aed5c9958d00ec45f49e8" +checksum = "8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934" dependencies = [ "unicode-ident", ] @@ -1570,7 +1675,7 @@ dependencies = [ "rustc-hash", "rustls", "socket2", - "thiserror 2.0.17", + "thiserror", "tokio", "tracing", "web-time", @@ -1578,9 +1683,9 @@ dependencies = [ [[package]] name = "quinn-proto" -version = "0.11.13" +version = "0.11.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1906b49b0c3bc04b5fe5d86a77925ae6524a19b816ae38ce1e426255f1d8a31" +checksum = "434b42fec591c96ef50e21e886936e66d3cc3f737104fdb9b737c40ffb94c098" dependencies = [ "bytes", "getrandom 0.3.4", @@ -1591,7 +1696,7 @@ dependencies = [ "rustls", "rustls-pki-types", "slab", - "thiserror 2.0.17", + "thiserror", "tinyvec", "tracing", "web-time", @@ -1613,9 +1718,9 @@ dependencies = [ [[package]] name = "quote" -version = "1.0.42" +version = "1.0.45" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a338cc41d27e6cc6dce6cefc13a0729dfbb81c262b1f519331575dd80ef3067f" +checksum = "41f2619966050689382d2b44f664f4bc593e129785a36d6ee376ddf37259b924" dependencies = [ "proc-macro2", ] @@ -1626,11 +1731,17 @@ version = "5.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" +[[package]] +name = "r-efi" +version = "6.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf" + [[package]] name = "rand" -version = "0.9.2" +version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1" +checksum = "44c5af06bb1b7d3216d91932aed5265164bf384dc89cd6ba05cf59a35f5f76ea" dependencies = [ "rand_chacha", "rand_core", @@ -1648,9 +1759,9 @@ dependencies = [ [[package]] name = "rand_core" -version = "0.9.3" +version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38" +checksum = "76afc826de14238e6e8c374ddcc1fa19e374fd8dd986b0d2af0d02377261d83c" dependencies = [ "getrandom 0.3.4", ] @@ -1666,9 +1777,9 @@ dependencies = [ [[package]] name = "regex" -version = "1.12.2" +version = "1.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "843bc0191f75f3e22651ae5f1e72939ab2f72a4bc30fa80a066bd66edefc24d4" +checksum = "e10754a14b9137dd7b1e3e5b0493cc9171fdd105e0ab477f51b72e7f3ac0e276" dependencies = [ "aho-corasick", "memchr", @@ -1678,9 +1789,9 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.13" +version = "0.4.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5276caf25ac86c8d810222b3dbb938e512c55c6831a10f3e6ed1c93b84041f1c" +checksum = "6e1dd4122fc1595e8162618945476892eefca7b88c52820e74af6262213cae8f" dependencies = [ "aho-corasick", "memchr", @@ -1689,17 +1800,17 @@ dependencies = [ [[package]] name = "regex-syntax" -version = "0.8.8" +version = "0.8.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a2d987857b319362043e95f5353c0535c1f58eec5336fdfcf626430af7def58" +checksum = "dc897dd8d9e8bd1ed8cdad82b5966c3e0ecae09fb1907d58efaa013543185d0a" [[package]] name = "reqwest" -version = "0.12.24" +version = "0.12.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d0946410b9f7b082a427e4ef5c8ff541a88b357bc6c637c40db3a68ac70a36f" +checksum = "eddd3ca559203180a307f12d114c268abf583f59b03cb906fd0b3ff8646c1147" dependencies = [ - "base64 0.22.1", + "base64", "bytes", "futures-core", "futures-util", @@ -1742,7 +1853,7 @@ checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" dependencies = [ "cc", "cfg-if", - "getrandom 0.2.16", + "getrandom 0.2.17", "libc", "untrusted", "windows-sys 0.52.0", @@ -1769,14 +1880,16 @@ dependencies = [ [[package]] name = "ron" -version = "0.8.1" +version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b91f7eff05f748767f183df4320a63d6936e9c6107d97c9e6bdd9784f4289c94" +checksum = "4147b952f3f819eca0e99527022f7d6a8d05f111aeb0a62960c74eb283bec8fc" dependencies = [ - "base64 0.21.7", "bitflags", + "once_cell", "serde", "serde_derive", + "typeid", + "unicode-ident", ] [[package]] @@ -1791,15 +1904,15 @@ dependencies = [ [[package]] name = "rustc-hash" -version = "2.1.1" +version = "2.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "357703d41365b4b27c590e3ed91eabb1b663f07c4c084095e60cbed4362dff0d" +checksum = "94300abf3f1ae2e2b8ffb7b58043de3d399c73fa6f4b73826402a5c457614dbe" [[package]] name = "rustix" -version = "1.1.2" +version = "1.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd15f8a2c5551a84d56efdc1cd049089e409ac19a3072d5037a17fd70719ff3e" +checksum = "b6fe4565b9518b83ef4f91bb47ce29620ca828bd32cb7e408f0062e9930ba190" dependencies = [ "bitflags", "errno", @@ -1810,9 +1923,9 @@ dependencies = [ [[package]] name = "rustls" -version = "0.23.35" +version = "0.23.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "533f54bc6a7d4f647e46ad909549eda97bf5afc1585190ef692b4286b198bd8f" +checksum = "ef86cd5876211988985292b91c96a8f2d298df24e75989a43a3c73f2d4d8168b" dependencies = [ "once_cell", "ring", @@ -1836,9 +1949,9 @@ dependencies = [ [[package]] name = "rustls-pki-types" -version = "1.13.0" +version = "1.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94182ad936a0c91c324cd46c6511b9510ed16af436d7b5bab34beab0afd55f7a" +checksum = "30a7197ae7eb376e574fe940d068c30fe0462554a3ddbe4eca7838e049c937a9" dependencies = [ "web-time", "zeroize", @@ -1846,9 +1959,9 @@ dependencies = [ [[package]] name = "rustls-webpki" -version = "0.103.8" +version = "0.103.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ffdfa2f5286e2247234e03f680868ac2815974dc39e00ea15adc445d0aafe52" +checksum = "61c429a8649f110dddef65e2a5ad240f747e85f7758a6bccc7e5777bd33f756e" dependencies = [ "ring", "rustls-pki-types", @@ -1863,9 +1976,9 @@ checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" [[package]] name = "ryu" -version = "1.0.20" +version = "1.0.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" +checksum = "9774ba4a74de5f7b1c1451ed6cd5285a32eddb5cccb8cc655a4e50009e06477f" [[package]] name = "schannel" @@ -1884,9 +1997,9 @@ checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" [[package]] name = "security-framework" -version = "3.6.0" +version = "3.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d17b898a6d6948c3a8ee4372c17cb384f90d2e6e912ef00895b14fd7ab54ec38" +checksum = "b7f4bc775c73d9a02cde8bf7b2ec4c9d12743edf609006c7facc23998404cd1d" dependencies = [ "bitflags", "core-foundation", @@ -1905,6 +2018,12 @@ dependencies = [ "libc", ] +[[package]] +name = "semver" +version = "1.0.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a7852d02fc848982e0c167ef163aaff9cd91dc640ba85e263cb1ce46fae51cd" + [[package]] name = "serde" version = "1.0.228" @@ -1927,16 +2046,6 @@ dependencies = [ "typeid", ] -[[package]] -name = "serde_bytes" -version = "0.11.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5d440709e79d88e51ac01c4b72fc6cb7314017bb7da9eeff678aa94c10e3ea8" -dependencies = [ - "serde", - "serde_core", -] - [[package]] name = "serde_core" version = "1.0.228" @@ -1959,15 +2068,15 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.145" +version = "1.0.149" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "402a6f66d8c709116cf22f558eab210f5a50187f702eb4d7e5ef38d9a7f1c79c" +checksum = "83fc039473c5595ace860d8c4fafa220ff474b3fc6bfdb4293327f1a37e94d86" dependencies = [ "itoa", "memchr", - "ryu", "serde", "serde_core", + "zmij", ] [[package]] @@ -1993,9 +2102,9 @@ dependencies = [ [[package]] name = "serde_spanned" -version = "1.0.3" +version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e24345aa0fe688594e73770a5f6d1b216508b4f93484c0026d521acd30134392" +checksum = "6662b5879511e06e8999a8a235d848113e942c9124f211511b16466ee2995f26" dependencies = [ "serde_core", ] @@ -2051,10 +2160,11 @@ checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" [[package]] name = "signal-hook-registry" -version = "1.4.6" +version = "1.4.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2a4719bff48cee6b39d12c020eeb490953ad2443b7055bd0b21fca26bd8c28b" +checksum = "c4db69cba1110affc0e9f7bcd48bbf87b3f4fc7c61fc9155afd4c469eb3d6c1b" dependencies = [ + "errno", "libc", ] @@ -2066,9 +2176,9 @@ checksum = "bbbb5d9659141646ae647b42fe094daf6c6192d1620870b449d9557f748b2daa" [[package]] name = "slab" -version = "0.4.11" +version = "0.4.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a2ae44ef20feb57a68b23d846850f861394c2e02dc425a50098ae8c90267589" +checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5" [[package]] name = "smallvec" @@ -2078,12 +2188,12 @@ checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" [[package]] name = "socket2" -version = "0.6.1" +version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17129e116933cf371d018bb80ae557e889637989d8638274fb25622827b03881" +checksum = "3a766e1110788c36f4fa1c2b71b387a7815aa65f88ce0229841826633d93723e" dependencies = [ "libc", - "windows-sys 0.60.2", + "windows-sys 0.61.2", ] [[package]] @@ -2118,23 +2228,22 @@ checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" [[package]] name = "strum" -version = "0.26.3" +version = "0.27.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fec0f0aef304996cf250b31b5a10dee7980c85da9d759361292b8bca5a18f06" +checksum = "af23d6f6c1a224baef9d3f61e287d2761385a5b88fdab4eb4c6f11aeb54c4bcf" dependencies = [ "strum_macros", ] [[package]] name = "strum_macros" -version = "0.26.4" +version = "0.27.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c6bee85a5a24955dc440386795aa378cd9cf82acd5f764469152d2270e581be" +checksum = "7695ce3845ea4b33927c055a39dc438a45b059f7c1b3d91d38d10355fb8cbca7" dependencies = [ "heck", "proc-macro2", "quote", - "rustversion", "syn", ] @@ -2146,9 +2255,9 @@ checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" [[package]] name = "syn" -version = "2.0.110" +version = "2.0.117" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a99801b5bd34ede4cf3fc688c5919368fea4e4814a4664359503e6015b280aea" +checksum = "e665b8803e7b1d2a727f4023456bbbbe74da67099c585258af0ad9c5013b9b99" dependencies = [ "proc-macro2", "quote", @@ -2186,12 +2295,12 @@ dependencies = [ [[package]] name = "tempfile" -version = "3.23.0" +version = "3.27.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d31c77bdf42a745371d260a26ca7163f1e0924b64afa0b688e61b5a9fa02f16" +checksum = "32497e9a4c7b38532efcdebeef879707aa9f794296a4f0244f6f69e9bc8574bd" dependencies = [ "fastrand", - "getrandom 0.3.4", + "getrandom 0.4.2", "once_cell", "rustix", "windows-sys 0.61.2", @@ -2199,38 +2308,18 @@ dependencies = [ [[package]] name = "thiserror" -version = "1.0.69" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" -dependencies = [ - "thiserror-impl 1.0.69", -] - -[[package]] -name = "thiserror" -version = "2.0.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f63587ca0f12b72a0600bcba1d40081f830876000bb46dd2337a3051618f4fc8" -dependencies = [ - "thiserror-impl 2.0.17", -] - -[[package]] -name = "thiserror-impl" -version = "1.0.69" +version = "2.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" +checksum = "4288b5bcbc7920c07a1149a35cf9590a2aa808e0bc1eafaade0b80947865fbc4" dependencies = [ - "proc-macro2", - "quote", - "syn", + "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "2.0.17" +version = "2.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ff15c8ecd7de3849db632e14d18d2571fa09dfc5ed93479bc4485c7a517c913" +checksum = "ebc4ee7f67670e9b64d05fa4253e753e016c6c95ff35b89b7941d6b856dec1d5" dependencies = [ "proc-macro2", "quote", @@ -2257,9 +2346,9 @@ dependencies = [ [[package]] name = "tinystr" -version = "0.8.2" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42d3e9c45c09de15d06dd8acf5f4e0e399e85927b7f00711024eb7ae10fa4869" +checksum = "c8323304221c2a851516f22236c5722a72eaa19749016521d6dff0824447d96d" dependencies = [ "displaydoc", "zerovec", @@ -2267,9 +2356,9 @@ dependencies = [ [[package]] name = "tinyvec" -version = "1.10.0" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfa5fdc3bce6191a1dbc8c02d5c8bffcf557bafa17c124c5264a458f1b0613fa" +checksum = "3e61e67053d25a4e82c844e8424039d9745781b3fc4f32b8d55ed50f5f667ef3" dependencies = [ "tinyvec_macros", ] @@ -2282,9 +2371,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.48.0" +version = "1.52.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff360e02eab121e0bc37a2d3b4d4dc622e6eda3a8e5253d5435ecf5bd4c68408" +checksum = "110a78583f19d5cdb2c5ccf321d1290344e71313c6c37d43520d386027d18386" dependencies = [ "bytes", "libc", @@ -2299,9 +2388,9 @@ dependencies = [ [[package]] name = "tokio-macros" -version = "2.6.0" +version = "2.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af407857209536a95c8e56f8231ef2c2e2aff839b22e07a1ffcbc617e9db9fa5" +checksum = "385a6cb71ab9ab790c5fe8d67f1645e6c450a7ce006a33de03daa956cf70a496" dependencies = [ "proc-macro2", "quote", @@ -2320,9 +2409,9 @@ dependencies = [ [[package]] name = "tokio-stream" -version = "0.1.17" +version = "0.1.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eca58d7bba4a75707817a2c44174253f9236b2d5fbd055602e9d5c07c139a047" +checksum = "32da49809aab5c3bc678af03902d4ccddea2a87d028d86392a4b1560c6906c70" dependencies = [ "futures-core", "pin-project-lite", @@ -2342,14 +2431,26 @@ dependencies = [ "rustls-pki-types", "tokio", "tokio-rustls", - "tungstenite", + "tungstenite 0.28.0", +] + +[[package]] +name = "tokio-tungstenite" +version = "0.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f72a05e828585856dacd553fba484c242c46e391fb0e58917c942ee9202915c" +dependencies = [ + "futures-util", + "log", + "tokio", + "tungstenite 0.29.0", ] [[package]] name = "tokio-util" -version = "0.7.17" +version = "0.7.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2efa149fe76073d6e8fd97ef4f4eca7b67f599660115591483572e406e165594" +checksum = "9ae9cec805b01e8fc3fd2fe289f89149a9b66dd16786abd8b19cfa7b48cb0098" dependencies = [ "bytes", "futures-core", @@ -2361,9 +2462,9 @@ dependencies = [ [[package]] name = "toml" -version = "0.9.8" +version = "1.1.2+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0dc8b1fb61449e27716ec0e1bdf0f6b8f3e8f6b05391e8497b8b6d7804ea6d8" +checksum = "81f3d15e84cbcd896376e6730314d59fb5a87f31e4b038454184435cd57defee" dependencies = [ "serde_core", "serde_spanned", @@ -2374,18 +2475,18 @@ dependencies = [ [[package]] name = "toml_datetime" -version = "0.7.3" +version = "1.1.1+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2cdb639ebbc97961c51720f858597f7f24c4fc295327923af55b74c3c724533" +checksum = "3165f65f62e28e0115a00b2ebdd37eb6f3b641855f9d636d3cd4103767159ad7" dependencies = [ "serde_core", ] [[package]] name = "toml_edit" -version = "0.23.7" +version = "0.25.11+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6485ef6d0d9b5d0ec17244ff7eb05310113c3f316f2d14200d4de56b3cb98f8d" +checksum = "0b59c4d22ed448339746c59b905d24568fcbb3ab65a500494f7b8c3e97739f2b" dependencies = [ "indexmap", "toml_datetime", @@ -2395,18 +2496,18 @@ dependencies = [ [[package]] name = "toml_parser" -version = "1.0.4" +version = "1.1.2+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0cbe268d35bdb4bb5a56a2de88d0ad0eb70af5384a99d648cd4b3d04039800e" +checksum = "a2abe9b86193656635d2411dc43050282ca48aa31c2451210f4202550afb7526" dependencies = [ "winnow", ] [[package]] name = "tower" -version = "0.5.2" +version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d039ad9159c98b70ecfd540b2573b97f7f52c3e8d9f8ad57a24b916a536975f9" +checksum = "ebe5ef63511595f1344e2d5cfa636d973292adc0eec1f0ad45fae9f0851ab1d4" dependencies = [ "futures-core", "futures-util", @@ -2420,20 +2521,20 @@ dependencies = [ [[package]] name = "tower-http" -version = "0.6.6" +version = "0.6.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "adc82fd73de2a9722ac5da747f12383d2bfdb93591ee6c58486e0097890f05f2" +checksum = "68d6fdd9f81c2819c9a8b0e0cd91660e7746a8e6ea2ba7c6b2b057985f6bcb51" dependencies = [ "bitflags", "bytes", "futures-util", "http", "http-body", - "iri-string", "pin-project-lite", "tower", "tower-layer", "tower-service", + "url", ] [[package]] @@ -2450,9 +2551,9 @@ checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" [[package]] name = "tracing" -version = "0.1.41" +version = "0.1.44" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" +checksum = "63e71662fa4b2a2c3a26f570f037eb95bb1f85397f3cd8076caed2f026a6d100" dependencies = [ "log", "pin-project-lite", @@ -2462,9 +2563,9 @@ dependencies = [ [[package]] name = "tracing-attributes" -version = "0.1.30" +version = "0.1.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81383ab64e72a7a8b8e13130c49e3dab29def6d0c7d76a03087b3cf71c5c6903" +checksum = "7490cfa5ec963746568740651ac6781f701c9c5ea257c58e057f3ba8cf69e8da" dependencies = [ "proc-macro2", "quote", @@ -2473,9 +2574,9 @@ dependencies = [ [[package]] name = "tracing-core" -version = "0.1.34" +version = "0.1.36" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9d12581f227e93f094d3af2ae690a574abb8a2b9b7a96e7cfe9647b2b617678" +checksum = "db97caf9d906fbde555dd62fa95ddba9eecfd14cb388e4f491a66d74cd5fb79a" dependencies = [ "once_cell", "valuable", @@ -2494,9 +2595,9 @@ dependencies = [ [[package]] name = "tracing-subscriber" -version = "0.3.20" +version = "0.3.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2054a14f5307d601f88daf0553e1cbf472acc4f2c51afab632431cdcd72124d5" +checksum = "cb7f578e5945fb242538965c2d0b04418d38ec25c79d160cd279bf0731c8d319" dependencies = [ "nu-ansi-term", "sharded-slab", @@ -2527,10 +2628,26 @@ dependencies = [ "rustls", "rustls-pki-types", "sha1", - "thiserror 2.0.17", + "thiserror", "utf-8", ] +[[package]] +name = "tungstenite" +version = "0.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c01152af293afb9c7c2a57e4b559c5620b421f6d133261c60dd2d0cdb38e6b8" +dependencies = [ + "bytes", + "data-encoding", + "http", + "httparse", + "log", + "rand", + "sha1", + "thiserror", +] + [[package]] name = "typeid" version = "1.0.3" @@ -2539,9 +2656,9 @@ checksum = "bc7d623258602320d5c55d1bc22793b57daff0ec7efc270ea7d55ce1d5f5471c" [[package]] name = "typenum" -version = "1.19.0" +version = "1.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "562d481066bde0658276a35467c4af00bdc6ee726305698a55b86e61d7ad82bb" +checksum = "40ce102ab67701b8526c123c1bab5cbe42d7040ccfd0f64af1a385808d2f43de" [[package]] name = "ucd-trie" @@ -2551,15 +2668,15 @@ checksum = "2896d95c02a80c6d6a5d6e953d479f5ddf2dfdb6a244441010e373ac0fb88971" [[package]] name = "unicode-ident" -version = "1.0.22" +version = "1.0.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9312f7c4f6ff9069b165498234ce8be658059c6728633667c526e27dc2cf1df5" +checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" [[package]] name = "unicode-segmentation" -version = "1.12.0" +version = "1.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" +checksum = "9629274872b2bfaf8d66f5f15725007f635594914870f65218920345aa11aa8c" [[package]] name = "unicode-width" @@ -2567,6 +2684,12 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b4ac048d71ede7ee76d585517add45da530660ef4390e49b098733c6e897f254" +[[package]] +name = "unicode-xid" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" + [[package]] name = "untrusted" version = "0.9.0" @@ -2575,9 +2698,9 @@ checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" [[package]] name = "url" -version = "2.5.7" +version = "2.5.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08bc136a29a3d1758e07a9cca267be308aeebf5cfd5a10f3f67ab2097683ef5b" +checksum = "ff67a8a4397373c3ef660812acab3268222035010ab8680ec4215f38ba3d0eed" dependencies = [ "form_urlencoded", "idna", @@ -2605,13 +2728,13 @@ checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" [[package]] name = "uuid" -version = "1.18.1" +version = "1.23.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f87b8aa10b915a06587d0dec516c282ff295b475d94abf425d62b57710070a2" +checksum = "ddd74a9687298c6858e9b88ec8935ec45d22e8fd5e6394fa1bd4e99a87789c76" dependencies = [ - "getrandom 0.3.4", + "getrandom 0.4.2", "js-sys", - "serde", + "serde_core", "wasm-bindgen", ] @@ -2644,18 +2767,27 @@ checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" [[package]] name = "wasip2" -version = "1.0.1+wasi-0.2.4" +version = "1.0.3+wasi-0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0562428422c63773dad2c345a1882263bbf4d65cf3f42e90921f787ef5ad58e7" +checksum = "20064672db26d7cdc89c7798c48a0fdfac8213434a1186e5ef29fd560ae223d6" dependencies = [ - "wit-bindgen", + "wit-bindgen 0.57.1", +] + +[[package]] +name = "wasip3" +version = "0.4.0+wasi-0.3.0-rc-2026-01-06" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5428f8bf88ea5ddc08faddef2ac4a67e390b88186c703ce6dbd955e1c145aca5" +dependencies = [ + "wit-bindgen 0.51.0", ] [[package]] name = "wasm-bindgen" -version = "0.2.105" +version = "0.2.121" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da95793dfc411fbbd93f5be7715b0578ec61fe87cb1a42b12eb625caa5c5ea60" +checksum = "49ace1d07c165b0864824eee619580c4689389afa9dc9ed3a4c75040d82e6790" dependencies = [ "cfg-if", "once_cell", @@ -2666,22 +2798,19 @@ dependencies = [ [[package]] name = "wasm-bindgen-futures" -version = "0.4.55" +version = "0.4.71" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "551f88106c6d5e7ccc7cd9a16f312dd3b5d36ea8b4954304657d5dfba115d4a0" +checksum = "96492d0d3ffba25305a7dc88720d250b1401d7edca02cc3bcd50633b424673b8" dependencies = [ - "cfg-if", "js-sys", - "once_cell", "wasm-bindgen", - "web-sys", ] [[package]] name = "wasm-bindgen-macro" -version = "0.2.105" +version = "0.2.121" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04264334509e04a7bf8690f2384ef5265f05143a4bff3889ab7a3269adab59c2" +checksum = "8e68e6f4afd367a562002c05637acb8578ff2dea1943df76afb9e83d177c8578" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -2689,9 +2818,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.105" +version = "0.2.121" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "420bc339d9f322e562942d52e115d57e950d12d88983a14c79b86859ee6c7ebc" +checksum = "d95a9ec35c64b2a7cb35d3fead40c4238d0940c86d107136999567a4703259f2" dependencies = [ "bumpalo", "proc-macro2", @@ -2702,13 +2831,35 @@ dependencies = [ [[package]] name = "wasm-bindgen-shared" -version = "0.2.105" +version = "0.2.121" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76f218a38c84bcb33c25ec7059b07847d465ce0e0a76b995e134a45adcb6af76" +checksum = "c4e0100b01e9f0d03189a92b96772a1fb998639d981193d7dbab487302513441" dependencies = [ "unicode-ident", ] +[[package]] +name = "wasm-encoder" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "990065f2fe63003fe337b932cfb5e3b80e0b4d0f5ff650e6985b1048f62c8319" +dependencies = [ + "leb128fmt", + "wasmparser", +] + +[[package]] +name = "wasm-metadata" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb0e353e6a2fbdc176932bbaab493762eb1255a7900fe0fea1a2f96c296cc909" +dependencies = [ + "anyhow", + "indexmap", + "wasm-encoder", + "wasmparser", +] + [[package]] name = "wasm-streams" version = "0.4.2" @@ -2722,11 +2873,23 @@ dependencies = [ "web-sys", ] +[[package]] +name = "wasmparser" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47b807c72e1bac69382b3a6fb3dbe8ea4c0ed87ff5629b8685ae6b9a611028fe" +dependencies = [ + "bitflags", + "hashbrown 0.15.5", + "indexmap", + "semver", +] + [[package]] name = "web-sys" -version = "0.3.82" +version = "0.3.98" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a1f95c0d03a47f4ae1f7a64643a6bb97465d9b740f0fa8f90ea33915c99a9a1" +checksum = "4b572dff8bcf38bad0fa19729c89bb5748b2b9b1d8be70cf90df697e3a8f32aa" dependencies = [ "js-sys", "wasm-bindgen", @@ -2744,72 +2907,19 @@ dependencies = [ [[package]] name = "webpki-roots" -version = "1.0.4" +version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2878ef029c47c6e8cf779119f20fcf52bde7ad42a731b2a304bc221df17571e" +checksum = "52f5ee44c96cf55f1b349600768e3ece3a8f26010c05265ab73f945bb1a2eb9d" dependencies = [ "rustls-pki-types", ] -[[package]] -name = "windows-core" -version = "0.62.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8e83a14d34d0623b51dce9581199302a221863196a1dde71a7663a4c2be9deb" -dependencies = [ - "windows-implement", - "windows-interface", - "windows-link", - "windows-result", - "windows-strings", -] - -[[package]] -name = "windows-implement" -version = "0.60.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "windows-interface" -version = "0.59.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - [[package]] name = "windows-link" version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" -[[package]] -name = "windows-result" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7781fa89eaf60850ac3d2da7af8e5242a5ea78d1a11c49bf2910bb5a73853eb5" -dependencies = [ - "windows-link", -] - -[[package]] -name = "windows-strings" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7837d08f69c77cf6b07689544538e017c1bfcf57e34b4c0ff58e6c2cd3b37091" -dependencies = [ - "windows-link", -] - [[package]] name = "windows-sys" version = "0.52.0" @@ -2968,24 +3078,112 @@ checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650" [[package]] name = "winnow" -version = "0.7.13" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21a0236b59786fed61e2a80582dd500fe61f18b5dca67a4a067d0bc9039339cf" +checksum = "2ee1708bef14716a11bae175f579062d4554d95be2c6829f518df847b7b3fdd0" dependencies = [ "memchr", ] [[package]] name = "wit-bindgen" -version = "0.46.0" +version = "0.51.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7249219f66ced02969388cf2bb044a09756a083d0fab1e566056b04d9fbcaa5" +dependencies = [ + "wit-bindgen-rust-macro", +] + +[[package]] +name = "wit-bindgen" +version = "0.57.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f17a85883d4e6d00e8a97c586de764dabcc06133f7f1d55dce5cdc070ad7fe59" +checksum = "1ebf944e87a7c253233ad6766e082e3cd714b5d03812acc24c318f549614536e" + +[[package]] +name = "wit-bindgen-core" +version = "0.51.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea61de684c3ea68cb082b7a88508a8b27fcc8b797d738bfc99a82facf1d752dc" +dependencies = [ + "anyhow", + "heck", + "wit-parser", +] + +[[package]] +name = "wit-bindgen-rust" +version = "0.51.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7c566e0f4b284dd6561c786d9cb0142da491f46a9fbed79ea69cdad5db17f21" +dependencies = [ + "anyhow", + "heck", + "indexmap", + "prettyplease", + "syn", + "wasm-metadata", + "wit-bindgen-core", + "wit-component", +] + +[[package]] +name = "wit-bindgen-rust-macro" +version = "0.51.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c0f9bfd77e6a48eccf51359e3ae77140a7f50b1e2ebfe62422d8afdaffab17a" +dependencies = [ + "anyhow", + "prettyplease", + "proc-macro2", + "quote", + "syn", + "wit-bindgen-core", + "wit-bindgen-rust", +] + +[[package]] +name = "wit-component" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d66ea20e9553b30172b5e831994e35fbde2d165325bec84fc43dbf6f4eb9cb2" +dependencies = [ + "anyhow", + "bitflags", + "indexmap", + "log", + "serde", + "serde_derive", + "serde_json", + "wasm-encoder", + "wasm-metadata", + "wasmparser", + "wit-parser", +] + +[[package]] +name = "wit-parser" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ecc8ac4bc1dc3381b7f59c34f00b67e18f910c2c0f50015669dde7def656a736" +dependencies = [ + "anyhow", + "id-arena", + "indexmap", + "log", + "semver", + "serde", + "serde_derive", + "serde_json", + "unicode-xid", + "wasmparser", +] [[package]] name = "writeable" -version = "0.6.2" +version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9edde0db4769d2dc68579893f2306b26c6ecfbe0ef499b013d731b7b9247e0b9" +checksum = "1ffae5123b2d3fc086436f8834ae3ab053a283cfac8fe0a0b8eaae044768a4c4" [[package]] name = "yaml-rust2" @@ -3000,9 +3198,9 @@ dependencies = [ [[package]] name = "yoke" -version = "0.8.1" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72d6e5c6afb84d73944e5cedb052c4680d5657337201555f9f2a16b7406d4954" +checksum = "abe8c5fda708d9ca3df187cae8bfb9ceda00dd96231bed36e445a1a48e66f9ca" dependencies = [ "stable_deref_trait", "yoke-derive", @@ -3011,9 +3209,9 @@ dependencies = [ [[package]] name = "yoke-derive" -version = "0.8.1" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b659052874eb698efe5b9e8cf382204678a0086ebf46982b79d6ca3182927e5d" +checksum = "de844c262c8848816172cef550288e7dc6c7b7814b4ee56b3e1553f275f1858e" dependencies = [ "proc-macro2", "quote", @@ -3023,18 +3221,18 @@ dependencies = [ [[package]] name = "zerocopy" -version = "0.8.27" +version = "0.8.48" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0894878a5fa3edfd6da3f88c4805f4c8558e2b996227a3d864f47fe11e38282c" +checksum = "eed437bf9d6692032087e337407a86f04cd8d6a16a37199ed57949d415bd68e9" dependencies = [ "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.8.27" +version = "0.8.48" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88d2b8d9c68ad2b9e4340d7832716a4d21a22a1154777ad56ea55c51a9cf3831" +checksum = "70e3cd084b1788766f53af483dd21f93881ff30d7320490ec3ef7526d203bad4" dependencies = [ "proc-macro2", "quote", @@ -3043,18 +3241,18 @@ dependencies = [ [[package]] name = "zerofrom" -version = "0.1.6" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5" +checksum = "69faa1f2a1ea75661980b013019ed6687ed0e83d069bc1114e2cc74c6c04c4df" dependencies = [ "zerofrom-derive", ] [[package]] name = "zerofrom-derive" -version = "0.1.6" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" +checksum = "11532158c46691caf0f2593ea8358fed6bbf68a0315e80aae9bd41fbade684a1" dependencies = [ "proc-macro2", "quote", @@ -3070,9 +3268,9 @@ checksum = "b97154e67e32c85465826e8bcc1c59429aaaf107c1e4a9e53c8d8ccd5eff88d0" [[package]] name = "zerotrie" -version = "0.2.3" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a59c17a5562d507e4b54960e8569ebee33bee890c70aa3fe7b97e85a9fd7851" +checksum = "0f9152d31db0792fa83f70fb2f83148effb5c1f5b8c7686c3459e361d9bc20bf" dependencies = [ "displaydoc", "yoke", @@ -3081,9 +3279,9 @@ dependencies = [ [[package]] name = "zerovec" -version = "0.11.5" +version = "0.11.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c28719294829477f525be0186d13efa9a3c602f7ec202ca9e353d310fb9a002" +checksum = "90f911cbc359ab6af17377d242225f4d75119aec87ea711a880987b18cd7b239" dependencies = [ "yoke", "zerofrom", @@ -3092,11 +3290,17 @@ dependencies = [ [[package]] name = "zerovec-derive" -version = "0.11.2" +version = "0.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eadce39539ca5cb3985590102671f2567e659fca9666581ad3411d59207951f3" +checksum = "625dc425cab0dca6dc3c3319506e6593dcb08a9f387ea3b284dbd52a92c40555" dependencies = [ "proc-macro2", "quote", "syn", ] + +[[package]] +name = "zmij" +version = "1.0.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8848ee67ecc8aedbaf3e4122217aff892639231befc6a1b58d29fff4c2cabaa" diff --git a/Cargo.toml b/Cargo.toml index e622801..6620fdc 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -24,8 +24,6 @@ tokio-tungstenite = { version = "0.28.0", features = ["rustls-tls-native-roots"] rmp-serde = "1.3.1" futures-util = "0.3.32" async-stream = "0.3.6" -chrono = { version = "0.4", features = ["serde"] } -serde_bytes="0.11.19" [dev-dependencies] http-body-util = "0.1.3" diff --git a/src/clients.rs b/src/clients.rs index cec3842..3ec8d9d 100644 --- a/src/clients.rs +++ b/src/clients.rs @@ -178,14 +178,13 @@ impl TiledClient { match rmp_serde::from_slice::(&bin) { Ok(event) => yield event, Err(e) => { - error!("Failed to deserialize msgpack: {}, binary: {:?}", e, bin); + return error!("Failed to deserialize msgpack: {}, binary: {:?}", e, bin); } } } Ok(_) => {}, Err(e) => { - error!("WebSocket error: {}", e); - break; + return error!("WebSocket error: {}", e); } } } diff --git a/src/handlers.rs b/src/handlers.rs index 2b5e45a..a99afe9 100644 --- a/src/handlers.rs +++ b/src/handlers.rs @@ -1,5 +1,5 @@ use async_graphql::http::{ALL_WEBSOCKET_PROTOCOLS, GraphiQLSource}; -use async_graphql::{EmptyMutation, Schema}; +use async_graphql::{Data, EmptyMutation, Schema}; use async_graphql_axum::{GraphQLProtocol, GraphQLRequest, GraphQLResponse, GraphQLWebSocket}; use axum::Extension; use axum::body::Body; @@ -28,7 +28,7 @@ pub async fn graphql_handler( pub async fn graphql_ws_handler( schema: Extension>, protocol: GraphQLProtocol, - auth_token: Option, + mut auth_token: Option, websocket: WebSocketUpgrade, ) -> impl IntoResponse { websocket @@ -36,8 +36,7 @@ pub async fn graphql_ws_handler( .on_upgrade(move |socket| { GraphQLWebSocket::new(socket, schema.0, protocol) .on_connection_init(|value| async move { - let mut data = async_graphql::Data::default(); - let mut auth_token = auth_token; + let mut data = Data::default(); if let Ok(value) = serde_json::from_value::(value) && let Some(auth) = value.get("Authorization").and_then(|v| v.as_str()) @@ -190,6 +189,7 @@ mod tests { use serde_json::json; use tokio_tungstenite::connect_async; use tokio_tungstenite::tungstenite::Message; + use tokio_tungstenite::tungstenite::client::IntoClientRequest; use crate::clients::TiledClient; @@ -205,9 +205,7 @@ mod tests { }); let ws_url = format!("ws://{addr}/ws"); - let mut request = - tokio_tungstenite::tungstenite::client::IntoClientRequest::into_client_request(ws_url) - .unwrap(); + let mut request = IntoClientRequest::into_client_request(ws_url).unwrap(); request.headers_mut().insert( axum::http::header::SEC_WEBSOCKET_PROTOCOL, "graphql-transport-ws".parse().unwrap(), diff --git a/src/model/subscription.rs b/src/model/subscription.rs index f9b5237..4ed5329 100644 --- a/src/model/subscription.rs +++ b/src/model/subscription.rs @@ -133,6 +133,7 @@ pub enum TiledEvent { mod tests { use axum::Router; use axum::extract::WebSocketUpgrade; + use axum::extract::ws::Message; use axum::http::HeaderMap; use axum::routing::any; use futures_util::StreamExt; @@ -190,19 +191,15 @@ mod tests { let app = Router::new().fallback(any(move |uri: Uri, ws: WebSocketUpgrade| async move { let path = uri.path().to_string(); - let is_first = path.ends_with("/api/v1/stream/single/"); - let tx = tx.clone(); + let root = path.ends_with("/api/v1/stream/single/"); ws.on_upgrade(move |mut socket| async move { - let version = if is_first { 42 } else { 43 }; + let version = if root { 42 } else { 43 }; let event = serde_json::json!({ "type": "container-schema", "version": version }); let bin = rmp_serde::to_vec(&event).unwrap(); - socket - .send(axum::extract::ws::Message::Binary(bin.into())) - .await - .unwrap(); + socket.send(Message::Binary(bin.into())).await.unwrap(); let _ = tx.send(path).await; }) })); @@ -256,8 +253,8 @@ mod tests { .expect("Timeout waiting for path2") .unwrap(); - let paths = [path1, path2]; - assert!(paths.contains(&"/api/v1/stream/single/".to_string())); - assert!(paths.contains(&"/api/v1/stream/single/foo".to_string())); + // let paths = [path1, path2]; + assert_eq!(path1, String::from("/api/v1/stream/single/")); + assert_eq!(path2, String::from("/api/v1/stream/single/foo")); } } From bf8e39cd679fb9e199aff2e8dc5fc2ff9df165a9 Mon Sep 17 00:00:00 2001 From: Zoheb Shaikh <26975142+ZohebShaikh@users.noreply.github.com> Date: Fri, 8 May 2026 10:08:05 +0100 Subject: [PATCH 06/22] fix import issues --- Cargo.lock | 1 + Cargo.toml | 2 +- src/handlers.rs | 4 +--- src/model/subscription.rs | 1 - 4 files changed, 3 insertions(+), 5 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index d446544..ad53a2f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2706,6 +2706,7 @@ dependencies = [ "idna", "percent-encoding", "serde", + "serde_derive", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index 6620fdc..2f91c5d 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -14,7 +14,7 @@ serde_json = "1.0.143" serde = { version = "1.0.219", features = ["derive"] } axum = "0.8.4" async-graphql-axum = "7.0.17" -url = "2.5.7" +url = { version = "2.5.7", features = ["serde"] } config = "0.15.16" clap = { version = "4.5.48", features = ["derive"] } uuid = { version = "1.18.1", features = ["serde"] } diff --git a/src/handlers.rs b/src/handlers.rs index a99afe9..1ffdbff 100644 --- a/src/handlers.rs +++ b/src/handlers.rs @@ -7,7 +7,6 @@ use axum::extract::{OptionalFromRequestParts, Path, State, WebSocketUpgrade}; use axum::http::{HeaderMap, HeaderValue, StatusCode}; use axum::response::{Html, IntoResponse}; use reqwest::header::AUTHORIZATION; -use serde_json::Value; use tracing::info; use crate::clients::TiledClient; @@ -38,8 +37,7 @@ pub async fn graphql_ws_handler( .on_connection_init(|value| async move { let mut data = Data::default(); - if let Ok(value) = serde_json::from_value::(value) - && let Some(auth) = value.get("Authorization").and_then(|v| v.as_str()) + if let Some(auth) = value.get("Authorization").and_then(|v| v.as_str()) && let Ok(header_value) = HeaderValue::from_str(auth) { auth_token = Some(AuthHeader(header_value)); diff --git a/src/model/subscription.rs b/src/model/subscription.rs index 4ed5329..fcf541d 100644 --- a/src/model/subscription.rs +++ b/src/model/subscription.rs @@ -253,7 +253,6 @@ mod tests { .expect("Timeout waiting for path2") .unwrap(); - // let paths = [path1, path2]; assert_eq!(path1, String::from("/api/v1/stream/single/")); assert_eq!(path2, String::from("/api/v1/stream/single/foo")); } From aba07e236b2b5b069f2611989fbcd6cdc772c0c9 Mon Sep 17 00:00:00 2001 From: Zoheb Shaikh <26975142+ZohebShaikh@users.noreply.github.com> Date: Fri, 8 May 2026 14:00:01 +0100 Subject: [PATCH 07/22] parameterize tests --- Cargo.lock | 51 +++++++++++++++++++++++++ Cargo.toml | 1 + src/handlers.rs | 12 ++++-- src/main.rs | 15 +++----- src/model/subscription.rs | 80 +++++++++++++++++++-------------------- 5 files changed, 107 insertions(+), 52 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index ad53a2f..3feeb1b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -924,6 +924,7 @@ dependencies = [ "httpmock", "reqwest", "rmp-serde", + "rstest", "serde", "serde_json", "tokio", @@ -935,6 +936,12 @@ dependencies = [ "uuid", ] +[[package]] +name = "glob" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0cc23270f6e1808e30a928bdc84dea0b9b4136a8bc82338574f23baf47bbd280" + [[package]] name = "h2" version = "0.4.14" @@ -1804,6 +1811,12 @@ version = "0.8.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dc897dd8d9e8bd1ed8cdad82b5966c3e0ecae09fb1907d58efaa013543185d0a" +[[package]] +name = "relative-path" +version = "1.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba39f3699c378cd8970968dcbff9c43159ea4cfbd88d43c00b22f2ef10a435d2" + [[package]] name = "reqwest" version = "0.12.28" @@ -1892,6 +1905,35 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "rstest" +version = "0.26.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f5a3193c063baaa2a95a33f03035c8a72b83d97a54916055ba22d35ed3839d49" +dependencies = [ + "futures-timer", + "futures-util", + "rstest_macros", +] + +[[package]] +name = "rstest_macros" +version = "0.26.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c845311f0ff7951c5506121a9ad75aec44d083c31583b2ea5a30bcb0b0abba0" +dependencies = [ + "cfg-if", + "glob", + "proc-macro-crate", + "proc-macro2", + "quote", + "regex", + "relative-path", + "rustc_version", + "syn", + "unicode-ident", +] + [[package]] name = "rust-ini" version = "0.21.3" @@ -1908,6 +1950,15 @@ version = "2.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "94300abf3f1ae2e2b8ffb7b58043de3d399c73fa6f4b73826402a5c457614dbe" +[[package]] +name = "rustc_version" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" +dependencies = [ + "semver", +] + [[package]] name = "rustix" version = "1.1.4" diff --git a/Cargo.toml b/Cargo.toml index 2f91c5d..97d77af 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -28,4 +28,5 @@ async-stream = "0.3.6" [dev-dependencies] http-body-util = "0.1.3" httpmock = "0.8.2" +rstest = "0.26.1" tower = "0.5.2" diff --git a/src/handlers.rs b/src/handlers.rs index 1ffdbff..97fdd06 100644 --- a/src/handlers.rs +++ b/src/handlers.rs @@ -8,6 +8,7 @@ use axum::http::{HeaderMap, HeaderValue, StatusCode}; use axum::response::{Html, IntoResponse}; use reqwest::header::AUTHORIZATION; use tracing::info; +use url::Url; use crate::clients::TiledClient; use crate::model::TiledQuery; @@ -50,11 +51,15 @@ pub async fn graphql_ws_handler( }) } -pub async fn graphiql_handler(graphql_endpoint: Option) -> impl IntoResponse { +pub async fn graphiql_handler(public_address: Url) -> impl IntoResponse { + let (endpoint, subscription_endpoint) = ( + public_address.join("graphql").unwrap().to_string(), + public_address.join("ws").unwrap().to_string(), + ); Html( GraphiQLSource::build() - .endpoint(graphql_endpoint.as_deref().unwrap_or("/graphql")) - .subscription_endpoint(graphql_endpoint.as_deref().unwrap_or("/ws")) + .endpoint(&endpoint) + .subscription_endpoint(&subscription_endpoint) .finish(), ) } @@ -257,4 +262,5 @@ mod tests { mock.assert_async().await; } + } diff --git a/src/main.rs b/src/main.rs index b4e6311..cb8263c 100644 --- a/src/main.rs +++ b/src/main.rs @@ -56,19 +56,16 @@ async fn serve(config: GlazedConfig) -> Result<(), Box> { .public_address .clone() .unwrap_or_else(|| Url::parse(&format!("http://{}", config.bind_address)).unwrap()); - let schema = Schema::build(TiledQuery, EmptyMutation, TiledSubscription) - .data(RootAddress(public_address)) - .data(client.clone()) - .finish(); - - let graphql_endpoint = config - .public_address - .map(|u| u.join("graphql").unwrap().to_string()); + let schema: Schema = + Schema::build(TiledQuery, EmptyMutation, TiledSubscription) + .data(RootAddress(public_address.clone())) + .data(client.clone()) + .finish(); let app = Router::new() .route("/graphql", post(graphql_handler).get(graphql_get_warning)) .route("/ws", get(graphql_ws_handler)) - .route("/graphiql", get(|| graphiql_handler(graphql_endpoint))) + .route("/graphiql", get(|| graphiql_handler(public_address))) .route( "/status", get(Json(json!({"version": env!("CARGO_PKG_VERSION")}))), diff --git a/src/model/subscription.rs b/src/model/subscription.rs index fcf541d..9071810 100644 --- a/src/model/subscription.rs +++ b/src/model/subscription.rs @@ -12,9 +12,7 @@ pub struct TiledSubscription; #[Subscription] impl TiledSubscription { async fn events(&self, ctx: &Context<'_>) -> impl Stream { - let client = ctx - .data::() - .expect("TiledClient not found in context"); + let client = ctx.data::().unwrap(); let auth = ctx .data_opt::>() .and_then(|a| a.as_ref()); @@ -24,9 +22,7 @@ impl TiledSubscription { } async fn node_events(&self, ctx: &Context<'_>, node: String) -> impl Stream { - let client = ctx - .data::() - .expect("TiledClient not found in context"); + let client = ctx.data::().unwrap(); let auth = ctx .data_opt::>() .and_then(|a| a.as_ref()); @@ -143,8 +139,11 @@ mod tests { use super::*; use crate::clients::TiledClient; + #[rstest::rstest] + #[case::with_auth(Some("Bearer test-token"))] + #[case::no_auth(None)] #[tokio::test] - async fn test_stream_events_headers() { + async fn test_stream_events_headers_parameterized(#[case] auth_token: Option<&str>) { let (tx, mut rx) = tokio::sync::mpsc::channel(1); let app = Router::new().fallback(any( @@ -164,9 +163,11 @@ mod tests { let client = TiledClient::new(url); let mut headers = HeaderMap::new(); - headers.insert("Authorization", "Bearer test-token".parse().unwrap()); + if let Some(token) = auth_token { + headers.insert("Authorization", token.parse().unwrap()); + } - let stream = client.stream_events(None, Some(headers)); + let stream = client.stream_events(None, if headers.is_empty() { None } else { Some(headers) }); tokio::pin!(stream); let _ = tokio::time::timeout(std::time::Duration::from_secs(5), stream.next()).await; @@ -176,18 +177,37 @@ mod tests { .expect("Timeout waiting for headers") .expect("Channel closed"); - assert_eq!( - captured_headers.get("Authorization").unwrap(), - "Bearer test-token" - ); + if let Some(token) = auth_token { + assert_eq!(captured_headers.get("Authorization").unwrap(), token); + } else { + assert!(captured_headers.get("Authorization").is_none()); + } } + #[rstest::rstest] + #[case::root( + "subscription { events { ... on ContainerSchema { version } } }", + "/api/v1/stream/single/", + 42, + "events" + )] + #[case::node( + "subscription { nodeEvents(node: \"foo\") { ... on ContainerSchema { version } } }", + "/api/v1/stream/single/foo", + 43, + "nodeEvents" + )] #[tokio::test] - async fn test_subscription_events_and_node_events() { + async fn test_subscription_events_parameterized( + #[case] query: &str, + #[case] expected_path: &str, + #[case] expected_version: u32, + #[case] result_key: &str, + ) { use async_graphql::{EmptyMutation, Schema}; use axum::http::Uri; - let (tx, mut rx) = tokio::sync::mpsc::channel(2); + let (tx, mut rx) = tokio::sync::mpsc::channel(1); let app = Router::new().fallback(any(move |uri: Uri, ws: WebSocketUpgrade| async move { let path = uri.path().to_string(); @@ -217,43 +237,23 @@ mod tests { .data(client) .finish(); - // Test events() - let stream = - schema.execute_stream("subscription { events { ... on ContainerSchema { version } } }"); + let stream = schema.execute_stream(query); let mut stream = Box::pin(stream); let res = tokio::time::timeout(std::time::Duration::from_secs(5), stream.next()) .await .expect("Timeout waiting for events") .unwrap(); - assert_eq!( - res.data, - async_graphql::value!({ "events": { "version": 42 } }) - ); - // Test node_events(node: "foo") - let stream = schema.execute_stream( - "subscription { nodeEvents(node: \"foo\") { ... on ContainerSchema { version } } }", - ); - let mut stream = Box::pin(stream); - let res = tokio::time::timeout(std::time::Duration::from_secs(5), stream.next()) - .await - .expect("Timeout waiting for nodeEvents") - .unwrap(); assert_eq!( res.data, - async_graphql::value!({ "nodeEvents": { "version": 43 } }) + async_graphql::value!({ result_key: { "version": expected_version } }) ); - let path1 = tokio::time::timeout(std::time::Duration::from_secs(5), rx.recv()) - .await - .expect("Timeout waiting for path1") - .unwrap(); - let path2 = tokio::time::timeout(std::time::Duration::from_secs(5), rx.recv()) + let path = tokio::time::timeout(std::time::Duration::from_secs(5), rx.recv()) .await - .expect("Timeout waiting for path2") + .expect("Timeout waiting for path") .unwrap(); - assert_eq!(path1, String::from("/api/v1/stream/single/")); - assert_eq!(path2, String::from("/api/v1/stream/single/foo")); + assert_eq!(path, expected_path); } } From df1715a9a01708af65bd179252d75f802bff052b Mon Sep 17 00:00:00 2001 From: Zoheb Shaikh <26975142+ZohebShaikh@users.noreply.github.com> Date: Fri, 8 May 2026 14:03:04 +0100 Subject: [PATCH 08/22] fix lint --- src/handlers.rs | 1 - src/model/subscription.rs | 9 ++++++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/handlers.rs b/src/handlers.rs index 97fdd06..bc0c8e2 100644 --- a/src/handlers.rs +++ b/src/handlers.rs @@ -262,5 +262,4 @@ mod tests { mock.assert_async().await; } - } diff --git a/src/model/subscription.rs b/src/model/subscription.rs index 9071810..5f376ab 100644 --- a/src/model/subscription.rs +++ b/src/model/subscription.rs @@ -167,7 +167,14 @@ mod tests { headers.insert("Authorization", token.parse().unwrap()); } - let stream = client.stream_events(None, if headers.is_empty() { None } else { Some(headers) }); + let stream = client.stream_events( + None, + if headers.is_empty() { + None + } else { + Some(headers) + }, + ); tokio::pin!(stream); let _ = tokio::time::timeout(std::time::Duration::from_secs(5), stream.next()).await; From 93ee54a2582c696dce5f7cd124ffd26dc0f1e702 Mon Sep 17 00:00:00 2001 From: Zoheb Shaikh <26975142+ZohebShaikh@users.noreply.github.com> Date: Fri, 8 May 2026 14:41:31 +0100 Subject: [PATCH 09/22] cleanup code --- config.toml | 3 +- src/handlers.rs | 100 -------------------------------------- src/model/subscription.rs | 47 ++++++++---------- 3 files changed, 23 insertions(+), 127 deletions(-) diff --git a/config.toml b/config.toml index 6bd9ae3..919aa33 100644 --- a/config.toml +++ b/config.toml @@ -1,4 +1,5 @@ bind_address = "0.0.0.0:3000" [tiled_client] -address = "http://tiled.tiled:8000" +address = "http://tiled:8000" +public_address = "http://localhost/glazed/" diff --git a/src/handlers.rs b/src/handlers.rs index bc0c8e2..1c24cf7 100644 --- a/src/handlers.rs +++ b/src/handlers.rs @@ -121,7 +121,6 @@ mod tests { use tower::ServiceExt; use super::AuthHeader; - use crate::clients::TiledClient; async fn auth_echo(auth: Option) -> impl IntoResponse { match auth { @@ -132,29 +131,7 @@ mod tests { fn app() -> Router { Router::new().route("/", get(auth_echo)) } - use async_graphql::{EmptyMutation, Schema}; - use axum::Extension; - use axum::routing::any; - fn ws_app(client: TiledClient) -> Router { - let schema = Schema::build( - crate::model::TiledQuery, - EmptyMutation, - crate::model::subscription::TiledSubscription, - ) - .data(client) - .finish(); - Router::new().route( - "/ws", - any( - move |protocol: async_graphql_axum::GraphQLProtocol, - websocket: axum::extract::WebSocketUpgrade| { - let schema = Extension(schema.clone()); - super::graphql_ws_handler(schema, protocol, None, websocket) - }, - ), - ) - } #[tokio::test] async fn auth_extract() { let app = app(); @@ -185,81 +162,4 @@ mod tests { "No auth" ); } - - #[tokio::test] - async fn test_graphql_ws_handler_auth_extraction() { - use futures_util::{SinkExt, StreamExt}; - use serde_json::json; - use tokio_tungstenite::connect_async; - use tokio_tungstenite::tungstenite::Message; - use tokio_tungstenite::tungstenite::client::IntoClientRequest; - - use crate::clients::TiledClient; - - let server = httpmock::MockServer::start(); - let client = TiledClient::for_mock_server(&server); - - let app = ws_app(client); - - let listener = tokio::net::TcpListener::bind("127.0.0.1:0").await.unwrap(); - let addr = listener.local_addr().unwrap(); - tokio::spawn(async move { - axum::serve(listener, app).await.unwrap(); - }); - - let ws_url = format!("ws://{addr}/ws"); - let mut request = IntoClientRequest::into_client_request(ws_url).unwrap(); - request.headers_mut().insert( - axum::http::header::SEC_WEBSOCKET_PROTOCOL, - "graphql-transport-ws".parse().unwrap(), - ); - let (mut ws_stream, _) = connect_async(request).await.unwrap(); - - let init_msg = json!({ - "type": "connection_init", - "payload": { - "Authorization": "Bearer ws-test-token" - } - }); - ws_stream - .send(Message::Text(init_msg.to_string().into())) - .await - .unwrap(); - - let ack = ws_stream.next().await.unwrap().unwrap(); - assert!(ack.is_text()); - assert!(ack.to_text().unwrap().contains("connection_ack")); - - let mock = server - .mock_async(|when, then| { - when.method("GET") - .path("/api/v1/metadata/5d8f5c3e-0e00-4c5c-816d-70b4b0f41498") - .header("Authorization", "Bearer ws-test-token"); - then.status(200) - .body_from_file("resources/metadata_run.json"); - }) - .await; - - let query = json!({ - "id": "1", - "type": "subscribe", - "payload": { - "query": "query { run(id: \"5d8f5c3e-0e00-4c5c-816d-70b4b0f41498\") { id } }" - } - }); - ws_stream - .send(Message::Text(query.to_string().into())) - .await - .unwrap(); - - let msg = ws_stream.next().await.unwrap().unwrap(); - assert!(msg.is_text()); - assert!( - msg.to_text() - .unwrap() - .contains("5d8f5c3e-0e00-4c5c-816d-70b4b0f41498") - ); - - mock.assert_async().await; - } } diff --git a/src/model/subscription.rs b/src/model/subscription.rs index 5f376ab..a6a30fd 100644 --- a/src/model/subscription.rs +++ b/src/model/subscription.rs @@ -13,20 +13,19 @@ pub struct TiledSubscription; impl TiledSubscription { async fn events(&self, ctx: &Context<'_>) -> impl Stream { let client = ctx.data::().unwrap(); - let auth = ctx + let headers = ctx .data_opt::>() - .and_then(|a| a.as_ref()); - let headers = auth.map(|a| a.as_header_map()); - + .and_then(|a| a.as_ref()) + .map(|a| a.as_header_map()); client.stream_events(None, headers) } async fn node_events(&self, ctx: &Context<'_>, node: String) -> impl Stream { let client = ctx.data::().unwrap(); - let auth = ctx + let headers = ctx .data_opt::>() - .and_then(|a| a.as_ref()); - let headers = auth.map(|a| a.as_header_map()); + .and_then(|a| a.as_ref()) + .map(|a| a.as_header_map()); client.stream_events(Some(node), headers) } } @@ -127,24 +126,30 @@ pub enum TiledEvent { #[cfg(test)] mod tests { + use std::time::Duration; + + use async_graphql::{EmptyMutation, Schema}; use axum::Router; use axum::extract::WebSocketUpgrade; use axum::extract::ws::Message; - use axum::http::HeaderMap; + use axum::http::{HeaderMap, Uri}; use axum::routing::any; use futures_util::StreamExt; + use rstest::rstest; use tokio::net::TcpListener; + use tokio::sync::mpsc; + use tokio::time; use url::Url; use super::*; use crate::clients::TiledClient; - #[rstest::rstest] + #[rstest] #[case::with_auth(Some("Bearer test-token"))] #[case::no_auth(None)] #[tokio::test] async fn test_stream_events_headers_parameterized(#[case] auth_token: Option<&str>) { - let (tx, mut rx) = tokio::sync::mpsc::channel(1); + let (tx, mut rx) = mpsc::channel(1); let app = Router::new().fallback(any( move |headers: HeaderMap, ws: WebSocketUpgrade| async move { @@ -167,19 +172,12 @@ mod tests { headers.insert("Authorization", token.parse().unwrap()); } - let stream = client.stream_events( - None, - if headers.is_empty() { - None - } else { - Some(headers) - }, - ); + let stream = client.stream_events(None, Some(headers)); tokio::pin!(stream); - let _ = tokio::time::timeout(std::time::Duration::from_secs(5), stream.next()).await; + let _ = time::timeout(Duration::from_secs(5), stream.next()).await; - let captured_headers = tokio::time::timeout(std::time::Duration::from_secs(5), rx.recv()) + let captured_headers = time::timeout(Duration::from_secs(5), rx.recv()) .await .expect("Timeout waiting for headers") .expect("Channel closed"); @@ -211,10 +209,7 @@ mod tests { #[case] expected_version: u32, #[case] result_key: &str, ) { - use async_graphql::{EmptyMutation, Schema}; - use axum::http::Uri; - - let (tx, mut rx) = tokio::sync::mpsc::channel(1); + let (tx, mut rx) = mpsc::channel(1); let app = Router::new().fallback(any(move |uri: Uri, ws: WebSocketUpgrade| async move { let path = uri.path().to_string(); @@ -246,7 +241,7 @@ mod tests { let stream = schema.execute_stream(query); let mut stream = Box::pin(stream); - let res = tokio::time::timeout(std::time::Duration::from_secs(5), stream.next()) + let res = time::timeout(Duration::from_secs(5), stream.next()) .await .expect("Timeout waiting for events") .unwrap(); @@ -256,7 +251,7 @@ mod tests { async_graphql::value!({ result_key: { "version": expected_version } }) ); - let path = tokio::time::timeout(std::time::Duration::from_secs(5), rx.recv()) + let path = time::timeout(Duration::from_secs(5), rx.recv()) .await .expect("Timeout waiting for path") .unwrap(); From 037126b1b9fbfdfe93f6093dc03e26b9369c5537 Mon Sep 17 00:00:00 2001 From: Zoheb Shaikh <26975142+ZohebShaikh@users.noreply.github.com> Date: Fri, 8 May 2026 14:46:15 +0100 Subject: [PATCH 10/22] remove config changes added --- config.toml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/config.toml b/config.toml index 919aa33..6bd9ae3 100644 --- a/config.toml +++ b/config.toml @@ -1,5 +1,4 @@ bind_address = "0.0.0.0:3000" [tiled_client] -address = "http://tiled:8000" -public_address = "http://localhost/glazed/" +address = "http://tiled.tiled:8000" From 74b1af12908864f1603b8a68e9f1bac0b80e62e2 Mon Sep 17 00:00:00 2001 From: Zoheb Shaikh <26975142+ZohebShaikh@users.noreply.github.com> Date: Fri, 8 May 2026 15:13:04 +0100 Subject: [PATCH 11/22] refactor header logic --- src/handlers.rs | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/handlers.rs b/src/handlers.rs index 1c24cf7..f0691d9 100644 --- a/src/handlers.rs +++ b/src/handlers.rs @@ -38,11 +38,12 @@ pub async fn graphql_ws_handler( .on_connection_init(|value| async move { let mut data = Data::default(); - if let Some(auth) = value.get("Authorization").and_then(|v| v.as_str()) - && let Ok(header_value) = HeaderValue::from_str(auth) - { - auth_token = Some(AuthHeader(header_value)); - } + auth_token = value + .get("Authorization") + .and_then(|v| v.as_str()) + .and_then(|auth| HeaderValue::from_str(auth).ok()) + .map(AuthHeader) + .or(auth_token); data.insert(auth_token); Ok(data) From edc1ae90af11eeb7b40ca349da5a70646aaa82bc Mon Sep 17 00:00:00 2001 From: Zoheb Shaikh <26975142+ZohebShaikh@users.noreply.github.com> Date: Tue, 28 Jul 2026 11:08:38 +0100 Subject: [PATCH 12/22] chore: update dependencies --- Cargo.lock | 1197 +++++++++++++++++++++++++++------------------------- Cargo.toml | 2 +- 2 files changed, 629 insertions(+), 570 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 109b47b..8f065bd 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -7,10 +7,6 @@ name = "Inflector" version = "0.11.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fe438c63458706e03479442743baae6c88256498e6431708f6dfc520a26515d3" -dependencies = [ - "lazy_static", - "regex", -] [[package]] name = "aho-corasick" @@ -23,9 +19,9 @@ dependencies = [ [[package]] name = "anstream" -version = "0.6.21" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43d5b281e737544384e969a5ccad3f1cdd24b48086a0fc1b2a5262a26b8f4f4a" +checksum = "824a212faf96e9acacdbd09febd34438f8f711fb84e09a8916013cd7815ca28d" dependencies = [ "anstyle", "anstyle-parse", @@ -38,37 +34,37 @@ dependencies = [ [[package]] name = "anstyle" -version = "1.0.13" +version = "1.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5192cca8006f1fd4f7237516f40fa183bb07f8fbdfedaa0036de5ea9b0b45e78" +checksum = "940b3a0ca603d1eade50a4846a2afffd5ef57a9feac2c0e2ec2e14f9ead76000" [[package]] name = "anstyle-parse" -version = "0.2.7" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e7644824f0aa2c7b9384579234ef10eb7efb6a0deb83f9630a49594dd9c15c2" +checksum = "52ce7f38b242319f7cabaa6813055467063ecdc9d355bbb4ce0c68908cd8130e" dependencies = [ "utf8parse", ] [[package]] name = "anstyle-query" -version = "1.1.4" +version = "1.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e231f6134f61b71076a3eab506c379d4f36122f2af15a9ff04415ea4c3339e2" +checksum = "40c48f72fd53cd289104fc64099abca73db4166ad86ea0b4341abe65af83dadc" dependencies = [ - "windows-sys 0.60.2", + "windows-sys 0.61.2", ] [[package]] name = "anstyle-wincon" -version = "3.0.10" +version = "3.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e0633414522a32ffaac8ac6cc8f748e090c5717661fddeea04219e2344f5f2a" +checksum = "291e6a250ff86cd4a820112fb8898808a366d8f9f58ce16d1f538353ad55747d" dependencies = [ "anstyle", "once_cell_polyfill", - "windows-sys 0.60.2", + "windows-sys 0.61.2", ] [[package]] @@ -95,20 +91,20 @@ dependencies = [ [[package]] name = "async-graphql" -version = "7.0.17" +version = "7.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "036618f842229ba0b89652ffe425f96c7c16a49f7e3cb23b56fca7f61fd74980" +checksum = "1057a9f7ccf2404d94571dec3451ade1cb524790df6f1ada0d19c2a49f6b0f40" dependencies = [ "async-graphql-derive", "async-graphql-parser", "async-graphql-value", - "async-stream", + "async-io", "async-trait", - "base64 0.22.1", + "asynk-strim", + "base64", "bytes", "fast_chemail", "fnv", - "futures-timer", "futures-util", "handlebars", "http", @@ -123,15 +119,15 @@ dependencies = [ "serde_urlencoded", "static_assertions_next", "tempfile", - "thiserror 1.0.69", + "thiserror", "uuid", ] [[package]] name = "async-graphql-axum" -version = "7.0.17" +version = "7.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8725874ecfbf399e071150b8619c4071d7b2b7a2f117e173dddef53c6bdb6bb1" +checksum = "a1e37c5532e4b686acf45e7162bc93da91fc2c702fb0d465efc2c20c8f973795" dependencies = [ "async-graphql", "axum", @@ -146,26 +142,26 @@ dependencies = [ [[package]] name = "async-graphql-derive" -version = "7.0.17" +version = "7.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd45deb3dbe5da5cdb8d6a670a7736d735ba65b455328440f236dfb113727a3d" +checksum = "2e6cbeadc8515e66450fba0985ce722192e28443697799988265d86304d7cc68" dependencies = [ "Inflector", "async-graphql-parser", - "darling", + "darling 0.23.0", "proc-macro-crate", "proc-macro2", "quote", "strum", - "syn", - "thiserror 1.0.69", + "syn 2.0.119", + "thiserror", ] [[package]] name = "async-graphql-parser" -version = "7.0.17" +version = "7.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60b7607e59424a35dadbc085b0d513aa54ec28160ee640cf79ec3b634eba66d3" +checksum = "e64ef70f77a1c689111e52076da1cd18f91834bcb847de0a9171f83624b07fbf" dependencies = [ "async-graphql-value", "pest", @@ -175,9 +171,9 @@ dependencies = [ [[package]] name = "async-graphql-value" -version = "7.0.17" +version = "7.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34ecdaff7c9cffa3614a9f9999bf9ee4c3078fe3ce4d6a6e161736b56febf2de" +checksum = "3e3ef112905abea9dea592fc868a6873b10ebd3f983e83308f995d6284e9ba41" dependencies = [ "bytes", "indexmap", @@ -185,11 +181,29 @@ dependencies = [ "serde_json", ] +[[package]] +name = "async-io" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "456b8a8feb6f42d237746d4b3e9a178494627745c3c56c6ea55d92ba50d026fc" +dependencies = [ + "autocfg", + "cfg-if", + "concurrent-queue", + "futures-io", + "futures-lite", + "parking", + "polling", + "rustix", + "slab", + "windows-sys 0.61.2", +] + [[package]] name = "async-lock" -version = "3.4.1" +version = "3.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5fd03604047cee9b6ce9de9f70c6cd540a0520c813cbd49bae61f33ab80ed1dc" +checksum = "290f7f2596bd5b78a9fec8088ccd89180d7f9f55b94b0576823bbbdc72ee8311" dependencies = [ "event-listener", "event-listener-strategy", @@ -207,36 +221,24 @@ dependencies = [ ] [[package]] -name = "async-stream" -version = "0.3.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b5a71a6f37880a80d1d7f19efd781e4b5de42c88f0722cc13bcb6cc2cfe8476" -dependencies = [ - "async-stream-impl", - "futures-core", - "pin-project-lite", -] - -[[package]] -name = "async-stream-impl" -version = "0.3.6" +name = "async-trait" +version = "0.1.91" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7c24de15d275a1ecfd47a380fb4d5ec9bfe0933f309ed5e705b775596a3574d" +checksum = "ae36dc4177970ef04fde5178d3e2429882def40e57a451f919c098f72baa6cec" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 3.0.3", ] [[package]] -name = "async-trait" -version = "0.1.89" +name = "asynk-strim" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb" +checksum = "52697735bdaac441a29391a9e97102c74c6ef0f9b60a40cf109b1b404e29d2f6" dependencies = [ - "proc-macro2", - "quote", - "syn", + "futures-core", + "pin-project-lite", ] [[package]] @@ -247,18 +249,18 @@ checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" [[package]] name = "autocfg" -version = "1.5.0" +version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" +checksum = "f2032f911046de80f0a198e0901378627c33f59ea0ac00e363d481118bd70a53" [[package]] name = "axum" -version = "0.8.6" +version = "0.8.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a18ed336352031311f4e0b4dd2ff392d4fbb370777c9d18d7fc9d7359f73871" +checksum = "31b698c5f9a010f6573133b09e0de5408834d0c82f8d7475a89fc1867a71cd90" dependencies = [ "axum-core", - "base64 0.22.1", + "base64", "bytes", "form_urlencoded", "futures-util", @@ -289,9 +291,9 @@ dependencies = [ [[package]] name = "axum-core" -version = "0.5.5" +version = "0.5.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59446ce19cd142f8833f856eb31f3eb097812d1479ab224f54d72428ca21ea22" +checksum = "08c78f31d7b1291f7ee735c1c6780ccde7785daae9a9206026862dab7d8792d1" dependencies = [ "bytes", "futures-core", @@ -306,12 +308,6 @@ dependencies = [ "tracing", ] -[[package]] -name = "base64" -version = "0.21.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" - [[package]] name = "base64" version = "0.22.1" @@ -320,9 +316,9 @@ checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" [[package]] name = "bitflags" -version = "2.10.0" +version = "2.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "812e12b5285cc515a9c72a5c1d3b6d46a19dac5acfef5265968c166106e31dd3" +checksum = "b588b76d00fde79687d7646a9b5bdf3cc0f655e0bbd080335a95d7e96f3587da" dependencies = [ "serde_core", ] @@ -338,24 +334,24 @@ dependencies = [ [[package]] name = "bumpalo" -version = "3.19.0" +version = "3.20.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46c5e41b57b8bba42a04676d81cb89e9ee8e859a1a66f80a5a72e1cb76b34d43" +checksum = "72f5acc6cb2ba439de613abc23857ec3d78374d8ed5ac84e9d11336e87da8649" [[package]] name = "bytes" -version = "1.10.1" +version = "1.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" +checksum = "fc652a48c352aef3ea3aed32080501cf3ef6ed5da78602a020c991775b0aff04" dependencies = [ "serde", ] [[package]] name = "cc" -version = "1.2.45" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35900b6c8d709fb1d854671ae27aeaa9eec2f8b01b364e1619a40da3e6fe2afe" +checksum = "5add81bb678e6cb321aff7fa0dc7689ad82b112dbc032cea19f91d6b8e3582b9" dependencies = [ "find-msvc-tools", "shlex", @@ -369,15 +365,26 @@ checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" [[package]] name = "cfg_aliases" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" +checksum = "f079e83a288787bcd14a6aea84cee5c87a67c5a3e660c30f557a3d24761b3527" + +[[package]] +name = "chacha20" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d524456ba66e72eb8b115ff89e01e497f8e6d11d78b70b1aa13c0fbd97540a81" +dependencies = [ + "cfg-if", + "cpufeatures 0.3.0", + "rand_core 0.10.1", +] [[package]] name = "clap" -version = "4.5.51" +version = "4.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c26d721170e0295f191a69bd9a1f93efcdb0aff38684b61ab5750468972e5f5" +checksum = "d91e0c145792ef73a6ad36d27c75ac09f1832222a3c209689d90f534685ee5b7" dependencies = [ "clap_builder", "clap_derive", @@ -385,9 +392,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.51" +version = "4.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75835f0c7bf681bfd05abe44e965760fea999a5286c6eb2d59883634fd02011a" +checksum = "f09628afdcc538b57f3c6341e9c8e9970f18e4a481690a64974d7023bd33548b" dependencies = [ "anstream", "anstyle", @@ -397,27 +404,27 @@ dependencies = [ [[package]] name = "clap_derive" -version = "4.5.49" +version = "4.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a0b5487afeab2deb2ff4e03a807ad1a03ac532ff5a2cee5d86884440c7f7671" +checksum = "d012d2b9d65aca7f18f4d9878a045bc17899bba951561ba5ec3c2ba1eed9a061" dependencies = [ "heck", "proc-macro2", "quote", - "syn", + "syn 3.0.3", ] [[package]] name = "clap_lex" -version = "0.7.6" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1d728cc89cf3aee9ff92b05e62b19ee65a02b5702cff7d5a377e32c6ae29d8d" +checksum = "c8d4a3bb8b1e0c1050499d1815f5ab16d04f0959b233085fb31653fbfc9d98f9" [[package]] name = "colorchoice" -version = "1.0.4" +version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b05b61dc5112cbb17e4b6cd61790d9845d13888356391624cbe7e41efeac1e75" +checksum = "1d07550c9036bf2ae0c684c4297d503f838287c83c53686d05370d0e139ae570" [[package]] name = "concurrent-queue" @@ -430,9 +437,9 @@ dependencies = [ [[package]] name = "config" -version = "0.15.18" +version = "0.15.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "180e549344080374f9b32ed41bf3b6b57885ff6a289367b3dbc10eea8acc1918" +checksum = "b85f248a4de22d204ceabc6299d89d2c70fbd7f09fea53c06c852369652d8139" dependencies = [ "async-trait", "convert_case", @@ -463,7 +470,7 @@ version = "0.1.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f9d839f2a20b0aee515dc581a6172f2321f96cab76c1a38a4c584a194955390e" dependencies = [ - "getrandom 0.2.16", + "getrandom 0.2.17", "once_cell", "tiny-keccak", ] @@ -486,11 +493,20 @@ dependencies = [ "libc", ] +[[package]] +name = "cpufeatures" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b2a41393f66f16b0823bb79094d54ac5fbd34ab292ddafb9a0456ac9f87d201" +dependencies = [ + "libc", +] + [[package]] name = "crossbeam-utils" -version = "0.8.21" +version = "0.8.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" +checksum = "61803da095bee82a81bb1a452ecc25d3b2f1416d1897eb86430c6159ef717c17" [[package]] name = "crunchy" @@ -500,9 +516,9 @@ checksum = "460fbee9c2c2f33933d720630a6a0bac33ba7053db5344fac858d4b8952d77d5" [[package]] name = "crypto-common" -version = "0.1.6" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" +checksum = "78c8292055d1c1df0cce5d180393dc8cce0abec0a7102adb6c7b1eef6016d60a" dependencies = [ "generic-array", "typenum", @@ -514,8 +530,18 @@ version = "0.20.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fc7f46116c46ff9ab3eb1597a45688b6715c6e628b5c133e288e709a29bcb4ee" dependencies = [ - "darling_core", - "darling_macro", + "darling_core 0.20.11", + "darling_macro 0.20.11", +] + +[[package]] +name = "darling" +version = "0.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "25ae13da2f202d56bd7f91c25fba009e7717a1e4a1cc98a76d844b65ae912e9d" +dependencies = [ + "darling_core 0.23.0", + "darling_macro 0.23.0", ] [[package]] @@ -529,7 +555,20 @@ dependencies = [ "proc-macro2", "quote", "strsim", - "syn", + "syn 2.0.119", +] + +[[package]] +name = "darling_core" +version = "0.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9865a50f7c335f53564bb694ef660825eb8610e0a53d3e11bf1b0d3df31e03b0" +dependencies = [ + "ident_case", + "proc-macro2", + "quote", + "strsim", + "syn 2.0.119", ] [[package]] @@ -538,16 +577,58 @@ version = "0.20.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fc34b93ccb385b40dc71c6fceac4b2ad23662c7eeb248cf10d529b7e055b6ead" dependencies = [ - "darling_core", + "darling_core 0.20.11", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "darling_macro" +version = "0.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3984ec7bd6cfa798e62b4a642426a5be0e68f9401cfc2a01e3fa9ea2fcdb8d" +dependencies = [ + "darling_core 0.23.0", "quote", - "syn", + "syn 2.0.119", ] [[package]] name = "data-encoding" -version = "2.9.0" +version = "2.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a2330da5de22e8a3cb63252ce2abb30116bf5265e89c0e01bc17015ce30a476" +checksum = "a4ae5f15dda3c708c0ade84bfee31ccab44a3da4f88015ed22f63732abe300c8" + +[[package]] +name = "derive_builder" +version = "0.20.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "507dfb09ea8b7fa618fcf76e953f4f5e192547945816d5358edffe39f6f94947" +dependencies = [ + "derive_builder_macro", +] + +[[package]] +name = "derive_builder_core" +version = "0.20.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d5bcf7b024d6835cfb3d473887cd966994907effbe9227e8c8219824d06c4e8" +dependencies = [ + "darling 0.20.11", + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "derive_builder_macro" +version = "0.20.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab63b0e2bf4d5928aff72e83a7dace85d7bba5fe12dcc3c5a572d78caffd3f3c" +dependencies = [ + "derive_builder_core", + "syn 2.0.119", +] [[package]] name = "digest" @@ -561,13 +642,13 @@ dependencies = [ [[package]] name = "displaydoc" -version = "0.2.5" +version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" +checksum = "1ac70aa55017e108007fbaf5aa0f54b021c98f92ff8af59d42eda9da96e3dd4f" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.119", ] [[package]] @@ -596,9 +677,9 @@ checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" [[package]] name = "erased-serde" -version = "0.4.9" +version = "0.4.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89e8918065695684b2b0702da20382d5ae6065cf3327bc2d6436bd49a71ce9f3" +checksum = "d2add8a07dd6a8d93ff627029c51de145e12686fbc36ecb298ac22e74cf02dec" dependencies = [ "serde", "serde_core", @@ -617,11 +698,10 @@ dependencies = [ [[package]] name = "event-listener" -version = "5.4.1" +version = "5.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e13b66accf52311f30a0db42147dadea9850cb48cd070028831ae5f5d4b856ab" +checksum = "5a23add41df1562121a9393cb065eab5146a1242410f23a644851e90cfd669d2" dependencies = [ - "concurrent-queue", "parking", "pin-project-lite", ] @@ -647,15 +727,15 @@ dependencies = [ [[package]] name = "fastrand" -version = "2.3.0" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" +checksum = "da7c62ceae207dd37ea5b845da6a0696c799f85e97da1ab5b7910be3c1c80223" [[package]] name = "find-msvc-tools" -version = "0.1.4" +version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52051878f80a721bb68ebfbc930e07b65ba72f2da88968ea5c06fd6ca3d3a127" +checksum = "5baebc0774151f905a1a2cc41989300b1e6fbb29aff0ceffa1064fdd3088d582" [[package]] name = "fnv" @@ -665,9 +745,9 @@ checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" [[package]] name = "foldhash" -version = "0.1.5" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" +checksum = "77ce24cb58228fbb8aa041425bb1050850ac19177686ea6e0f41a70416f56fdb" [[package]] name = "form_urlencoded" @@ -680,59 +760,69 @@ dependencies = [ [[package]] name = "futures-channel" -version = "0.3.31" +version = "0.3.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" +checksum = "262590f4fe6afeb0bc83be1daa64e52657fe185690a958af7f3ad0e92085c5ae" dependencies = [ "futures-core", ] [[package]] name = "futures-core" -version = "0.3.31" +version = "0.3.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" +checksum = "2cd50c473c80f6d7c3670a752354b8e569b1a7cbfdc0419ec88e5edad85e0dc7" [[package]] name = "futures-io" -version = "0.3.31" +version = "0.3.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" +checksum = "4577ecaa3c4f96589d473f679a71b596316f6641bc350038b962a5daf0085d7a" + +[[package]] +name = "futures-lite" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f78e10609fe0e0b3f4157ffab1876319b5b0db102a2c60dc4626306dc46b44ad" +dependencies = [ + "futures-core", + "pin-project-lite", +] [[package]] name = "futures-macro" -version = "0.3.31" +version = "0.3.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" +checksum = "2d6d3cde68c518367be28956066ddfef33813991b77a55005a69dae04bf3b10b" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.119", ] [[package]] name = "futures-sink" -version = "0.3.31" +version = "0.3.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" +checksum = "e34418ac499d6305c2fb5ad0ed2f6ac998c5f8ca209b4510f7f94242c647e307" [[package]] name = "futures-task" -version = "0.3.31" +version = "0.3.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" +checksum = "b231ed28831efb4a61a08580c4bc233ec56bc009f4cd8f52da2c3cb97df0c109" [[package]] name = "futures-timer" -version = "3.0.3" +version = "3.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f288b0a4f20f9a56b5d1da57e2227c661b7b16168e2f72365f57b63326e29b24" +checksum = "af43fadb8a98512d547e37b4e92e0ced13e205c061b87b4623eff01d918d6968" [[package]] name = "futures-util" -version = "0.3.31" +version = "0.3.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" +checksum = "a77a90a256fce34da66415271e30f94ee91c57b04b8a2c042d9cf3220179deaa" dependencies = [ "futures-core", "futures-io", @@ -741,15 +831,14 @@ dependencies = [ "futures-task", "memchr", "pin-project-lite", - "pin-utils", "slab", ] [[package]] name = "generic-array" -version = "0.14.9" +version = "0.14.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4bb6743198531e02858aeaea5398fcc883e71851fcbcb5a2f773e2fb6cb1edf2" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" dependencies = [ "typenum", "version_check", @@ -757,9 +846,9 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.2.16" +version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592" +checksum = "ff2abc00be7fca6ebc474524697ae276ad847ad0a6b3faa4bcb027e9a4614ad0" dependencies = [ "cfg-if", "js-sys", @@ -775,10 +864,22 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" dependencies = [ "cfg-if", - "js-sys", "libc", - "r-efi", + "r-efi 5.3.0", "wasip2", +] + +[[package]] +name = "getrandom" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "300e883d756b2e4ec94e02791f39b04b522276138852cfc41d9fb7e904106099" +dependencies = [ + "cfg-if", + "js-sys", + "libc", + "r-efi 6.0.0", + "rand_core 0.10.1", "wasm-bindgen", ] @@ -806,9 +907,9 @@ dependencies = [ [[package]] name = "h2" -version = "0.4.12" +version = "0.4.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3c0b69cfcb4e1b9f1bf2f53f95f766e4661169728ec61cd3fe5a0166f2d1386" +checksum = "6cb093c84e8bd9b188d4c4a8cb6579fc016968d14c99882163cd3ff402a4f155" dependencies = [ "atomic-waker", "bytes", @@ -825,16 +926,18 @@ dependencies = [ [[package]] name = "handlebars" -version = "5.1.2" +version = "6.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d08485b96a0e6393e9e4d1b8d48cf74ad6c063cd905eb33f42c1ce3f0377539b" +checksum = "4633d16a2350341713c379d6d06a4b9e1845329386026a49ce4fd09c2f3b16f6" dependencies = [ + "derive_builder", "log", + "num-order", "pest", "pest_derive", "serde", "serde_json", - "thiserror 1.0.69", + "thiserror", ] [[package]] @@ -845,26 +948,26 @@ checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" [[package]] name = "hashbrown" -version = "0.15.5" +version = "0.16.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" +checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100" dependencies = [ "foldhash", ] [[package]] name = "hashbrown" -version = "0.16.0" +version = "0.17.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5419bdc4f6a9207fbeba6d11b604d481addf78ecd10c11ad51e76c2f6482748d" +checksum = "ed5909b6e89a2db4456e54cd5f673791d7eca6732202bbf2a9cc504fe2f9b84a" [[package]] name = "hashlink" -version = "0.10.0" +version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7382cf6263419f2d8df38c55d7da83da5c18aef87fc7a7fc1fb1e344edfe14c1" +checksum = "824e001ac4f3012dd16a264bec811403a67ca9deb6c102fc5049b32c4574b35f" dependencies = [ - "hashbrown 0.15.5", + "hashbrown 0.16.1", ] [[package]] @@ -873,7 +976,7 @@ version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b3314d5adb5d94bcdf56771f2e50dbbc80bb4bdf88967526706205ac9eff24eb" dependencies = [ - "base64 0.22.1", + "base64", "bytes", "headers-core", "http", @@ -897,22 +1000,27 @@ version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" +[[package]] +name = "hermit-abi" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc0fef456e4baa96da950455cd02c081ca953b141298e41db3fc7e36b1da849c" + [[package]] name = "http" -version = "1.3.1" +version = "1.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4a85d31aea989eead29a3aaf9e1115a180df8282431156e533de47660892565" +checksum = "6970f50e31d6fc17d3fa27329444bfa74e196cf62e95052a3f6fee181dba6425" dependencies = [ "bytes", - "fnv", "itoa", ] [[package]] name = "http-body" -version = "1.0.1" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" +checksum = "ca2a8f2913ee65f60facd6a5905613afaa448497a0230cc41ce022d93290bc2c" dependencies = [ "bytes", "http", @@ -920,9 +1028,9 @@ dependencies = [ [[package]] name = "http-body-util" -version = "0.1.3" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a" +checksum = "e9f41fd6a08e4d4ec69df65976da761afd5ad5e58a9d4acb46bd1c953a9e3ff2" dependencies = [ "bytes", "futures-core", @@ -945,14 +1053,14 @@ checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" [[package]] name = "httpmock" -version = "0.8.2" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "511f510e9b1888d67f10bab4397f8b019d2a9b249a2c10acbce2d705b1b32e26" +checksum = "bf4888a4d02d8e1f92ffb6b4965cf5ff56dda36ef41975f41c6fa0f6bde78c4e" dependencies = [ "assert-json-diff", "async-object-pool", "async-trait", - "base64 0.22.1", + "base64", "bytes", "crossbeam-utils", "form_urlencoded", @@ -971,7 +1079,7 @@ dependencies = [ "similar", "stringmetrics", "tabwriter", - "thiserror 2.0.17", + "thiserror", "tokio", "tracing", "url", @@ -979,9 +1087,9 @@ dependencies = [ [[package]] name = "hyper" -version = "1.7.0" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb3aa54a13a0dfe7fbe3a59e0c76093041720fdc77b110cc0fc260fafb4dc51e" +checksum = "d22053281f852e11534f5198498373cbb59295120a20771d90f7ed1897490a72" dependencies = [ "atomic-waker", "bytes", @@ -994,7 +1102,6 @@ dependencies = [ "httpdate", "itoa", "pin-project-lite", - "pin-utils", "smallvec", "tokio", "want", @@ -1002,15 +1109,14 @@ dependencies = [ [[package]] name = "hyper-rustls" -version = "0.27.7" +version = "0.27.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3c93eb611681b207e1fe55d5a71ecf91572ec8a6705cdb6857f7d8d5242cf58" +checksum = "33ca68d021ef39cf6463ab54c1d0f5daf03377b70561305bb89a8f83aab66e0f" dependencies = [ "http", "hyper", "hyper-util", "rustls", - "rustls-pki-types", "tokio", "tokio-rustls", "tower-service", @@ -1019,14 +1125,13 @@ dependencies = [ [[package]] name = "hyper-util" -version = "0.1.17" +version = "0.1.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c6995591a8f1380fcb4ba966a252a4b29188d51d2b89e3a252f5305be65aea8" +checksum = "96547c2556ec9d12fb1578c4eaf448b04993e7fb79cbaad930a656880a6bdfa0" dependencies = [ - "base64 0.22.1", + "base64", "bytes", "futures-channel", - "futures-core", "futures-util", "http", "http-body", @@ -1043,12 +1148,13 @@ dependencies = [ [[package]] name = "icu_collections" -version = "2.1.1" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c6b649701667bbe825c3b7e6388cb521c23d88644678e83c0c4d0a621a34b43" +checksum = "2984d1cd16c883d7935b9e07e44071dca8d917fd52ecc02c04d5fa0b5a3f191c" dependencies = [ "displaydoc", "potential_utf", + "utf8_iter", "yoke", "zerofrom", "zerovec", @@ -1056,9 +1162,9 @@ dependencies = [ [[package]] name = "icu_locale_core" -version = "2.1.1" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "edba7861004dd3714265b4db54a3c390e880ab658fec5f7db895fae2046b5bb6" +checksum = "92219b62b3e2b4d88ac5119f8904c10f8f61bf7e95b640d25ba3075e6cac2c29" dependencies = [ "displaydoc", "litemap", @@ -1069,9 +1175,9 @@ dependencies = [ [[package]] name = "icu_normalizer" -version = "2.1.1" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f6c8828b67bf8908d82127b2054ea1b4427ff0230ee9141c54251934ab1b599" +checksum = "c56e5ee99d6e3d33bd91c5d85458b6005a22140021cc324cea84dd0e72cff3b4" dependencies = [ "icu_collections", "icu_normalizer_data", @@ -1083,15 +1189,15 @@ dependencies = [ [[package]] name = "icu_normalizer_data" -version = "2.1.1" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7aedcccd01fc5fe81e6b489c15b247b8b0690feb23304303a9e560f37efc560a" +checksum = "da3be0ae77ea334f4da67c12f149704f19f81d1adf7c51cf482943e84a2bad38" [[package]] name = "icu_properties" -version = "2.1.1" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e93fcd3157766c0c8da2f8cff6ce651a31f0810eaa1c51ec363ef790bbb5fb99" +checksum = "bee3b67d0ea5c2cca5003417989af8996f8604e34fb9ddf96208a033901e70de" dependencies = [ "icu_collections", "icu_locale_core", @@ -1103,15 +1209,15 @@ dependencies = [ [[package]] name = "icu_properties_data" -version = "2.1.1" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02845b3647bb045f1100ecd6480ff52f34c35f82d9880e029d329c21d1054899" +checksum = "8e2bbb201e0c04f7b4b3e14382af113e17ba4f63e2c9d2ee626b720cbce54a14" [[package]] name = "icu_provider" -version = "2.1.1" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85962cf0ce02e1e0a629cc34e7ca3e373ce20dda4c4d7294bbd0bf1fdb59e614" +checksum = "139c4cf31c8b5f33d7e199446eff9c1e02decfc2f0eec2c8d71f65befa45b421" dependencies = [ "displaydoc", "icu_locale_core", @@ -1141,9 +1247,9 @@ dependencies = [ [[package]] name = "idna_adapter" -version = "1.2.1" +version = "1.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344" +checksum = "cb68373c0d6620ef8105e855e7745e18b0d00d3bdb07fb532e434244cdb9a714" dependencies = [ "icu_normalizer", "icu_properties", @@ -1151,31 +1257,21 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.12.0" +version = "2.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6717a8d2a5a929a1a2eb43a12812498ed141a0bcfb7e8f7844fbdbe4303bba9f" +checksum = "d466e9454f08e4a911e14806c24e16fba1b4c121d1ea474396f396069cf949d9" dependencies = [ "equivalent", - "hashbrown 0.16.0", + "hashbrown 0.17.1", "serde", "serde_core", ] [[package]] name = "ipnet" -version = "2.11.0" +version = "2.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130" - -[[package]] -name = "iri-string" -version = "0.7.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f867b9d1d896b67beb18518eda36fdb77a32ea590de864f1325b294a6d14397" -dependencies = [ - "memchr", - "serde", -] +checksum = "d98f6fed1fde3f8c21bc40a1abb88dd75e67924f9cffc3ef95607bad8017f8e2" [[package]] name = "is_terminal_polyfill" @@ -1185,17 +1281,18 @@ checksum = "a6cb138bb79a146c1bd460005623e142ef0181e3d0219cb493e02f7d08a35695" [[package]] name = "itoa" -version = "1.0.15" +version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" +checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682" [[package]] name = "js-sys" -version = "0.3.82" +version = "0.3.103" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b011eec8cc36da2aab2d5cff675ec18454fad408585853910a202391cf9f8e65" +checksum = "53b44bfcdb3f8d5837a46dae1ca9660a837176eee74a28b229bc626816589102" dependencies = [ - "once_cell", + "cfg-if", + "futures-util", "wasm-bindgen", ] @@ -1218,21 +1315,21 @@ checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" [[package]] name = "libc" -version = "0.2.177" +version = "0.2.189" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2874a2af47a2325c2001a6e6fad9b16a53b802102b528163885171cf92b15976" +checksum = "3eaf3ede3fee6db1a4c2ee091bf8a8b4dccdc6d17f656fb07896ee72867612f2" [[package]] name = "linux-raw-sys" -version = "0.11.0" +version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df1d3c3b53da64cf5760482273a98e575c651a67eec7f77df96b5b642de8f039" +checksum = "32a66949e030da00e8c7d4434b251670a91556f4144941d37452769c25d58a53" [[package]] name = "litemap" -version = "0.8.1" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6373607a59f0be73a39b6fe456b8192fcc3585f602af20751600e974dd455e77" +checksum = "92daf443525c4cce67b150400bc2316076100ce0b3686209eb8cf3c31612e6f0" [[package]] name = "lock_api" @@ -1245,9 +1342,9 @@ dependencies = [ [[package]] name = "log" -version = "0.4.28" +version = "0.4.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34080505efa8e45a4b816c349525ebe327ceaa8559756f0356cba97ef3bf7432" +checksum = "0ceec5bc11778974d1bcb055b18002eba7f4b3518b6a0081b3af5f21666da9ad" [[package]] name = "lru-slab" @@ -1263,9 +1360,9 @@ checksum = "47e1ffaa40ddd1f3ed91f717a33c8c0ee23fff369e3aa8772b9605cc1d22f4c3" [[package]] name = "memchr" -version = "2.7.6" +version = "2.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f52b00d39961fc5b2736ea853c9cc86238e165017a493d1d5c8eac6bdc4cc273" +checksum = "cf8baf1c55e62ffcace7a9f06f4bd9cd3f0c4beb022d3b367256b91b87513d98" [[package]] name = "mime" @@ -1275,9 +1372,9 @@ checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" [[package]] name = "mio" -version = "1.1.0" +version = "1.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69d83b0086dc8ecf3ce9ae2874b2d1290252e2a30720bea58a5c6639b0092873" +checksum = "30d65c71f1ce40ab09135ce117d742b9f8a19ff91a41a8b57ed50bc2de59c427" dependencies = [ "libc", "wasi", @@ -1310,6 +1407,21 @@ dependencies = [ "windows-sys 0.61.2", ] +[[package]] +name = "num-modular" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc41a1374056e9672221567958a66c16be12d0e2c1b408761e14d901c237d5e0" + +[[package]] +name = "num-order" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "537b596b97c40fcf8056d153049eb22f481c17ebce72a513ec9286e4986d1bb6" +dependencies = [ + "num-modular", +] + [[package]] name = "num-traits" version = "0.2.19" @@ -1321,9 +1433,9 @@ dependencies = [ [[package]] name = "once_cell" -version = "1.21.3" +version = "1.21.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" +checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50" [[package]] name = "once_cell_polyfill" @@ -1393,9 +1505,9 @@ checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" [[package]] name = "pest" -version = "2.8.3" +version = "2.8.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "989e7521a040efde50c3ab6bbadafbe15ab6dc042686926be59ac35d74607df4" +checksum = "7df728be843c7070fab6ab7c328c4e9e9d78e23bf749c0669c86ee7ebfa050a2" dependencies = [ "memchr", "ucd-trie", @@ -1403,9 +1515,9 @@ dependencies = [ [[package]] name = "pest_derive" -version = "2.8.3" +version = "2.8.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "187da9a3030dbafabbbfb20cb323b976dc7b7ce91fcd84f2f74d6e31d378e2de" +checksum = "9e2dd6fc3b26b3462ee188aac870f5a41d398f1cd5e2408d16531bd71c9591fd" dependencies = [ "pest", "pest_generator", @@ -1413,44 +1525,51 @@ dependencies = [ [[package]] name = "pest_generator" -version = "2.8.3" +version = "2.8.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49b401d98f5757ebe97a26085998d6c0eecec4995cad6ab7fc30ffdf4b052843" +checksum = "6a7a9205cfb6f596a9e8b689c0a15f9ceb7a1aafae7aaf788150ac65b29975b6" dependencies = [ "pest", "pest_meta", "proc-macro2", "quote", - "syn", + "syn 2.0.119", ] [[package]] name = "pest_meta" -version = "2.8.3" +version = "2.8.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72f27a2cfee9f9039c4d86faa5af122a0ac3851441a34865b8a043b46be0065a" +checksum = "85abd351c0de1e8384fc791a0737111a350394937e92b956b743dac12429f57c" dependencies = [ "pest", - "sha2", ] [[package]] name = "pin-project-lite" -version = "0.2.16" +version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" +checksum = "a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd" [[package]] -name = "pin-utils" -version = "0.1.0" +name = "polling" +version = "3.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" +checksum = "5d0e4f59085d47d8241c88ead0f274e8a0cb551f3625263c05eb8dd897c34218" +dependencies = [ + "cfg-if", + "concurrent-queue", + "hermit-abi", + "pin-project-lite", + "rustix", + "windows-sys 0.61.2", +] [[package]] name = "potential_utf" -version = "0.1.4" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b73949432f5e2a09657003c25bca5e19a0e9c84f8058ca374f49e0ebe605af77" +checksum = "0103b1cef7ec0cf76490e969665504990193874ea05c85ff9bab8b911d0a0564" dependencies = [ "zerovec", ] @@ -1466,27 +1585,27 @@ dependencies = [ [[package]] name = "proc-macro-crate" -version = "3.4.0" +version = "3.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "219cb19e96be00ab2e37d6e299658a0cfa83e52429179969b0f0121b4ac46983" +checksum = "e67ba7e9b2b56446f1d419b1d807906278ffa1a658a8a5d8a39dcb1f5a78614f" dependencies = [ "toml_edit", ] [[package]] name = "proc-macro2" -version = "1.0.103" +version = "1.0.107" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ee95bc4ef87b8d5ba32e8b7714ccc834865276eab0aed5c9958d00ec45f49e8" +checksum = "985e7ec9bb745e6ce6535b544d84d6cd6f7ad8bd711c398938ae983b91a766d9" dependencies = [ "unicode-ident", ] [[package]] name = "quinn" -version = "0.11.9" +version = "0.11.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9e20a958963c291dc322d98411f541009df2ced7b5a4f2bd52337638cfccf20" +checksum = "0c1a41e437b6bbd489372cd4971de128e85c855f56c57f283d20ff016cf7c0a8" dependencies = [ "bytes", "cfg_aliases", @@ -1496,7 +1615,7 @@ dependencies = [ "rustc-hash", "rustls", "socket2", - "thiserror 2.0.17", + "thiserror", "tokio", "tracing", "web-time", @@ -1504,20 +1623,21 @@ dependencies = [ [[package]] name = "quinn-proto" -version = "0.11.13" +version = "0.11.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1906b49b0c3bc04b5fe5d86a77925ae6524a19b816ae38ce1e426255f1d8a31" +checksum = "2f4bfc015262b9df63c8845072ce59068853ff5872180c2ce2f13038b970e560" dependencies = [ "bytes", - "getrandom 0.3.4", + "getrandom 0.4.3", "lru-slab", - "rand", + "rand 0.10.2", + "rand_pcg", "ring", "rustc-hash", "rustls", "rustls-pki-types", "slab", - "thiserror 2.0.17", + "thiserror", "tinyvec", "tracing", "web-time", @@ -1525,23 +1645,23 @@ dependencies = [ [[package]] name = "quinn-udp" -version = "0.5.14" +version = "0.5.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "addec6a0dcad8a8d96a771f815f0eaf55f9d1805756410b39f5fa81332574cbd" +checksum = "35a133f956daabe89a61a685c2649f13d82d5aa4bd5d12d1277e1072a21c0694" dependencies = [ "cfg_aliases", "libc", "once_cell", "socket2", "tracing", - "windows-sys 0.60.2", + "windows-sys 0.61.2", ] [[package]] name = "quote" -version = "1.0.42" +version = "1.0.47" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a338cc41d27e6cc6dce6cefc13a0729dfbb81c262b1f519331575dd80ef3067f" +checksum = "1fbf4db142a473a8d80c26bbf18454ed458bf8d26c8219c331daecfdbd079001" dependencies = [ "proc-macro2", ] @@ -1552,14 +1672,31 @@ version = "5.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" +[[package]] +name = "r-efi" +version = "6.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf" + [[package]] name = "rand" -version = "0.9.2" +version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1" +checksum = "b9ef1d0d795eb7d84685bca4f72f3649f064e6641543d3a8c415898726a57b41" dependencies = [ "rand_chacha", - "rand_core", + "rand_core 0.9.5", +] + +[[package]] +name = "rand" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7f5fa3a058cd35567ef9bfa5e75732bee0f9e4c55fa90477bef2dfcdbc4be80" +dependencies = [ + "chacha20", + "getrandom 0.4.3", + "rand_core 0.10.1", ] [[package]] @@ -1569,18 +1706,33 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" dependencies = [ "ppv-lite86", - "rand_core", + "rand_core 0.9.5", ] [[package]] name = "rand_core" -version = "0.9.3" +version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38" +checksum = "76afc826de14238e6e8c374ddcc1fa19e374fd8dd986b0d2af0d02377261d83c" dependencies = [ "getrandom 0.3.4", ] +[[package]] +name = "rand_core" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "63b8176103e19a2643978565ca18b50549f6101881c443590420e4dc998a3c69" + +[[package]] +name = "rand_pcg" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "caa0f4137e1c0a72f4c651489402276c8e8e1cf081f3b0ba156d2cbeef09e86a" +dependencies = [ + "rand_core 0.10.1", +] + [[package]] name = "redox_syscall" version = "0.5.18" @@ -1592,9 +1744,9 @@ dependencies = [ [[package]] name = "regex" -version = "1.12.2" +version = "1.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "843bc0191f75f3e22651ae5f1e72939ab2f72a4bc30fa80a066bd66edefc24d4" +checksum = "f020237b6c8eed93db2e2cb53c00c60a8e1bc73da7d073199a1180401450218d" dependencies = [ "aho-corasick", "memchr", @@ -1604,9 +1756,9 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.13" +version = "0.4.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5276caf25ac86c8d810222b3dbb938e512c55c6831a10f3e6ed1c93b84041f1c" +checksum = "8fcfdb36bda0c880c5931cdc7a2bcdc8ba4556847b9d912bca70bc94708711ad" dependencies = [ "aho-corasick", "memchr", @@ -1615,17 +1767,17 @@ dependencies = [ [[package]] name = "regex-syntax" -version = "0.8.8" +version = "0.8.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a2d987857b319362043e95f5353c0535c1f58eec5336fdfcf626430af7def58" +checksum = "d6f6ff9a378485b298a5286656da665ba74413d36db0979633275d2e708145d4" [[package]] name = "reqwest" -version = "0.12.24" +version = "0.12.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d0946410b9f7b082a427e4ef5c8ff541a88b357bc6c637c40db3a68ac70a36f" +checksum = "eddd3ca559203180a307f12d114c268abf583f59b03cb906fd0b3ff8646c1147" dependencies = [ - "base64 0.22.1", + "base64", "bytes", "futures-core", "futures-util", @@ -1668,7 +1820,7 @@ checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" dependencies = [ "cc", "cfg-if", - "getrandom 0.2.16", + "getrandom 0.2.17", "libc", "untrusted", "windows-sys 0.52.0", @@ -1676,14 +1828,16 @@ dependencies = [ [[package]] name = "ron" -version = "0.8.1" +version = "0.12.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b91f7eff05f748767f183df4320a63d6936e9c6107d97c9e6bdd9784f4289c94" +checksum = "81116b9531d61eabc41aeb228e4b6b2435bcca3233b98cf3b3077d4e6e9debb3" dependencies = [ - "base64 0.21.7", "bitflags", + "once_cell", "serde", "serde_derive", + "typeid", + "unicode-ident", ] [[package]] @@ -1698,15 +1852,15 @@ dependencies = [ [[package]] name = "rustc-hash" -version = "2.1.1" +version = "2.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "357703d41365b4b27c590e3ed91eabb1b663f07c4c084095e60cbed4362dff0d" +checksum = "6b1e7f9a428571be2dc5bc0505c13fb6bf936822b894ec87abf8a08a4e51742d" [[package]] name = "rustix" -version = "1.1.2" +version = "1.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd15f8a2c5551a84d56efdc1cd049089e409ac19a3072d5037a17fd70719ff3e" +checksum = "b6fe4565b9518b83ef4f91bb47ce29620ca828bd32cb7e408f0062e9930ba190" dependencies = [ "bitflags", "errno", @@ -1717,9 +1871,9 @@ dependencies = [ [[package]] name = "rustls" -version = "0.23.35" +version = "0.23.42" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "533f54bc6a7d4f647e46ad909549eda97bf5afc1585190ef692b4286b198bd8f" +checksum = "3c54fcab019b409d04215d3a17cb438fd7fbf192ee61461f20f4fe18704bc138" dependencies = [ "once_cell", "ring", @@ -1731,9 +1885,9 @@ dependencies = [ [[package]] name = "rustls-pki-types" -version = "1.13.0" +version = "1.15.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94182ad936a0c91c324cd46c6511b9510ed16af436d7b5bab34beab0afd55f7a" +checksum = "2f4925028c7eb5d1fcdaf196971378ed9d2c1c4efc7dc5d011256f76c99c0a96" dependencies = [ "web-time", "zeroize", @@ -1741,9 +1895,9 @@ dependencies = [ [[package]] name = "rustls-webpki" -version = "0.103.8" +version = "0.103.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ffdfa2f5286e2247234e03f680868ac2815974dc39e00ea15adc445d0aafe52" +checksum = "61c429a8649f110dddef65e2a5ad240f747e85f7758a6bccc7e5777bd33f756e" dependencies = [ "ring", "rustls-pki-types", @@ -1752,15 +1906,15 @@ dependencies = [ [[package]] name = "rustversion" -version = "1.0.22" +version = "1.0.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" +checksum = "cf54715a573b99ac80df0bc206da022bcd442c974952c7b9720069370852e21f" [[package]] name = "ryu" -version = "1.0.20" +version = "1.0.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" +checksum = "9774ba4a74de5f7b1c1451ed6cd5285a32eddb5cccb8cc655a4e50009e06477f" [[package]] name = "scopeguard" @@ -1770,9 +1924,9 @@ checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" [[package]] name = "serde" -version = "1.0.228" +version = "1.0.229" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" +checksum = "4148590afebada386688f18773da617792bf2ef03ffc1e4cbd2b1d45b023e0ba" dependencies = [ "serde_core", "serde_derive", @@ -1792,35 +1946,36 @@ dependencies = [ [[package]] name = "serde_core" -version = "1.0.228" +version = "1.0.229" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" +checksum = "67dca2c9c51e58a4791a4b1ed58308b39c64224d349a935ab5039aa360942a48" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.228" +version = "1.0.229" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" +checksum = "e7a5d71263a5a7d47b41f6b3f06ba276f10cc18b0931f1799f710578e2309348" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 3.0.3", ] [[package]] name = "serde_json" -version = "1.0.145" +version = "1.0.151" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "402a6f66d8c709116cf22f558eab210f5a50187f702eb4d7e5ef38d9a7f1c79c" +checksum = "c841b55ecdae098c80dcae9cf767f6f8a0c2cdb3416bbef72181df4d0fe73f14" dependencies = [ + "indexmap", "itoa", "memchr", - "ryu", "serde", "serde_core", + "zmij", ] [[package]] @@ -1836,9 +1991,9 @@ dependencies = [ [[package]] name = "serde_regex" -version = "1.1.0" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8136f1a4ea815d7eac4101cfd0b16dc0cb5e1fe1b8609dfd728058656b7badf" +checksum = "bafc8d0c5330cecff10f16b459b479fd9acaa5b4acd7167301414e21b0057012" dependencies = [ "regex", "serde", @@ -1846,9 +2001,9 @@ dependencies = [ [[package]] name = "serde_spanned" -version = "1.0.3" +version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e24345aa0fe688594e73770a5f6d1b216508b4f93484c0026d521acd30134392" +checksum = "6662b5879511e06e8999a8a235d848113e942c9124f211511b16466ee2995f26" dependencies = [ "serde_core", ] @@ -1867,23 +2022,12 @@ dependencies = [ [[package]] name = "sha1" -version = "0.10.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" -dependencies = [ - "cfg-if", - "cpufeatures", - "digest", -] - -[[package]] -name = "sha2" -version = "0.10.9" +version = "0.10.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" +checksum = "a978451301f4db1d02937a4ab3ccce137717b81826e79b7d49ffe3244a13c3b8" dependencies = [ "cfg-if", - "cpufeatures", + "cpufeatures 0.2.17", "digest", ] @@ -1898,16 +2042,17 @@ dependencies = [ [[package]] name = "shlex" -version = "1.3.0" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" +checksum = "f8fadd59c855ef2080decdef8ff161eb6661b86933c9d82e5ba29dc602a55aba" [[package]] name = "signal-hook-registry" -version = "1.4.6" +version = "1.4.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2a4719bff48cee6b39d12c020eeb490953ad2443b7055bd0b21fca26bd8c28b" +checksum = "c4db69cba1110affc0e9f7bcd48bbf87b3f4fc7c61fc9155afd4c469eb3d6c1b" dependencies = [ + "errno", "libc", ] @@ -1919,31 +2064,31 @@ checksum = "bbbb5d9659141646ae647b42fe094daf6c6192d1620870b449d9557f748b2daa" [[package]] name = "slab" -version = "0.4.11" +version = "0.4.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a2ae44ef20feb57a68b23d846850f861394c2e02dc425a50098ae8c90267589" +checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5" [[package]] name = "smallvec" -version = "1.15.1" +version = "1.15.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" +checksum = "8ed6a63f02c8539c91a8685a86f4099661ba3da017932f6ebbea6de3f0fa7c90" [[package]] name = "socket2" -version = "0.6.1" +version = "0.6.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17129e116933cf371d018bb80ae557e889637989d8638274fb25622827b03881" +checksum = "c3d1e2c7f27f8d4cb10542a02c49005dbd6e93095799d6f3be745fae9f8fedd4" dependencies = [ "libc", - "windows-sys 0.60.2", + "windows-sys 0.61.2", ] [[package]] name = "spin" -version = "0.9.8" +version = "0.9.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" +checksum = "3763264f6b73151db08c50ff20d7d8a0b8796e021cdea7ceedad07b80155fa0e" [[package]] name = "stable_deref_trait" @@ -1971,24 +2116,23 @@ checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" [[package]] name = "strum" -version = "0.26.3" +version = "0.27.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fec0f0aef304996cf250b31b5a10dee7980c85da9d759361292b8bca5a18f06" +checksum = "af23d6f6c1a224baef9d3f61e287d2761385a5b88fdab4eb4c6f11aeb54c4bcf" dependencies = [ "strum_macros", ] [[package]] name = "strum_macros" -version = "0.26.4" +version = "0.27.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c6bee85a5a24955dc440386795aa378cd9cf82acd5f764469152d2270e581be" +checksum = "7695ce3845ea4b33927c055a39dc438a45b059f7c1b3d91d38d10355fb8cbca7" dependencies = [ "heck", "proc-macro2", "quote", - "rustversion", - "syn", + "syn 2.0.119", ] [[package]] @@ -1999,9 +2143,20 @@ checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" [[package]] name = "syn" -version = "2.0.110" +version = "2.0.119" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a99801b5bd34ede4cf3fc688c5919368fea4e4814a4664359503e6015b280aea" +checksum = "872831b642d1a07999a962a351ed35b955ea2cfc8f3862091e2a240a84f17297" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "3.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53e9bae58849f64dfa4f5d5ae372c8341f7305f82a3868709269343628b659a3" dependencies = [ "proc-macro2", "quote", @@ -2025,7 +2180,7 @@ checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.119", ] [[package]] @@ -2039,12 +2194,12 @@ dependencies = [ [[package]] name = "tempfile" -version = "3.23.0" +version = "3.27.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d31c77bdf42a745371d260a26ca7163f1e0924b64afa0b688e61b5a9fa02f16" +checksum = "32497e9a4c7b38532efcdebeef879707aa9f794296a4f0244f6f69e9bc8574bd" dependencies = [ "fastrand", - "getrandom 0.3.4", + "getrandom 0.4.3", "once_cell", "rustix", "windows-sys 0.61.2", @@ -2052,49 +2207,29 @@ dependencies = [ [[package]] name = "thiserror" -version = "1.0.69" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" -dependencies = [ - "thiserror-impl 1.0.69", -] - -[[package]] -name = "thiserror" -version = "2.0.17" +version = "2.0.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f63587ca0f12b72a0600bcba1d40081f830876000bb46dd2337a3051618f4fc8" +checksum = "09a43598840e33d5b0331f38c5e30d13bb11c11210a4b58f0d9b18a5a5eefcd9" dependencies = [ - "thiserror-impl 2.0.17", + "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.69" +version = "2.0.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" +checksum = "43cbfe0cf76104d42a574802844187e84a305e531ed54455f11fbde0f10541cd" dependencies = [ "proc-macro2", "quote", - "syn", -] - -[[package]] -name = "thiserror-impl" -version = "2.0.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ff15c8ecd7de3849db632e14d18d2571fa09dfc5ed93479bc4485c7a517c913" -dependencies = [ - "proc-macro2", - "quote", - "syn", + "syn 3.0.3", ] [[package]] name = "thread_local" -version = "1.1.9" +version = "1.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f60246a4944f24f6e018aa17cdeffb7818b76356965d03b07d6a9886e8962185" +checksum = "1ad99c4c6d32803332c548b1af0540b357b3f5fc0be8f6c6bfe8b2e6ae784070" dependencies = [ "cfg-if", ] @@ -2110,9 +2245,9 @@ dependencies = [ [[package]] name = "tinystr" -version = "0.8.2" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42d3e9c45c09de15d06dd8acf5f4e0e399e85927b7f00711024eb7ae10fa4869" +checksum = "c8323304221c2a851516f22236c5722a72eaa19749016521d6dff0824447d96d" dependencies = [ "displaydoc", "zerovec", @@ -2120,9 +2255,9 @@ dependencies = [ [[package]] name = "tinyvec" -version = "1.10.0" +version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfa5fdc3bce6191a1dbc8c02d5c8bffcf557bafa17c124c5264a458f1b0613fa" +checksum = "bb4ebadaa0af04fab11ae01eb5f9fdb5f9c5b875506e210e71c07873528baa7f" dependencies = [ "tinyvec_macros", ] @@ -2135,9 +2270,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.48.0" +version = "1.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff360e02eab121e0bc37a2d3b4d4dc622e6eda3a8e5253d5435ecf5bd4c68408" +checksum = "202caea871b69668250d242070849eb495be178ed697a3e98aebce5bc81a0bed" dependencies = [ "bytes", "libc", @@ -2152,13 +2287,13 @@ dependencies = [ [[package]] name = "tokio-macros" -version = "2.6.0" +version = "2.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af407857209536a95c8e56f8231ef2c2e2aff839b22e07a1ffcbc617e9db9fa5" +checksum = "6328af13490e73a9b4694030fafd93f8c8c6a9dede33e821c3fc63eddf8042ba" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.119", ] [[package]] @@ -2173,9 +2308,9 @@ dependencies = [ [[package]] name = "tokio-stream" -version = "0.1.17" +version = "0.1.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eca58d7bba4a75707817a2c44174253f9236b2d5fbd055602e9d5c07c139a047" +checksum = "a3d06f0b082ba57c26b79407372e57cf2a1e28124f78e9479fe80322cf53420b" dependencies = [ "futures-core", "pin-project-lite", @@ -2184,9 +2319,9 @@ dependencies = [ [[package]] name = "tokio-tungstenite" -version = "0.28.0" +version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d25a406cddcc431a75d3d9afc6a7c0f7428d4891dd973e4d54c56b46127bf857" +checksum = "8f72a05e828585856dacd553fba484c242c46e391fb0e58917c942ee9202915c" dependencies = [ "futures-util", "log", @@ -2196,23 +2331,24 @@ dependencies = [ [[package]] name = "tokio-util" -version = "0.7.17" +version = "0.7.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2efa149fe76073d6e8fd97ef4f4eca7b67f599660115591483572e406e165594" +checksum = "494815d09bf52b5548659851081238f0ca39ff638363907596da739561c62c52" dependencies = [ "bytes", "futures-core", "futures-io", "futures-sink", + "libc", "pin-project-lite", "tokio", ] [[package]] name = "toml" -version = "0.9.8" +version = "1.1.3+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0dc8b1fb61449e27716ec0e1bdf0f6b8f3e8f6b05391e8497b8b6d7804ea6d8" +checksum = "53c96ecdfa941c8fc4fcaed14f99ada8ebed502eef533015095a07e3301d4c3c" dependencies = [ "serde_core", "serde_spanned", @@ -2223,18 +2359,18 @@ dependencies = [ [[package]] name = "toml_datetime" -version = "0.7.3" +version = "1.1.1+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2cdb639ebbc97961c51720f858597f7f24c4fc295327923af55b74c3c724533" +checksum = "3165f65f62e28e0115a00b2ebdd37eb6f3b641855f9d636d3cd4103767159ad7" dependencies = [ "serde_core", ] [[package]] name = "toml_edit" -version = "0.23.7" +version = "0.25.13+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6485ef6d0d9b5d0ec17244ff7eb05310113c3f316f2d14200d4de56b3cb98f8d" +checksum = "6975367e4d2ef766d86af01ffad14b622fecc8d4357a998fbc4deb6e9bacaf9b" dependencies = [ "indexmap", "toml_datetime", @@ -2244,18 +2380,18 @@ dependencies = [ [[package]] name = "toml_parser" -version = "1.0.4" +version = "1.1.3+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0cbe268d35bdb4bb5a56a2de88d0ad0eb70af5384a99d648cd4b3d04039800e" +checksum = "1d38ac1cf9b95face32296c0a3ede1fdc270627c9d9c02a7274dd6d960dc4d56" dependencies = [ "winnow", ] [[package]] name = "tower" -version = "0.5.2" +version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d039ad9159c98b70ecfd540b2573b97f7f52c3e8d9f8ad57a24b916a536975f9" +checksum = "ebe5ef63511595f1344e2d5cfa636d973292adc0eec1f0ad45fae9f0851ab1d4" dependencies = [ "futures-core", "futures-util", @@ -2269,20 +2405,20 @@ dependencies = [ [[package]] name = "tower-http" -version = "0.6.6" +version = "0.6.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "adc82fd73de2a9722ac5da747f12383d2bfdb93591ee6c58486e0097890f05f2" +checksum = "4cfcf7e2740e6fc6d4d688b4ef00650406bb94adf4731e43c096c3a19fe40840" dependencies = [ "bitflags", "bytes", "futures-util", "http", "http-body", - "iri-string", "pin-project-lite", "tower", "tower-layer", "tower-service", + "url", ] [[package]] @@ -2299,9 +2435,9 @@ checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" [[package]] name = "tracing" -version = "0.1.41" +version = "0.1.44" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" +checksum = "63e71662fa4b2a2c3a26f570f037eb95bb1f85397f3cd8076caed2f026a6d100" dependencies = [ "log", "pin-project-lite", @@ -2311,20 +2447,20 @@ dependencies = [ [[package]] name = "tracing-attributes" -version = "0.1.30" +version = "0.1.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81383ab64e72a7a8b8e13130c49e3dab29def6d0c7d76a03087b3cf71c5c6903" +checksum = "7490cfa5ec963746568740651ac6781f701c9c5ea257c58e057f3ba8cf69e8da" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.119", ] [[package]] name = "tracing-core" -version = "0.1.34" +version = "0.1.36" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9d12581f227e93f094d3af2ae690a574abb8a2b9b7a96e7cfe9647b2b617678" +checksum = "db97caf9d906fbde555dd62fa95ddba9eecfd14cb388e4f491a66d74cd5fb79a" dependencies = [ "once_cell", "valuable", @@ -2343,9 +2479,9 @@ dependencies = [ [[package]] name = "tracing-subscriber" -version = "0.3.20" +version = "0.3.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2054a14f5307d601f88daf0553e1cbf472acc4f2c51afab632431cdcd72124d5" +checksum = "cb7f578e5945fb242538965c2d0b04418d38ec25c79d160cd279bf0731c8d319" dependencies = [ "nu-ansi-term", "sharded-slab", @@ -2363,19 +2499,18 @@ checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" [[package]] name = "tungstenite" -version = "0.28.0" +version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8628dcc84e5a09eb3d8423d6cb682965dea9133204e8fb3efee74c2a0c259442" +checksum = "6c01152af293afb9c7c2a57e4b559c5620b421f6d133261c60dd2d0cdb38e6b8" dependencies = [ "bytes", "data-encoding", "http", "httparse", "log", - "rand", + "rand 0.9.5", "sha1", - "thiserror 2.0.17", - "utf-8", + "thiserror", ] [[package]] @@ -2386,9 +2521,9 @@ checksum = "bc7d623258602320d5c55d1bc22793b57daff0ec7efc270ea7d55ce1d5f5471c" [[package]] name = "typenum" -version = "1.19.0" +version = "1.20.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "562d481066bde0658276a35467c4af00bdc6ee726305698a55b86e61d7ad82bb" +checksum = "b6f5e870be6c3b371b77fe0ee0bafb859fa4964b4404c27de1d380043c4dda20" [[package]] name = "ucd-trie" @@ -2398,15 +2533,15 @@ checksum = "2896d95c02a80c6d6a5d6e953d479f5ddf2dfdb6a244441010e373ac0fb88971" [[package]] name = "unicode-ident" -version = "1.0.22" +version = "1.0.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9312f7c4f6ff9069b165498234ce8be658059c6728633667c526e27dc2cf1df5" +checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" [[package]] name = "unicode-segmentation" -version = "1.12.0" +version = "1.13.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" +checksum = "c6f5d3c3b1bf09027a88a6bc961fc00497d651009560b5463668dc81b0fa87a8" [[package]] name = "unicode-width" @@ -2422,22 +2557,17 @@ checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" [[package]] name = "url" -version = "2.5.7" +version = "2.5.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08bc136a29a3d1758e07a9cca267be308aeebf5cfd5a10f3f67ab2097683ef5b" +checksum = "ff67a8a4397373c3ef660812acab3268222035010ab8680ec4215f38ba3d0eed" dependencies = [ "form_urlencoded", "idna", "percent-encoding", "serde", + "serde_derive", ] -[[package]] -name = "utf-8" -version = "0.7.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" - [[package]] name = "utf8_iter" version = "1.0.4" @@ -2452,13 +2582,13 @@ checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" [[package]] name = "uuid" -version = "1.18.1" +version = "1.24.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f87b8aa10b915a06587d0dec516c282ff295b475d94abf425d62b57710070a2" +checksum = "bf3923a6f5c4c6382e0b653c4117f48d631ea17f38ed86e2a828e6f7412f5239" dependencies = [ - "getrandom 0.3.4", + "getrandom 0.4.3", "js-sys", - "serde", + "serde_core", "wasm-bindgen", ] @@ -2491,18 +2621,18 @@ checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" [[package]] name = "wasip2" -version = "1.0.1+wasi-0.2.4" +version = "1.0.4+wasi-0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0562428422c63773dad2c345a1882263bbf4d65cf3f42e90921f787ef5ad58e7" +checksum = "b67efb37e106e55ce722a510d6b5f9c17f083e5fc79afc2badeb12cc313d9487" dependencies = [ "wit-bindgen", ] [[package]] name = "wasm-bindgen" -version = "0.2.105" +version = "0.2.126" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da95793dfc411fbbd93f5be7715b0578ec61fe87cb1a42b12eb625caa5c5ea60" +checksum = "4b067c0c11094aef6b7a801c1e34a26affafdf3d051dba08456b868789aaf9a4" dependencies = [ "cfg-if", "once_cell", @@ -2513,22 +2643,19 @@ dependencies = [ [[package]] name = "wasm-bindgen-futures" -version = "0.4.55" +version = "0.4.76" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "551f88106c6d5e7ccc7cd9a16f312dd3b5d36ea8b4954304657d5dfba115d4a0" +checksum = "c62df1340f32221cb9c54d6a27b030e3dba64361d4a95bed55f9aacb44da291d" dependencies = [ - "cfg-if", "js-sys", - "once_cell", "wasm-bindgen", - "web-sys", ] [[package]] name = "wasm-bindgen-macro" -version = "0.2.105" +version = "0.2.126" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04264334509e04a7bf8690f2384ef5265f05143a4bff3889ab7a3269adab59c2" +checksum = "167ce5e579f6bcf889c4f7175a8a5a585de84e8ff93976ce393efa5f2837aab1" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -2536,22 +2663,22 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.105" +version = "0.2.126" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "420bc339d9f322e562942d52e115d57e950d12d88983a14c79b86859ee6c7ebc" +checksum = "f3997c7839262f4ef12cf90b818d6340c18e80f263f1a94bf157d0ec4420380e" dependencies = [ "bumpalo", "proc-macro2", "quote", - "syn", + "syn 2.0.119", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.105" +version = "0.2.126" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76f218a38c84bcb33c25ec7059b07847d465ce0e0a76b995e134a45adcb6af76" +checksum = "dc1b4cb0cc549fcf58d7dfc081778139b3d283a081644e833e84682ad71cea24" dependencies = [ "unicode-ident", ] @@ -2571,9 +2698,9 @@ dependencies = [ [[package]] name = "web-sys" -version = "0.3.82" +version = "0.3.103" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a1f95c0d03a47f4ae1f7a64643a6bb97465d9b740f0fa8f90ea33915c99a9a1" +checksum = "8622dcb61c0bcc9fffa6938bed81210af2da9a7e4a1a834b2e37a59b6dfb6141" dependencies = [ "js-sys", "wasm-bindgen", @@ -2591,9 +2718,9 @@ dependencies = [ [[package]] name = "webpki-roots" -version = "1.0.4" +version = "1.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2878ef029c47c6e8cf779119f20fcf52bde7ad42a731b2a304bc221df17571e" +checksum = "7dcd9d09a39985f5344844e66b0c530a33843579125f23e21e9f0f220850f22a" dependencies = [ "rustls-pki-types", ] @@ -2610,16 +2737,7 @@ version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" dependencies = [ - "windows-targets 0.52.6", -] - -[[package]] -name = "windows-sys" -version = "0.60.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" -dependencies = [ - "windows-targets 0.53.5", + "windows-targets", ] [[package]] @@ -2637,31 +2755,14 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" dependencies = [ - "windows_aarch64_gnullvm 0.52.6", - "windows_aarch64_msvc 0.52.6", - "windows_i686_gnu 0.52.6", - "windows_i686_gnullvm 0.52.6", - "windows_i686_msvc 0.52.6", - "windows_x86_64_gnu 0.52.6", - "windows_x86_64_gnullvm 0.52.6", - "windows_x86_64_msvc 0.52.6", -] - -[[package]] -name = "windows-targets" -version = "0.53.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4945f9f551b88e0d65f3db0bc25c33b8acea4d9e41163edf90dcd0b19f9069f3" -dependencies = [ - "windows-link", - "windows_aarch64_gnullvm 0.53.1", - "windows_aarch64_msvc 0.53.1", - "windows_i686_gnu 0.53.1", - "windows_i686_gnullvm 0.53.1", - "windows_i686_msvc 0.53.1", - "windows_x86_64_gnu 0.53.1", - "windows_x86_64_gnullvm 0.53.1", - "windows_x86_64_msvc 0.53.1", + "windows_aarch64_gnullvm", + "windows_aarch64_msvc", + "windows_i686_gnu", + "windows_i686_gnullvm", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_gnullvm", + "windows_x86_64_msvc", ] [[package]] @@ -2670,122 +2771,74 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9d8416fa8b42f5c947f8482c43e7d89e73a173cead56d044f6a56104a6d1b53" - [[package]] name = "windows_aarch64_msvc" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" -[[package]] -name = "windows_aarch64_msvc" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9d782e804c2f632e395708e99a94275910eb9100b2114651e04744e9b125006" - [[package]] name = "windows_i686_gnu" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" -[[package]] -name = "windows_i686_gnu" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "960e6da069d81e09becb0ca57a65220ddff016ff2d6af6a223cf372a506593a3" - [[package]] name = "windows_i686_gnullvm" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" -[[package]] -name = "windows_i686_gnullvm" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa7359d10048f68ab8b09fa71c3daccfb0e9b559aed648a8f95469c27057180c" - [[package]] name = "windows_i686_msvc" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" -[[package]] -name = "windows_i686_msvc" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e7ac75179f18232fe9c285163565a57ef8d3c89254a30685b57d83a38d326c2" - [[package]] name = "windows_x86_64_gnu" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" -[[package]] -name = "windows_x86_64_gnu" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c3842cdd74a865a8066ab39c8a7a473c0778a3f29370b5fd6b4b9aa7df4a499" - [[package]] name = "windows_x86_64_gnullvm" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ffa179e2d07eee8ad8f57493436566c7cc30ac536a3379fdf008f47f6bb7ae1" - [[package]] name = "windows_x86_64_msvc" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" -[[package]] -name = "windows_x86_64_msvc" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650" - [[package]] name = "winnow" -version = "0.7.13" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21a0236b59786fed61e2a80582dd500fe61f18b5dca67a4a067d0bc9039339cf" +checksum = "23b97319f7b8343df12cc98938e5c3eb436064524c8d2b4e30a1d3a36eecdf81" dependencies = [ "memchr", ] [[package]] name = "wit-bindgen" -version = "0.46.0" +version = "0.57.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f17a85883d4e6d00e8a97c586de764dabcc06133f7f1d55dce5cdc070ad7fe59" +checksum = "1ebf944e87a7c253233ad6766e082e3cd714b5d03812acc24c318f549614536e" [[package]] name = "writeable" -version = "0.6.2" +version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9edde0db4769d2dc68579893f2306b26c6ecfbe0ef499b013d731b7b9247e0b9" +checksum = "1ffae5123b2d3fc086436f8834ae3ab053a283cfac8fe0a0b8eaae044768a4c4" [[package]] name = "yaml-rust2" -version = "0.10.4" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2462ea039c445496d8793d052e13787f2b90e750b833afee748e601c17621ed9" +checksum = "631a50d867fafb7093e709d75aaee9e0e0d5deb934021fcea25ac2fe09edc51e" dependencies = [ "arraydeque", "encoding_rs", @@ -2794,9 +2847,9 @@ dependencies = [ [[package]] name = "yoke" -version = "0.8.1" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72d6e5c6afb84d73944e5cedb052c4680d5657337201555f9f2a16b7406d4954" +checksum = "709fe23a0424b6a435d82152b1bd3fdfb0833487d5fa90d05d42762a9891fef5" dependencies = [ "stable_deref_trait", "yoke-derive", @@ -2805,68 +2858,68 @@ dependencies = [ [[package]] name = "yoke-derive" -version = "0.8.1" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b659052874eb698efe5b9e8cf382204678a0086ebf46982b79d6ca3182927e5d" +checksum = "de844c262c8848816172cef550288e7dc6c7b7814b4ee56b3e1553f275f1858e" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.119", "synstructure", ] [[package]] name = "zerocopy" -version = "0.8.27" +version = "0.8.55" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0894878a5fa3edfd6da3f88c4805f4c8558e2b996227a3d864f47fe11e38282c" +checksum = "b5a105cd7b140f6eeec8acff2ea38135d3cab283ada58540f629fe51e46696eb" dependencies = [ "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.8.27" +version = "0.8.55" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88d2b8d9c68ad2b9e4340d7832716a4d21a22a1154777ad56ea55c51a9cf3831" +checksum = "0fe976fb70c78cd64cccfe3a6fc142244e8a77b70959b30faf9d0ac37ee228eb" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.119", ] [[package]] name = "zerofrom" -version = "0.1.6" +version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5" +checksum = "0ec05a11813ea801ff6d75110ad09cd0824ddba17dfe17128ea0d5f68e6c5272" dependencies = [ "zerofrom-derive", ] [[package]] name = "zerofrom-derive" -version = "0.1.6" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" +checksum = "11532158c46691caf0f2593ea8358fed6bbf68a0315e80aae9bd41fbade684a1" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.119", "synstructure", ] [[package]] name = "zeroize" -version = "1.8.2" +version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b97154e67e32c85465826e8bcc1c59429aaaf107c1e4a9e53c8d8ccd5eff88d0" +checksum = "e13c156562582aa81c60cb29407084cdb54c4164760106ab78e6c5b0858cf64e" [[package]] name = "zerotrie" -version = "0.2.3" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a59c17a5562d507e4b54960e8569ebee33bee890c70aa3fe7b97e85a9fd7851" +checksum = "0f9152d31db0792fa83f70fb2f83148effb5c1f5b8c7686c3459e361d9bc20bf" dependencies = [ "displaydoc", "yoke", @@ -2875,9 +2928,9 @@ dependencies = [ [[package]] name = "zerovec" -version = "0.11.5" +version = "0.11.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c28719294829477f525be0186d13efa9a3c602f7ec202ca9e353d310fb9a002" +checksum = "90f911cbc359ab6af17377d242225f4d75119aec87ea711a880987b18cd7b239" dependencies = [ "yoke", "zerofrom", @@ -2886,11 +2939,17 @@ dependencies = [ [[package]] name = "zerovec-derive" -version = "0.11.2" +version = "0.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eadce39539ca5cb3985590102671f2567e659fca9666581ad3411d59207951f3" +checksum = "625dc425cab0dca6dc3c3319506e6593dcb08a9f387ea3b284dbd52a92c40555" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.119", ] + +[[package]] +name = "zmij" +version = "1.0.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29666d0abbfad1e3dc4dcf6144730dd3a3ab225bbbdac83319345b1b44ccfc1b" diff --git a/Cargo.toml b/Cargo.toml index f7a5b19..6ee276d 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -14,7 +14,7 @@ serde_json = "1.0.143" serde = { version = "1.0.219", features = ["derive"] } axum = "0.8.4" async-graphql-axum = "7.0.17" -url = "2.5.7" +url = { version="2.5.7", features=["serde"]} config = "0.15.16" clap = { version = "4.5.48", features = ["derive"] } uuid = { version = "1.18.1", features = ["serde"] } From 67c37931b7aaf35053248325a2bc02eb2c3d4b6d Mon Sep 17 00:00:00 2001 From: Zoheb Shaikh <26975142+ZohebShaikh@users.noreply.github.com> Date: Tue, 28 Jul 2026 11:04:42 +0000 Subject: [PATCH 13/22] ignore clippy warning --- src/model.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/model.rs b/src/model.rs index 0acabf8..bd301df 100644 --- a/src/model.rs +++ b/src/model.rs @@ -78,6 +78,7 @@ impl InstrumentSession { } #[derive(Union)] +#[allow(clippy::large_enum_variant)] enum RunData<'run> { Array(ArrayData<'run>), Internal(TableData), From 3792e901e7b1e58be4f9d330174285b5b5b512f3 Mon Sep 17 00:00:00 2001 From: Zoheb Shaikh <26975142+ZohebShaikh@users.noreply.github.com> Date: Tue, 28 Jul 2026 15:51:42 +0000 Subject: [PATCH 14/22] wip add code review changes --- src/clients.rs | 34 ++++++++-------------------------- src/handlers.rs | 14 ++++++-------- src/main.rs | 16 ++++++++++++++-- src/model/subscription.rs | 15 +++++++++++---- 4 files changed, 39 insertions(+), 40 deletions(-) diff --git a/src/clients.rs b/src/clients.rs index 3ec8d9d..bcf1f93 100644 --- a/src/clients.rs +++ b/src/clients.rs @@ -15,7 +15,6 @@ use crate::model::subscription::TiledEvent; use crate::model::{app, node, table}; pub type ClientResult = Result; -use tracing::error; #[derive(Clone)] pub struct TiledClient { @@ -140,7 +139,7 @@ impl TiledClient { &self, node: Option, headers: Option, - ) -> impl Stream { + ) -> Result>, String> { let scheme = match self.address.scheme() { "http" => "ws", "https" => "wss", @@ -161,34 +160,17 @@ impl TiledClient { if let Some(headers) = headers { request.headers_mut().extend(headers); } - async_stream::stream! { + Ok(async_stream::try_stream! { info!("Connecting to WebSocket: {}", url); - let (ws_stream, _) = match connect_async(request).await { - Ok(ws) => ws, - Err(e) => { - return error!("Failed to connect to WebSocket: {}", e); - } - }; - - let (_, mut read) = ws_stream.split(); - + let (ws,_) = connect_async(request).await.map_err(|e| e.to_string())?; + let (_, mut read) = ws.split(); while let Some(msg) = read.next().await { - match msg { - Ok(tokio_tungstenite::tungstenite::Message::Binary(bin)) => { - match rmp_serde::from_slice::(&bin) { - Ok(event) => yield event, - Err(e) => { - return error!("Failed to deserialize msgpack: {}, binary: {:?}", e, bin); - } - } - } - Ok(_) => {}, - Err(e) => { - return error!("WebSocket error: {}", e); - } + + if let tokio_tungstenite::tungstenite::Message::Binary(bin) = msg.map_err(|e| e.to_string())?{ + yield rmp_serde::from_slice::(&bin).map_err(|e| e.to_string())? } } - } + }) } /// Create a new client for the given mock server diff --git a/src/handlers.rs b/src/handlers.rs index f0691d9..310b775 100644 --- a/src/handlers.rs +++ b/src/handlers.rs @@ -8,7 +8,6 @@ use axum::http::{HeaderMap, HeaderValue, StatusCode}; use axum::response::{Html, IntoResponse}; use reqwest::header::AUTHORIZATION; use tracing::info; -use url::Url; use crate::clients::TiledClient; use crate::model::TiledQuery; @@ -52,15 +51,14 @@ pub async fn graphql_ws_handler( }) } -pub async fn graphiql_handler(public_address: Url) -> impl IntoResponse { - let (endpoint, subscription_endpoint) = ( - public_address.join("graphql").unwrap().to_string(), - public_address.join("ws").unwrap().to_string(), - ); +pub async fn graphiql_handler( + graphql_endpoint: Option, + subscription_endpoint: Option, +) -> impl IntoResponse { Html( GraphiQLSource::build() - .endpoint(&endpoint) - .subscription_endpoint(&subscription_endpoint) + .endpoint(graphql_endpoint.as_deref().unwrap_or("/graphql")) + .subscription_endpoint(subscription_endpoint.as_deref().unwrap_or("/ws")) .finish(), ) } diff --git a/src/main.rs b/src/main.rs index bfd4072..6a2f78b 100644 --- a/src/main.rs +++ b/src/main.rs @@ -26,7 +26,7 @@ use tracing_subscriber::{Registry, fmt, reload}; use url::Url; use crate::clients::TiledClient; -use crate::config::{GlazedConfig,LogLevel}; +use crate::config::{GlazedConfig, LogLevel}; use crate::handlers::{download_handler, graphiql_handler, graphql_handler, graphql_ws_handler}; use crate::model::TiledQuery; use crate::model::subscription::TiledSubscription; @@ -76,10 +76,22 @@ async fn serve( .data(client.clone()) .finish(); + let graphql_endpoint = config + .public_address + .clone() + .map(|u| u.join("graphql").unwrap().to_string()); + + let subscription_endpoint = config + .public_address + .clone() + .map(|u| u.join("ws").unwrap().to_string()); let app = Router::new() .route("/graphql", post(graphql_handler).get(graphql_get_warning)) .route("/ws", get(graphql_ws_handler)) - .route("/graphiql", get(|| graphiql_handler(public_address))) + .route( + "/graphiql", + get(|| graphiql_handler(graphql_endpoint, subscription_endpoint)), + ) .route( "/status", get(Json(json!({"version": env!("CARGO_PKG_VERSION")}))), diff --git a/src/model/subscription.rs b/src/model/subscription.rs index a6a30fd..0720459 100644 --- a/src/model/subscription.rs +++ b/src/model/subscription.rs @@ -11,7 +11,10 @@ pub struct TiledSubscription; #[Subscription] impl TiledSubscription { - async fn events(&self, ctx: &Context<'_>) -> impl Stream { + async fn events( + &self, + ctx: &Context<'_>, + ) -> Result>, String> { let client = ctx.data::().unwrap(); let headers = ctx .data_opt::>() @@ -20,7 +23,11 @@ impl TiledSubscription { client.stream_events(None, headers) } - async fn node_events(&self, ctx: &Context<'_>, node: String) -> impl Stream { + async fn node_events( + &self, + ctx: &Context<'_>, + node: String, + ) -> Result>, String> { let client = ctx.data::().unwrap(); let headers = ctx .data_opt::>() @@ -179,8 +186,8 @@ mod tests { let captured_headers = time::timeout(Duration::from_secs(5), rx.recv()) .await - .expect("Timeout waiting for headers") - .expect("Channel closed"); + .expect("Headers should have be sent after stream is read above") + .expect("The header channel should remain open until headers are received"); if let Some(token) = auth_token { assert_eq!(captured_headers.get("Authorization").unwrap(), token); From 1611d8b371c138eeb75f92b17b21cfe58e758bd3 Mon Sep 17 00:00:00 2001 From: Zoheb Shaikh <26975142+ZohebShaikh@users.noreply.github.com> Date: Tue, 4 Aug 2026 12:00:39 +0000 Subject: [PATCH 15/22] Add codereview changes --- src/clients.rs | 29 +++++++++++++++++++++++++---- src/handlers.rs | 4 ++-- src/model/subscription.rs | 8 ++++---- 3 files changed, 31 insertions(+), 10 deletions(-) diff --git a/src/clients.rs b/src/clients.rs index bcf1f93..3892cd5 100644 --- a/src/clients.rs +++ b/src/clients.rs @@ -139,7 +139,7 @@ impl TiledClient { &self, node: Option, headers: Option, - ) -> Result>, String> { + ) -> Result>, SubscriptionError> { let scheme = match self.address.scheme() { "http" => "ws", "https" => "wss", @@ -162,12 +162,12 @@ impl TiledClient { } Ok(async_stream::try_stream! { info!("Connecting to WebSocket: {}", url); - let (ws,_) = connect_async(request).await.map_err(|e| e.to_string())?; + let (ws,_) = connect_async(request).await.map_err(|e| SubscriptionError::WebSocketConnect(e.to_string()))?; let (_, mut read) = ws.split(); while let Some(msg) = read.next().await { - if let tokio_tungstenite::tungstenite::Message::Binary(bin) = msg.map_err(|e| e.to_string())?{ - yield rmp_serde::from_slice::(&bin).map_err(|e| e.to_string())? + if let tokio_tungstenite::tungstenite::Message::Binary(bin) = msg.map_err(|e| SubscriptionError::MessageDeserialize(e.to_string()))?{ + yield rmp_serde::from_slice::(&bin).map_err(|e| SubscriptionError::TiledEventDeserialize(e.to_string()))? } } }) @@ -184,6 +184,27 @@ impl TiledClient { } } +#[derive(Debug, Clone)] +pub enum SubscriptionError { + WebSocketConnect(String), + MessageDeserialize(String), + TiledEventDeserialize(String), +} +impl std::fmt::Display for SubscriptionError { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + match self { + SubscriptionError::WebSocketConnect(err) => { + write!(f, "Failed to connect to tiled websocket {}", err) + } + SubscriptionError::MessageDeserialize(err) => { + write!(f, "Failed to deserialize tiled websocket event {}", err) + } + SubscriptionError::TiledEventDeserialize(err) => { + write!(f, "Failed to convert tiled event into {}", err) + } + } + } +} #[derive(Debug)] pub enum ClientError { InvalidPath(url::ParseError), diff --git a/src/handlers.rs b/src/handlers.rs index 310b775..d4347db 100644 --- a/src/handlers.rs +++ b/src/handlers.rs @@ -34,10 +34,10 @@ pub async fn graphql_ws_handler( .protocols(ALL_WEBSOCKET_PROTOCOLS) .on_upgrade(move |socket| { GraphQLWebSocket::new(socket, schema.0, protocol) - .on_connection_init(|value| async move { + .on_connection_init(|headers| async move { let mut data = Data::default(); - auth_token = value + auth_token = headers .get("Authorization") .and_then(|v| v.as_str()) .and_then(|auth| HeaderValue::from_str(auth).ok()) diff --git a/src/model/subscription.rs b/src/model/subscription.rs index 0720459..ffcea90 100644 --- a/src/model/subscription.rs +++ b/src/model/subscription.rs @@ -3,7 +3,7 @@ use futures_util::Stream; use serde::Deserialize; use serde_json::Value; -use crate::clients::TiledClient; +use crate::clients::{SubscriptionError, TiledClient}; use crate::handlers::AuthHeader; use crate::model::array::{ArrayStructure, DataType}; @@ -14,7 +14,7 @@ impl TiledSubscription { async fn events( &self, ctx: &Context<'_>, - ) -> Result>, String> { + ) -> Result>, SubscriptionError> { let client = ctx.data::().unwrap(); let headers = ctx .data_opt::>() @@ -27,7 +27,7 @@ impl TiledSubscription { &self, ctx: &Context<'_>, node: String, - ) -> Result>, String> { + ) -> Result>, SubscriptionError> { let client = ctx.data::().unwrap(); let headers = ctx .data_opt::>() @@ -179,7 +179,7 @@ mod tests { headers.insert("Authorization", token.parse().unwrap()); } - let stream = client.stream_events(None, Some(headers)); + let stream = client.stream_events(None, Some(headers)).unwrap(); tokio::pin!(stream); let _ = time::timeout(Duration::from_secs(5), stream.next()).await; From aa700e8fa528b6f7827a2c44c9d02765f5caf7b4 Mon Sep 17 00:00:00 2001 From: Zoheb Shaikh <26975142+ZohebShaikh@users.noreply.github.com> Date: Tue, 4 Aug 2026 15:08:20 +0100 Subject: [PATCH 16/22] remove loglevel --- src/config.rs | 24 ------------------------ 1 file changed, 24 deletions(-) diff --git a/src/config.rs b/src/config.rs index 51e1bc6..706c325 100644 --- a/src/config.rs +++ b/src/config.rs @@ -10,8 +10,6 @@ pub struct GlazedConfig { pub bind_address: SocketAddr, pub public_address: Option, pub tiled_client: TiledClientConfig, - #[serde(default)] - pub log_level: LogLevel, } impl GlazedConfig { pub fn from_file(path: &Path) -> Result { @@ -26,7 +24,6 @@ impl GlazedConfig { tiled_client: TiledClientConfig { address: Url::parse("http://localhost:8000").expect("Static URL is valid"), }, - log_level: LogLevel::Info, } } } @@ -35,24 +32,3 @@ impl GlazedConfig { pub struct TiledClientConfig { pub address: Url, } - -#[derive(Debug, Default, Deserialize, Clone, Copy)] -pub enum LogLevel { - #[default] - #[serde(alias = "info")] - Info, - #[serde(alias = "debug")] - Debug, - #[serde(alias = "trace")] - Trace, -} - -impl From for tracing::level_filters::LevelFilter { - fn from(value: LogLevel) -> Self { - match value { - LogLevel::Info => Self::INFO, - LogLevel::Debug => Self::DEBUG, - LogLevel::Trace => Self::TRACE, - } - } -} From 6331520df5bd89df1add801833a94944ae76f774 Mon Sep 17 00:00:00 2001 From: Zoheb Shaikh <26975142+ZohebShaikh@users.noreply.github.com> Date: Tue, 4 Aug 2026 14:16:47 +0000 Subject: [PATCH 17/22] remove fmt stuff --- src/main.rs | 30 +++++------------------------- 1 file changed, 5 insertions(+), 25 deletions(-) diff --git a/src/main.rs b/src/main.rs index 6a2f78b..ecb4781 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,5 +1,4 @@ use async_graphql::{EmptyMutation, Schema}; -use axum::extract::Path; use axum::http::StatusCode; use axum::response::{Html, IntoResponse}; use axum::routing::{get, post}; @@ -19,25 +18,18 @@ use serde_json::json; use tokio::select; use tokio::signal::unix::{SignalKind, signal}; use tracing::info; -use tracing::level_filters::LevelFilter; -use tracing_subscriber::layer::SubscriberExt as _; -use tracing_subscriber::util::SubscriberInitExt; -use tracing_subscriber::{Registry, fmt, reload}; use url::Url; use crate::clients::TiledClient; -use crate::config::{GlazedConfig, LogLevel}; +use crate::config::GlazedConfig; use crate::handlers::{download_handler, graphiql_handler, graphql_handler, graphql_ws_handler}; use crate::model::TiledQuery; use crate::model::subscription::TiledSubscription; #[tokio::main] async fn main() -> Result<(), Box> { - let (filter, filter_reload) = reload::Layer::new(LevelFilter::INFO); - tracing_subscriber::registry() - .with(filter) - .with(fmt::Layer::default()) - .init(); + let subscriber = tracing_subscriber::FmtSubscriber::new(); + tracing::subscriber::set_global_default(subscriber)?; let cli = Cli::init(); let config; @@ -50,21 +42,15 @@ async fn main() -> Result<(), Box> { info!("Using default config"); config = GlazedConfig::default(); } - filter_reload - .modify(|f| *f = config.log_level.into()) - .unwrap(); match cli.command { - Commands::Serve => serve(config, filter_reload).await, + Commands::Serve => serve(config).await, } } #[derive(Clone)] pub struct RootAddress(Url); -async fn serve( - config: GlazedConfig, - reload: reload::Handle, -) -> Result<(), Box> { +async fn serve(config: GlazedConfig) -> Result<(), Box> { let client = TiledClient::new(config.tiled_client.address); let public_address = config .public_address @@ -97,12 +83,6 @@ async fn serve( get(Json(json!({"version": env!("CARGO_PKG_VERSION")}))), ) .route("/asset/{run}/{stream}/{det}/{id}", get(download_handler)) - .route( - "/loglevel/{level}", - post(|level: Path| async move { - reload.clone().modify(|f| *f = level.0.into()).unwrap(); - }), - ) .with_state(client) .fallback(( StatusCode::NOT_FOUND, From 77536810a22e627306777a37aa7d313b42158dd8 Mon Sep 17 00:00:00 2001 From: Zoheb Shaikh <26975142+ZohebShaikh@users.noreply.github.com> Date: Tue, 4 Aug 2026 15:45:46 +0000 Subject: [PATCH 18/22] add ":" to message --- src/clients.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/clients.rs b/src/clients.rs index 3892cd5..e9071e2 100644 --- a/src/clients.rs +++ b/src/clients.rs @@ -194,13 +194,13 @@ impl std::fmt::Display for SubscriptionError { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { match self { SubscriptionError::WebSocketConnect(err) => { - write!(f, "Failed to connect to tiled websocket {}", err) + write!(f, "Failed to connect to tiled websocket: {}", err) } SubscriptionError::MessageDeserialize(err) => { - write!(f, "Failed to deserialize tiled websocket event {}", err) + write!(f, "Failed to deserialize tiled websocket event: {}", err) } SubscriptionError::TiledEventDeserialize(err) => { - write!(f, "Failed to convert tiled event into {}", err) + write!(f, "Failed to convert tiled event into: {}", err) } } } From f659b46f1736a4e2f899a1605b23704ca639017a Mon Sep 17 00:00:00 2001 From: Zoheb Shaikh <26975142+ZohebShaikh@users.noreply.github.com> Date: Tue, 11 Aug 2026 08:28:15 +0000 Subject: [PATCH 19/22] add code review comments --- src/clients.rs | 26 +++++++++++++------------- src/main.rs | 17 ++++++++--------- src/model/subscription.rs | 13 +++++++------ 3 files changed, 28 insertions(+), 28 deletions(-) diff --git a/src/clients.rs b/src/clients.rs index e9071e2..6256286 100644 --- a/src/clients.rs +++ b/src/clients.rs @@ -8,6 +8,7 @@ use reqwest::header::HeaderMap; use reqwest::{Client, Url}; use serde::de::DeserializeOwned; use tokio_tungstenite::connect_async; +use tokio_tungstenite::tungstenite::Message; use tokio_tungstenite::tungstenite::client::IntoClientRequest; use tracing::{debug, info, instrument}; @@ -139,38 +140,37 @@ impl TiledClient { &self, node: Option, headers: Option, - ) -> Result>, SubscriptionError> { + ) -> impl Stream> { let scheme = match self.address.scheme() { - "http" => "ws", "https" => "wss", _ => "ws", }; - let path = if let Some(node_id) = node { - format!("api/v1/stream/single/{}", node_id) - } else { - "api/v1/stream/single/".to_string() - }; + let path = format!("api/v1/stream/single/{}", node.as_deref().unwrap_or("")); let mut url = self.address.join(&path).expect("Invalid stream path"); - url.set_scheme(scheme).ok(); + url.set_scheme(scheme) + .expect("ws and wss are valid schemes"); url.set_query(Some("envelope_format=msgpack")); - let mut request = url.as_str().into_client_request().unwrap(); + let mut request = url + .as_str() + .into_client_request() + .expect("it's going to work"); if let Some(headers) = headers { request.headers_mut().extend(headers); } - Ok(async_stream::try_stream! { + async_stream::try_stream! { info!("Connecting to WebSocket: {}", url); let (ws,_) = connect_async(request).await.map_err(|e| SubscriptionError::WebSocketConnect(e.to_string()))?; let (_, mut read) = ws.split(); while let Some(msg) = read.next().await { - if let tokio_tungstenite::tungstenite::Message::Binary(bin) = msg.map_err(|e| SubscriptionError::MessageDeserialize(e.to_string()))?{ - yield rmp_serde::from_slice::(&bin).map_err(|e| SubscriptionError::TiledEventDeserialize(e.to_string()))? + if let Message::Binary(bin) = msg.map_err(|e| SubscriptionError::MessageDeserialize(e.to_string()))?{ + yield rmp_serde::from_slice(&bin).map_err(|e| SubscriptionError::TiledEventDeserialize(e.to_string()))? } } - }) + } } /// Create a new client for the given mock server diff --git a/src/main.rs b/src/main.rs index 7742466..a36a377 100644 --- a/src/main.rs +++ b/src/main.rs @@ -62,24 +62,23 @@ async fn serve(config: GlazedConfig) -> Result<(), Box> { .public_address .clone() .unwrap_or_else(|| Url::parse(&format!("http://{}", config.bind_address)).unwrap()); - let schema: Schema = - Schema::build(TiledQuery, EmptyMutation, TiledSubscription) - .data(RootAddress(public_address.clone())) - .data(client.clone()) - .finish(); + let schema = Schema::build(TiledQuery, EmptyMutation, TiledSubscription) + .data(RootAddress(public_address.clone())) + .data(client.clone()) + .finish(); let graphql_endpoint = config .public_address - .clone() + .as_ref() .map(|u| u.join("graphql").unwrap().to_string()); let subscription_endpoint = config .public_address - .clone() - .map(|u| u.join("ws").unwrap().to_string()); + .as_ref() + .map(|u| u.join("subscribe").unwrap().to_string()); let app = Router::new() .route("/graphql", post(graphql_handler).get(graphql_get_warning)) - .route("/ws", get(graphql_ws_handler)) + .route("/subscribe", get(graphql_ws_handler)) .route( "/graphiql", get(|| graphiql_handler(graphql_endpoint, subscription_endpoint)), diff --git a/src/model/subscription.rs b/src/model/subscription.rs index ffcea90..5b719d0 100644 --- a/src/model/subscription.rs +++ b/src/model/subscription.rs @@ -14,7 +14,7 @@ impl TiledSubscription { async fn events( &self, ctx: &Context<'_>, - ) -> Result>, SubscriptionError> { + ) -> impl Stream> { let client = ctx.data::().unwrap(); let headers = ctx .data_opt::>() @@ -27,7 +27,7 @@ impl TiledSubscription { &self, ctx: &Context<'_>, node: String, - ) -> Result>, SubscriptionError> { + ) -> impl Stream> { let client = ctx.data::().unwrap(); let headers = ctx .data_opt::>() @@ -150,12 +150,13 @@ mod tests { use super::*; use crate::clients::TiledClient; + use crate::model::TiledQuery; #[rstest] #[case::with_auth(Some("Bearer test-token"))] #[case::no_auth(None)] #[tokio::test] - async fn test_stream_events_headers_parameterized(#[case] auth_token: Option<&str>) { + async fn test_stream_events_headers(#[case] auth_token: Option<&str>) { let (tx, mut rx) = mpsc::channel(1); let app = Router::new().fallback(any( @@ -179,14 +180,14 @@ mod tests { headers.insert("Authorization", token.parse().unwrap()); } - let stream = client.stream_events(None, Some(headers)).unwrap(); + let stream = client.stream_events(None, Some(headers)); tokio::pin!(stream); let _ = time::timeout(Duration::from_secs(5), stream.next()).await; let captured_headers = time::timeout(Duration::from_secs(5), rx.recv()) .await - .expect("Headers should have be sent after stream is read above") + .expect("Headers should have been sent after stream is read above") .expect("The header channel should remain open until headers are received"); if let Some(token) = auth_token { @@ -242,7 +243,7 @@ mod tests { let url = Url::parse(&format!("http://{addr}")).unwrap(); let client = TiledClient::new(url); - let schema = Schema::build(crate::model::TiledQuery, EmptyMutation, TiledSubscription) + let schema = Schema::build(TiledQuery, EmptyMutation, TiledSubscription) .data(client) .finish(); From a8d1afeae5ff588ad7262153506af4d228eb08d9 Mon Sep 17 00:00:00 2001 From: Zoheb Shaikh <26975142+ZohebShaikh@users.noreply.github.com> Date: Tue, 11 Aug 2026 08:36:55 +0000 Subject: [PATCH 20/22] remove fluff --- src/model/subscription.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/model/subscription.rs b/src/model/subscription.rs index 5b719d0..c51783e 100644 --- a/src/model/subscription.rs +++ b/src/model/subscription.rs @@ -211,7 +211,7 @@ mod tests { "nodeEvents" )] #[tokio::test] - async fn test_subscription_events_parameterized( + async fn test_subscription_events( #[case] query: &str, #[case] expected_path: &str, #[case] expected_version: u32, From f75305c06272889530df125bce4a251480be979f Mon Sep 17 00:00:00 2001 From: Zoheb Shaikh <26975142+ZohebShaikh@users.noreply.github.com> Date: Tue, 11 Aug 2026 08:40:51 +0000 Subject: [PATCH 21/22] updated the error message --- src/clients.rs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/clients.rs b/src/clients.rs index 6256286..0a07eec 100644 --- a/src/clients.rs +++ b/src/clients.rs @@ -166,7 +166,7 @@ impl TiledClient { let (_, mut read) = ws.split(); while let Some(msg) = read.next().await { - if let Message::Binary(bin) = msg.map_err(|e| SubscriptionError::MessageDeserialize(e.to_string()))?{ + if let Message::Binary(bin) = msg.map_err(|e| SubscriptionError::FailedToRecieveMessage(e.to_string()))?{ yield rmp_serde::from_slice(&bin).map_err(|e| SubscriptionError::TiledEventDeserialize(e.to_string()))? } } @@ -187,7 +187,7 @@ impl TiledClient { #[derive(Debug, Clone)] pub enum SubscriptionError { WebSocketConnect(String), - MessageDeserialize(String), + FailedToRecieveMessage(String), TiledEventDeserialize(String), } impl std::fmt::Display for SubscriptionError { @@ -196,8 +196,8 @@ impl std::fmt::Display for SubscriptionError { SubscriptionError::WebSocketConnect(err) => { write!(f, "Failed to connect to tiled websocket: {}", err) } - SubscriptionError::MessageDeserialize(err) => { - write!(f, "Failed to deserialize tiled websocket event: {}", err) + SubscriptionError::FailedToRecieveMessage(err) => { + write!(f, "Failed to recieve message from tiled websocket: {}", err) } SubscriptionError::TiledEventDeserialize(err) => { write!(f, "Failed to convert tiled event into: {}", err) From ce8fb81542ab293774e5765c0cc5ec67b9b0bf21 Mon Sep 17 00:00:00 2001 From: Zoheb Shaikh <26975142+ZohebShaikh@users.noreply.github.com> Date: Tue, 11 Aug 2026 11:12:23 +0100 Subject: [PATCH 22/22] updata coment --- src/clients.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/clients.rs b/src/clients.rs index 0a07eec..61a81b3 100644 --- a/src/clients.rs +++ b/src/clients.rs @@ -156,7 +156,7 @@ impl TiledClient { let mut request = url .as_str() .into_client_request() - .expect("it's going to work"); + .expect("valid URLs can be converted to URIs needed for Request"); if let Some(headers) = headers { request.headers_mut().extend(headers); }