From 0542e3d83d5d808c9bdb9ee3f2d389517300b6b6 Mon Sep 17 00:00:00 2001 From: Black Hat Date: Thu, 16 Jul 2020 03:49:46 -0700 Subject: [PATCH 1/4] Client::sync(): expose sync filter --- matrix_sdk/src/client.rs | 35 ++++++++++++++++++++--------------- 1 file changed, 20 insertions(+), 15 deletions(-) diff --git a/matrix_sdk/src/client.rs b/matrix_sdk/src/client.rs index af962e7a..6dc6402b 100644 --- a/matrix_sdk/src/client.rs +++ b/matrix_sdk/src/client.rs @@ -1220,9 +1220,13 @@ impl Client { /// /// * `sync_settings` - Settings for the sync call. #[instrument] - pub async fn sync(&self, sync_settings: SyncSettings) -> Result { + pub async fn sync( + &self, + sync_settings: SyncSettings, + filter: Option, + ) -> Result { let request = sync_events::Request { - filter: None, + filter, since: sync_settings.token, full_state: sync_settings.full_state, set_presence: sync_events::SetPresence::Online, @@ -1297,6 +1301,7 @@ impl Client { pub async fn sync_forever( &self, sync_settings: SyncSettings, + filter: Option, callback: impl Fn(sync_events::Response) -> C, ) where C: Future, @@ -1309,7 +1314,7 @@ impl Client { } loop { - let response = self.sync(sync_settings.clone()).await; + let response = self.sync(sync_settings.clone(), None).await; let response = match response { Ok(r) => r, @@ -1561,7 +1566,7 @@ mod test { let room = client.get_joined_room(&room_id).await; assert!(room.is_none()); - client.sync(SyncSettings::default()).await.unwrap(); + client.sync(SyncSettings::default(), None).await.unwrap(); let room = client.get_left_room(&room_id).await; assert!(room.is_none()); @@ -1576,7 +1581,7 @@ mod test { joined_client.restore_login(session).await.unwrap(); // joined room reloaded from state store - joined_client.sync(SyncSettings::default()).await.unwrap(); + joined_client.sync(SyncSettings::default(), None).await.unwrap(); let room = joined_client.get_joined_room(&room_id).await; assert!(room.is_some()); @@ -1588,7 +1593,7 @@ mod test { .with_body(test_json::LEAVE_SYNC_EVENT.to_string()) .create(); - joined_client.sync(SyncSettings::default()).await.unwrap(); + joined_client.sync(SyncSettings::default(), None).await.unwrap(); let room = joined_client.get_joined_room(&room_id).await; assert!(room.is_none()); @@ -1620,7 +1625,7 @@ mod test { let sync_settings = SyncSettings::new().timeout(Duration::from_millis(3000)); - let _response = client.sync(sync_settings).await.unwrap(); + let _response = client.sync(sync_settings, None).await.unwrap(); // let bc = &client.base_client; // let ignored_users = bc.ignored_users.read().await; @@ -2243,7 +2248,7 @@ mod test { let sync_settings = SyncSettings::new().timeout(Duration::from_millis(3000)); - let _response = client.sync(sync_settings).await.unwrap(); + let _response = client.sync(sync_settings, None).await.unwrap(); let rooms_lock = &client.base_client.joined_rooms(); let rooms = rooms_lock.read().await; @@ -2279,7 +2284,7 @@ mod test { client.restore_login(session).await.unwrap(); let sync_settings = SyncSettings::new().timeout(Duration::from_millis(3000)); - let _response = client.sync(sync_settings).await.unwrap(); + let _response = client.sync(sync_settings, None).await.unwrap(); let mut room_names = vec![]; for room in client.joined_rooms().read().await.values() { @@ -2311,7 +2316,7 @@ mod test { .with_body(test_json::INVITE_SYNC.to_string()) .create(); - let _response = client.sync(SyncSettings::default()).await.unwrap(); + let _response = client.sync(SyncSettings::default(), None).await.unwrap(); assert!(client.joined_rooms().read().await.is_empty()); assert!(client.left_rooms().read().await.is_empty()); @@ -2345,7 +2350,7 @@ mod test { .with_body(test_json::LEAVE_SYNC.to_string()) .create(); - let _response = client.sync(SyncSettings::default()).await.unwrap(); + let _response = client.sync(SyncSettings::default(), None).await.unwrap(); assert!(client.joined_rooms().read().await.is_empty()); assert!(!client.left_rooms().read().await.is_empty()); @@ -2389,14 +2394,14 @@ mod test { let sync_settings = SyncSettings::new().timeout(std::time::Duration::from_millis(3000)); // gather state to save to the db, the first time through loading will be skipped - let _ = client.sync(sync_settings.clone()).await.unwrap(); + let _ = client.sync(sync_settings.clone(), None).await.unwrap(); // now syncing the client will update from the state store let config = ClientConfig::default().state_store(Box::new(JsonStore::open(dir.path()).unwrap())); let client = Client::new_with_config(homeserver, config).unwrap(); client.restore_login(session.clone()).await.unwrap(); - client.sync(sync_settings).await.unwrap(); + client.sync(sync_settings, None).await.unwrap(); let base_client = &client.base_client; @@ -2457,7 +2462,7 @@ mod test { let sync_settings = SyncSettings::new().timeout(Duration::from_millis(3000)); - let response = client.sync(sync_settings).await.unwrap(); + let response = client.sync(sync_settings, None).await.unwrap(); assert_ne!(response.next_batch, ""); @@ -2487,7 +2492,7 @@ mod test { let sync_settings = SyncSettings::new().timeout(Duration::from_millis(3000)); - let _response = client.sync(sync_settings).await.unwrap(); + let _response = client.sync(sync_settings, None).await.unwrap(); let mut names = vec![]; for r in client.joined_rooms().read().await.values() { From a5c5f5a7b10aa4e566f94fbf1790833fbfbe803c Mon Sep 17 00:00:00 2001 From: Black Hat Date: Thu, 16 Jul 2020 06:04:26 -0700 Subject: [PATCH 2/4] Revert "Client::sync(): expose sync filter" This reverts commit 0542e3d83d5d808c9bdb9ee3f2d389517300b6b6. --- matrix_sdk/src/client.rs | 35 +++++++++++++++-------------------- 1 file changed, 15 insertions(+), 20 deletions(-) diff --git a/matrix_sdk/src/client.rs b/matrix_sdk/src/client.rs index 6dc6402b..af962e7a 100644 --- a/matrix_sdk/src/client.rs +++ b/matrix_sdk/src/client.rs @@ -1220,13 +1220,9 @@ impl Client { /// /// * `sync_settings` - Settings for the sync call. #[instrument] - pub async fn sync( - &self, - sync_settings: SyncSettings, - filter: Option, - ) -> Result { + pub async fn sync(&self, sync_settings: SyncSettings) -> Result { let request = sync_events::Request { - filter, + filter: None, since: sync_settings.token, full_state: sync_settings.full_state, set_presence: sync_events::SetPresence::Online, @@ -1301,7 +1297,6 @@ impl Client { pub async fn sync_forever( &self, sync_settings: SyncSettings, - filter: Option, callback: impl Fn(sync_events::Response) -> C, ) where C: Future, @@ -1314,7 +1309,7 @@ impl Client { } loop { - let response = self.sync(sync_settings.clone(), None).await; + let response = self.sync(sync_settings.clone()).await; let response = match response { Ok(r) => r, @@ -1566,7 +1561,7 @@ mod test { let room = client.get_joined_room(&room_id).await; assert!(room.is_none()); - client.sync(SyncSettings::default(), None).await.unwrap(); + client.sync(SyncSettings::default()).await.unwrap(); let room = client.get_left_room(&room_id).await; assert!(room.is_none()); @@ -1581,7 +1576,7 @@ mod test { joined_client.restore_login(session).await.unwrap(); // joined room reloaded from state store - joined_client.sync(SyncSettings::default(), None).await.unwrap(); + joined_client.sync(SyncSettings::default()).await.unwrap(); let room = joined_client.get_joined_room(&room_id).await; assert!(room.is_some()); @@ -1593,7 +1588,7 @@ mod test { .with_body(test_json::LEAVE_SYNC_EVENT.to_string()) .create(); - joined_client.sync(SyncSettings::default(), None).await.unwrap(); + joined_client.sync(SyncSettings::default()).await.unwrap(); let room = joined_client.get_joined_room(&room_id).await; assert!(room.is_none()); @@ -1625,7 +1620,7 @@ mod test { let sync_settings = SyncSettings::new().timeout(Duration::from_millis(3000)); - let _response = client.sync(sync_settings, None).await.unwrap(); + let _response = client.sync(sync_settings).await.unwrap(); // let bc = &client.base_client; // let ignored_users = bc.ignored_users.read().await; @@ -2248,7 +2243,7 @@ mod test { let sync_settings = SyncSettings::new().timeout(Duration::from_millis(3000)); - let _response = client.sync(sync_settings, None).await.unwrap(); + let _response = client.sync(sync_settings).await.unwrap(); let rooms_lock = &client.base_client.joined_rooms(); let rooms = rooms_lock.read().await; @@ -2284,7 +2279,7 @@ mod test { client.restore_login(session).await.unwrap(); let sync_settings = SyncSettings::new().timeout(Duration::from_millis(3000)); - let _response = client.sync(sync_settings, None).await.unwrap(); + let _response = client.sync(sync_settings).await.unwrap(); let mut room_names = vec![]; for room in client.joined_rooms().read().await.values() { @@ -2316,7 +2311,7 @@ mod test { .with_body(test_json::INVITE_SYNC.to_string()) .create(); - let _response = client.sync(SyncSettings::default(), None).await.unwrap(); + let _response = client.sync(SyncSettings::default()).await.unwrap(); assert!(client.joined_rooms().read().await.is_empty()); assert!(client.left_rooms().read().await.is_empty()); @@ -2350,7 +2345,7 @@ mod test { .with_body(test_json::LEAVE_SYNC.to_string()) .create(); - let _response = client.sync(SyncSettings::default(), None).await.unwrap(); + let _response = client.sync(SyncSettings::default()).await.unwrap(); assert!(client.joined_rooms().read().await.is_empty()); assert!(!client.left_rooms().read().await.is_empty()); @@ -2394,14 +2389,14 @@ mod test { let sync_settings = SyncSettings::new().timeout(std::time::Duration::from_millis(3000)); // gather state to save to the db, the first time through loading will be skipped - let _ = client.sync(sync_settings.clone(), None).await.unwrap(); + let _ = client.sync(sync_settings.clone()).await.unwrap(); // now syncing the client will update from the state store let config = ClientConfig::default().state_store(Box::new(JsonStore::open(dir.path()).unwrap())); let client = Client::new_with_config(homeserver, config).unwrap(); client.restore_login(session.clone()).await.unwrap(); - client.sync(sync_settings, None).await.unwrap(); + client.sync(sync_settings).await.unwrap(); let base_client = &client.base_client; @@ -2462,7 +2457,7 @@ mod test { let sync_settings = SyncSettings::new().timeout(Duration::from_millis(3000)); - let response = client.sync(sync_settings, None).await.unwrap(); + let response = client.sync(sync_settings).await.unwrap(); assert_ne!(response.next_batch, ""); @@ -2492,7 +2487,7 @@ mod test { let sync_settings = SyncSettings::new().timeout(Duration::from_millis(3000)); - let _response = client.sync(sync_settings, None).await.unwrap(); + let _response = client.sync(sync_settings).await.unwrap(); let mut names = vec![]; for r in client.joined_rooms().read().await.values() { From cc4ae3db1ed1d3c4c692fb7b7c88e0bb92b59c58 Mon Sep 17 00:00:00 2001 From: Black Hat Date: Thu, 16 Jul 2020 06:13:35 -0700 Subject: [PATCH 3/4] Client::SyncSettings: Include sync filter --- matrix_sdk/src/client.rs | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/matrix_sdk/src/client.rs b/matrix_sdk/src/client.rs index af962e7a..2101bea5 100644 --- a/matrix_sdk/src/client.rs +++ b/matrix_sdk/src/client.rs @@ -203,6 +203,7 @@ impl ClientConfig { #[derive(Debug, Default, Clone)] /// Settings for a sync call. pub struct SyncSettings { + pub(crate) filter: Option, pub(crate) timeout: Option, pub(crate) token: Option, pub(crate) full_state: bool, @@ -235,6 +236,17 @@ impl SyncSettings { self } + /// Set the sync filter. + /// It can be either the filter ID, or the definition for the filter. + /// + /// # Arguments + /// + /// * `filter` - The filter configuration that should be used for the sync call. + pub fn filter(mut self, filter: sync_events::Filter) -> Self { + self.filter = Some(filter); + self + } + /// Should the server return the full state from the start of the timeline. /// /// This does nothing if no sync token is set. @@ -1222,7 +1234,7 @@ impl Client { #[instrument] pub async fn sync(&self, sync_settings: SyncSettings) -> Result { let request = sync_events::Request { - filter: None, + filter: sync_settings.filter, since: sync_settings.token, full_state: sync_settings.full_state, set_presence: sync_events::SetPresence::Online, From 7a72949613a8f95e965ebd9c624c305df3327103 Mon Sep 17 00:00:00 2001 From: Black Hat Date: Thu, 16 Jul 2020 15:55:55 -0700 Subject: [PATCH 4/4] Client::sync_forever(): Add filter in next iteration. --- matrix_sdk/src/client.rs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/matrix_sdk/src/client.rs b/matrix_sdk/src/client.rs index 2101bea5..831547c8 100644 --- a/matrix_sdk/src/client.rs +++ b/matrix_sdk/src/client.rs @@ -1314,6 +1314,7 @@ impl Client { C: Future, { let mut sync_settings = sync_settings; + let filter = sync_settings.filter.clone(); let mut last_sync_time: Option = None; if sync_settings.token.is_none() { @@ -1373,6 +1374,9 @@ impl Client { .await .expect("No sync token found after initial sync"), ); + if let Some(f) = filter.as_ref() { + sync_settings = sync_settings.filter(f.clone()); + } } }