From 401cf282a76dcfc53c36ba118a196a76e9a74592 Mon Sep 17 00:00:00 2001 From: Jonas Platte Date: Mon, 19 Apr 2021 12:16:13 +0200 Subject: [PATCH 1/3] Upgrade ruma dependency --- matrix_sdk_common/Cargo.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/matrix_sdk_common/Cargo.toml b/matrix_sdk_common/Cargo.toml index 752fa730..d43f6ddf 100644 --- a/matrix_sdk_common/Cargo.toml +++ b/matrix_sdk_common/Cargo.toml @@ -20,9 +20,9 @@ serde = "1.0.122" async-trait = "0.1.42" [dependencies.ruma] -version = "0.0.2" +version = "0.0.3" git = "https://github.com/ruma/ruma" -rev = "47d6b458574247545f8836b9421800f0089f3008" +rev = "c816630058ab625d93ebab294e9e6c02dd9d866c" features = ["client-api", "compat", "unstable-pre-spec"] [target.'cfg(not(target_arch = "wasm32"))'.dependencies] From 15780674981479b35bd524a777384fee0221e30f Mon Sep 17 00:00:00 2001 From: Jonas Platte Date: Mon, 19 Apr 2021 12:23:09 +0200 Subject: [PATCH 2/3] Only activate the client parts of ruma-client-api MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit … to reduce compile times. --- matrix_sdk_common/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/matrix_sdk_common/Cargo.toml b/matrix_sdk_common/Cargo.toml index d43f6ddf..3a284e4d 100644 --- a/matrix_sdk_common/Cargo.toml +++ b/matrix_sdk_common/Cargo.toml @@ -23,7 +23,7 @@ async-trait = "0.1.42" version = "0.0.3" git = "https://github.com/ruma/ruma" rev = "c816630058ab625d93ebab294e9e6c02dd9d866c" -features = ["client-api", "compat", "unstable-pre-spec"] +features = ["client-api-c", "compat", "unstable-pre-spec"] [target.'cfg(not(target_arch = "wasm32"))'.dependencies] uuid = { version = "0.8.2", default-features = false, features = ["v4", "serde"] } From 796354ce5dc8306f756b7c42e258a80bc492d9cc Mon Sep 17 00:00:00 2001 From: Jonas Platte Date: Mon, 19 Apr 2021 12:54:45 +0200 Subject: [PATCH 3/3] Ensure exhaustiveness for sync_events::Response destructuring So the SDKs own SyncResponse type doesn't get out-of-sync. --- matrix_sdk_base/src/client.rs | 74 +++++++++++++++++++++-------------- 1 file changed, 45 insertions(+), 29 deletions(-) diff --git a/matrix_sdk_base/src/client.rs b/matrix_sdk_base/src/client.rs index 9e98489c..dad4ea36 100644 --- a/matrix_sdk_base/src/client.rs +++ b/matrix_sdk_base/src/client.rs @@ -682,11 +682,35 @@ impl BaseClient { &self, response: api::sync::sync_events::Response, ) -> Result { + #[cfg(test)] + let api::sync::sync_events::Response { + next_batch, + rooms, + presence, + account_data, + to_device, + device_lists, + device_one_time_keys_count, + __test_exhaustive: _, + } = response; + + #[cfg(not(test))] + let api::sync::sync_events::Response { + next_batch, + rooms, + presence, + account_data, + to_device, + device_lists, + device_one_time_keys_count, + .. + } = response; + // The server might respond multiple times with the same sync token, in // that case we already received this response and there's nothing to // do. - if self.sync_token.read().await.as_ref() == Some(&response.next_batch) { - return Ok(SyncResponse::new(response.next_batch)); + if self.sync_token.read().await.as_ref() == Some(&next_batch) { + return Ok(SyncResponse::new(next_batch)); } let now = Instant::now(); @@ -700,15 +724,10 @@ impl BaseClient { // decryptes to-device events, but leaves room events alone. // This makes sure that we have the deryption keys for the room // events at hand. - o.receive_sync_changes( - &response.to_device, - &response.device_lists, - &response.device_one_time_keys_count, - ) - .await? + o.receive_sync_changes(&to_device, &device_lists, &device_one_time_keys_count) + .await? } else { - response - .to_device + to_device .events .into_iter() .filter_map(|e| e.deserialize().ok()) @@ -717,20 +736,19 @@ impl BaseClient { } }; #[cfg(not(feature = "encryption"))] - let to_device = response - .to_device + let to_device = to_device .events .into_iter() .filter_map(|e| e.deserialize().ok()) .collect::>() .into(); - let mut changes = StateChanges::new(response.next_batch.clone()); + let mut changes = StateChanges::new(next_batch.clone()); let mut ambiguity_cache = AmbiguityCache::new(self.store.clone()); - let mut rooms = Rooms::default(); + let mut new_rooms = Rooms::default(); - for (room_id, new_info) in response.rooms.join { + for (room_id, new_info) in rooms.join { let room = self .store .get_or_create_room(&room_id, RoomType::Joined) @@ -799,7 +817,7 @@ impl BaseClient { .collect(), }; - rooms.join.insert( + new_rooms.join.insert( room_id, JoinedRoom::new(timeline, state, account_data, ephemeral, notification_count), ); @@ -807,7 +825,7 @@ impl BaseClient { changes.add_room(room_info); } - for (room_id, new_info) in response.rooms.leave { + for (room_id, new_info) in rooms.leave { let room = self .store .get_or_create_room(&room_id, RoomType::Left) @@ -840,12 +858,12 @@ impl BaseClient { .await; changes.add_room(room_info); - rooms + new_rooms .leave .insert(room_id, LeftRoom::new(timeline, state, account_data)); } - for (room_id, new_info) in response.rooms.invite { + for (room_id, new_info) in rooms.invite { { let room = self .store @@ -870,11 +888,10 @@ impl BaseClient { invite_state: state, }; - rooms.invite.insert(room_id, room); + new_rooms.invite.insert(room_id, room); } - let presence: BTreeMap = response - .presence + let presence: BTreeMap = presence .events .into_iter() .filter_map(|e| { @@ -885,20 +902,20 @@ impl BaseClient { changes.presence = presence; - self.handle_account_data(response.account_data.events, &mut changes) + self.handle_account_data(account_data.events, &mut changes) .await; changes.ambiguity_maps = ambiguity_cache.cache; self.store.save_changes(&changes).await?; - *self.sync_token.write().await = Some(response.next_batch.clone()); + *self.sync_token.write().await = Some(next_batch.clone()); self.apply_changes(&changes).await; info!("Processed a sync response in {:?}", now.elapsed()); let response = SyncResponse { - next_batch: response.next_batch, - rooms, + next_batch, + rooms: new_rooms, presence: Presence { events: changes.presence.into_iter().map(|(_, v)| v).collect(), }, @@ -906,9 +923,8 @@ impl BaseClient { events: changes.account_data.into_iter().map(|(_, e)| e).collect(), }, to_device, - device_lists: response.device_lists, - device_one_time_keys_count: response - .device_one_time_keys_count + device_lists, + device_one_time_keys_count: device_one_time_keys_count .into_iter() .map(|(k, v)| (k, v.into())) .collect(),