Browse Source

Upgrade matrix-sdk and ruma crates

main
Kévin Commaille 12 hours ago
parent
commit
2cfc3c45c3
No known key found for this signature in database
GPG Key ID: F26F4BE20A08255B
  1. 70
      Cargo.lock
  2. 21
      Cargo.toml
  3. 18
      src/login/in_browser_page.rs
  4. 13
      src/session/room/mod.rs
  5. 6
      src/session/room/timeline/event/mod.rs
  6. 22
      src/session_view/room_history/state/content.rs
  7. 10
      src/session_view/room_history/state/creation.rs
  8. 6
      src/user_facing_error.rs

70
Cargo.lock generated

@ -1431,9 +1431,11 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd"
dependencies = [
"cfg-if",
"js-sys",
"libc",
"r-efi",
"wasip2",
"wasm-bindgen",
]
[[package]]
@ -2847,7 +2849,7 @@ dependencies = [
[[package]]
name = "matrix-sdk"
version = "0.16.0"
source = "git+https://github.com/matrix-org/matrix-rust-sdk.git?rev=029148ef6e45d51e6325a4f5aadcdee7ec9385cc#029148ef6e45d51e6325a4f5aadcdee7ec9385cc"
source = "git+https://github.com/matrix-org/matrix-rust-sdk.git?rev=74c1044b7dd384cf6436598713c12c915b331d73#74c1044b7dd384cf6436598713c12c915b331d73"
dependencies = [
"anymap2",
"aquamarine",
@ -2880,6 +2882,7 @@ dependencies = [
"mime",
"mime2ext",
"oauth2",
"oauth2-reqwest",
"percent-encoding",
"pin-project-lite",
"rand 0.8.5",
@ -2905,7 +2908,7 @@ dependencies = [
[[package]]
name = "matrix-sdk-base"
version = "0.16.0"
source = "git+https://github.com/matrix-org/matrix-rust-sdk.git?rev=029148ef6e45d51e6325a4f5aadcdee7ec9385cc#029148ef6e45d51e6325a4f5aadcdee7ec9385cc"
source = "git+https://github.com/matrix-org/matrix-rust-sdk.git?rev=74c1044b7dd384cf6436598713c12c915b331d73#74c1044b7dd384cf6436598713c12c915b331d73"
dependencies = [
"as_variant",
"async-trait",
@ -2931,7 +2934,7 @@ dependencies = [
[[package]]
name = "matrix-sdk-common"
version = "0.16.0"
source = "git+https://github.com/matrix-org/matrix-rust-sdk.git?rev=029148ef6e45d51e6325a4f5aadcdee7ec9385cc#029148ef6e45d51e6325a4f5aadcdee7ec9385cc"
source = "git+https://github.com/matrix-org/matrix-rust-sdk.git?rev=74c1044b7dd384cf6436598713c12c915b331d73#74c1044b7dd384cf6436598713c12c915b331d73"
dependencies = [
"eyeball-im",
"futures-core",
@ -2954,7 +2957,7 @@ dependencies = [
[[package]]
name = "matrix-sdk-crypto"
version = "0.16.0"
source = "git+https://github.com/matrix-org/matrix-rust-sdk.git?rev=029148ef6e45d51e6325a4f5aadcdee7ec9385cc#029148ef6e45d51e6325a4f5aadcdee7ec9385cc"
source = "git+https://github.com/matrix-org/matrix-rust-sdk.git?rev=74c1044b7dd384cf6436598713c12c915b331d73#74c1044b7dd384cf6436598713c12c915b331d73"
dependencies = [
"aes",
"aquamarine",
@ -2995,12 +2998,12 @@ dependencies = [
[[package]]
name = "matrix-sdk-indexeddb"
version = "0.16.0"
source = "git+https://github.com/matrix-org/matrix-rust-sdk.git?rev=029148ef6e45d51e6325a4f5aadcdee7ec9385cc#029148ef6e45d51e6325a4f5aadcdee7ec9385cc"
source = "git+https://github.com/matrix-org/matrix-rust-sdk.git?rev=74c1044b7dd384cf6436598713c12c915b331d73#74c1044b7dd384cf6436598713c12c915b331d73"
dependencies = [
"async-trait",
"base64",
"futures-util",
"getrandom 0.2.17",
"getrandom 0.3.4",
"gloo-utils",
"hkdf",
"js-sys",
@ -3026,7 +3029,7 @@ dependencies = [
[[package]]
name = "matrix-sdk-qrcode"
version = "0.16.0"
source = "git+https://github.com/matrix-org/matrix-rust-sdk.git?rev=029148ef6e45d51e6325a4f5aadcdee7ec9385cc#029148ef6e45d51e6325a4f5aadcdee7ec9385cc"
source = "git+https://github.com/matrix-org/matrix-rust-sdk.git?rev=74c1044b7dd384cf6436598713c12c915b331d73#74c1044b7dd384cf6436598713c12c915b331d73"
dependencies = [
"byteorder",
"qrcode",
@ -3038,7 +3041,7 @@ dependencies = [
[[package]]
name = "matrix-sdk-sqlite"
version = "0.16.0"
source = "git+https://github.com/matrix-org/matrix-rust-sdk.git?rev=029148ef6e45d51e6325a4f5aadcdee7ec9385cc#029148ef6e45d51e6325a4f5aadcdee7ec9385cc"
source = "git+https://github.com/matrix-org/matrix-rust-sdk.git?rev=74c1044b7dd384cf6436598713c12c915b331d73#74c1044b7dd384cf6436598713c12c915b331d73"
dependencies = [
"as_variant",
"async-trait",
@ -3065,12 +3068,12 @@ dependencies = [
[[package]]
name = "matrix-sdk-store-encryption"
version = "0.16.0"
source = "git+https://github.com/matrix-org/matrix-rust-sdk.git?rev=029148ef6e45d51e6325a4f5aadcdee7ec9385cc#029148ef6e45d51e6325a4f5aadcdee7ec9385cc"
source = "git+https://github.com/matrix-org/matrix-rust-sdk.git?rev=74c1044b7dd384cf6436598713c12c915b331d73#74c1044b7dd384cf6436598713c12c915b331d73"
dependencies = [
"base64",
"blake3",
"chacha20poly1305",
"getrandom 0.2.17",
"getrandom 0.3.4",
"hmac",
"pbkdf2",
"rand 0.8.5",
@ -3085,7 +3088,7 @@ dependencies = [
[[package]]
name = "matrix-sdk-ui"
version = "0.16.0"
source = "git+https://github.com/matrix-org/matrix-rust-sdk.git?rev=029148ef6e45d51e6325a4f5aadcdee7ec9385cc#029148ef6e45d51e6325a4f5aadcdee7ec9385cc"
source = "git+https://github.com/matrix-org/matrix-rust-sdk.git?rev=74c1044b7dd384cf6436598713c12c915b331d73#74c1044b7dd384cf6436598713c12c915b331d73"
dependencies = [
"as_variant",
"async-rx",
@ -3378,7 +3381,6 @@ dependencies = [
"getrandom 0.2.17",
"http",
"rand 0.8.5",
"reqwest",
"serde",
"serde_json",
"serde_path_to_error",
@ -3387,6 +3389,16 @@ dependencies = [
"url",
]
[[package]]
name = "oauth2-reqwest"
version = "0.1.0-alpha.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "234fb5c965bbce983ee5de636a7a51d6a3223da8067ea02f9ab2d2d78ac08be2"
dependencies = [
"oauth2",
"reqwest",
]
[[package]]
name = "objc"
version = "0.2.7"
@ -3960,9 +3972,9 @@ checksum = "dc897dd8d9e8bd1ed8cdad82b5966c3e0ecae09fb1907d58efaa013543185d0a"
[[package]]
name = "reqwest"
version = "0.12.28"
version = "0.13.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "eddd3ca559203180a307f12d114c268abf583f59b03cb906fd0b3ff8646c1147"
checksum = "ab3f43e3283ab1488b624b44b0e988d0acea0b3214e694730a055cb6b2efa801"
dependencies = [
"base64",
"bytes",
@ -3982,9 +3994,6 @@ dependencies = [
"percent-encoding",
"pin-project-lite",
"rustls-pki-types",
"serde",
"serde_json",
"serde_urlencoded",
"sync_wrapper",
"tokio",
"tokio-native-tls",
@ -4045,7 +4054,7 @@ dependencies = [
[[package]]
name = "ruma"
version = "0.14.1"
source = "git+https://github.com/ruma/ruma.git?rev=4a0ae80fbf42d1b759e108d7315537d13583c144#4a0ae80fbf42d1b759e108d7315537d13583c144"
source = "git+https://github.com/ruma/ruma.git?rev=2455c71ec8bd16318397865d9c6e231e792cb15e#2455c71ec8bd16318397865d9c6e231e792cb15e"
dependencies = [
"assign",
"js_int",
@ -4061,7 +4070,7 @@ dependencies = [
[[package]]
name = "ruma-client-api"
version = "0.22.1"
source = "git+https://github.com/ruma/ruma.git?rev=4a0ae80fbf42d1b759e108d7315537d13583c144#4a0ae80fbf42d1b759e108d7315537d13583c144"
source = "git+https://github.com/ruma/ruma.git?rev=2455c71ec8bd16318397865d9c6e231e792cb15e#2455c71ec8bd16318397865d9c6e231e792cb15e"
dependencies = [
"as_variant",
"assign",
@ -4084,7 +4093,7 @@ dependencies = [
[[package]]
name = "ruma-common"
version = "0.17.1"
source = "git+https://github.com/ruma/ruma.git?rev=4a0ae80fbf42d1b759e108d7315537d13583c144#4a0ae80fbf42d1b759e108d7315537d13583c144"
source = "git+https://github.com/ruma/ruma.git?rev=2455c71ec8bd16318397865d9c6e231e792cb15e#2455c71ec8bd16318397865d9c6e231e792cb15e"
dependencies = [
"as_variant",
"base64",
@ -4093,7 +4102,6 @@ dependencies = [
"getrandom 0.2.17",
"http",
"indexmap",
"js-sys",
"js_int",
"konst",
"percent-encoding",
@ -4117,24 +4125,20 @@ dependencies = [
[[package]]
name = "ruma-events"
version = "0.32.1"
source = "git+https://github.com/ruma/ruma.git?rev=4a0ae80fbf42d1b759e108d7315537d13583c144#4a0ae80fbf42d1b759e108d7315537d13583c144"
source = "git+https://github.com/ruma/ruma.git?rev=2455c71ec8bd16318397865d9c6e231e792cb15e#2455c71ec8bd16318397865d9c6e231e792cb15e"
dependencies = [
"as_variant",
"indexmap",
"js_int",
"js_option",
"percent-encoding",
"pulldown-cmark",
"regex",
"ruma-common",
"ruma-html",
"ruma-identifiers-validation",
"ruma-macros",
"serde",
"serde_json",
"thiserror 2.0.18",
"tracing",
"url",
"web-time",
"wildmatch",
"zeroize",
@ -4143,7 +4147,7 @@ dependencies = [
[[package]]
name = "ruma-federation-api"
version = "0.13.1"
source = "git+https://github.com/ruma/ruma.git?rev=4a0ae80fbf42d1b759e108d7315537d13583c144#4a0ae80fbf42d1b759e108d7315537d13583c144"
source = "git+https://github.com/ruma/ruma.git?rev=2455c71ec8bd16318397865d9c6e231e792cb15e#2455c71ec8bd16318397865d9c6e231e792cb15e"
dependencies = [
"headers",
"http",
@ -4162,7 +4166,7 @@ dependencies = [
[[package]]
name = "ruma-html"
version = "0.6.0"
source = "git+https://github.com/ruma/ruma.git?rev=4a0ae80fbf42d1b759e108d7315537d13583c144#4a0ae80fbf42d1b759e108d7315537d13583c144"
source = "git+https://github.com/ruma/ruma.git?rev=2455c71ec8bd16318397865d9c6e231e792cb15e#2455c71ec8bd16318397865d9c6e231e792cb15e"
dependencies = [
"as_variant",
"html5ever",
@ -4174,7 +4178,7 @@ dependencies = [
[[package]]
name = "ruma-identifiers-validation"
version = "0.12.0"
source = "git+https://github.com/ruma/ruma.git?rev=4a0ae80fbf42d1b759e108d7315537d13583c144#4a0ae80fbf42d1b759e108d7315537d13583c144"
source = "git+https://github.com/ruma/ruma.git?rev=2455c71ec8bd16318397865d9c6e231e792cb15e#2455c71ec8bd16318397865d9c6e231e792cb15e"
dependencies = [
"js_int",
"thiserror 2.0.18",
@ -4183,7 +4187,7 @@ dependencies = [
[[package]]
name = "ruma-macros"
version = "0.17.1"
source = "git+https://github.com/ruma/ruma.git?rev=4a0ae80fbf42d1b759e108d7315537d13583c144#4a0ae80fbf42d1b759e108d7315537d13583c144"
source = "git+https://github.com/ruma/ruma.git?rev=2455c71ec8bd16318397865d9c6e231e792cb15e#2455c71ec8bd16318397865d9c6e231e792cb15e"
dependencies = [
"as_variant",
"cfg-if",
@ -4199,7 +4203,7 @@ dependencies = [
[[package]]
name = "ruma-signatures"
version = "0.19.0"
source = "git+https://github.com/ruma/ruma.git?rev=4a0ae80fbf42d1b759e108d7315537d13583c144#4a0ae80fbf42d1b759e108d7315537d13583c144"
source = "git+https://github.com/ruma/ruma.git?rev=2455c71ec8bd16318397865d9c6e231e792cb15e#2455c71ec8bd16318397865d9c6e231e792cb15e"
dependencies = [
"base64",
"ed25519-dalek",
@ -5428,9 +5432,9 @@ dependencies = [
[[package]]
name = "wasm-streams"
version = "0.4.2"
version = "0.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "15053d8d85c7eccdbefef60f06769760a563c7f0a9d6902a13d35c7800b0ad65"
checksum = "9d1ec4f6517c9e11ae630e200b2b65d193279042e28edd4a2cda233e46670bbb"
dependencies = [
"futures-util",
"js-sys",

21
Cargo.toml

@ -78,23 +78,34 @@ sourceview = { version = "0.11", package = "sourceview5" }
[dependencies.matrix-sdk]
# version = "0.14"
git = "https://github.com/matrix-org/matrix-rust-sdk.git"
rev = "029148ef6e45d51e6325a4f5aadcdee7ec9385cc"
features = ["socks", "sso-login", "markdown", "qrcode"]
rev = "74c1044b7dd384cf6436598713c12c915b331d73"
default-features = false
features = [
"automatic-room-key-forwarding",
"e2e-encryption",
"markdown",
"native-tls",
"qrcode",
"socks",
"sqlite",
"sso-login",
]
[dependencies.matrix-sdk-store-encryption]
# version = "0.14"
git = "https://github.com/matrix-org/matrix-rust-sdk.git"
rev = "029148ef6e45d51e6325a4f5aadcdee7ec9385cc"
rev = "74c1044b7dd384cf6436598713c12c915b331d73"
[dependencies.matrix-sdk-ui]
# version = "0.14"
git = "https://github.com/matrix-org/matrix-rust-sdk.git"
rev = "029148ef6e45d51e6325a4f5aadcdee7ec9385cc"
rev = "74c1044b7dd384cf6436598713c12c915b331d73"
default-features = false
[dependencies.ruma]
# version = "0.14"
git = "https://github.com/ruma/ruma.git"
rev = "4a0ae80fbf42d1b759e108d7315537d13583c144"
rev = "2455c71ec8bd16318397865d9c6e231e792cb15e"
features = [
"client-api-c",
"markdown",

18
src/login/in_browser_page.rs

@ -3,8 +3,11 @@ use gettextrs::gettext;
use gtk::glib;
use matrix_sdk::{
Error,
authentication::oauth::{OAuthAuthorizationData, UrlOrQuery},
utils::local_server::{LocalServerRedirectHandle, QueryString},
authentication::oauth::OAuthAuthorizationData,
utils::{
UrlOrQuery,
local_server::{LocalServerRedirectHandle, QueryString},
},
};
use tokio::task::AbortHandle;
use tracing::{error, warn};
@ -130,8 +133,8 @@ mod imp {
match data {
LoginInBrowserData::Oauth(_) => self.finish_oauth_login(query_string).await,
LoginInBrowserData::Matrix(url) => {
self.finish_matrix_login(url, query_string).await;
LoginInBrowserData::Matrix(_) => {
self.finish_matrix_login(query_string).await;
}
}
}
@ -174,7 +177,7 @@ mod imp {
}
/// Finish the Matrix SSO login process.
async fn finish_matrix_login(&self, mut url: Url, query_string: QueryString) {
async fn finish_matrix_login(&self, query_string: QueryString) {
let Some(login) = self.login.upgrade() else {
return;
};
@ -185,12 +188,9 @@ mod imp {
.expect("login client should be constructed");
let matrix_auth = client.matrix_auth();
// We need to rebuild the URL to use the SDK's method.
url.set_query(Some(&query_string.0));
let handle = spawn_tokio!(async move {
matrix_auth
.login_with_sso_callback(url)
.login_with_sso_callback(query_string.into())
.map_err(|error| Error::UnknownError(error.into()))?
.initial_device_display_name(APP_NAME)
.await

13
src/session/room/mod.rs

@ -18,7 +18,7 @@ use matrix_sdk::{
use ruma::{
EventId, MatrixToUri, OwnedEventId, OwnedRoomId, OwnedUserId, RoomId, UserId,
api::client::{
error::{ErrorKind, RetryAfter},
error::{ErrorKind, LimitExceededErrorData, RetryAfter},
receipt::create_receipt::v3::ReceiptType as ApiReceiptType,
},
events::room::{
@ -1573,9 +1573,12 @@ mod imp {
}
let duration = match error.client_api_error_kind() {
Some(ErrorKind::LimitExceeded {
retry_after: Some(retry_after),
}) => match retry_after {
Some(ErrorKind::LimitExceeded(
LimitExceededErrorData {
retry_after: Some(retry_after),
..
},
)) => match retry_after {
RetryAfter::Delay(duration) => Some(*duration),
RetryAfter::DateTime(time) => {
time.duration_since(SystemTime::now()).ok()
@ -1965,7 +1968,7 @@ impl Room {
let handle = spawn_tokio!(async move {
let futures = events_clone
.into_iter()
.map(|(event_id, reason)| matrix_room.report_content(event_id, None, reason));
.map(|(event_id, reason)| matrix_room.report_content(event_id, reason));
futures_util::future::join_all(futures).await
});

6
src/session/room/timeline/event/mod.rs

@ -3,7 +3,7 @@ use std::sync::Arc;
use gtk::{gio, glib, glib::closure_local, prelude::*, subclass::prelude::*};
use indexmap::IndexMap;
use matrix_sdk_ui::timeline::{
AnyOtherFullStateEventContent, EmbeddedEvent, Error as TimelineError, EventSendState,
AnyOtherStateEventContentChange, EmbeddedEvent, Error as TimelineError, EventSendState,
EventTimelineItem, MembershipChange, Message, MsgLikeKind, TimelineDetails,
TimelineEventItemId, TimelineItemContent,
};
@ -666,7 +666,7 @@ impl Event {
// so we do not group it.
!matches!(
other_state.content(),
AnyOtherFullStateEventContent::RoomCreate(_)
AnyOtherStateEventContentChange::RoomCreate(_)
)
}
_ => false,
@ -679,7 +679,7 @@ impl Event {
TimelineItemContent::OtherState(other_state) => {
matches!(
other_state.content(),
AnyOtherFullStateEventContent::RoomCreate(_),
AnyOtherStateEventContentChange::RoomCreate(_),
)
}
_ => false,

22
src/session_view/room_history/state/content.rs

@ -2,12 +2,12 @@ use adw::{prelude::*, subclass::prelude::*};
use gettextrs::gettext;
use gtk::{glib, glib::clone, pango};
use matrix_sdk_ui::timeline::{
AnyOtherFullStateEventContent, MemberProfileChange, MembershipChange, OtherState,
AnyOtherStateEventContentChange, MemberProfileChange, MembershipChange, OtherState,
RoomMembershipChange, TimelineItemContent,
};
use ruma::{
UserId,
events::{FullStateEventContent, room::member::MembershipState},
events::{StateEventContentChange, room::member::MembershipState},
};
use tracing::warn;
@ -93,21 +93,21 @@ mod imp {
/// Update this row with the given [`OtherState`].
fn update_with_other_state(&self, other_state: &OtherState, sender: &Member) {
let widget = match other_state.content() {
AnyOtherFullStateEventContent::RoomCreate(content) => {
AnyOtherStateEventContentChange::RoomCreate(content) => {
WidgetType::Creation(StateCreation::new(content))
}
AnyOtherFullStateEventContent::RoomEncryption(_) => {
AnyOtherStateEventContentChange::RoomEncryption(_) => {
WidgetType::Text(gettext("This room is encrypted from this point on."))
}
AnyOtherFullStateEventContent::RoomThirdPartyInvite(content) => {
AnyOtherStateEventContentChange::RoomThirdPartyInvite(content) => {
let display_name = match content {
FullStateEventContent::Original { content, .. } => {
StateEventContentChange::Original { content, .. } => {
match &content.display_name {
s if s.is_empty() => other_state.state_key(),
s => s,
}
}
FullStateEventContent::Redacted(_) => other_state.state_key(),
StateEventContentChange::Redacted(_) => other_state.state_key(),
};
WidgetType::Text(gettext_f(
// Translators: Do NOT translate the content between '{' and '}', this is a
@ -146,11 +146,11 @@ mod imp {
) {
let sender_display_name = sender.disambiguated_name();
let target_display_name = match membership_change.content() {
FullStateEventContent::Original { content, .. } => content
StateEventContentChange::Original { content, .. } => content
.displayname
.clone()
.unwrap_or_else(|| membership_change.user_id().to_string()),
FullStateEventContent::Redacted(_) => membership_change.user_id().to_string(),
StateEventContentChange::Redacted(_) => membership_change.user_id().to_string(),
};
let supported_membership_change =
@ -294,8 +294,8 @@ mod imp {
MembershipChange::KnockDenied => MembershipChange::KnockDenied,
_ => {
let membership = match membership_change.content() {
FullStateEventContent::Original { content, .. } => &content.membership,
FullStateEventContent::Redacted(content) => &content.membership,
StateEventContentChange::Original { content, .. } => &content.membership,
StateEventContentChange::Redacted(content) => &content.membership,
};
match membership {

10
src/session_view/room_history/state/creation.rs

@ -2,7 +2,7 @@ use adw::{prelude::*, subclass::prelude::*};
use gettextrs::gettext;
use gtk::glib;
use matrix_sdk::ruma::events::room::create::RoomCreateEventContent;
use ruma::events::FullStateEventContent;
use ruma::events::StateEventContentChange;
mod imp {
use glib::subclass::InitializingObject;
@ -39,10 +39,10 @@ mod imp {
impl StateCreation {
/// Set the room create state event to display.
pub(super) fn set_event(&self, event: &FullStateEventContent<RoomCreateEventContent>) {
pub(super) fn set_event(&self, event: &StateEventContentChange<RoomCreateEventContent>) {
let predecessor = match event {
FullStateEventContent::Original { content, .. } => content.predecessor.as_ref(),
FullStateEventContent::Redacted(_) => None,
StateEventContentChange::Original { content, .. } => content.predecessor.as_ref(),
StateEventContentChange::Redacted(_) => None,
};
if let Some(predecessor) = &predecessor {
@ -71,7 +71,7 @@ glib::wrapper! {
}
impl StateCreation {
pub fn new(event: &FullStateEventContent<RoomCreateEventContent>) -> Self {
pub fn new(event: &StateEventContentChange<RoomCreateEventContent>) -> Self {
let obj: Self = glib::Object::new();
obj.imp().set_event(event);
obj

6
src/user_facing_error.rs

@ -23,10 +23,10 @@ impl UserFacingError for HttpError {
self.as_client_api_error().map(|error| &error.body)
{
match kind {
ErrorKind::Forbidden { .. } => gettext("Invalid credentials."),
ErrorKind::Forbidden => gettext("Invalid credentials."),
ErrorKind::UserDeactivated => gettext("Account deactivated."),
ErrorKind::LimitExceeded { retry_after } => {
if let Some(retry_after) = retry_after {
ErrorKind::LimitExceeded(limit_exceeded) => {
if let Some(retry_after) = &limit_exceeded.retry_after {
let duration = match retry_after {
RetryAfter::Delay(duration) => *duration,
RetryAfter::DateTime(until) => until

Loading…
Cancel
Save