diff --git a/Cargo.lock b/Cargo.lock index 78f2d59ed..970e5372a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -6068,7 +6068,7 @@ checksum = "f962df74c8c05a667b5ee8bcf162993134c104e96440b663c8daa176dc772d8c" [[package]] name = "uniffi" version = "0.26.0" -source = "git+https://github.com/mozilla/uniffi-rs?rev=2e4e2ae53e83c832cdff80cb4c8779038789f7aa#2e4e2ae53e83c832cdff80cb4c8779038789f7aa" +source = "git+https://github.com/mozilla/uniffi-rs?rev=0a5e2eb5760b4ce5549021ec91de546716de8db1#0a5e2eb5760b4ce5549021ec91de546716de8db1" dependencies = [ "anyhow", "camino", @@ -6089,7 +6089,7 @@ dependencies = [ [[package]] name = "uniffi_bindgen" version = "0.26.0" -source = "git+https://github.com/mozilla/uniffi-rs?rev=2e4e2ae53e83c832cdff80cb4c8779038789f7aa#2e4e2ae53e83c832cdff80cb4c8779038789f7aa" +source = "git+https://github.com/mozilla/uniffi-rs?rev=0a5e2eb5760b4ce5549021ec91de546716de8db1#0a5e2eb5760b4ce5549021ec91de546716de8db1" dependencies = [ "anyhow", "askama", @@ -6113,7 +6113,7 @@ dependencies = [ [[package]] name = "uniffi_build" version = "0.26.0" -source = "git+https://github.com/mozilla/uniffi-rs?rev=2e4e2ae53e83c832cdff80cb4c8779038789f7aa#2e4e2ae53e83c832cdff80cb4c8779038789f7aa" +source = "git+https://github.com/mozilla/uniffi-rs?rev=0a5e2eb5760b4ce5549021ec91de546716de8db1#0a5e2eb5760b4ce5549021ec91de546716de8db1" dependencies = [ "anyhow", "camino", @@ -6123,7 +6123,7 @@ dependencies = [ [[package]] name = "uniffi_checksum_derive" version = "0.26.0" -source = "git+https://github.com/mozilla/uniffi-rs?rev=2e4e2ae53e83c832cdff80cb4c8779038789f7aa#2e4e2ae53e83c832cdff80cb4c8779038789f7aa" +source = "git+https://github.com/mozilla/uniffi-rs?rev=0a5e2eb5760b4ce5549021ec91de546716de8db1#0a5e2eb5760b4ce5549021ec91de546716de8db1" dependencies = [ "quote", "syn 2.0.48", @@ -6132,7 +6132,7 @@ dependencies = [ [[package]] name = "uniffi_core" version = "0.26.0" -source = "git+https://github.com/mozilla/uniffi-rs?rev=2e4e2ae53e83c832cdff80cb4c8779038789f7aa#2e4e2ae53e83c832cdff80cb4c8779038789f7aa" +source = "git+https://github.com/mozilla/uniffi-rs?rev=0a5e2eb5760b4ce5549021ec91de546716de8db1#0a5e2eb5760b4ce5549021ec91de546716de8db1" dependencies = [ "anyhow", "async-compat", @@ -6148,7 +6148,7 @@ dependencies = [ [[package]] name = "uniffi_macros" version = "0.26.0" -source = "git+https://github.com/mozilla/uniffi-rs?rev=2e4e2ae53e83c832cdff80cb4c8779038789f7aa#2e4e2ae53e83c832cdff80cb4c8779038789f7aa" +source = "git+https://github.com/mozilla/uniffi-rs?rev=0a5e2eb5760b4ce5549021ec91de546716de8db1#0a5e2eb5760b4ce5549021ec91de546716de8db1" dependencies = [ "bincode", "camino", @@ -6166,7 +6166,7 @@ dependencies = [ [[package]] name = "uniffi_meta" version = "0.26.0" -source = "git+https://github.com/mozilla/uniffi-rs?rev=2e4e2ae53e83c832cdff80cb4c8779038789f7aa#2e4e2ae53e83c832cdff80cb4c8779038789f7aa" +source = "git+https://github.com/mozilla/uniffi-rs?rev=0a5e2eb5760b4ce5549021ec91de546716de8db1#0a5e2eb5760b4ce5549021ec91de546716de8db1" dependencies = [ "anyhow", "bytes", @@ -6177,7 +6177,7 @@ dependencies = [ [[package]] name = "uniffi_testing" version = "0.26.0" -source = "git+https://github.com/mozilla/uniffi-rs?rev=2e4e2ae53e83c832cdff80cb4c8779038789f7aa#2e4e2ae53e83c832cdff80cb4c8779038789f7aa" +source = "git+https://github.com/mozilla/uniffi-rs?rev=0a5e2eb5760b4ce5549021ec91de546716de8db1#0a5e2eb5760b4ce5549021ec91de546716de8db1" dependencies = [ "anyhow", "camino", @@ -6189,7 +6189,7 @@ dependencies = [ [[package]] name = "uniffi_udl" version = "0.26.0" -source = "git+https://github.com/mozilla/uniffi-rs?rev=2e4e2ae53e83c832cdff80cb4c8779038789f7aa#2e4e2ae53e83c832cdff80cb4c8779038789f7aa" +source = "git+https://github.com/mozilla/uniffi-rs?rev=0a5e2eb5760b4ce5549021ec91de546716de8db1#0a5e2eb5760b4ce5549021ec91de546716de8db1" dependencies = [ "anyhow", "textwrap", @@ -6494,7 +6494,7 @@ checksum = "5f20c57d8d7db6d3b86154206ae5d8fba62dd39573114de97c2cb0578251f8e1" [[package]] name = "weedle2" version = "5.0.0" -source = "git+https://github.com/mozilla/uniffi-rs?rev=2e4e2ae53e83c832cdff80cb4c8779038789f7aa#2e4e2ae53e83c832cdff80cb4c8779038789f7aa" +source = "git+https://github.com/mozilla/uniffi-rs?rev=0a5e2eb5760b4ce5549021ec91de546716de8db1#0a5e2eb5760b4ce5549021ec91de546716de8db1" dependencies = [ "nom", ] diff --git a/Cargo.toml b/Cargo.toml index df74dd228..9704b0730 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -50,8 +50,8 @@ tokio = { version = "1.30.0", default-features = false, features = ["sync"] } tokio-stream = "0.1.14" tracing = { version = "0.1.40", default-features = false, features = ["std"] } tracing-core = "0.1.32" -uniffi = { git = "https://github.com/mozilla/uniffi-rs", rev = "2e4e2ae53e83c832cdff80cb4c8779038789f7aa" } -uniffi_bindgen = { git = "https://github.com/mozilla/uniffi-rs", rev = "2e4e2ae53e83c832cdff80cb4c8779038789f7aa" } +uniffi = { git = "https://github.com/mozilla/uniffi-rs", rev = "0a5e2eb5760b4ce5549021ec91de546716de8db1" } +uniffi_bindgen = { git = "https://github.com/mozilla/uniffi-rs", rev = "0a5e2eb5760b4ce5549021ec91de546716de8db1" } vodozemac = "0.5.1" zeroize = "1.6.0" diff --git a/bindings/matrix-sdk-ffi/src/room.rs b/bindings/matrix-sdk-ffi/src/room.rs index e700f99c9..630fffdc3 100644 --- a/bindings/matrix-sdk-ffi/src/room.rs +++ b/bindings/matrix-sdk-ffi/src/room.rs @@ -128,15 +128,10 @@ impl Room { self.inner.active_room_call_participants().iter().map(|u| u.to_string()).collect() } - pub fn inviter(&self) -> Option> { + pub fn inviter(&self) -> Option { if self.inner.state() == RoomState::Invited { RUNTIME.block_on(async move { - self.inner - .invite_details() - .await - .ok() - .and_then(|a| a.inviter) - .map(|m| Arc::new(RoomMember::new(m))) + self.inner.invite_details().await.ok().and_then(|a| a.inviter).map(|m| m.into()) }) } else { None @@ -189,10 +184,10 @@ impl Room { ))) } - pub async fn member(&self, user_id: String) -> Result, ClientError> { + pub async fn member(&self, user_id: String) -> Result { let user_id = UserId::parse(&*user_id).context("Invalid user id.")?; let member = self.inner.get_member(&user_id).await?.context("No user found")?; - Ok(Arc::new(RoomMember::new(member))) + Ok(member.into()) } pub fn member_avatar_url(&self, user_id: String) -> Result, ClientError> { @@ -631,10 +626,10 @@ impl RoomMembersIterator { self.chunk_iterator.len() } - fn next_chunk(&self, chunk_size: u32) -> Option>> { + fn next_chunk(&self, chunk_size: u32) -> Option> { self.chunk_iterator .next(chunk_size) - .map(|members| members.into_iter().map(RoomMember::new).map(Arc::new).collect()) + .map(|members| members.into_iter().map(|m| m.into()).collect()) } } diff --git a/bindings/matrix-sdk-ffi/src/room_info.rs b/bindings/matrix-sdk-ffi/src/room_info.rs index a22147bc9..879c89f66 100644 --- a/bindings/matrix-sdk-ffi/src/room_info.rs +++ b/bindings/matrix-sdk-ffi/src/room_info.rs @@ -23,7 +23,7 @@ pub struct RoomInfo { alternative_aliases: Vec, membership: Membership, latest_event: Option>, - inviter: Option>, + inviter: Option, active_members_count: u64, invited_members_count: u64, joined_members_count: u64, @@ -75,9 +75,7 @@ impl RoomInfo { membership: room.state().into(), latest_event, inviter: match room.state() { - RoomState::Invited => { - room.invite_details().await?.inviter.map(|inner| Arc::new(RoomMember { inner })) - } + RoomState::Invited => room.invite_details().await?.inviter.map(|m| m.into()), _ => None, }, active_members_count: room.active_members_count(), diff --git a/bindings/matrix-sdk-ffi/src/room_member.rs b/bindings/matrix-sdk-ffi/src/room_member.rs index 3805ba5f1..0d6117ed3 100644 --- a/bindings/matrix-sdk-ffi/src/room_member.rs +++ b/bindings/matrix-sdk-ffi/src/room_member.rs @@ -1,11 +1,5 @@ use matrix_sdk::room::{RoomMember as SdkRoomMember, RoomMemberRole}; -use super::RUNTIME; -use crate::{ - event::{MessageLikeEventType, StateEventType}, - ClientError, -}; - #[derive(Clone, uniffi::Enum)] pub enum MembershipState { /// The user is banned. @@ -45,110 +39,6 @@ impl From for Membershi } } -#[derive(uniffi::Object)] -pub struct RoomMember { - pub(crate) inner: SdkRoomMember, -} - -#[uniffi::export] -impl RoomMember { - pub fn user_id(&self) -> String { - self.inner.user_id().to_string() - } - - pub fn display_name(&self) -> Option { - self.inner.display_name().map(|d| d.to_owned()) - } - - pub fn avatar_url(&self) -> Option { - self.inner.avatar_url().map(ToString::to_string) - } - - pub fn membership(&self) -> MembershipState { - self.inner.membership().to_owned().into() - } - - pub fn is_name_ambiguous(&self) -> bool { - self.inner.name_ambiguous() - } - - pub fn power_level(&self) -> i64 { - self.inner.power_level() - } - - pub fn suggested_role_for_power_level(&self) -> RoomMemberRole { - self.inner.suggested_role_for_power_level() - } - - pub fn normalized_power_level(&self) -> i64 { - self.inner.normalized_power_level() - } - - pub fn is_ignored(&self) -> bool { - self.inner.is_ignored() - } - - pub fn is_account_user(&self) -> bool { - self.inner.is_account_user() - } - - /// Adds the room member to the current account data's ignore list - /// which will ignore the user across all rooms. - pub fn ignore(&self) -> Result<(), ClientError> { - RUNTIME.block_on(async move { - self.inner.ignore().await?; - Ok(()) - }) - } - - /// Removes the room member from the current account data's ignore list - /// which will unignore the user across all rooms. - pub fn unignore(&self) -> Result<(), ClientError> { - RUNTIME.block_on(async move { - self.inner.unignore().await?; - Ok(()) - }) - } - - pub fn can_ban(&self) -> bool { - self.inner.can_ban() - } - - pub fn can_invite(&self) -> bool { - self.inner.can_invite() - } - - pub fn can_kick(&self) -> bool { - self.inner.can_kick() - } - - pub fn can_redact_own(&self) -> bool { - self.inner.can_redact_own() - } - - pub fn can_redact_other(&self) -> bool { - self.inner.can_redact_other() - } - - pub fn can_send_state(&self, state_event: StateEventType) -> bool { - self.inner.can_send_state(state_event.into()) - } - - pub fn can_send_message(&self, event: MessageLikeEventType) -> bool { - self.inner.can_send_message(event.into()) - } - - pub fn can_trigger_room_notification(&self) -> bool { - self.inner.can_trigger_room_notification() - } -} - -impl RoomMember { - pub fn new(room_member: SdkRoomMember) -> Self { - RoomMember { inner: room_member } - } -} - #[uniffi::export] pub fn suggested_role_for_power_level(power_level: i64) -> RoomMemberRole { // It's not possible to expose the constructor on the Enum through Uniffi ☹️ @@ -160,3 +50,32 @@ pub fn suggested_power_level_for_role(role: RoomMemberRole) -> i64 { // It's not possible to expose methods on an Enum through Uniffi ☹️ role.suggested_power_level() } + +#[derive(uniffi::Record)] +pub struct RoomMember { + pub user_id: String, + pub display_name: Option, + pub avatar_url: Option, + pub membership: MembershipState, + pub is_name_ambiguous: bool, + pub power_level: i64, + pub normalized_power_level: i64, + pub is_ignored: bool, + pub suggested_role_for_power_level: RoomMemberRole, +} + +impl From for RoomMember { + fn from(m: SdkRoomMember) -> Self { + RoomMember { + user_id: m.user_id().to_string(), + display_name: m.display_name().map(|s| s.to_owned()), + avatar_url: m.avatar_url().map(|a| a.to_string()), + membership: m.membership().clone().into(), + is_name_ambiguous: m.name_ambiguous(), + power_level: m.power_level(), + normalized_power_level: m.normalized_power_level(), + is_ignored: m.is_ignored(), + suggested_role_for_power_level: m.suggested_role_for_power_level(), + } + } +} diff --git a/crates/matrix-sdk-base/src/rooms/members.rs b/crates/matrix-sdk-base/src/rooms/members.rs index 1e1dd5329..9c369e0ed 100644 --- a/crates/matrix-sdk-base/src/rooms/members.rs +++ b/crates/matrix-sdk-base/src/rooms/members.rs @@ -122,7 +122,8 @@ impl RoomMember { /// Get the normalized power level of this member. /// /// The normalized power level depends on the maximum power level that can - /// be found in a certain room, it's always in the range of 0-100. + /// be found in a certain room, positive values are always in the range of + /// 0-100. pub fn normalized_power_level(&self) -> i64 { if self.max_power_level > 0 { (self.power_level() * 100) / self.max_power_level diff --git a/crates/matrix-sdk/src/config/request.rs b/crates/matrix-sdk/src/config/request.rs index add9072c1..226d26a99 100644 --- a/crates/matrix-sdk/src/config/request.rs +++ b/crates/matrix-sdk/src/config/request.rs @@ -98,7 +98,8 @@ impl RequestConfig { self } - /// The number of times a request should be retried. The default is no limit + /// The number of times a request should be retried. The default is no + /// limit. #[must_use] pub fn retry_limit(mut self, retry_limit: u64) -> Self { self.retry_limit = Some(retry_limit); diff --git a/crates/matrix-sdk/src/room/mod.rs b/crates/matrix-sdk/src/room/mod.rs index 22f4ae7fd..b4d0014d4 100644 --- a/crates/matrix-sdk/src/room/mod.rs +++ b/crates/matrix-sdk/src/room/mod.rs @@ -81,6 +81,7 @@ pub use self::{ }; use crate::{ attachment::AttachmentConfig, + config::RequestConfig, error::WrongRoomState, event_handler::{EventHandler, EventHandlerDropGuard, EventHandlerHandle, SyncEvent}, media::{MediaFormat, MediaRequest}, @@ -410,7 +411,15 @@ impl Room { .members_request_deduplicated_handler .run(self.room_id().to_owned(), async move { let request = get_member_events::v3::Request::new(self.inner.room_id().to_owned()); - let response = self.client.send(request, None).await?; + let response = self + .client + .send( + request, + // In some cases it can take longer than 30s to load: + // https://github.com/element-hq/synapse/issues/16872 + Some(RequestConfig::new().timeout(Duration::from_secs(60)).retry_limit(3)), + ) + .await?; // That's a large `Future`. Let's `Box::pin` to reduce its size on the stack. Box::pin(self.client.base_client().receive_members(self.room_id(), &response))