From 8f9015a6ff181d208d9269ab8691bd417d39811a Mon Sep 17 00:00:00 2001 From: IAmTomahawkx Date: Mon, 18 Aug 2025 16:59:08 -0700 Subject: [PATCH 1/8] fix: apply uname fix to january and autumn --- crates/services/autumn/Dockerfile | 2 ++ crates/services/january/Dockerfile | 2 ++ 2 files changed, 4 insertions(+) diff --git a/crates/services/autumn/Dockerfile b/crates/services/autumn/Dockerfile index 75eba733..40548e2c 100644 --- a/crates/services/autumn/Dockerfile +++ b/crates/services/autumn/Dockerfile @@ -1,11 +1,13 @@ # Build Stage FROM ghcr.io/revoltchat/base:latest AS builder +FROM debian:12 AS debian # Bundle Stage FROM gcr.io/distroless/cc-debian12:nonroot COPY --from=builder /home/rust/src/target/release/revolt-autumn ./ COPY --from=mwader/static-ffmpeg:7.0.2 /ffmpeg /usr/local/bin/ COPY --from=mwader/static-ffmpeg:7.0.2 /ffprobe /usr/local/bin/ +COPY --from=debian /usr/bin/uname /usr/bin/uname EXPOSE 14704 USER nonroot diff --git a/crates/services/january/Dockerfile b/crates/services/january/Dockerfile index 0d61449d..0848291a 100644 --- a/crates/services/january/Dockerfile +++ b/crates/services/january/Dockerfile @@ -1,11 +1,13 @@ # Build Stage FROM ghcr.io/revoltchat/base:latest AS builder +FROM debian:12 AS debian # Bundle Stage FROM gcr.io/distroless/cc-debian12:nonroot COPY --from=builder /home/rust/src/target/release/revolt-january ./ COPY --from=mwader/static-ffmpeg:7.0.2 /ffmpeg /usr/local/bin/ COPY --from=mwader/static-ffmpeg:7.0.2 /ffprobe /usr/local/bin/ +COPY --from=debian /usr/bin/uname /usr/bin/uname EXPOSE 14705 USER nonroot From 1561481eb4cdc0f385fbf0a81e4950408050e11f Mon Sep 17 00:00:00 2001 From: Zomatree Date: Wed, 20 Aug 2025 18:55:39 +0100 Subject: [PATCH 2/8] feat: make message lexer use unowned string --- .../database/src/models/server_members/ops.rs | 6 +- .../src/models/server_members/ops/mongodb.rs | 6 +- .../models/server_members/ops/reference.rs | 6 +- crates/core/parser/src/lib.rs | 57 +++++++++++-------- 4 files changed, 43 insertions(+), 32 deletions(-) diff --git a/crates/core/database/src/models/server_members/ops.rs b/crates/core/database/src/models/server_members/ops.rs index 51ddd574..83eb332a 100644 --- a/crates/core/database/src/models/server_members/ops.rs +++ b/crates/core/database/src/models/server_members/ops.rs @@ -79,7 +79,7 @@ pub trait AbstractServerMembers: Sync + Send { async fn fetch_member(&self, server_id: &str, user_id: &str) -> Result; /// Fetch all members in a server - async fn fetch_all_members<'a>(&self, server_id: &str) -> Result>; + async fn fetch_all_members(&self, server_id: &str) -> Result>; /// Fetch all members in a server as an iterator async fn fetch_all_members_chunked( @@ -100,10 +100,10 @@ pub trait AbstractServerMembers: Sync + Send { ) -> Result; /// Fetch all memberships for a user - async fn fetch_all_memberships<'a>(&self, user_id: &str) -> Result>; + async fn fetch_all_memberships(&self, user_id: &str) -> Result>; /// Fetch multiple members by their ids - async fn fetch_members<'a>(&self, server_id: &str, ids: &'a [String]) -> Result>; + async fn fetch_members(&self, server_id: &str, ids: &[String]) -> Result>; /// Fetch member count of a server async fn fetch_member_count(&self, server_id: &str) -> Result; diff --git a/crates/core/database/src/models/server_members/ops/mongodb.rs b/crates/core/database/src/models/server_members/ops/mongodb.rs index 07d8a819..f8cd325d 100644 --- a/crates/core/database/src/models/server_members/ops/mongodb.rs +++ b/crates/core/database/src/models/server_members/ops/mongodb.rs @@ -31,7 +31,7 @@ impl AbstractServerMembers for MongoDb { } /// Fetch all members in a server - async fn fetch_all_members<'a>(&self, server_id: &str) -> Result> { + async fn fetch_all_members(&self, server_id: &str) -> Result> { Ok(self .col::(COL) .find(doc! { @@ -139,7 +139,7 @@ impl AbstractServerMembers for MongoDb { } /// Fetch all memberships for a user - async fn fetch_all_memberships<'a>(&self, user_id: &str) -> Result> { + async fn fetch_all_memberships(&self, user_id: &str) -> Result> { Ok(self .col::(COL) .find(doc! { @@ -159,7 +159,7 @@ impl AbstractServerMembers for MongoDb { } /// Fetch multiple members by their ids - async fn fetch_members<'a>(&self, server_id: &str, ids: &'a [String]) -> Result> { + async fn fetch_members(&self, server_id: &str, ids: &[String]) -> Result> { Ok(self .col::(COL) .find(doc! { diff --git a/crates/core/database/src/models/server_members/ops/reference.rs b/crates/core/database/src/models/server_members/ops/reference.rs index ac15d977..b69f548e 100644 --- a/crates/core/database/src/models/server_members/ops/reference.rs +++ b/crates/core/database/src/models/server_members/ops/reference.rs @@ -31,7 +31,7 @@ impl AbstractServerMembers for ReferenceDb { } /// Fetch all members in a server - async fn fetch_all_members<'a>(&self, server_id: &str) -> Result> { + async fn fetch_all_members(&self, server_id: &str) -> Result> { let server_members = self.server_members.lock().await; Ok(server_members .values() @@ -105,7 +105,7 @@ impl AbstractServerMembers for ReferenceDb { } /// Fetch all memberships for a user - async fn fetch_all_memberships<'a>(&self, user_id: &str) -> Result> { + async fn fetch_all_memberships(&self, user_id: &str) -> Result> { let server_members = self.server_members.lock().await; Ok(server_members .values() @@ -115,7 +115,7 @@ impl AbstractServerMembers for ReferenceDb { } /// Fetch multiple members by their ids - async fn fetch_members<'a>(&self, server_id: &str, ids: &'a [String]) -> Result> { + async fn fetch_members(&self, server_id: &str, ids: &[String]) -> Result> { let server_members = self.server_members.lock().await; Ok(ids .iter() diff --git a/crates/core/parser/src/lib.rs b/crates/core/parser/src/lib.rs index 191540c1..4ebbac63 100644 --- a/crates/core/parser/src/lib.rs +++ b/crates/core/parser/src/lib.rs @@ -4,15 +4,18 @@ use logos::Logos; #[derive(Debug, Clone, Logos, PartialEq)] #[logos(skip "\n")] -pub enum MessageToken { +#[logos(subpattern id="[0123456789ABCDEFGHJKMNPQRSTVWXYZ]{26}")] +pub enum MessageToken<'a> { #[token("\\")] Escape, - #[regex("(```[^`\n]*)|(``)|`", |lex| lex.slice().to_owned().chars().filter(|&c| c == '`').count())] + #[regex("```[^`\n]*", |_| 3)] + #[regex("``", |_| 2)] + #[regex("`", |_| 1)] CodeblockMarker(usize), - #[regex("<@[0123456789ABCDEFGHJKMNPQRSTVWXYZ]{26}>", |lex| lex.slice()[2..lex.slice().len() - 1].to_owned())] - UserMention(String), - #[regex("<%[0123456789ABCDEFGHJKMNPQRSTVWXYZ]{26}>", |lex| lex.slice()[2..lex.slice().len() - 1].to_owned())] - RoleMention(String), + #[regex("<@(?&id)>", |lex| &lex.slice()[2..lex.slice().len() - 1])] + UserMention(&'a str), + #[regex("<%(?&id)>", |lex| &lex.slice()[2..lex.slice().len() - 1],)] + RoleMention(&'a str), #[token("@everyone")] MentionEveryone, #[token("@online")] @@ -27,13 +30,13 @@ pub struct MessageResults { pub mentions_online: bool } -struct MessageParserIterator { +struct MessageParserIterator<'a, I> { inner: I, - temp: VecDeque + temp: VecDeque> } -impl> Iterator for MessageParserIterator { - type Item = MessageToken; +impl<'a, I: Iterator>> Iterator for MessageParserIterator<'a, I> { + type Item = MessageToken<'a>; fn next(&mut self) -> Option { if !self.temp.is_empty() { @@ -80,8 +83,8 @@ pub fn parse_message(text: &str) -> MessageResults { match token { MessageToken::Escape => {} MessageToken::CodeblockMarker(_) => {}, - MessageToken::UserMention(id) => { results.user_mentions.insert(id); }, - MessageToken::RoleMention(id) => { results.role_mentions.insert(id); }, + MessageToken::UserMention(id) => { results.user_mentions.insert(id.to_string()); }, + MessageToken::RoleMention(id) => { results.role_mentions.insert(id.to_string()); }, MessageToken::MentionEveryone => results.mentions_everyone = true, MessageToken::MentionOnline => results.mentions_online = true, }; @@ -106,7 +109,7 @@ mod tests { let output = parse_message_iter("Hello <@01FD58YK5W7QRV5H3D64KTQYX3>.").collect::>(); assert_eq!(output.len(), 1); - assert_eq!(output[0], MessageToken::UserMention("01FD58YK5W7QRV5H3D64KTQYX3".to_string())); + assert_eq!(output[0], MessageToken::UserMention("01FD58YK5W7QRV5H3D64KTQYX3")); } #[test] @@ -114,7 +117,7 @@ mod tests { let output = parse_message_iter("Hello <%01FD58YK5W7QRV5H3D64KTQYX3>.").collect::>(); assert_eq!(output.len(), 1); - assert_eq!(output[0], MessageToken::RoleMention("01FD58YK5W7QRV5H3D64KTQYX3".to_string())); + assert_eq!(output[0], MessageToken::RoleMention("01FD58YK5W7QRV5H3D64KTQYX3")); } #[test] @@ -138,8 +141,8 @@ mod tests { let output = parse_message_iter("Hello <@01FD58YK5W7QRV5H3D64KTQYX3>, <%01FD58YK5W7QRV5H3D64KTQYX3>, @everyone and @online.").collect::>(); assert_eq!(output.len(), 4); - assert_eq!(output[0], MessageToken::UserMention("01FD58YK5W7QRV5H3D64KTQYX3".to_string())); - assert_eq!(output[1], MessageToken::RoleMention("01FD58YK5W7QRV5H3D64KTQYX3".to_string())); + assert_eq!(output[0], MessageToken::UserMention("01FD58YK5W7QRV5H3D64KTQYX3")); + assert_eq!(output[1], MessageToken::RoleMention("01FD58YK5W7QRV5H3D64KTQYX3")); assert_eq!(output[2], MessageToken::MentionEveryone); assert_eq!(output[3], MessageToken::MentionOnline); } @@ -149,8 +152,8 @@ mod tests { let output = parse_message_iter("<@01FD58YK5W7QRV5H3D64KTQYX3><%01FD58YK5W7QRV5H3D64KTQYX3>@everyone@online").collect::>(); assert_eq!(output.len(), 4); - assert_eq!(output[0], MessageToken::UserMention("01FD58YK5W7QRV5H3D64KTQYX3".to_string())); - assert_eq!(output[1], MessageToken::RoleMention("01FD58YK5W7QRV5H3D64KTQYX3".to_string())); + assert_eq!(output[0], MessageToken::UserMention("01FD58YK5W7QRV5H3D64KTQYX3")); + assert_eq!(output[1], MessageToken::RoleMention("01FD58YK5W7QRV5H3D64KTQYX3")); assert_eq!(output[2], MessageToken::MentionEveryone); assert_eq!(output[3], MessageToken::MentionOnline); } @@ -170,15 +173,14 @@ mod tests { assert_eq!(output.len(), 5); assert_eq!(output[0], MessageToken::CodeblockMarker(3)); - assert_eq!(output[1], MessageToken::UserMention("01FD58YK5W7QRV5H3D64KTQYX3".to_string())); - assert_eq!(output[2], MessageToken::RoleMention("01FD58YK5W7QRV5H3D64KTQYX3".to_string())); + assert_eq!(output[1], MessageToken::UserMention("01FD58YK5W7QRV5H3D64KTQYX3")); + assert_eq!(output[2], MessageToken::RoleMention("01FD58YK5W7QRV5H3D64KTQYX3")); assert_eq!(output[3], MessageToken::MentionEveryone); assert_eq!(output[4], MessageToken::MentionOnline); } #[test] fn test_inline_codeblock_no_mentions() { - let output = parse_message_iter("`<@01FD58YK5W7QRV5H3D64KTQYX3><%01FD58YK5W7QRV5H3D64KTQYX3>@everyone@online`").collect::>(); assert_eq!(output.len(), 2); @@ -192,12 +194,21 @@ mod tests { assert_eq!(output.len(), 5); assert_eq!(output[0], MessageToken::CodeblockMarker(1)); - assert_eq!(output[1], MessageToken::UserMention("01FD58YK5W7QRV5H3D64KTQYX3".to_string())); - assert_eq!(output[2], MessageToken::RoleMention("01FD58YK5W7QRV5H3D64KTQYX3".to_string())); + assert_eq!(output[1], MessageToken::UserMention("01FD58YK5W7QRV5H3D64KTQYX3")); + assert_eq!(output[2], MessageToken::RoleMention("01FD58YK5W7QRV5H3D64KTQYX3")); assert_eq!(output[3], MessageToken::MentionEveryone); assert_eq!(output[4], MessageToken::MentionOnline); } + #[test] + fn test_codeblock_with_language_no_mentions() { + let output = parse_message_iter("```rust\n<@01FD58YK5W7QRV5H3D64KTQYX3><%01FD58YK5W7QRV5H3D64KTQYX3>@everyone@online```").collect::>(); + + assert_eq!(output.len(), 2); + assert_eq!(output[0], MessageToken::CodeblockMarker(3)); + assert_eq!(output[1], MessageToken::CodeblockMarker(3)); + } + #[test] fn test_double_inline_codeblock() { let output = parse_message_iter("``this should not ping @everyone``").collect::>(); From 53351243064cac8d499dd74284be73928fa78a43 Mon Sep 17 00:00:00 2001 From: Zomatree Date: Wed, 20 Aug 2025 18:55:52 +0100 Subject: [PATCH 3/8] fix: add license to revolt-parser --- crates/core/parser/Cargo.toml | 3 ++- crates/core/parser/LICENSE | 9 +++++++++ 2 files changed, 11 insertions(+), 1 deletion(-) create mode 100644 crates/core/parser/LICENSE diff --git a/crates/core/parser/Cargo.toml b/crates/core/parser/Cargo.toml index a162cee3..a6e1869b 100644 --- a/crates/core/parser/Cargo.toml +++ b/crates/core/parser/Cargo.toml @@ -2,7 +2,8 @@ name = "revolt-parser" version = "0.8.8" edition = "2021" -license = "AGPL-3.0-or-later" +license = "MIT" +authors = ["Zomatree ", "Paul Makles "] description = "Revolt Backend: Message Parser" [dependencies] diff --git a/crates/core/parser/LICENSE b/crates/core/parser/LICENSE new file mode 100644 index 00000000..7c2815b9 --- /dev/null +++ b/crates/core/parser/LICENSE @@ -0,0 +1,9 @@ +MIT License + +Copyright (c) 2024 Pawel Makles + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. From caa86074680d46223cebc20f41e9c91c41ec825d Mon Sep 17 00:00:00 2001 From: Zomatree Date: Sun, 24 Aug 2025 03:40:10 +0100 Subject: [PATCH 4/8] feat: include groups and dms in fetch mutuals --- crates/core/models/src/v0/users.rs | 4 +++- crates/delta/src/routes/users/find_mutual.rs | 5 +++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/crates/core/models/src/v0/users.rs b/crates/core/models/src/v0/users.rs index ef1c8f1a..fc681e00 100644 --- a/crates/core/models/src/v0/users.rs +++ b/crates/core/models/src/v0/users.rs @@ -255,12 +255,14 @@ auto_derived!( pub flags: i32, } - /// Mutual friends and servers response + /// Mutual friends, servers, groups and DMs response pub struct MutualResponse { /// Array of mutual user IDs that both users are friends with pub users: Vec, /// Array of mutual server IDs that both users are in pub servers: Vec, + /// Array of mutual group and dm IDs that both users are in + pub channels: Vec, } /// Bot information for if the user is a bot diff --git a/crates/delta/src/routes/users/find_mutual.rs b/crates/delta/src/routes/users/find_mutual.rs index 9f7fd950..78d5256f 100644 --- a/crates/delta/src/routes/users/find_mutual.rs +++ b/crates/delta/src/routes/users/find_mutual.rs @@ -8,9 +8,9 @@ use revolt_result::{create_error, Result}; use rocket::serde::json::Json; use rocket::State; -/// # Fetch Mutual Friends And Servers +/// # Fetch Mutual Friends, Servers, Groups and DMs /// -/// Retrieve a list of mutual friends and servers with another user. +/// Retrieve a list of mutual friends, servers, groups and DMs with another user. #[openapi(tag = "Relationships")] #[get("//mutual")] pub async fn mutual( @@ -32,5 +32,6 @@ pub async fn mutual( Ok(Json(v0::MutualResponse { users: db.fetch_mutual_user_ids(&user.id, &target.id).await?, servers: db.fetch_mutual_server_ids(&user.id, &target.id).await?, + channels: db.fetch_mutual_channel_ids(&user.id, &target.id).await?, })) } From 480f210ce85271e13d1dac58a5dae08de108579d Mon Sep 17 00:00:00 2001 From: Zomatree Date: Sun, 24 Aug 2025 06:32:38 +0100 Subject: [PATCH 5/8] feat: include member payload in ServerMemberJoin event --- crates/core/database/src/events/client.rs | 8 +++++++- crates/core/database/src/models/server_members/model.rs | 1 + crates/delta/src/routes/bots/invite.rs | 4 ++-- 3 files changed, 10 insertions(+), 3 deletions(-) diff --git a/crates/core/database/src/events/client.rs b/crates/core/database/src/events/client.rs index a887e9f1..aa9fb0b9 100644 --- a/crates/core/database/src/events/client.rs +++ b/crates/core/database/src/events/client.rs @@ -144,7 +144,13 @@ pub enum EventV1 { }, /// User joins server - ServerMemberJoin { id: String, user: String }, + ServerMemberJoin { + id: String, + // Deprecated: use member.id.user + #[deprecated = "Use member.id.user instead"] + user: String, + member: Member, + }, /// User left server ServerMemberLeave { diff --git a/crates/core/database/src/models/server_members/model.rs b/crates/core/database/src/models/server_members/model.rs index 25b6979a..c74014ba 100644 --- a/crates/core/database/src/models/server_members/model.rs +++ b/crates/core/database/src/models/server_members/model.rs @@ -124,6 +124,7 @@ impl Member { EventV1::ServerMemberJoin { id: server.id.clone(), user: user.id.clone(), + member: member.clone().into(), } .p(server.id.clone()) .await; diff --git a/crates/delta/src/routes/bots/invite.rs b/crates/delta/src/routes/bots/invite.rs index 39517c51..ad4f16ad 100644 --- a/crates/delta/src/routes/bots/invite.rs +++ b/crates/delta/src/routes/bots/invite.rs @@ -168,8 +168,8 @@ mod test { .await; match event { - EventV1::ServerMemberJoin { user, .. } => { - assert_eq!(bot.id, user); + EventV1::ServerMemberJoin { member, .. } => { + assert_eq!(bot.id, member.id.user); } _ => unreachable!(), } From dea0f675dde7a63c7a59b38d469f878b7a8a3af4 Mon Sep 17 00:00:00 2001 From: Zomatree Date: Fri, 5 Sep 2025 13:07:52 +0100 Subject: [PATCH 6/8] fix: implement Serialize to ClientMessage --- crates/core/database/src/events/server.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/crates/core/database/src/events/server.rs b/crates/core/database/src/events/server.rs index cdaf6418..3c53314c 100644 --- a/crates/core/database/src/events/server.rs +++ b/crates/core/database/src/events/server.rs @@ -1,8 +1,8 @@ -use serde::Deserialize; +use serde::{Serialize, Deserialize}; use super::client::Ping; -#[derive(Deserialize, Debug)] +#[derive(Serialize, Deserialize, Debug)] #[serde(tag = "type")] pub enum ClientMessage { Authenticate { token: String }, From 3cb7da95e3dadd37586e9f967e109005e27c835a Mon Sep 17 00:00:00 2001 From: Zomatree Date: Fri, 5 Sep 2025 15:22:55 +0100 Subject: [PATCH 7/8] chore: add missing traits implementations to PermissionValue --- crates/core/permissions/src/models/mod.rs | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/crates/core/permissions/src/models/mod.rs b/crates/core/permissions/src/models/mod.rs index 330fe756..ba72b38b 100644 --- a/crates/core/permissions/src/models/mod.rs +++ b/crates/core/permissions/src/models/mod.rs @@ -8,10 +8,18 @@ pub use server::*; pub use user::*; /// Holds a permission value to manipulate. -#[derive(Clone, Debug)] +#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)] pub struct PermissionValue(u64); impl PermissionValue { + pub fn from_raw(value: u64) -> Self { + Self(value) + } + + pub fn into_raw(self) -> u64 { + self.0 + } + /// Apply a given override to this value pub fn apply(&mut self, v: Override) { self.allow(v.allow); From e635bc23ec857d648d5705e1a3875d7bc3402b0d Mon Sep 17 00:00:00 2001 From: Tom Date: Sat, 6 Sep 2025 18:41:23 -0700 Subject: [PATCH 8/8] fix: don't remove timeouts when a member leaves a server (#409) --- Cargo.lock | 960 ++++++++++-------- .../src/models/server_members/model.rs | 84 +- .../database/src/models/server_members/ops.rs | 14 +- .../src/models/server_members/ops/mongodb.rs | 107 +- .../models/server_members/ops/reference.rs | 28 +- crates/core/database/src/util/bridge/v0.rs | 2 + .../core/database/src/util/test_fixtures.rs | 4 +- crates/core/models/src/v0/server_members.rs | 1 + crates/daemons/crond/src/main.rs | 5 +- crates/daemons/crond/src/tasks/mod.rs | 1 + .../daemons/crond/src/tasks/prune_members.rs | 18 + crates/delta/src/util/ratelimiter.rs | 3 + 12 files changed, 778 insertions(+), 449 deletions(-) create mode 100644 crates/daemons/crond/src/tasks/prune_members.rs diff --git a/Cargo.lock b/Cargo.lock index bf4db3ba..4d310e03 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -13,9 +13,9 @@ dependencies = [ [[package]] name = "adler2" -version = "2.0.0" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" +checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" [[package]] name = "aead" @@ -87,9 +87,12 @@ dependencies = [ [[package]] name = "aligned-vec" -version = "0.5.0" +version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4aa90d7ce82d4be67b64039a3d588d38dbcc6736577de4a847025ce5b0c468d1" +checksum = "dc890384c8602f339876ded803c97ad529f3842aba97f6392b3dba0dd171769b" +dependencies = [ + "equator", +] [[package]] name = "allocator-api2" @@ -119,7 +122,7 @@ dependencies = [ "bytes 1.10.1", "serde", "serde_bytes_ng", - "tokio 1.45.1", + "tokio 1.47.1", ] [[package]] @@ -166,7 +169,7 @@ checksum = "0ae92a5119aa49cdbcf6b9f893fe4e1d98b04ccbf82ee0584ad948a44a734dea" dependencies = [ "proc-macro2", "quote 1.0.40", - "syn 2.0.101", + "syn 2.0.104", ] [[package]] @@ -204,9 +207,9 @@ dependencies = [ [[package]] name = "async-channel" -version = "2.3.1" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89b47800b0be77592da0afd425cc03468052844aff33b84e33cc696f64e77b6a" +checksum = "924ed96dd52d1b75e9c1a3e6275715fd320f5f9439fb5a4a11fa51f4221158d2" dependencies = [ "concurrent-queue", "event-listener-strategy", @@ -223,7 +226,7 @@ dependencies = [ "async-task", "concurrent-queue", "fastrand 2.3.0", - "futures-lite 2.6.0", + "futures-lite 2.6.1", "pin-project-lite 0.2.16", "slab", ] @@ -234,34 +237,33 @@ version = "2.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "05b1b633a2115cd122d73b955eadd9916c18c8f510ec9cd1686404c60ad1c29c" dependencies = [ - "async-channel 2.3.1", + "async-channel 2.5.0", "async-executor", "async-io", - "async-lock 3.4.0", + "async-lock 3.4.1", "blocking", - "futures-lite 2.6.0", + "futures-lite 2.6.1", "once_cell", "tokio 0.2.25", - "tokio 1.45.1", + "tokio 1.47.1", ] [[package]] name = "async-io" -version = "2.4.1" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1237c0ae75a0f3765f58910ff9cdd0a12eeb39ab2f4c7de23262f337f0aacbb3" +checksum = "19634d6336019ef220f09fd31168ce5c184b295cbf80345437cc36094ef223ca" dependencies = [ - "async-lock 3.4.0", + "async-lock 3.4.1", "cfg-if", "concurrent-queue", "futures-io", - "futures-lite 2.6.0", + "futures-lite 2.6.1", "parking", - "polling 3.8.0", - "rustix 1.0.7", + "polling 3.10.0", + "rustix 1.0.8", "slab", - "tracing", - "windows-sys 0.59.0", + "windows-sys 0.60.2", ] [[package]] @@ -275,32 +277,31 @@ dependencies = [ [[package]] name = "async-lock" -version = "3.4.0" +version = "3.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff6e472cdea888a4bd64f342f09b3f50e1886d32afe8df3d663c01140b811b18" +checksum = "5fd03604047cee9b6ce9de9f70c6cd540a0520c813cbd49bae61f33ab80ed1dc" dependencies = [ - "event-listener 5.4.0", + "event-listener 5.4.1", "event-listener-strategy", "pin-project-lite 0.2.16", ] [[package]] name = "async-process" -version = "2.3.1" +version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cde3f4e40e6021d7acffc90095cbd6dc54cb593903d1de5832f435eb274b85dc" +checksum = "65daa13722ad51e6ab1a1b9c01299142bc75135b337923cfa10e79bbbd669f00" dependencies = [ - "async-channel 2.3.1", + "async-channel 2.5.0", "async-io", - "async-lock 3.4.0", + "async-lock 3.4.1", "async-signal", "async-task", "blocking", "cfg-if", - "event-listener 5.4.0", - "futures-lite 2.6.0", - "rustix 1.0.7", - "tracing", + "event-listener 5.4.1", + "futures-lite 2.6.1", + "rustix 1.0.8", ] [[package]] @@ -311,25 +312,25 @@ checksum = "3b43422f69d8ff38f95f1b2bb76517c91589a924d1559a0e935d7c8ce0274c11" dependencies = [ "proc-macro2", "quote 1.0.40", - "syn 2.0.101", + "syn 2.0.104", ] [[package]] name = "async-signal" -version = "0.2.11" +version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7605a4e50d4b06df3898d5a70bf5fde51ed9059b0434b73105193bc27acce0d" +checksum = "f567af260ef69e1d52c2b560ce0ea230763e6fbb9214a85d768760a920e3e3c1" dependencies = [ "async-io", - "async-lock 3.4.0", + "async-lock 3.4.1", "atomic-waker", "cfg-if", "futures-core", "futures-io", - "rustix 1.0.7", + "rustix 1.0.8", "signal-hook-registry", "slab", - "windows-sys 0.59.0", + "windows-sys 0.60.2", ] [[package]] @@ -342,13 +343,13 @@ dependencies = [ "async-channel 1.9.0", "async-global-executor", "async-io", - "async-lock 3.4.0", + "async-lock 3.4.1", "async-process", "crossbeam-utils", "futures-channel", "futures-core", "futures-io", - "futures-lite 2.6.0", + "futures-lite 2.6.1", "gloo-timers", "kv-log-macro", "log", @@ -379,7 +380,7 @@ checksum = "c7c24de15d275a1ecfd47a380fb4d5ec9bfe0933f309ed5e705b775596a3574d" dependencies = [ "proc-macro2", "quote 1.0.40", - "syn 2.0.101", + "syn 2.0.104", ] [[package]] @@ -396,7 +397,7 @@ checksum = "e539d3fca749fcee5236ab05e93a52867dd549cc157c8cb7f99595f3cedffdb5" dependencies = [ "proc-macro2", "quote 1.0.40", - "syn 2.0.101", + "syn 2.0.104", ] [[package]] @@ -421,9 +422,9 @@ checksum = "c59bdb34bc650a32731b31bd8f0829cc15d24a708ee31559e0bb34f2bc320cba" [[package]] name = "atomic" -version = "0.6.0" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d818003e740b63afc82337e3160717f4f63078720a810b7b903e70a5d1d2994" +checksum = "a89cbf775b137e9b968e67227ef7f775587cde3fd31b0d8599dbd0f598a48340" dependencies = [ "bytemuck", ] @@ -471,7 +472,7 @@ dependencies = [ "revolt_rocket_okapi", "rocket", "rust-argon2", - "schemars", + "schemars 0.8.22", "serde", "serde_json", "sha1", @@ -492,14 +493,14 @@ version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0dde43e75fd43e8a1bf86103336bc699aa8d17ad1be60c76c0bdfd4828e19b78" dependencies = [ - "autocfg 1.4.0", + "autocfg 1.5.0", ] [[package]] name = "autocfg" -version = "1.4.0" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" +checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" [[package]] name = "av1-grain" @@ -517,18 +518,18 @@ dependencies = [ [[package]] name = "avif-serialize" -version = "0.8.3" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "98922d6a4cfbcb08820c69d8eeccc05bb1f29bfa06b4f5b1dbfe9a868bd7608e" +checksum = "2ea8ef51aced2b9191c08197f55450d830876d9933f8f48a429b354f1d496b42" dependencies = [ "arrayvec", ] [[package]] name = "aws-config" -version = "1.6.3" +version = "1.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02a18fd934af6ae7ca52410d4548b98eb895aab0f1ea417d168d85db1434a141" +checksum = "483020b893cdef3d89637e428d588650c71cfae7ea2e6ecbaee4de4ff99fb2dd" dependencies = [ "aws-credential-types", "aws-runtime", @@ -548,7 +549,7 @@ dependencies = [ "http 1.3.1", "ring", "time", - "tokio 1.45.1", + "tokio 1.47.1", "tracing", "url", "zeroize", @@ -556,9 +557,9 @@ dependencies = [ [[package]] name = "aws-credential-types" -version = "1.2.3" +version = "1.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "687bc16bc431a8533fe0097c7f0182874767f920989d7260950172ae8e3c4465" +checksum = "1541072f81945fa1251f8795ef6c92c4282d74d59f88498ae7d4bf00f0ebdad9" dependencies = [ "aws-smithy-async", "aws-smithy-runtime-api", @@ -568,9 +569,9 @@ dependencies = [ [[package]] name = "aws-lc-rs" -version = "1.13.1" +version = "1.13.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93fcc8f365936c834db5514fc45aee5b1202d677e6b40e48468aaaa8183ca8c7" +checksum = "5c953fe1ba023e6b7730c0d4b031d06f267f23a46167dcbd40316644b10a17ba" dependencies = [ "aws-lc-sys", "zeroize", @@ -578,9 +579,9 @@ dependencies = [ [[package]] name = "aws-lc-sys" -version = "0.29.0" +version = "0.30.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61b1d86e7705efe1be1b569bab41d4fa1e14e220b60a160f78de2db687add079" +checksum = "dbfd150b5dbdb988bcc8fb1fe787eb6b7ee6180ca24da683b61ea5405f3d43ff" dependencies = [ "bindgen", "cc", @@ -591,9 +592,9 @@ dependencies = [ [[package]] name = "aws-runtime" -version = "1.5.7" +version = "1.5.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c4063282c69991e57faab9e5cb21ae557e59f5b0fb285c196335243df8dc25c" +checksum = "c034a1bc1d70e16e7f4e4caf7e9f7693e4c9c24cd91cf17c2a0b21abaebc7c8b" dependencies = [ "aws-credential-types", "aws-sigv4", @@ -616,9 +617,9 @@ dependencies = [ [[package]] name = "aws-sdk-s3" -version = "1.91.0" +version = "1.101.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "10c7d58f9c99e7d33e5a9b288ec84db24de046add7ba4c1e98baf6b3a5b37fde" +checksum = "7b16efa59a199f5271bf21ab3e570c5297d819ce4f240e6cf0096d1dc0049c44" dependencies = [ "aws-credential-types", "aws-runtime", @@ -650,9 +651,9 @@ dependencies = [ [[package]] name = "aws-sdk-sso" -version = "1.72.0" +version = "1.79.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13118ad30741222f67b1a18e5071385863914da05124652b38e172d6d3d9ce31" +checksum = "0a847168f15b46329fa32c7aca4e4f1a2e072f9b422f0adb19756f2e1457f111" dependencies = [ "aws-credential-types", "aws-runtime", @@ -672,9 +673,9 @@ dependencies = [ [[package]] name = "aws-sdk-ssooidc" -version = "1.73.0" +version = "1.80.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f879a8572b4683a8f84f781695bebf2f25cf11a81a2693c31fc0e0215c2c1726" +checksum = "b654dd24d65568738593e8239aef279a86a15374ec926ae8714e2d7245f34149" dependencies = [ "aws-credential-types", "aws-runtime", @@ -694,9 +695,9 @@ dependencies = [ [[package]] name = "aws-sdk-sts" -version = "1.73.0" +version = "1.81.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1e9c3c24e36183e2f698235ed38dcfbbdff1d09b9232dc866c4be3011e0b47e" +checksum = "c92ea8a7602321c83615c82b408820ad54280fb026e92de0eeea937342fafa24" dependencies = [ "aws-credential-types", "aws-runtime", @@ -717,9 +718,9 @@ dependencies = [ [[package]] name = "aws-sigv4" -version = "1.3.2" +version = "1.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3734aecf9ff79aa401a6ca099d076535ab465ff76b46440cf567c8e70b65dc13" +checksum = "084c34162187d39e3740cb635acd73c4e3a551a36146ad6fe8883c929c9f876c" dependencies = [ "aws-credential-types", "aws-smithy-eventstream", @@ -751,14 +752,14 @@ checksum = "1e190749ea56f8c42bf15dd76c65e14f8f765233e6df9b0506d9d934ebef867c" dependencies = [ "futures-util", "pin-project-lite 0.2.16", - "tokio 1.45.1", + "tokio 1.47.1", ] [[package]] name = "aws-smithy-checksums" -version = "0.63.3" +version = "0.63.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2f77a921dbd2c78ebe70726799787c1d110a2245dd65e39b20923dfdfb2deee" +checksum = "9054b4cc5eda331cde3096b1576dec45365c5cbbca61d1fffa5f236e251dfce7" dependencies = [ "aws-smithy-http", "aws-smithy-types", @@ -776,9 +777,9 @@ dependencies = [ [[package]] name = "aws-smithy-eventstream" -version = "0.60.8" +version = "0.60.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c45d3dddac16c5c59d553ece225a88870cf81b7b813c9cc17b78cf4685eac7a" +checksum = "604c7aec361252b8f1c871a7641d5e0ba3a7f5a586e51b66bc9510a5519594d9" dependencies = [ "aws-smithy-types", "bytes 1.10.1", @@ -787,9 +788,9 @@ dependencies = [ [[package]] name = "aws-smithy-http" -version = "0.62.1" +version = "0.62.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "99335bec6cdc50a346fda1437f9fefe33abf8c99060739a546a16457f2862ca9" +checksum = "7c4dacf2d38996cf729f55e7a762b30918229917eca115de45dfa8dfb97796c9" dependencies = [ "aws-smithy-eventstream", "aws-smithy-runtime-api", @@ -808,15 +809,15 @@ dependencies = [ [[package]] name = "aws-smithy-http-client" -version = "1.0.3" +version = "1.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "073d330f94bdf1f47bb3e0f5d45dda1e372a54a553c39ab6e9646902c8c81594" +checksum = "f108f1ca850f3feef3009bdcc977be201bca9a91058864d9de0684e64514bee0" dependencies = [ "aws-smithy-async", "aws-smithy-runtime-api", "aws-smithy-types", - "h2 0.3.26", - "h2 0.4.10", + "h2 0.3.27", + "h2 0.4.11", "http 0.2.12", "http 1.3.1", "http-body 0.4.6", @@ -827,19 +828,19 @@ dependencies = [ "hyper-util", "pin-project-lite 0.2.16", "rustls 0.21.12", - "rustls 0.23.27", + "rustls 0.23.31", "rustls-native-certs 0.8.1", "rustls-pki-types", - "tokio 1.45.1", + "tokio 1.47.1", "tower", "tracing", ] [[package]] name = "aws-smithy-json" -version = "0.61.3" +version = "0.61.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92144e45819cae7dc62af23eac5a038a58aa544432d2102609654376a900bd07" +checksum = "a16e040799d29c17412943bdbf488fd75db04112d0c0d4b9290bacf5ae0014b9" dependencies = [ "aws-smithy-types", ] @@ -865,9 +866,9 @@ dependencies = [ [[package]] name = "aws-smithy-runtime" -version = "1.8.3" +version = "1.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14302f06d1d5b7d333fd819943075b13d27c7700b414f574c3c35859bfb55d5e" +checksum = "9e107ce0783019dbff59b3a244aa0c114e4a8c9d93498af9162608cd5474e796" dependencies = [ "aws-smithy-async", "aws-smithy-http", @@ -883,15 +884,15 @@ dependencies = [ "http-body 1.0.1", "pin-project-lite 0.2.16", "pin-utils", - "tokio 1.45.1", + "tokio 1.47.1", "tracing", ] [[package]] name = "aws-smithy-runtime-api" -version = "1.8.0" +version = "1.8.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1e5d9e3a80a18afa109391fb5ad09c3daf887b516c6fd805a157c6ea7994a57" +checksum = "75d52251ed4b9776a3e8487b2a01ac915f73b2da3af8fc1e77e0fce697a550d4" dependencies = [ "aws-smithy-async", "aws-smithy-types", @@ -899,16 +900,16 @@ dependencies = [ "http 0.2.12", "http 1.3.1", "pin-project-lite 0.2.16", - "tokio 1.45.1", + "tokio 1.47.1", "tracing", "zeroize", ] [[package]] name = "aws-smithy-types" -version = "1.3.1" +version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40076bd09fadbc12d5e026ae080d0930defa606856186e31d83ccc6a255eeaf3" +checksum = "d498595448e43de7f4296b7b7a18a8a02c61ec9349128c80a368f7c3b4ab11a8" dependencies = [ "base64-simd", "bytes 1.10.1", @@ -926,24 +927,24 @@ dependencies = [ "ryu", "serde", "time", - "tokio 1.45.1", + "tokio 1.47.1", "tokio-util", ] [[package]] name = "aws-smithy-xml" -version = "0.60.9" +version = "0.60.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab0b0166827aa700d3dc519f72f8b3a91c35d0b8d042dc5d643a91e6f80648fc" +checksum = "3db87b96cb1b16c024980f133968d52882ca0daaee3a086c6decc500f6c99728" dependencies = [ "xmlparser", ] [[package]] name = "aws-types" -version = "1.3.7" +version = "1.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a322fec39e4df22777ed3ad8ea868ac2f94cd15e1a55f6ee8d8d6305057689a" +checksum = "b069d19bf01e46298eaedd7c6f283fe565a59263e53eebec945f3e6398f42390" dependencies = [ "aws-credential-types", "aws-smithy-async", @@ -981,7 +982,7 @@ dependencies = [ "serde_path_to_error", "serde_urlencoded", "sync_wrapper 1.0.2", - "tokio 1.45.1", + "tokio 1.47.1", "tower", "tower-layer", "tower-service", @@ -1041,7 +1042,7 @@ checksum = "57d123550fa8d071b7255cb0cc04dc302baa6c8c4a79f55701552684d8399bce" dependencies = [ "proc-macro2", "quote 1.0.40", - "syn 2.0.101", + "syn 2.0.104", ] [[package]] @@ -1059,7 +1060,7 @@ dependencies = [ "futures-util", "tempfile", "thiserror 1.0.69", - "tokio 1.45.1", + "tokio 1.47.1", "uuid", ] @@ -1073,7 +1074,7 @@ dependencies = [ "heck", "proc-macro-error", "quote 1.0.40", - "syn 2.0.101", + "syn 2.0.104", "ubyte", ] @@ -1184,7 +1185,7 @@ dependencies = [ "regex", "rustc-hash", "shlex", - "syn 2.0.101", + "syn 2.0.104", "which", ] @@ -1258,14 +1259,14 @@ dependencies = [ [[package]] name = "blocking" -version = "1.6.1" +version = "1.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "703f41c54fc768e63e091340b424302bb1c29ef4aa0c7f10fe849dfb114d29ea" +checksum = "e83f8d02be6967315521be875afa792a316e28d57b5a2d401897e2a7921b7f21" dependencies = [ - "async-channel 2.3.1", + "async-channel 2.5.0", "async-task", "futures-io", - "futures-lite 2.6.0", + "futures-lite 2.6.1", "piper", ] @@ -1281,10 +1282,10 @@ dependencies = [ "getrandom 0.2.16", "getrandom 0.3.3", "hex", - "indexmap 2.9.0", + "indexmap 2.10.0", "js-sys", "once_cell", - "rand 0.9.1", + "rand 0.9.2", "serde", "serde_bytes", "serde_json", @@ -1300,15 +1301,15 @@ checksum = "56ed6191a7e78c36abdb16ab65341eefd73d64d303fffccdbb00d51e4205967b" [[package]] name = "bumpalo" -version = "3.18.1" +version = "3.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "793db76d6187cd04dff33004d8e6c9cc4e05cd330500379d2394209271b4aeee" +checksum = "46c5e41b57b8bba42a04676d81cb89e9ee8e859a1a66f80a5a72e1cb76b34d43" [[package]] name = "bytemuck" -version = "1.23.0" +version = "1.23.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9134a6ef01ce4b366b50689c94f82c14bc72bc5d0386829828a2e2752ef7958c" +checksum = "5c76a5792e44e4abe34d3abf15636779261d45a7450612059293d1d2cfc63422" [[package]] name = "byteorder" @@ -1358,7 +1359,7 @@ dependencies = [ "instant", "once_cell", "thiserror 1.0.69", - "tokio 1.45.1", + "tokio 1.47.1", ] [[package]] @@ -1388,9 +1389,9 @@ checksum = "a2698f953def977c68f935bb0dfa959375ad4638570e969e2f1e9f433cbf1af6" [[package]] name = "cc" -version = "1.2.26" +version = "1.2.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "956a5e21988b87f372569b66183b78babf23ebc2e744b733e4350a752c4dafac" +checksum = "c3a42d84bb6b69d3a8b3eaacf0d88f179e1929695e1ad012b6cf64d9caaa5fd2" dependencies = [ "jobserver", "libc", @@ -1429,9 +1430,9 @@ dependencies = [ [[package]] name = "cfg-if" -version = "1.0.0" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" +checksum = "9555578bc9e57714c812a1f84e4fc5b4d21fcb063490c624de019f7464c91268" [[package]] name = "chrono" @@ -1514,7 +1515,7 @@ dependencies = [ "futures-core", "memchr", "pin-project-lite 0.2.16", - "tokio 1.45.1", + "tokio 1.47.1", "tokio-util", ] @@ -1671,15 +1672,14 @@ checksum = "19d374276b40fb8bbdee95aef7c7fa6b5316ec764510eb64b8dd0e2ed0d7e7f5" [[package]] name = "crc-fast" -version = "1.2.2" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68fcb2be5386ffb77e30bf10820934cb89a628bcb976e7cc632dcd88c059ebea" +checksum = "6bf62af4cc77d8fe1c22dde4e721d87f2f54056139d8c412e1366b740305f56f" dependencies = [ - "cc", "crc", "digest", "libc", - "rand 0.9.1", + "rand 0.9.2", "regex", ] @@ -1691,9 +1691,9 @@ checksum = "338089f42c427b86394a5ee60ff321da23a5c89c9d89514c829687b26359fcff" [[package]] name = "crc32fast" -version = "1.4.2" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3" +checksum = "9481c1c90cbf2ac953f07c8d4a58aa3945c425b7185c9154d67a65e4230da511" dependencies = [ "cfg-if", ] @@ -1743,9 +1743,9 @@ checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" [[package]] name = "crunchy" -version = "0.2.3" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43da5946c66ffcc7745f48db692ffbb10a83bfe0afd96235c5c2a4fb23994929" +checksum = "460fbee9c2c2f33933d720630a6a0bac33ba7053db5344fac858d4b8952d77d5" [[package]] name = "crypto-bigint" @@ -1802,7 +1802,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "13b588ba4ac1a99f7f2964d24b3d896ddc6bf847ee3855dbd4366f058cfcd331" dependencies = [ "quote 1.0.40", - "syn 2.0.101", + "syn 2.0.104", ] [[package]] @@ -1920,7 +1920,7 @@ dependencies = [ "proc-macro2", "quote 1.0.40", "strsim 0.11.1", - "syn 2.0.101", + "syn 2.0.104", ] [[package]] @@ -1953,7 +1953,7 @@ checksum = "fc34b93ccb385b40dc71c6fceac4b2ad23662c7eeb248cf10d529b7e055b6ead" dependencies = [ "darling_core 0.20.11", "quote 1.0.40", - "syn 2.0.101", + "syn 2.0.104", ] [[package]] @@ -1983,12 +1983,12 @@ checksum = "5c297a1c74b71ae29df00c3e22dd9534821d60eb9af5a0192823fa2acea70c2a" [[package]] name = "deadqueue" -version = "0.2.4" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16a2561fd313df162315935989dceb8c99db4ee1933358270a57a3cfb8c957f3" +checksum = "72ff1266be84e4e04a81e2d1cbb998cb271b374fb73ce780245ef96c037c50cd" dependencies = [ "crossbeam-queue", - "tokio 1.45.1", + "tokio 1.47.1", ] [[package]] @@ -2069,18 +2069,18 @@ checksum = "d65d7ce8132b7c0e54497a4d9a55a1c2a0912a0d786cf894472ba818fba45762" dependencies = [ "proc-macro2", "quote 1.0.40", - "syn 2.0.101", + "syn 2.0.104", ] [[package]] name = "derive-where" -version = "1.4.0" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e73f2692d4bd3cac41dca28934a39894200c9fabf49586d77d0e5954af1d7902" +checksum = "510c292c8cf384b1a340b816a9a6cf2599eb8f566a44949024af88418000c50b" dependencies = [ "proc-macro2", "quote 1.0.40", - "syn 2.0.101", + "syn 2.0.104", ] [[package]] @@ -2093,7 +2093,7 @@ dependencies = [ "proc-macro2", "quote 1.0.40", "rustc_version", - "syn 2.0.101", + "syn 2.0.104", ] [[package]] @@ -2126,7 +2126,7 @@ dependencies = [ "proc-macro2", "proc-macro2-diagnostics", "quote 1.0.40", - "syn 2.0.101", + "syn 2.0.104", ] [[package]] @@ -2149,7 +2149,7 @@ checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" dependencies = [ "proc-macro2", "quote 1.0.40", - "syn 2.0.101", + "syn 2.0.104", ] [[package]] @@ -2181,9 +2181,9 @@ checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813" [[package]] name = "dyn-clone" -version = "1.0.19" +version = "1.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c7a8fb8a9fbf66c1f703fe16184d10ca0ee9d23be5b4436400408ba54a95005" +checksum = "d0881ea181b1df73ff77ffaaf9c7544ecc11e82fba9b5f27b262a3c73a332555" [[package]] name = "ecdsa" @@ -2326,7 +2326,7 @@ dependencies = [ "heck", "proc-macro2", "quote 1.0.40", - "syn 2.0.101", + "syn 2.0.104", ] [[package]] @@ -2346,7 +2346,7 @@ checksum = "a1ab991c1362ac86c61ab6f556cff143daa22e5a15e4e189df818b2fd19fe65b" dependencies = [ "proc-macro2", "quote 1.0.40", - "syn 2.0.101", + "syn 2.0.104", ] [[package]] @@ -2362,6 +2362,26 @@ dependencies = [ "termcolor", ] +[[package]] +name = "equator" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4711b213838dfee0117e3be6ac926007d7f433d7bbe33595975d4190cb07e6fc" +dependencies = [ + "equator-macro", +] + +[[package]] +name = "equator-macro" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44f23cf4b44bfce11a86ace86f8a73ffdec849c9fd00a386a53d278bd9e81fb3" +dependencies = [ + "proc-macro2", + "quote 1.0.40", + "syn 2.0.104", +] + [[package]] name = "equivalent" version = "1.0.2" @@ -2379,12 +2399,21 @@ dependencies = [ [[package]] name = "errno" -version = "0.3.12" +version = "0.3.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cea14ef9355e3beab063703aa9dab15afd25f0667c341310c1e5274bb1d0da18" +checksum = "778e2ac28f6c47af28e4907f13ffd1e1ddbd400980a9abd7c8df189bf578a5ad" dependencies = [ "libc", - "windows-sys 0.52.0", + "windows-sys 0.60.2", +] + +[[package]] +name = "euclid" +version = "0.22.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad9cdb4b747e485a12abb0e6566612956c7a1bafa3bdb8d682c5b6d403589e48" +dependencies = [ + "num-traits", ] [[package]] @@ -2395,9 +2424,9 @@ checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0" [[package]] name = "event-listener" -version = "5.4.0" +version = "5.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3492acde4c3fc54c845eaab3eed8bd00c7a7d881f78bfc801e43a93dec1331ae" +checksum = "e13b66accf52311f30a0db42147dadea9850cb48cd070028831ae5f5d4b856ab" dependencies = [ "concurrent-queue", "parking", @@ -2410,7 +2439,7 @@ version = "0.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8be9f3dfaaffdae2972880079a491a1a8bb7cbed0b8dd7a347f668b4150a3b93" dependencies = [ - "event-listener 5.4.0", + "event-listener 5.4.1", "pin-project-lite 0.2.16", ] @@ -2502,7 +2531,7 @@ version = "0.10.19" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8cb01cd46b0cf372153850f4c6c272d9cbea2da513e07538405148f95bd789f3" dependencies = [ - "atomic 0.6.0", + "atomic 0.6.1", "pear", "serde", "toml 0.8.23", @@ -2524,9 +2553,9 @@ dependencies = [ [[package]] name = "flate2" -version = "1.1.1" +version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ced92e76e966ca2fd84c8f7aa01a4aea65b0eb6648d72f7c8f3e2764a67fece" +checksum = "4a3d7db9596fecd151c5f638c0ee5d5bd487b6e0ea232e5dc96d5250f6f94b1d" dependencies = [ "crc32fast", "miniz_oxide", @@ -2619,7 +2648,7 @@ dependencies = [ "redis-protocol", "semver", "socket2 0.5.10", - "tokio 1.45.1", + "tokio 1.47.1", "tokio-stream", "tokio-util", "url", @@ -2719,9 +2748,9 @@ dependencies = [ [[package]] name = "futures-lite" -version = "2.6.0" +version = "2.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f5edaec856126859abb19ed65f39e90fea3a9574b9707f13539acf4abf7eb532" +checksum = "f78e10609fe0e0b3f4157ffab1876319b5b0db102a2c60dc4626306dc46b44ad" dependencies = [ "fastrand 2.3.0", "futures-core", @@ -2738,7 +2767,7 @@ checksum = "45ec6fe3675af967e67c5536c0b9d44e34e6c52f86bedc4ea49c5317b8e94d06" dependencies = [ "futures-channel", "futures-task", - "tokio 1.45.1", + "tokio 1.47.1", ] [[package]] @@ -2749,7 +2778,7 @@ checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote 1.0.40", - "syn 2.0.101", + "syn 2.0.104", ] [[package]] @@ -2821,7 +2850,7 @@ dependencies = [ "libc", "log", "rustversion", - "windows 0.61.1", + "windows 0.61.3", ] [[package]] @@ -2846,9 +2875,9 @@ dependencies = [ [[package]] name = "getopts" -version = "0.2.21" +version = "0.2.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14dbbfd5c71d70241ecf9e6f13737f7b5ce823821063188d7e46c41d371eebd5" +checksum = "cba6ae63eb948698e300f645f87c70f76630d505f23b8907cf1e193ee85048c1" dependencies = [ "unicode-width", ] @@ -2862,7 +2891,7 @@ dependencies = [ "cfg-if", "js-sys", "libc", - "wasi 0.11.0+wasi-snapshot-preview1", + "wasi 0.11.1+wasi-snapshot-preview1", "wasm-bindgen", ] @@ -2882,14 +2911,14 @@ dependencies = [ [[package]] name = "getset" -version = "0.1.5" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3586f256131df87204eb733da72e3d3eb4f343c639f4b7be279ac7c48baeafe" +checksum = "9cf0fc11e47561d47397154977bc219f4cf809b2974facc3ccb3b89e2436f912" dependencies = [ "proc-macro-error2", "proc-macro2", "quote 1.0.40", - "syn 2.0.101", + "syn 2.0.104", ] [[package]] @@ -2904,9 +2933,9 @@ dependencies = [ [[package]] name = "gif" -version = "0.13.1" +version = "0.13.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fb2d69b19215e18bb912fa30f7ce15846e301408695e44e0ef719f1da9e19f2" +checksum = "4ae047235e33e2829703574b54fdec96bfbad892062d97fed2f76022287de61b" dependencies = [ "color_quant", "weezl", @@ -2973,9 +3002,9 @@ dependencies = [ [[package]] name = "h2" -version = "0.3.26" +version = "0.3.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81fe527a889e1532da5c525686d96d4c2e74cdd345badf8dfef9f6b39dd5f5e8" +checksum = "0beca50380b1fc32983fc1cb4587bfa4bb9e78fc259aad4a0032d2080309222d" dependencies = [ "bytes 1.10.1", "fnv", @@ -2983,18 +3012,18 @@ dependencies = [ "futures-sink", "futures-util", "http 0.2.12", - "indexmap 2.9.0", + "indexmap 2.10.0", "slab", - "tokio 1.45.1", + "tokio 1.47.1", "tokio-util", "tracing", ] [[package]] name = "h2" -version = "0.4.10" +version = "0.4.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9421a676d1b147b16b82c9225157dc629087ef8ec4d5e2960f9437a90dac0a5" +checksum = "17da50a276f1e01e0ba6c029e47b7100754904ee8a278f886546e98575380785" dependencies = [ "atomic-waker", "bytes 1.10.1", @@ -3002,9 +3031,9 @@ dependencies = [ "futures-core", "futures-sink", "http 1.3.1", - "indexmap 2.9.0", + "indexmap 2.10.0", "slab", - "tokio 1.45.1", + "tokio 1.47.1", "tokio-util", "tracing", ] @@ -3060,9 +3089,9 @@ dependencies = [ [[package]] name = "hashbrown" -version = "0.15.3" +version = "0.15.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "84b26c544d002229e640969970a2e74021aadf6e2f96372b9c58eff97de08eb3" +checksum = "5971ac85611da7067dbfcabef3c70ebb5606018acd9e2a3903a0da507521e0d5" dependencies = [ "allocator-api2", "equivalent", @@ -3110,9 +3139,9 @@ dependencies = [ [[package]] name = "hermit-abi" -version = "0.5.1" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f154ce46856750ed433c8649605bf7ed2de3bc35fd9d2a9f30cddd873c80cb08" +checksum = "fc0fef456e4baa96da950455cd02c081ca953b141298e41db3fc7e36b1da849c" [[package]] name = "hex" @@ -3139,7 +3168,7 @@ dependencies = [ "rand 0.8.5", "thiserror 1.0.69", "tinyvec", - "tokio 1.45.1", + "tokio 1.47.1", "tracing", "url", ] @@ -3161,7 +3190,7 @@ dependencies = [ "resolv-conf", "smallvec", "thiserror 1.0.69", - "tokio 1.45.1", + "tokio 1.47.1", "tracing", ] @@ -3238,7 +3267,7 @@ dependencies = [ "markup5ever", "proc-macro2", "quote 1.0.40", - "syn 2.0.101", + "syn 2.0.104", ] [[package]] @@ -3328,7 +3357,7 @@ dependencies = [ "futures-channel", "futures-core", "futures-util", - "h2 0.3.26", + "h2 0.3.27", "http 0.2.12", "http-body 0.4.6", "httparse", @@ -3336,7 +3365,7 @@ dependencies = [ "itoa", "pin-project-lite 0.2.16", "socket2 0.5.10", - "tokio 1.45.1", + "tokio 1.47.1", "tower-service", "tracing", "want", @@ -3351,7 +3380,7 @@ dependencies = [ "bytes 1.10.1", "futures-channel", "futures-util", - "h2 0.4.10", + "h2 0.4.11", "http 1.3.1", "http-body 1.0.1", "httparse", @@ -3359,7 +3388,7 @@ dependencies = [ "itoa", "pin-project-lite 0.2.16", "smallvec", - "tokio 1.45.1", + "tokio 1.47.1", "want", ] @@ -3375,7 +3404,7 @@ dependencies = [ "log", "rustls 0.21.12", "rustls-native-certs 0.6.3", - "tokio 1.45.1", + "tokio 1.47.1", "tokio-rustls 0.24.1", ] @@ -3391,7 +3420,7 @@ dependencies = [ "hyper-util", "rustls 0.22.4", "rustls-pki-types", - "tokio 1.45.1", + "tokio 1.47.1", "tokio-rustls 0.25.0", "tower-service", "webpki-roots 0.26.11", @@ -3406,10 +3435,10 @@ dependencies = [ "http 1.3.1", "hyper 1.6.0", "hyper-util", - "rustls 0.23.27", + "rustls 0.23.31", "rustls-native-certs 0.8.1", "rustls-pki-types", - "tokio 1.45.1", + "tokio 1.47.1", "tokio-rustls 0.26.2", "tower-service", ] @@ -3423,7 +3452,7 @@ dependencies = [ "bytes 1.10.1", "hyper 0.14.32", "native-tls", - "tokio 1.45.1", + "tokio 1.47.1", "tokio-native-tls", ] @@ -3438,16 +3467,16 @@ dependencies = [ "hyper 1.6.0", "hyper-util", "native-tls", - "tokio 1.45.1", + "tokio 1.47.1", "tokio-native-tls", "tower-service", ] [[package]] name = "hyper-util" -version = "0.1.14" +version = "0.1.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc2fdfdbff08affe55bb779f33b053aa1fe5dd5b54c257343c17edfa55711bdb" +checksum = "8d9b05277c7e8da2c93a568989bb6207bef0112e8d17df7a6eda4a3cf143bc5e" dependencies = [ "base64 0.22.1", "bytes 1.10.1", @@ -3461,9 +3490,9 @@ dependencies = [ "libc", "percent-encoding", "pin-project-lite 0.2.16", - "socket2 0.5.10", + "socket2 0.6.0", "system-configuration 0.6.1", - "tokio 1.45.1", + "tokio 1.47.1", "tower-service", "tracing", "windows-registry", @@ -3654,7 +3683,7 @@ dependencies = [ "color_quant", "exr", "gif", - "image-webp 0.2.1", + "image-webp 0.2.3", "num-traits", "png", "qoi", @@ -3678,9 +3707,9 @@ dependencies = [ [[package]] name = "image-webp" -version = "0.2.1" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b77d01e822461baa8409e156015a1d91735549f0f2c17691bd2d996bef238f7f" +checksum = "f6970fe7a5300b4b42e62c52efa0187540a5bef546c60edaf554ef595d2e6f0b" dependencies = [ "byteorder-lite", "quick-error 2.0.1", @@ -3710,19 +3739,19 @@ version = "1.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" dependencies = [ - "autocfg 1.4.0", + "autocfg 1.5.0", "hashbrown 0.12.3", "serde", ] [[package]] name = "indexmap" -version = "2.9.0" +version = "2.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cea70ddb795996207ad57735b50c5982d8844f38ba9ee5f1aedcfb708a2aa11e" +checksum = "fe4cd85333e22411419a0bcae1297d25e58c9443848b11dc6a86fefe8c78a661" dependencies = [ "equivalent", - "hashbrown 0.15.3", + "hashbrown 0.15.4", "serde", ] @@ -3767,7 +3796,18 @@ checksum = "c34819042dc3d3971c46c2190835914dfbe0c3c13f61449b2997f4e9722dfa60" dependencies = [ "proc-macro2", "quote 1.0.40", - "syn 2.0.101", + "syn 2.0.104", +] + +[[package]] +name = "io-uring" +version = "0.7.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d93587f37623a1a17d94ef2bc9ada592f5465fe7732084ab7beefabe5c77c0c4" +dependencies = [ + "bitflags 2.9.1", + "cfg-if", + "libc", ] [[package]] @@ -3804,9 +3844,9 @@ version = "0.4.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e04d7f318608d35d4b61ddd75cbdaee86b023ebe2bd5a66ee0915f0bf93095a9" dependencies = [ - "hermit-abi 0.5.1", + "hermit-abi 0.5.2", "libc", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -3845,7 +3885,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "24d4e5d712dd664b11e778d1cfc06c79ba2700d6bc1771e44fb7b6a4656b487d" dependencies = [ "generic-array 1.2.0", - "schemars", + "schemars 0.8.22", "serde", "time", ] @@ -3877,9 +3917,9 @@ dependencies = [ [[package]] name = "jpeg-decoder" -version = "0.3.1" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f5d4a7da358eff58addd2877a45865158f0d78c911d43a5784ceb7bbf52833b0" +checksum = "00810f1d8b74be64b13dbf3db89ac67740615d6c891f0e7b6179326533011a07" [[package]] name = "js-sys" @@ -4094,11 +4134,12 @@ dependencies = [ [[package]] name = "kurbo" -version = "0.11.2" +version = "0.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1077d333efea6170d9ccb96d3c3026f300ca0773da4938cc4c811daa6df68b0c" +checksum = "c62026ae44756f8a599ba21140f350303d4f08dcdcc71b5ad9c9bb8128c13c62" dependencies = [ "arrayvec", + "euclid", "smallvec", ] @@ -4152,20 +4193,20 @@ dependencies = [ "once_cell", "quoted_printable", "socket2 0.4.10", - "tokio 1.45.1", + "tokio 1.47.1", ] [[package]] name = "libc" -version = "0.2.172" +version = "0.2.174" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d750af042f7ef4f724306de029d18836c26c1765a54a6a3f094cbd23a7267ffa" +checksum = "1171693293099992e19cddea4e8b849964e9846f4acee11b3948bcc337be8776" [[package]] name = "libfuzzer-sys" -version = "0.4.9" +version = "0.4.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf78f52d400cf2d84a3a973a78a592b4adc535739e0a5597a0da6f0c357adc75" +checksum = "5037190e1f70cbeef565bd267599242926f724d3b8a9f510fd7e0b540cfa4404" dependencies = [ "arbitrary", "cc", @@ -4190,7 +4231,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "07033963ba89ebaf1584d767badaa2e8fcec21aedea6b8c0346d487d49c28667" dependencies = [ "cfg-if", - "windows-targets 0.53.0", + "windows-targets 0.53.3", ] [[package]] @@ -4279,7 +4320,7 @@ version = "0.4.13" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "96936507f153605bddfcda068dd804796c84324ed2510809e5b2a624c81da765" dependencies = [ - "autocfg 1.4.0", + "autocfg 1.5.0", "scopeguard", ] @@ -4314,7 +4355,7 @@ dependencies = [ "quote 1.0.40", "regex-syntax 0.8.5", "rustc_version", - "syn 2.0.101", + "syn 2.0.104", ] [[package]] @@ -4387,7 +4428,7 @@ version = "0.12.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "234cf4f4a04dc1f57e24b96cc0cd600cf2af460d4161ac5ecdd0af8e1f3b2a38" dependencies = [ - "hashbrown 0.15.3", + "hashbrown 0.15.4", ] [[package]] @@ -4420,7 +4461,7 @@ dependencies = [ "macro_magic_core", "macro_magic_macros", "quote 1.0.40", - "syn 2.0.101", + "syn 2.0.104", ] [[package]] @@ -4434,7 +4475,7 @@ dependencies = [ "macro_magic_core_macros", "proc-macro2", "quote 1.0.40", - "syn 2.0.101", + "syn 2.0.104", ] [[package]] @@ -4445,7 +4486,7 @@ checksum = "b02abfe41815b5bd98dbd4260173db2c116dda171dc0fe7838cb206333b83308" dependencies = [ "proc-macro2", "quote 1.0.40", - "syn 2.0.101", + "syn 2.0.104", ] [[package]] @@ -4456,7 +4497,7 @@ checksum = "73ea28ee64b88876bf45277ed9a5817c1817df061a74f2b988971a12570e5869" dependencies = [ "macro_magic_core", "quote 1.0.40", - "syn 2.0.101", + "syn 2.0.104", ] [[package]] @@ -4522,15 +4563,15 @@ dependencies = [ [[package]] name = "memchr" -version = "2.7.4" +version = "2.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" +checksum = "32a282da65faaf38286cf3be983213fcf1d2e2a58700e808f83f4ea9a4804bc0" [[package]] name = "memmap2" -version = "0.9.5" +version = "0.9.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd3f7eed9d3848f8b98834af67102b720745c4ec028fcd0aa0239277e7de374f" +checksum = "483758ad303d734cec05e5c12b41d7e93e6a6390c5e9dae6bdeb7c1259012d28" dependencies = [ "libc", ] @@ -4559,9 +4600,9 @@ checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" [[package]] name = "miniz_oxide" -version = "0.8.8" +version = "0.8.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3be647b768db090acb35d5ec5db2b0e1f1de11133ca123b9eacf5137868f892a" +checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316" dependencies = [ "adler2", "simd-adler32", @@ -4574,7 +4615,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "78bed444cc8a2160f01cbcf811ef18cac863ad68ae8ca62092e8db51d51c761c" dependencies = [ "libc", - "wasi 0.11.0+wasi-snapshot-preview1", + "wasi 0.11.1+wasi-snapshot-preview1", "windows-sys 0.59.0", ] @@ -4593,7 +4634,7 @@ dependencies = [ "log", "metrics", "thiserror 1.0.69", - "tokio 1.45.1", + "tokio 1.47.1", "tracing", "tracing-subscriber", ] @@ -4614,11 +4655,11 @@ version = "0.12.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a9321642ca94a4282428e6ea4af8cc2ca4eac48ac7a6a4ea8f33f76d0ce70926" dependencies = [ - "async-lock 3.4.0", + "async-lock 3.4.1", "crossbeam-channel", "crossbeam-epoch", "crossbeam-utils", - "event-listener 5.4.0", + "event-listener 5.4.1", "futures-util", "loom 0.7.2", "parking_lot", @@ -4632,9 +4673,9 @@ dependencies = [ [[package]] name = "mongodb" -version = "3.2.3" +version = "3.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fdf4261933e5113914caec01c4bb16a7502bdaa9cf80fd87191765e7d9ff16b2" +checksum = "d0f8c69f13acf07eae386a2974f48ffd9187ea2aba8defbea9aa34e7e272c5f3" dependencies = [ "async-trait", "base64 0.13.1", @@ -4664,14 +4705,14 @@ dependencies = [ "serde", "serde_bytes", "serde_with", - "sha-1", + "sha1", "sha2", "socket2 0.5.10", "stringprep", "strsim 0.11.1", "take_mut", "thiserror 1.0.69", - "tokio 1.45.1", + "tokio 1.47.1", "tokio-rustls 0.24.1", "tokio-util", "typed-builder", @@ -4681,14 +4722,14 @@ dependencies = [ [[package]] name = "mongodb-internal-macros" -version = "3.2.3" +version = "3.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "619176c99deef0d50be51ce3193e9efd6a56ab0f4e6a38d5fd614880d148c7ae" +checksum = "b9202de265a3a8bbb43f9fe56db27c93137d4f9fb04c093f47e9c7de0c61ac7d" dependencies = [ "macro_magic", "proc-macro2", "quote 1.0.40", - "syn 2.0.101", + "syn 2.0.104", ] [[package]] @@ -4705,7 +4746,7 @@ dependencies = [ "memchr", "mime", "spin", - "tokio 1.45.1", + "tokio 1.47.1", "tokio-util", "version_check", ] @@ -4824,7 +4865,7 @@ checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202" dependencies = [ "proc-macro2", "quote 1.0.40", - "syn 2.0.101", + "syn 2.0.104", ] [[package]] @@ -4842,7 +4883,7 @@ version = "0.1.45" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1429034a0490724d0075ebb2bc9e875d6503c3cf69e235a8941aa757d83ef5bf" dependencies = [ - "autocfg 1.4.0", + "autocfg 1.5.0", "num-integer", "num-traits", ] @@ -4864,7 +4905,7 @@ version = "0.2.19" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" dependencies = [ - "autocfg 1.4.0", + "autocfg 1.5.0", "libm", ] @@ -4874,7 +4915,7 @@ version = "1.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "91df4bbde75afed763b708b7eee1e8e7651e02d97f6d5dd763e89367e957b23b" dependencies = [ - "hermit-abi 0.5.1", + "hermit-abi 0.5.2", "libc", ] @@ -4917,7 +4958,7 @@ dependencies = [ "proc-macro-crate", "proc-macro2", "quote 1.0.40", - "syn 2.0.101", + "syn 2.0.104", ] [[package]] @@ -4973,7 +5014,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote 1.0.40", - "syn 2.0.101", + "syn 2.0.104", ] [[package]] @@ -5006,11 +5047,12 @@ dependencies = [ [[package]] name = "os_info" -version = "3.11.0" +version = "3.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41fc863e2ca13dc2d5c34fb22ea4a588248ac14db929616ba65c45f21744b1e9" +checksum = "d0e1ac5fde8d43c34139135df8ea9ee9465394b2d8d20f032d38998f64afffc3" dependencies = [ "log", + "plist", "serde", "windows-sys 0.52.0", ] @@ -5132,7 +5174,7 @@ dependencies = [ "proc-macro2", "proc-macro2-diagnostics", "quote 1.0.40", - "syn 2.0.101", + "syn 2.0.104", ] [[package]] @@ -5182,9 +5224,9 @@ checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" [[package]] name = "pest" -version = "2.8.0" +version = "2.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "198db74531d58c70a361c42201efde7e2591e976d518caf7662a47dc5720e7b6" +checksum = "1db05f56d34358a8b1066f67cbb203ee3e7ed2ba674a6263a1d5ec6db2204323" dependencies = [ "memchr", "thiserror 2.0.12", @@ -5193,9 +5235,9 @@ dependencies = [ [[package]] name = "pest_derive" -version = "2.8.0" +version = "2.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d725d9cfd79e87dccc9341a2ef39d1b6f6353d68c4b33c177febbe1a402c97c5" +checksum = "bb056d9e8ea77922845ec74a1c4e8fb17e7c218cc4fc11a15c5d25e189aa40bc" dependencies = [ "pest", "pest_generator", @@ -5203,24 +5245,23 @@ dependencies = [ [[package]] name = "pest_generator" -version = "2.8.0" +version = "2.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db7d01726be8ab66ab32f9df467ae8b1148906685bbe75c82d1e65d7f5b3f841" +checksum = "87e404e638f781eb3202dc82db6760c8ae8a1eeef7fb3fa8264b2ef280504966" dependencies = [ "pest", "pest_meta", "proc-macro2", "quote 1.0.40", - "syn 2.0.101", + "syn 2.0.104", ] [[package]] name = "pest_meta" -version = "2.8.0" +version = "2.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f9f832470494906d1fca5329f8ab5791cc60beb230c74815dff541cbd2b5ca0" +checksum = "edd1101f170f5903fde0914f899bb503d9ff5271d7ba76bbb70bea63690cc0d5" dependencies = [ - "once_cell", "pest", "sha2", ] @@ -5294,7 +5335,7 @@ dependencies = [ "phf_shared 0.11.3", "proc-macro2", "quote 1.0.40", - "syn 2.0.101", + "syn 2.0.104", ] [[package]] @@ -5338,7 +5379,7 @@ checksum = "6e918e4ff8c4549eb882f14b3a4bc8c8bc93de829416eacf579f1207a8fbf861" dependencies = [ "proc-macro2", "quote 1.0.40", - "syn 2.0.101", + "syn 2.0.104", ] [[package]] @@ -5408,6 +5449,19 @@ version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" +[[package]] +name = "plist" +version = "1.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3af6b589e163c5a788fab00ce0c0366f6efbb9959c2f9874b224936af7fce7e1" +dependencies = [ + "base64 0.22.1", + "indexmap 2.10.0", + "quick-xml", + "serde", + "time", +] + [[package]] name = "png" version = "0.17.16" @@ -5427,7 +5481,7 @@ version = "2.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4b2d323e8ca7996b3e23126511a523f7e62924d93ecd5ae73b333815b0eb3dce" dependencies = [ - "autocfg 1.4.0", + "autocfg 1.5.0", "bitflags 1.3.2", "cfg-if", "concurrent-queue", @@ -5439,17 +5493,16 @@ dependencies = [ [[package]] name = "polling" -version = "3.8.0" +version = "3.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b53a684391ad002dd6a596ceb6c74fd004fdce75f4be2e3f615068abbea5fd50" +checksum = "b5bd19146350fe804f7cb2669c851c03d69da628803dab0d98018142aaa5d829" dependencies = [ "cfg-if", "concurrent-queue", - "hermit-abi 0.5.1", + "hermit-abi 0.5.2", "pin-project-lite 0.2.16", - "rustix 1.0.7", - "tracing", - "windows-sys 0.59.0", + "rustix 1.0.8", + "windows-sys 0.60.2", ] [[package]] @@ -5512,12 +5565,12 @@ dependencies = [ [[package]] name = "prettyplease" -version = "0.2.33" +version = "0.2.36" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9dee91521343f4c5c6a63edd65e54f31f5c92fe8978c40a4282f8372194c6a7d" +checksum = "ff24dfcda44452b9816fff4cd4227e1bb73ff5a2f1bc1105aa92fb8565ce44d2" dependencies = [ "proc-macro2", - "syn 2.0.101", + "syn 2.0.104", ] [[package]] @@ -5582,7 +5635,7 @@ dependencies = [ "proc-macro-error-attr2", "proc-macro2", "quote 1.0.40", - "syn 2.0.101", + "syn 2.0.104", ] [[package]] @@ -5602,28 +5655,28 @@ checksum = "af066a9c399a26e020ada66a034357a868728e72cd426f3adcd35f80d88d88c8" dependencies = [ "proc-macro2", "quote 1.0.40", - "syn 2.0.101", + "syn 2.0.104", "version_check", "yansi", ] [[package]] name = "profiling" -version = "1.0.16" +version = "1.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "afbdc74edc00b6f6a218ca6a5364d6226a259d4b8ea1af4a0ea063f27e179f4d" +checksum = "3eb8486b569e12e2c32ad3e204dbaba5e4b5b216e9367044f25f1dba42341773" dependencies = [ "profiling-procmacros", ] [[package]] name = "profiling-procmacros" -version = "1.0.16" +version = "1.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a65f2e60fbf1063868558d69c6beacf412dc755f9fc020f514b7955fc914fe30" +checksum = "52717f9a02b6965224f95ca2a81e2e0c5c43baacd28ca057577988930b6c3d5b" dependencies = [ "quote 1.0.40", - "syn 2.0.101", + "syn 2.0.104", ] [[package]] @@ -5667,6 +5720,15 @@ version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a993555f31e5a609f617c12db6250dedcac1b0a85076912c436e6fc9b2c8e6a3" +[[package]] +name = "quick-xml" +version = "0.38.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9845d9dccf565065824e69f9f235fafba1587031eda353c1f1561cd6a6be78f4" +dependencies = [ + "memchr", +] + [[package]] name = "quote" version = "0.3.15" @@ -5690,9 +5752,9 @@ checksum = "5a3866219251662ec3b26fc217e3e05bf9c4f84325234dfb96bf0bf840889e49" [[package]] name = "r-efi" -version = "5.2.0" +version = "5.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74765f6d916ee2faa39bc8e68e4f3ed8949b48cccdac59983d287a7cb71ce9c5" +checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" [[package]] name = "radium" @@ -5732,9 +5794,9 @@ dependencies = [ [[package]] name = "rand" -version = "0.9.1" +version = "0.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fbfd9d094a40bf3ae768db9361049ace4c0e04a4fd6b359518bd7b73a73dd97" +checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1" dependencies = [ "rand_chacha 0.9.0", "rand_core 0.9.3", @@ -5903,9 +5965,9 @@ dependencies = [ [[package]] name = "ravif" -version = "0.11.12" +version = "0.11.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6a5f31fcf7500f9401fea858ea4ab5525c99f2322cfcee732c0e6c74208c0c6" +checksum = "5825c26fddd16ab9f515930d49028a630efec172e903483c94796cfe31893e6b" dependencies = [ "avif-serialize", "imgref", @@ -5961,7 +6023,7 @@ dependencies = [ "ryu", "sha1_smol", "socket2 0.4.10", - "tokio 1.45.1", + "tokio 1.47.1", "tokio-util", "url", ] @@ -5998,9 +6060,9 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.5.12" +version = "0.5.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "928fca9cf2aa042393a8325b9ead81d2f0df4cb12e1e24cef072922ccd99c5af" +checksum = "5407465600fb0548f1442edf71dd20683c6ed326200ace4b1ef0763521bb3b77" dependencies = [ "bitflags 2.9.1", ] @@ -6022,7 +6084,7 @@ checksum = "1165225c21bff1f3bbce98f5a1f889949bc902d3575308cc7b0de30b4f6d27c7" dependencies = [ "proc-macro2", "quote 1.0.40", - "syn 2.0.101", + "syn 2.0.104", ] [[package]] @@ -6086,7 +6148,7 @@ dependencies = [ "encoding_rs", "futures-core", "futures-util", - "h2 0.3.26", + "h2 0.3.27", "http 0.2.12", "http-body 0.4.6", "hyper 0.14.32", @@ -6105,7 +6167,7 @@ dependencies = [ "serde_urlencoded", "sync_wrapper 0.1.2", "system-configuration 0.5.1", - "tokio 1.45.1", + "tokio 1.47.1", "tokio-native-tls", "tower-service", "url", @@ -6117,15 +6179,15 @@ dependencies = [ [[package]] name = "reqwest" -version = "0.12.19" +version = "0.12.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2f8e5513d63f2e5b386eb5106dc67eaf3f84e95258e210489136b8b92ad6119" +checksum = "cbc931937e6ca3a06e3b6c0aa7841849b160a90351d6ab467a8b9b9959767531" dependencies = [ "base64 0.22.1", "bytes 1.10.1", "encoding_rs", "futures-core", - "h2 0.4.10", + "h2 0.4.11", "http 1.3.1", "http-body 1.0.1", "http-body-util", @@ -6133,12 +6195,10 @@ dependencies = [ "hyper-rustls 0.27.7", "hyper-tls 0.6.0", "hyper-util", - "ipnet", "js-sys", "log", "mime", "native-tls", - "once_cell", "percent-encoding", "pin-project-lite 0.2.16", "rustls-pki-types", @@ -6146,7 +6206,7 @@ dependencies = [ "serde_json", "serde_urlencoded", "sync_wrapper 1.0.2", - "tokio 1.45.1", + "tokio 1.47.1", "tokio-native-tls", "tower", "tower-http 0.6.6", @@ -6207,7 +6267,7 @@ dependencies = [ "simdutf8", "strum_macros", "tempfile", - "tokio 1.45.1", + "tokio 1.47.1", "tower-http 0.5.2", "tracing", "tracing-subscriber", @@ -6221,7 +6281,7 @@ dependencies = [ name = "revolt-bonfire" version = "0.8.8" dependencies = [ - "async-channel 2.3.1", + "async-channel 2.5.0", "async-std", "async-tungstenite", "authifier", @@ -6273,7 +6333,7 @@ dependencies = [ "revolt-database", "revolt-files", "revolt-result", - "tokio 1.45.1", + "tokio 1.47.1", ] [[package]] @@ -6314,7 +6374,7 @@ dependencies = [ "revolt_optional_struct", "revolt_rocket_okapi", "rocket", - "schemars", + "schemars 0.8.22", "serde", "serde_json", "ulid 1.2.1", @@ -6361,7 +6421,7 @@ dependencies = [ "rocket_cors", "rocket_empty", "rocket_prometheus", - "schemars", + "schemars 0.8.22", "serde", "serde_json", "ulid 0.4.1", @@ -6405,7 +6465,7 @@ dependencies = [ "mime", "moka", "regex", - "reqwest 0.12.19", + "reqwest 0.12.22", "revolt-config", "revolt-files", "revolt-models", @@ -6414,7 +6474,7 @@ dependencies = [ "serde", "serde_json", "tempfile", - "tokio 1.45.1", + "tokio 1.47.1", "tracing", "tracing-subscriber", "utoipa", @@ -6434,7 +6494,7 @@ dependencies = [ "revolt-permissions", "revolt_optional_struct", "rocket", - "schemars", + "schemars 0.8.22", "serde", "utoipa", "validator 0.16.1", @@ -6458,7 +6518,7 @@ dependencies = [ "num_enum 0.6.1", "once_cell", "revolt-result", - "schemars", + "schemars 0.8.22", "serde", ] @@ -6497,7 +6557,7 @@ dependencies = [ "revolt_optional_struct", "serde", "serde_json", - "tokio 1.45.1", + "tokio 1.47.1", "ulid 1.2.1", "web-push", ] @@ -6510,7 +6570,7 @@ dependencies = [ "revolt_okapi", "revolt_rocket_okapi", "rocket", - "schemars", + "schemars 0.8.22", "serde", "serde_json", "utoipa", @@ -6537,7 +6597,7 @@ dependencies = [ "serde", "serde_json", "thiserror 1.0.69", - "tokio 1.45.1", + "tokio 1.47.1", ] [[package]] @@ -6553,7 +6613,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "23bfdf7ae769c3042fe727f6e5c17363b02a64b4b33ad60c3e5f73b26df7835b" dependencies = [ "log", - "schemars", + "schemars 0.8.22", "serde", "serde_json", ] @@ -6579,7 +6639,7 @@ dependencies = [ "revolt_okapi", "revolt_rocket_okapi_codegen", "rocket", - "schemars", + "schemars 0.8.22", "serde", "serde_json", ] @@ -6620,9 +6680,9 @@ dependencies = [ [[package]] name = "rgb" -version = "0.8.50" +version = "0.8.52" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57397d16646700483b67d2dd6511d79318f9d057fdbd21a4066aeac8b41d310a" +checksum = "0c6a884d2998352bb4daf0183589aec883f16a6da1f4dde84d8e2e9a5409a1ce" dependencies = [ "bytemuck", ] @@ -6677,7 +6737,7 @@ dependencies = [ "either", "figment", "futures", - "indexmap 2.9.0", + "indexmap 2.10.0", "log", "memchr", "multer", @@ -6693,7 +6753,7 @@ dependencies = [ "state", "tempfile", "time", - "tokio 1.45.1", + "tokio 1.47.1", "tokio-stream", "tokio-util", "ubyte", @@ -6713,7 +6773,7 @@ dependencies = [ "revolt_rocket_okapi", "rocket", "rocket_empty", - "schemars", + "schemars 0.8.22", "serde", ] @@ -6725,11 +6785,11 @@ checksum = "575d32d7ec1a9770108c879fc7c47815a80073f96ca07ff9525a94fcede1dd46" dependencies = [ "devise", "glob", - "indexmap 2.9.0", + "indexmap 2.10.0", "proc-macro2", "quote 1.0.40", "rocket_http", - "syn 2.0.101", + "syn 2.0.104", "unicode-xid 0.2.6", "version_check", ] @@ -6772,7 +6832,7 @@ dependencies = [ "futures", "http 0.2.12", "hyper 0.14.32", - "indexmap 2.9.0", + "indexmap 2.10.0", "log", "memchr", "pear", @@ -6784,7 +6844,7 @@ dependencies = [ "stable-pattern", "state", "time", - "tokio 1.45.1", + "tokio 1.47.1", "uncased", ] @@ -6860,9 +6920,9 @@ dependencies = [ [[package]] name = "rustc-demangle" -version = "0.1.24" +version = "0.1.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" +checksum = "56f7d92ca342cea22a06f2121d944b4fd82af56988c270852495420f961d4ace" [[package]] name = "rustc-hash" @@ -6899,20 +6959,20 @@ dependencies = [ "errno", "libc", "linux-raw-sys 0.4.15", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] name = "rustix" -version = "1.0.7" +version = "1.0.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c71e83d6afe7ff64890ec6b71d6a69bb8a610ab78ce364b3352876bb4c801266" +checksum = "11181fbabf243db407ef8df94a6ce0b2f9a733bd8be4ad02b4eda9602296cac8" dependencies = [ "bitflags 2.9.1", "errno", "libc", "linux-raw-sys 0.9.4", - "windows-sys 0.52.0", + "windows-sys 0.60.2", ] [[package]] @@ -6943,14 +7003,14 @@ dependencies = [ [[package]] name = "rustls" -version = "0.23.27" +version = "0.23.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "730944ca083c1c233a75c09f199e973ca499344a2b7ba9e755c457e86fb4a321" +checksum = "c0ebcbd2f03de0fc1122ad9bb24b127a5a6cd51d72604a3f3c50ac459762b6cc" dependencies = [ "aws-lc-rs", "once_cell", "rustls-pki-types", - "rustls-webpki 0.103.3", + "rustls-webpki 0.103.4", "subtle", "zeroize", ] @@ -7029,9 +7089,9 @@ dependencies = [ [[package]] name = "rustls-webpki" -version = "0.103.3" +version = "0.103.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e4a72fe2bcf7a6ac6fd7d0b9e5cb68aeb7d4c0a0271730218b3e92d43b4eb435" +checksum = "0a17884ae0c1b773f1ccd2bd4a8c72f16da897310a98b0e84bf349ad5ead92fc" dependencies = [ "aws-lc-rs", "ring", @@ -7091,6 +7151,30 @@ dependencies = [ "serde_json", ] +[[package]] +name = "schemars" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cd191f9397d57d581cddd31014772520aa448f65ef991055d7f61582c65165f" +dependencies = [ + "dyn-clone", + "ref-cast", + "serde", + "serde_json", +] + +[[package]] +name = "schemars" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82d20c4491bc164fa2f6c5d44565947a52ad80b9505d8e36f8d54c27c739fcd0" +dependencies = [ + "dyn-clone", + "ref-cast", + "serde", + "serde_json", +] + [[package]] name = "schemars_derive" version = "0.8.22" @@ -7100,7 +7184,7 @@ dependencies = [ "proc-macro2", "quote 1.0.40", "serde_derive_internals", - "syn 2.0.101", + "syn 2.0.104", ] [[package]] @@ -7262,7 +7346,7 @@ dependencies = [ "sentry-debug-images", "sentry-panic", "sentry-tracing", - "tokio 1.45.1", + "tokio 1.47.1", "ureq", ] @@ -7396,7 +7480,7 @@ checksum = "04b6c9287202294685cb1f749b944dbbce8160b81a1061ecddc073025fed129f" dependencies = [ "debugid", "hex", - "rand 0.9.1", + "rand 0.9.2", "serde", "serde_json", "thiserror 2.0.12", @@ -7440,7 +7524,7 @@ checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" dependencies = [ "proc-macro2", "quote 1.0.40", - "syn 2.0.101", + "syn 2.0.104", ] [[package]] @@ -7451,16 +7535,16 @@ checksum = "18d26a20a969b9e3fdf2fc2d9f21eda6c40e2de84c9408bb5d3b05d499aae711" dependencies = [ "proc-macro2", "quote 1.0.40", - "syn 2.0.101", + "syn 2.0.104", ] [[package]] name = "serde_json" -version = "1.0.140" +version = "1.0.142" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "20068b6e96dc6c9bd23e01df8827e6c7e1f2fddd43c21810382803c136b99373" +checksum = "030fedb782600dcbd6f02d479bf0d817ac3bb40d644745b769d6a96bc3afc5a7" dependencies = [ - "indexmap 2.9.0", + "indexmap 2.10.0", "itoa", "memchr", "ryu", @@ -7500,15 +7584,17 @@ dependencies = [ [[package]] name = "serde_with" -version = "3.12.0" +version = "3.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6b6f7f2fcb69f747921f79f3926bd1e203fce4fef62c268dd3abfb6d86029aa" +checksum = "f2c45cd61fefa9db6f254525d46e392b852e0e61d9a1fd36e5bd183450a556d5" dependencies = [ "base64 0.22.1", "chrono", "hex", "indexmap 1.9.3", - "indexmap 2.9.0", + "indexmap 2.10.0", + "schemars 0.9.0", + "schemars 1.0.4", "serde", "serde_derive", "serde_json", @@ -7518,14 +7604,14 @@ dependencies = [ [[package]] name = "serde_with_macros" -version = "3.12.0" +version = "3.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d00caa5193a3c8362ac2b73be6b9e768aa5a4b2f721d8f4b339600c3cb51f8e" +checksum = "de90945e6565ce0d9a25098082ed4ee4002e047cb59892c318d66821e14bb30f" dependencies = [ "darling 0.20.11", "proc-macro2", "quote 1.0.40", - "syn 2.0.101", + "syn 2.0.104", ] [[package]] @@ -7593,9 +7679,9 @@ checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" [[package]] name = "signal-hook-registry" -version = "1.4.5" +version = "1.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9203b8055f63a2a00e2f593bb0510367fe707d7ff1e5c872de2f537b339e5410" +checksum = "b2a4719bff48cee6b39d12c020eeb490953ad2443b7055bd0b21fca26bd8c28b" dependencies = [ "libc", ] @@ -7664,12 +7750,9 @@ checksum = "56199f7ddabf13fe5074ce809e7d3f42b42ae711800501b5b16ea82ad029c39d" [[package]] name = "slab" -version = "0.4.9" +version = "0.4.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" -dependencies = [ - "autocfg 1.4.0", -] +checksum = "04dc19736151f35336d325007ac991178d504a119863a2fcb3758cdb5e52c50d" [[package]] name = "slotmap" @@ -7717,6 +7800,16 @@ dependencies = [ "windows-sys 0.52.0", ] +[[package]] +name = "socket2" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "233504af464074f9d066d7b5416c5f9b894a5862a6506e306f7b816cdd6f1807" +dependencies = [ + "libc", + "windows-sys 0.59.0", +] + [[package]] name = "spin" version = "0.9.8" @@ -7834,7 +7927,7 @@ dependencies = [ "proc-macro2", "quote 1.0.40", "rustversion", - "syn 2.0.101", + "syn 2.0.104", ] [[package]] @@ -7877,9 +7970,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.101" +version = "2.0.104" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ce2b7fc941b3a24138a0a7cf8e858bfc6a992e7978a068a5c760deb0ed43caf" +checksum = "17b6f705963418cdb9927482fa304bc562ece2fdd4f616084c50b7023b435a40" dependencies = [ "proc-macro2", "quote 1.0.40", @@ -7930,7 +8023,7 @@ checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" dependencies = [ "proc-macro2", "quote 1.0.40", - "syn 2.0.101", + "syn 2.0.104", ] [[package]] @@ -8035,8 +8128,8 @@ dependencies = [ "fastrand 2.3.0", "getrandom 0.3.3", "once_cell", - "rustix 1.0.7", - "windows-sys 0.52.0", + "rustix 1.0.8", + "windows-sys 0.59.0", ] [[package]] @@ -8085,7 +8178,7 @@ checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ "proc-macro2", "quote 1.0.40", - "syn 2.0.101", + "syn 2.0.104", ] [[package]] @@ -8096,17 +8189,16 @@ checksum = "7f7cf42b4507d8ea322120659672cf1b9dbb93f8f2d4ecfd6e51350ff5b17a1d" dependencies = [ "proc-macro2", "quote 1.0.40", - "syn 2.0.101", + "syn 2.0.104", ] [[package]] name = "thread_local" -version = "1.1.8" +version = "1.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b9ef9bad013ada3808854ceac7b46812a6465ba368859a37e2100283d2d719c" +checksum = "f60246a4944f24f6e018aa17cdeffb7818b76356965d03b07d6a9886e8962185" dependencies = [ "cfg-if", - "once_cell", ] [[package]] @@ -8226,20 +8318,22 @@ dependencies = [ [[package]] name = "tokio" -version = "1.45.1" +version = "1.47.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75ef51a33ef1da925cea3e4eb122833cb377c61439ca401b770f54902b806779" +checksum = "89e49afdadebb872d3145a5638b59eb0691ea23e46ca484037cfab3b76b95038" dependencies = [ "backtrace", "bytes 1.10.1", + "io-uring", "libc", "mio", "parking_lot", "pin-project-lite 0.2.16", "signal-hook-registry", - "socket2 0.5.10", + "slab", + "socket2 0.6.0", "tokio-macros", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -8250,7 +8344,7 @@ checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" dependencies = [ "proc-macro2", "quote 1.0.40", - "syn 2.0.101", + "syn 2.0.104", ] [[package]] @@ -8260,7 +8354,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bbae76ab933c85776efabc971569dd6119c580d8f5d448769dec1764bf796ef2" dependencies = [ "native-tls", - "tokio 1.45.1", + "tokio 1.47.1", ] [[package]] @@ -8270,7 +8364,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c28327cf380ac148141087fbfb9de9d7bd4e84ab5d2c28fbc911d753de8a7081" dependencies = [ "rustls 0.21.12", - "tokio 1.45.1", + "tokio 1.47.1", ] [[package]] @@ -8281,7 +8375,7 @@ checksum = "775e0c0f0adb3a2f22a00c4745d728b479985fc15ee7ca6a2608388c5569860f" dependencies = [ "rustls 0.22.4", "rustls-pki-types", - "tokio 1.45.1", + "tokio 1.47.1", ] [[package]] @@ -8290,8 +8384,8 @@ version = "0.26.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8e727b36a1a0e8b74c376ac2211e40c2c8af09fb4013c60d910495810f008e9b" dependencies = [ - "rustls 0.23.27", - "tokio 1.45.1", + "rustls 0.23.31", + "tokio 1.47.1", ] [[package]] @@ -8302,21 +8396,21 @@ checksum = "eca58d7bba4a75707817a2c44174253f9236b2d5fbd055602e9d5c07c139a047" dependencies = [ "futures-core", "pin-project-lite 0.2.16", - "tokio 1.45.1", + "tokio 1.47.1", ] [[package]] name = "tokio-util" -version = "0.7.15" +version = "0.7.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "66a539a9ad6d5d281510d5bd368c973d636c02dbf8a67300bfb6b950696ad7df" +checksum = "14307c986784f72ef81c89db7d9e28d6ac26d16213b109ea501696195e6e3ce5" dependencies = [ "bytes 1.10.1", "futures-core", "futures-io", "futures-sink", "pin-project-lite 0.2.16", - "tokio 1.45.1", + "tokio 1.47.1", ] [[package]] @@ -8355,7 +8449,7 @@ version = "0.19.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" dependencies = [ - "indexmap 2.9.0", + "indexmap 2.10.0", "toml_datetime", "winnow 0.5.40", ] @@ -8366,12 +8460,12 @@ version = "0.22.27" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "41fe8c660ae4257887cf66394862d21dbca4a6ddd26f04a3560410406a2f819a" dependencies = [ - "indexmap 2.9.0", + "indexmap 2.10.0", "serde", "serde_spanned", "toml_datetime", "toml_write", - "winnow 0.7.10", + "winnow 0.7.12", ] [[package]] @@ -8402,7 +8496,7 @@ dependencies = [ "futures-util", "pin-project-lite 0.2.16", "sync_wrapper 1.0.2", - "tokio 1.45.1", + "tokio 1.47.1", "tower-layer", "tower-service", "tracing", @@ -8468,13 +8562,13 @@ dependencies = [ [[package]] name = "tracing-attributes" -version = "0.1.29" +version = "0.1.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b1ffbcf9c6f6b99d386e7444eb608ba646ae452a36b39737deb9663b610f662" +checksum = "81383ab64e72a7a8b8e13130c49e3dab29def6d0c7d76a03087b3cf71c5c6903" dependencies = [ "proc-macro2", "quote 1.0.40", - "syn 2.0.101", + "syn 2.0.104", ] [[package]] @@ -8620,7 +8714,7 @@ version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "470dbf6591da1b39d43c14523b2b469c86879a53e8b758c8e090a470fe7b1fbe" dependencies = [ - "rand 0.9.1", + "rand 0.9.2", "web-time", ] @@ -8718,9 +8812,9 @@ checksum = "b1d386ff53b415b7fe27b50bb44679e2cc4660272694b7b6f3326d8480823a94" [[package]] name = "unicode-width" -version = "0.1.14" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7dd6e30e90baa6f72411720665d41d89b9a3d039dc45b8faea1ddd07f617f6af" +checksum = "4a1a07cc7db3810833284e8d372ccdc6da29741639ecc70c9ec107df0fa6154c" [[package]] name = "unicode-xid" @@ -8835,7 +8929,7 @@ version = "4.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c5afb1a60e207dca502682537fefcfd9921e71d0b83e9576060f09abc6efab23" dependencies = [ - "indexmap 2.9.0", + "indexmap 2.10.0", "serde", "serde_json", "utoipa-gen", @@ -8851,7 +8945,7 @@ dependencies = [ "proc-macro2", "quote 1.0.40", "regex", - "syn 2.0.101", + "syn 2.0.104", "ulid 1.2.1", ] @@ -8881,9 +8975,9 @@ dependencies = [ [[package]] name = "v_frame" -version = "0.3.8" +version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6f32aaa24bacd11e488aa9ba66369c7cd514885742c9fe08cfe85884db3e92b" +checksum = "666b7727c8875d6ab5db9533418d7c764233ac9c0cff1d469aec8fa127597be2" dependencies = [ "aligned-vec", "num-traits", @@ -9018,9 +9112,9 @@ dependencies = [ [[package]] name = "wasi" -version = "0.11.0+wasi-snapshot-preview1" +version = "0.11.1+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" +checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" [[package]] name = "wasi" @@ -9037,7 +9131,7 @@ version = "0.12.21" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c1fbb4ef9bbca0c1170e0b00dd28abc9e3b68669821600cad1caaed606583c6d" dependencies = [ - "wasi 0.11.0+wasi-snapshot-preview1", + "wasi 0.11.1+wasi-snapshot-preview1", ] [[package]] @@ -9062,7 +9156,7 @@ dependencies = [ "log", "proc-macro2", "quote 1.0.40", - "syn 2.0.101", + "syn 2.0.104", "wasm-bindgen-shared", ] @@ -9097,7 +9191,7 @@ checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" dependencies = [ "proc-macro2", "quote 1.0.40", - "syn 2.0.101", + "syn 2.0.104", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -9121,7 +9215,7 @@ dependencies = [ "base64 0.13.1", "chrono", "ece", - "futures-lite 2.6.0", + "futures-lite 2.6.1", "http 0.2.12", "isahc", "jwt-simple", @@ -9175,14 +9269,14 @@ version = "0.26.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "521bc38abb08001b01866da9f51eb7c5d647a19260e00054a8c7fd5f9e57f7a9" dependencies = [ - "webpki-roots 1.0.0", + "webpki-roots 1.0.2", ] [[package]] name = "webpki-roots" -version = "1.0.0" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2853738d1cc4f2da3a225c18ec6c3721abb31961096e9dbf5ab35fa88b19cfdb" +checksum = "7e8983c3ab33d6fb807cfcdad2491c4ea8cbc8ed839181c7dfd9c67c83e261b2" dependencies = [ "rustls-pki-types", ] @@ -9233,7 +9327,7 @@ version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" dependencies = [ - "windows-sys 0.48.0", + "windows-sys 0.59.0", ] [[package]] @@ -9253,9 +9347,9 @@ dependencies = [ [[package]] name = "windows" -version = "0.61.1" +version = "0.61.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5ee8f3d025738cb02bad7868bbb5f8a6327501e870bf51f1b455b0a2454a419" +checksum = "9babd3a767a4c1aef6900409f85f5d53ce2544ccdfaa86dad48c91782c6d6893" dependencies = [ "windows-collections", "windows-core", @@ -9305,7 +9399,7 @@ checksum = "a47fddd13af08290e67f4acabf4b459f647552718f683a7b415d290ac744a836" dependencies = [ "proc-macro2", "quote 1.0.40", - "syn 2.0.101", + "syn 2.0.104", ] [[package]] @@ -9316,14 +9410,14 @@ checksum = "bd9211b69f8dcdfa817bfd14bf1c97c9188afa36f4750130fcdf3f400eca9fa8" dependencies = [ "proc-macro2", "quote 1.0.40", - "syn 2.0.101", + "syn 2.0.104", ] [[package]] name = "windows-link" -version = "0.1.1" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76840935b766e1b0a05c0066835fb9ec80071d4c09a16f6bd5f7e655e3c14c38" +checksum = "5e6ad25900d524eaabdbbb96d20b4311e1e7ae1699af4fb28c17ae66c80d798a" [[package]] name = "windows-numerics" @@ -9337,9 +9431,9 @@ dependencies = [ [[package]] name = "windows-registry" -version = "0.5.2" +version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3bab093bdd303a1240bb99b8aba8ea8a69ee19d34c9e2ef9594e708a4878820" +checksum = "5b8a9ed28765efc97bbc954883f4e6796c33a06546ebafacbabee9696967499e" dependencies = [ "windows-link", "windows-result", @@ -9391,6 +9485,15 @@ 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.3", +] + [[package]] name = "windows-targets" version = "0.48.5" @@ -9424,10 +9527,11 @@ dependencies = [ [[package]] name = "windows-targets" -version = "0.53.0" +version = "0.53.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1e4c7e8ceaaf9cb7d7507c974735728ab453b67ef8f18febdd7c11fe59dca8b" +checksum = "d5fe6031c4041849d7c496a8ded650796e7b6ecc19df1a431c1a363342e5dc91" dependencies = [ + "windows-link", "windows_aarch64_gnullvm 0.53.0", "windows_aarch64_msvc 0.53.0", "windows_i686_gnu 0.53.0", @@ -9596,9 +9700,9 @@ dependencies = [ [[package]] name = "winnow" -version = "0.7.10" +version = "0.7.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c06928c8748d81b05c9be96aad92e1b6ff01833332f281e8cfca3be4b35fc9ec" +checksum = "f3edebf492c8125044983378ecb5766203ad3b4c2f7a922bd7dd207f6d443e95" dependencies = [ "memchr", ] @@ -9687,7 +9791,7 @@ checksum = "38da3c9736e16c5d3c8c597a9aaa5d1fa565d0532ae05e27c24aa62fb32c0ab6" dependencies = [ "proc-macro2", "quote 1.0.40", - "syn 2.0.101", + "syn 2.0.104", "synstructure 0.13.2", ] @@ -9713,29 +9817,29 @@ dependencies = [ "serde", "serde_json", "time", - "tokio 1.45.1", + "tokio 1.47.1", "tower-service", "url", ] [[package]] name = "zerocopy" -version = "0.8.25" +version = "0.8.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1702d9583232ddb9174e01bb7c15a2ab8fb1bc6f227aa1233858c351a3ba0cb" +checksum = "1039dd0d3c310cf05de012d8a39ff557cb0d23087fd44cad61df08fc31907a2f" dependencies = [ "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.8.25" +version = "0.8.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28a6e20d751156648aa063f3800b706ee209a32c0b4d9f24be3d980b01be55ef" +checksum = "9ecf5b4cc5364572d7f4c329661bcc82724222973f2cab6f050a4e5c22f75181" dependencies = [ "proc-macro2", "quote 1.0.40", - "syn 2.0.101", + "syn 2.0.104", ] [[package]] @@ -9755,7 +9859,7 @@ checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" dependencies = [ "proc-macro2", "quote 1.0.40", - "syn 2.0.101", + "syn 2.0.104", "synstructure 0.13.2", ] @@ -9778,9 +9882,9 @@ dependencies = [ [[package]] name = "zerovec" -version = "0.11.2" +version = "0.11.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a05eb080e015ba39cc9e23bbe5e7fb04d5fb040350f99f34e338d5fdd294428" +checksum = "e7aa2bd55086f1ab526693ecbe444205da57e25f4489879da80635a46d90e73b" dependencies = [ "yoke", "zerofrom", @@ -9795,7 +9899,7 @@ checksum = "5b96237efa0c878c64bd89c436f661be4e46b2f3eff1ebb976f7ef2321d2f58f" dependencies = [ "proc-macro2", "quote 1.0.40", - "syn 2.0.101", + "syn 2.0.104", ] [[package]] @@ -9815,9 +9919,9 @@ dependencies = [ [[package]] name = "zune-jpeg" -version = "0.4.16" +version = "0.4.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e4a518c0ea2576f4da876349d7f67a7be489297cd77c2cf9e04c2e05fcd3974" +checksum = "fc1f7e205ce79eb2da3cd71c5f55f3589785cb7c79f6a03d1c8d1491bda5d089" dependencies = [ "zune-core", ] diff --git a/crates/core/database/src/models/server_members/model.rs b/crates/core/database/src/models/server_members/model.rs index c74014ba..ee5e354b 100644 --- a/crates/core/database/src/models/server_members/model.rs +++ b/crates/core/database/src/models/server_members/model.rs @@ -30,6 +30,9 @@ auto_derived_partial!( /// Timestamp this member is timed out until #[serde(skip_serializing_if = "Option::is_none")] pub timeout: Option, + // This value only exists in the database, not the models. + // If it is not-None, the database layer should return None to member fetching queries. + // pub pending_deletion_at: Option }, "PartialMember" ); @@ -50,6 +53,7 @@ auto_derived!( Avatar, Roles, Timeout, + JoinedAt, } /// Member removal intention @@ -90,7 +94,7 @@ impl Member { return Err(create_error!(AlreadyInServer)); } - let member = Member { + let mut member = Member { id: MemberCompositeKey { server: server.id.to_string(), user: user.id.to_string(), @@ -98,7 +102,9 @@ impl Member { ..Default::default() }; - db.insert_member(&member).await?; + if let Some(updated) = db.insert_or_merge_member(&member).await? { + member = updated; + } let should_fetch = channels.is_none(); let mut channels = channels.unwrap_or_default(); @@ -187,6 +193,7 @@ impl Member { pub fn remove_field(&mut self, field: &FieldsMember) { match field { + FieldsMember::JoinedAt => (), FieldsMember::Avatar => self.avatar = None, FieldsMember::Nickname => self.nickname = None, FieldsMember::Roles => self.roles.clear(), @@ -225,7 +232,7 @@ impl Member { intention: RemovalIntention, silent: bool, ) -> Result<()> { - db.delete_member(&self.id).await?; + db.soft_delete_member(&self.id).await?; EventV1::ServerMemberLeave { id: self.id.server.to_string(), @@ -261,3 +268,74 @@ impl Member { Ok(()) } } + +#[cfg(test)] +mod tests { + use iso8601_timestamp::{Duration, Timestamp}; + use revolt_models::v0::DataCreateServer; + + use crate::{Member, PartialMember, RemovalIntention, Server, User}; + + #[async_std::test] + async fn muted_member_rejoin() { + database_test!(|db| async move { + match db { + crate::Database::Reference(_) => return, + crate::Database::MongoDb(_) => (), + } + let owner = User::create(&db, "Server Owner".to_string(), None, None) + .await + .unwrap(); + + let kickable_user = User::create(&db, "Member".to_string(), None, None) + .await + .unwrap(); + + let server = Server::create( + &db, + DataCreateServer { + name: "Server".to_string(), + description: None, + nsfw: None, + }, + &owner, + false, + ) + .await + .unwrap() + .0; + + Member::create(&db, &server, &owner, None).await.unwrap(); + let mut kickable_member = Member::create(&db, &server, &kickable_user, None) + .await + .unwrap() + .0; + + kickable_member + .update( + &db, + PartialMember { + timeout: Some(Timestamp::now_utc() + Duration::minutes(5)), + ..Default::default() + }, + vec![], + ) + .await + .unwrap(); + + assert!(kickable_member.in_timeout()); + + kickable_member + .remove(&db, &server, RemovalIntention::Kick, false) + .await + .unwrap(); + + let kickable_member = Member::create(&db, &server, &kickable_user, None) + .await + .unwrap() + .0; + + assert!(kickable_member.in_timeout()) + }); + } +} diff --git a/crates/core/database/src/models/server_members/ops.rs b/crates/core/database/src/models/server_members/ops.rs index 83eb332a..1c59bf0f 100644 --- a/crates/core/database/src/models/server_members/ops.rs +++ b/crates/core/database/src/models/server_members/ops.rs @@ -73,7 +73,7 @@ impl ChunkedServerMembersGenerator { #[async_trait] pub trait AbstractServerMembers: Sync + Send { /// Insert a new server member into the database - async fn insert_member(&self, member: &Member) -> Result<()>; + async fn insert_or_merge_member(&self, member: &Member) -> Result>; /// Fetch a server member by their id async fn fetch_member(&self, server_id: &str, user_id: &str) -> Result; @@ -119,6 +119,14 @@ pub trait AbstractServerMembers: Sync + Send { remove: Vec, ) -> Result<()>; - /// Delete a server member by their id - async fn delete_member(&self, id: &MemberCompositeKey) -> Result<()>; + /// Marks a user as no longer a member of a server, while retaining the database value. + /// This is used to keep information such as timeouts in place, but will remove information such as join date and applied roles. + async fn soft_delete_member(&self, id: &MemberCompositeKey) -> Result<()>; + + /// Forcibly delete a server member by their id. + /// This will cancel any pending timeouts or other longer term actions, and they will not be reapplied on rejoin. + async fn force_delete_member(&self, id: &MemberCompositeKey) -> Result<()>; + + /// Fetch all members who have been marked for deletion. + async fn remove_dangling_members(&self) -> Result<()>; } diff --git a/crates/core/database/src/models/server_members/ops/mongodb.rs b/crates/core/database/src/models/server_members/ops/mongodb.rs index f8cd325d..cd9c5095 100644 --- a/crates/core/database/src/models/server_members/ops/mongodb.rs +++ b/crates/core/database/src/models/server_members/ops/mongodb.rs @@ -1,4 +1,6 @@ +use bson::Document; use futures::StreamExt; +use iso8601_timestamp::Timestamp; use mongodb::options::ReadConcern; use revolt_result::Result; @@ -11,9 +13,42 @@ static COL: &str = "server_members"; #[async_trait] impl AbstractServerMembers for MongoDb { - /// Insert a new server member into the database - async fn insert_member(&self, member: &Member) -> Result<()> { - query!(self, insert_one, COL, &member).map(|_| ()) + /// Insert a new server member (or use the existing member if one is found) + async fn insert_or_merge_member(&self, member: &Member) -> Result> { + let existing: Result> = query!( + self, + find_one, + COL, + doc! { + "_id.server": &member.id.server, + "_id.user": &member.id.user, + "pending_deletion_at": {"$exists": true} + } + ); + // Update the existing record if it exist, otherwise make a new record + if existing.is_ok_and(|x| x.is_some()) { + self.col::(COL) + .find_one_and_update( + doc! { + "_id.server": &member.id.server, + "_id.user": &member.id.user, + }, + doc! { + "$set": { + "joined_at": member.joined_at.duration_since(Timestamp::UNIX_EPOCH).whole_seconds(), + }, + "$unset": { + "pending_deletion_at": "" + } + }, + ) + .return_document(mongodb::options::ReturnDocument::After) + .await + .map_err(|_| create_database_error!("update_one", COL)) + } else { + query!(self, insert_one, COL, &member).map(|_| ())?; + Ok(None) + } } /// Fetch a server member by their id @@ -24,7 +59,8 @@ impl AbstractServerMembers for MongoDb { COL, doc! { "_id.server": server_id, - "_id.user": user_id + "_id.user": user_id, + "pending_deletion_at": {"$exists": false} } )? .ok_or_else(|| create_error!(NotFound)) @@ -35,7 +71,8 @@ impl AbstractServerMembers for MongoDb { Ok(self .col::(COL) .find(doc! { - "_id.server": server_id + "_id.server": server_id, + "pending_deletion_at": {"$exists": false} }) .await .map_err(|_| create_database_error!("find", COL))? @@ -143,7 +180,8 @@ impl AbstractServerMembers for MongoDb { Ok(self .col::(COL) .find(doc! { - "_id.user": user_id + "_id.user": user_id, + "pending_deletion_at": {"$exists": false} }) .await .map_err(|_| create_database_error!("find", COL))? @@ -164,6 +202,7 @@ impl AbstractServerMembers for MongoDb { .col::(COL) .find(doc! { "_id.server": server_id, + "pending_deletion_at": {"$exists": false}, "_id.user": { "$in": ids } @@ -185,7 +224,8 @@ impl AbstractServerMembers for MongoDb { async fn fetch_member_count(&self, server_id: &str) -> Result { self.col::(COL) .count_documents(doc! { - "_id.server": server_id + "_id.server": server_id, + "pending_deletion_at": {"$exists": false} }) .await .map(|c| c as usize) @@ -196,7 +236,8 @@ impl AbstractServerMembers for MongoDb { async fn fetch_server_count(&self, user_id: &str) -> Result { self.col::(COL) .count_documents(doc! { - "_id.user": user_id + "_id.user": user_id, + "pending_deletion_at": {"$exists": false} }) .await .map(|c| c as usize) @@ -225,8 +266,42 @@ impl AbstractServerMembers for MongoDb { .map(|_| ()) } + /// Marks a member for deletion. + /// This will remove the record if the user has no pending actions (eg. timeout), + /// otherwise will slate the record for deletion by revolt_crond once the actions expire. + async fn soft_delete_member(&self, id: &MemberCompositeKey) -> Result<()> { + let member = self.fetch_member(&id.server, &id.user).await; + if let Ok(member) = member { + if member.in_timeout() { + self.col::(COL) + .update_many( + doc! { + "_id.server": &id.server, + "_id.user": &id.user, + }, + doc! { + "$set": {"pending_deletion_at": format!("{}", member.timeout.unwrap().format())}, + "$unset": { + "joined_at": "", + "avatar": "", + "nickname": "", + "roles": "" + } + }, + ) + .await + .map(|_| ()) + .map_err(|_| create_database_error!("update_many", COL)) + } else { + self.force_delete_member(id).await + } + } else { + Err(create_database_error!("fetch_member", COL)) + } + } + /// Delete a server member by their id - async fn delete_member(&self, id: &MemberCompositeKey) -> Result<()> { + async fn force_delete_member(&self, id: &MemberCompositeKey) -> Result<()> { query!( self, delete_one, @@ -238,11 +313,25 @@ impl AbstractServerMembers for MongoDb { ) .map(|_| ()) } + + async fn remove_dangling_members(&self) -> Result<()> { + let now = Timestamp::now_utc(); + let date = bson::to_bson(&now).expect("Failed to serialize timestamp"); + + self.col::(COL) + .delete_many(doc! { + "pending_deletion_at": {"$lt": date} + }) + .await + .map(|_| ()) + .map_err(|_| create_database_error!("count_documents", COL)) + } } impl IntoDocumentPath for FieldsMember { fn as_path(&self) -> Option<&'static str> { Some(match self { + FieldsMember::JoinedAt => "joined_at", FieldsMember::Avatar => "avatar", FieldsMember::Nickname => "nickname", FieldsMember::Roles => "roles", diff --git a/crates/core/database/src/models/server_members/ops/reference.rs b/crates/core/database/src/models/server_members/ops/reference.rs index b69f548e..3238edbb 100644 --- a/crates/core/database/src/models/server_members/ops/reference.rs +++ b/crates/core/database/src/models/server_members/ops/reference.rs @@ -8,13 +8,13 @@ use super::{AbstractServerMembers, ChunkedServerMembersGenerator}; #[async_trait] impl AbstractServerMembers for ReferenceDb { /// Insert a new server member into the database - async fn insert_member(&self, member: &Member) -> Result<()> { + async fn insert_or_merge_member(&self, member: &Member) -> Result> { let mut server_members = self.server_members.lock().await; if server_members.contains_key(&member.id) { Err(create_database_error!("insert", "member")) } else { server_members.insert(member.id.clone(), member.clone()); - Ok(()) + Ok(None) } } @@ -169,8 +169,26 @@ impl AbstractServerMembers for ReferenceDb { } } + /// Soft delete a member + async fn soft_delete_member(&self, id: &MemberCompositeKey) -> Result<()> { + let mut server_members = self.server_members.lock().await; + + let member = server_members.get_mut(id); + if let Some(member) = member { + if member.in_timeout() { + panic!("Soft deletion is not implemented.") + } else if server_members.remove(id).is_some() { + Ok(()) + } else { + Err(create_error!(NotFound)) + } + } else { + Err(create_error!(NotFound)) + } + } + /// Delete a server member by their id - async fn delete_member(&self, id: &MemberCompositeKey) -> Result<()> { + async fn force_delete_member(&self, id: &MemberCompositeKey) -> Result<()> { let mut server_members = self.server_members.lock().await; if server_members.remove(id).is_some() { Ok(()) @@ -178,4 +196,8 @@ impl AbstractServerMembers for ReferenceDb { Err(create_error!(NotFound)) } } + + async fn remove_dangling_members(&self) -> Result<()> { + todo!() + } } diff --git a/crates/core/database/src/util/bridge/v0.rs b/crates/core/database/src/util/bridge/v0.rs index d667094f..de64a4bf 100644 --- a/crates/core/database/src/util/bridge/v0.rs +++ b/crates/core/database/src/util/bridge/v0.rs @@ -707,6 +707,7 @@ impl From for FieldsMember { crate::FieldsMember::Nickname => FieldsMember::Nickname, crate::FieldsMember::Roles => FieldsMember::Roles, crate::FieldsMember::Timeout => FieldsMember::Timeout, + crate::FieldsMember::JoinedAt => FieldsMember::JoinedAt, } } } @@ -718,6 +719,7 @@ impl From for crate::FieldsMember { FieldsMember::Nickname => crate::FieldsMember::Nickname, FieldsMember::Roles => crate::FieldsMember::Roles, FieldsMember::Timeout => crate::FieldsMember::Timeout, + FieldsMember::JoinedAt => crate::FieldsMember::JoinedAt, } } } diff --git a/crates/core/database/src/util/test_fixtures.rs b/crates/core/database/src/util/test_fixtures.rs index f08fe91b..e4374e82 100644 --- a/crates/core/database/src/util/test_fixtures.rs +++ b/crates/core/database/src/util/test_fixtures.rs @@ -39,7 +39,9 @@ pub async fn load_fixture(db: &Database, input: &str) -> HashMap LoadedFixture::User(user) => db.insert_user(&user).await.unwrap(), LoadedFixture::Channel(channel) => db.insert_channel(&channel).await.unwrap(), LoadedFixture::Server(server) => db.insert_server(&server).await.unwrap(), - LoadedFixture::ServerMember(member) => db.insert_member(&member).await.unwrap(), + LoadedFixture::ServerMember(member) => { + db.insert_or_merge_member(&member).await.unwrap(); + } } } diff --git a/crates/core/models/src/v0/server_members.rs b/crates/core/models/src/v0/server_members.rs index a47ceda4..048f696b 100644 --- a/crates/core/models/src/v0/server_members.rs +++ b/crates/core/models/src/v0/server_members.rs @@ -77,6 +77,7 @@ auto_derived!( Avatar, Roles, Timeout, + JoinedAt, } /// Member removal intention diff --git a/crates/daemons/crond/src/main.rs b/crates/daemons/crond/src/main.rs index 40af6a2b..b232a10a 100644 --- a/crates/daemons/crond/src/main.rs +++ b/crates/daemons/crond/src/main.rs @@ -1,7 +1,7 @@ use revolt_config::configure; use revolt_database::DatabaseInfo; use revolt_result::Result; -use tasks::{file_deletion, prune_dangling_files}; +use tasks::{file_deletion, prune_dangling_files, prune_members}; use tokio::try_join; pub mod tasks; @@ -13,7 +13,8 @@ async fn main() -> Result<()> { let db = DatabaseInfo::Auto.connect().await.expect("database"); try_join!( file_deletion::task(db.clone()), - prune_dangling_files::task(db) + prune_dangling_files::task(db.clone()), + prune_members::task(db.clone()) ) .map(|_| ()) } diff --git a/crates/daemons/crond/src/tasks/mod.rs b/crates/daemons/crond/src/tasks/mod.rs index 2a668f14..060f55d8 100644 --- a/crates/daemons/crond/src/tasks/mod.rs +++ b/crates/daemons/crond/src/tasks/mod.rs @@ -1,2 +1,3 @@ pub mod file_deletion; pub mod prune_dangling_files; +pub mod prune_members; diff --git a/crates/daemons/crond/src/tasks/prune_members.rs b/crates/daemons/crond/src/tasks/prune_members.rs new file mode 100644 index 00000000..e21b7d73 --- /dev/null +++ b/crates/daemons/crond/src/tasks/prune_members.rs @@ -0,0 +1,18 @@ +use std::time::Duration; + +use log::warn; +use revolt_database::Database; +use revolt_result::Result; +use tokio::time::sleep; + +pub async fn task(db: Database) -> Result<()> { + loop { + let success = db.remove_dangling_members().await; + if let Err(s) = success { + revolt_config::capture_error(&s); + warn!("Failed to prune dangling members: {:?}", &s); + } + + sleep(Duration::from_secs(90)).await; + } +} diff --git a/crates/delta/src/util/ratelimiter.rs b/crates/delta/src/util/ratelimiter.rs index 5527ee42..7d00e96d 100644 --- a/crates/delta/src/util/ratelimiter.rs +++ b/crates/delta/src/util/ratelimiter.rs @@ -109,6 +109,9 @@ fn resolve_bucket<'r>(request: &'r rocket::Request<'_>) -> (&'r str, Option<&'r }; if let Some(segment) = segment { + #[allow(clippy::redundant_locals)] + let resource = resource; + let method = request.method(); match (segment, resource, method) { ("users", target, Method::Patch) => ("user_edit", target),