Skip to content

Commit 5178cbb

Browse files
authored
Merge pull request #3551 from Hywan/fix-ui-roomlist-slidingsyncroom
feat(ui): `RoomListService::room` is no longer async!
2 parents 868e821 + a7ff058 commit 5178cbb

File tree

5 files changed

+50
-48
lines changed

5 files changed

+50
-48
lines changed

bindings/matrix-sdk-ffi/src/room_list.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -125,11 +125,11 @@ impl RoomListService {
125125
})))
126126
}
127127

128-
async fn room(&self, room_id: String) -> Result<Arc<RoomListItem>, RoomListError> {
128+
fn room(&self, room_id: String) -> Result<Arc<RoomListItem>, RoomListError> {
129129
let room_id = <&RoomId>::try_from(room_id.as_str()).map_err(RoomListError::from)?;
130130

131131
Ok(Arc::new(RoomListItem {
132-
inner: Arc::new(self.inner.room(room_id).await?),
132+
inner: Arc::new(self.inner.room(room_id)?),
133133
utd_hook: self.utd_hook.clone(),
134134
}))
135135
}
@@ -172,7 +172,7 @@ pub struct RoomList {
172172
inner: Arc<matrix_sdk_ui::room_list_service::RoomList>,
173173
}
174174

175-
#[uniffi::export(async_runtime = "tokio")]
175+
#[uniffi::export]
176176
impl RoomList {
177177
fn loading_state(
178178
&self,
@@ -233,8 +233,8 @@ impl RoomList {
233233
}
234234
}
235235

236-
async fn room(&self, room_id: String) -> Result<Arc<RoomListItem>, RoomListError> {
237-
self.room_list_service.room(room_id).await
236+
fn room(&self, room_id: String) -> Result<Arc<RoomListItem>, RoomListError> {
237+
self.room_list_service.room(room_id)
238238
}
239239
}
240240

crates/matrix-sdk-ui/src/room_list_service/mod.rs

Lines changed: 16 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,12 @@ mod room;
6666
mod room_list;
6767
mod state;
6868

69-
use std::{future::ready, num::NonZeroUsize, sync::Arc, time::Duration};
69+
use std::{
70+
future::ready,
71+
num::NonZeroUsize,
72+
sync::{Arc, Mutex as StdMutex},
73+
time::Duration,
74+
};
7075

7176
use async_stream::stream;
7277
use eyeball::{SharedObservable, Subscriber};
@@ -90,10 +95,7 @@ use ruma::{
9095
};
9196
pub use state::*;
9297
use thiserror::Error;
93-
use tokio::{
94-
sync::{Mutex, RwLock},
95-
time::timeout,
96-
};
98+
use tokio::{sync::Mutex, time::timeout};
9799

98100
use crate::timeline;
99101

@@ -112,7 +114,7 @@ pub struct RoomListService {
112114
state: SharedObservable<State>,
113115

114116
/// Room cache, to avoid recreating `Room`s every time users fetch them.
115-
rooms: Arc<RwLock<RingBuffer<Room>>>,
117+
rooms: Arc<StdMutex<RingBuffer<Room>>>,
116118

117119
/// The current viewport ranges.
118120
///
@@ -202,7 +204,7 @@ impl RoomListService {
202204
client,
203205
sliding_sync,
204206
state: SharedObservable::new(State::Init),
205-
rooms: Arc::new(RwLock::new(RingBuffer::new(Self::ROOM_OBJECT_CACHE_SIZE))),
207+
rooms: Arc::new(StdMutex::new(RingBuffer::new(Self::ROOM_OBJECT_CACHE_SIZE))),
206208
viewport_ranges: Mutex::new(vec![VISIBLE_ROOMS_DEFAULT_RANGE]),
207209
})
208210
}
@@ -424,21 +426,17 @@ impl RoomListService {
424426
}
425427

426428
/// Get a [`Room`] if it exists.
427-
pub async fn room(&self, room_id: &RoomId) -> Result<Room, Error> {
428-
{
429-
let rooms = self.rooms.read().await;
429+
pub fn room(&self, room_id: &RoomId) -> Result<Room, Error> {
430+
let mut rooms = self.rooms.lock().unwrap();
430431

431-
if let Some(room) = rooms.iter().rfind(|room| room.id() == room_id) {
432-
return Ok(room.clone());
433-
}
432+
if let Some(room) = rooms.iter().rfind(|room| room.id() == room_id) {
433+
return Ok(room.clone());
434434
}
435435

436-
let room = match self.sliding_sync.get_room(room_id).await {
437-
Some(room) => Room::new(self.sliding_sync.clone(), room)?,
438-
None => return Err(Error::RoomNotFound(room_id.to_owned())),
439-
};
436+
let room = Room::new(&self.client, room_id, &self.sliding_sync)?;
440437

441-
self.rooms.write().await.push(room.clone());
438+
// Save for later.
439+
rooms.push(room.clone());
442440

443441
Ok(room)
444442
}

crates/matrix-sdk-ui/src/room_list_service/room.rs

Lines changed: 20 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
use std::{ops::Deref, sync::Arc};
1818

1919
use async_once_cell::OnceCell as AsyncOnceCell;
20-
use matrix_sdk::{event_cache, SlidingSync, SlidingSyncRoom};
20+
use matrix_sdk::{Client, SlidingSync};
2121
use ruma::{api::client::sync::sync_events::v4::RoomSubscription, events::StateEventType, RoomId};
2222

2323
use super::Error;
@@ -39,9 +39,6 @@ struct RoomInner {
3939
/// The Sliding Sync where everything comes from.
4040
sliding_sync: Arc<SlidingSync>,
4141

42-
/// The Sliding Sync room.
43-
sliding_sync_room: SlidingSyncRoom,
44-
4542
/// The underlying client room.
4643
room: matrix_sdk::Room,
4744

@@ -60,18 +57,16 @@ impl Deref for Room {
6057
impl Room {
6158
/// Create a new `Room`.
6259
pub(super) fn new(
63-
sliding_sync: Arc<SlidingSync>,
64-
sliding_sync_room: SlidingSyncRoom,
60+
client: &Client,
61+
room_id: &RoomId,
62+
sliding_sync: &Arc<SlidingSync>,
6563
) -> Result<Self, Error> {
66-
let room = sliding_sync_room
67-
.client()
68-
.get_room(sliding_sync_room.room_id())
69-
.ok_or_else(|| Error::RoomNotFound(sliding_sync_room.room_id().to_owned()))?;
64+
let room =
65+
client.get_room(room_id).ok_or_else(|| Error::RoomNotFound(room_id.to_owned()))?;
7066

7167
Ok(Self {
7268
inner: Arc::new(RoomInner {
73-
sliding_sync,
74-
sliding_sync_room,
69+
sliding_sync: sliding_sync.clone(),
7570
room,
7671
timeline: AsyncOnceCell::new(),
7772
}),
@@ -185,18 +180,27 @@ impl Room {
185180
}
186181

187182
/// Create a new [`TimelineBuilder`] with the default configuration.
188-
pub async fn default_room_timeline_builder(&self) -> event_cache::Result<TimelineBuilder> {
183+
pub async fn default_room_timeline_builder(&self) -> Result<TimelineBuilder, Error> {
189184
// TODO we can remove this once the event cache handles his own cache.
185+
186+
let sliding_sync_room =
187+
self.inner
188+
.sliding_sync
189+
.get_room(self.inner.room.room_id())
190+
.await
191+
.ok_or_else(|| Error::RoomNotFound(self.inner.room.room_id().to_owned()))?;
192+
190193
self.inner
191194
.room
192195
.client()
193196
.event_cache()
194197
.add_initial_events(
195198
self.inner.room.room_id(),
196-
self.inner.sliding_sync_room.timeline_queue().iter().cloned().collect(),
197-
self.inner.sliding_sync_room.prev_batch(),
199+
sliding_sync_room.timeline_queue().iter().cloned().collect(),
200+
sliding_sync_room.prev_batch(),
198201
)
199-
.await?;
202+
.await
203+
.map_err(Error::EventCache)?;
200204

201205
Ok(Timeline::builder(&self.inner.room).track_read_marker_and_receipts())
202206
}

crates/matrix-sdk-ui/tests/integration/room_list_service.rs

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2072,15 +2072,15 @@ async fn test_room() -> Result<(), Error> {
20722072
},
20732073
};
20742074

2075-
let room0 = room_list.room(room_id_0).await?;
2075+
let room0 = room_list.room(room_id_0)?;
20762076

20772077
// Room has received a name from sliding sync.
20782078
assert_eq!(room0.cached_display_name(), Some("Room #0".to_owned()));
20792079

20802080
// Room has received an avatar from sliding sync.
20812081
assert_eq!(room0.avatar_url(), Some(mxc_uri!("mxc://homeserver/media").to_owned()));
20822082

2083-
let room1 = room_list.room(room_id_1).await?;
2083+
let room1 = room_list.room(room_id_1)?;
20842084

20852085
// Room has not received a name from sliding sync, then it's calculated.
20862086
assert_eq!(room1.cached_display_name(), Some("Empty Room".to_owned()));
@@ -2144,7 +2144,7 @@ async fn test_room_not_found() -> Result<(), Error> {
21442144
let room_id = room_id!("!foo:bar.org");
21452145

21462146
assert_matches!(
2147-
room_list.room(room_id).await,
2147+
room_list.room(room_id),
21482148
Err(Error::RoomNotFound(error_room_id)) => {
21492149
assert_eq!(error_room_id, room_id.to_owned());
21502150
}
@@ -2208,7 +2208,7 @@ async fn test_room_subscription() -> Result<(), Error> {
22082208
},
22092209
};
22102210

2211-
let room1 = room_list.room(room_id_1).await.unwrap();
2211+
let room1 = room_list.room(room_id_1).unwrap();
22122212

22132213
// Subscribe.
22142214

@@ -2253,7 +2253,7 @@ async fn test_room_subscription() -> Result<(), Error> {
22532253
// Unsubscribe.
22542254

22552255
room1.unsubscribe();
2256-
room_list.room(room_id_2).await?.unsubscribe(); // unsubscribe from a room that has no subscription.
2256+
room_list.room(room_id_2)?.unsubscribe(); // unsubscribe from a room that has no subscription.
22572257

22582258
sync_then_assert_request_and_fake_response! {
22592259
[server, room_list, sync]
@@ -2316,7 +2316,7 @@ async fn test_room_unread_notifications() -> Result<(), Error> {
23162316
},
23172317
};
23182318

2319-
let room = room_list.room(room_id).await.unwrap();
2319+
let room = room_list.room(room_id).unwrap();
23202320

23212321
assert_matches!(
23222322
room.unread_notification_counts(),
@@ -2391,7 +2391,7 @@ async fn test_room_timeline() -> Result<(), Error> {
23912391
},
23922392
};
23932393

2394-
let room = room_list.room(room_id).await?;
2394+
let room = room_list.room(room_id)?;
23952395
room.init_timeline_with_builder(room.default_room_timeline_builder().await.unwrap()).await?;
23962396
let timeline = room.timeline().unwrap();
23972397

@@ -2473,7 +2473,7 @@ async fn test_room_latest_event() -> Result<(), Error> {
24732473
},
24742474
};
24752475

2476-
let room = room_list.room(room_id).await?;
2476+
let room = room_list.room(room_id)?;
24772477
room.init_timeline_with_builder(room.default_room_timeline_builder().await.unwrap()).await?;
24782478

24792479
// The latest event does not exist.

labs/multiverse/src/main.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -227,7 +227,7 @@ impl App {
227227
all_rooms.into_iter().filter(|room_id| !previous_ui_rooms.contains_key(room_id))
228228
{
229229
// Retrieve the room list service's Room.
230-
let Ok(ui_room) = sync_service.room_list_service().room(&room_id).await else {
230+
let Ok(ui_room) = sync_service.room_list_service().room(&room_id) else {
231231
error!("error when retrieving room after an update");
232232
continue;
233233
};

0 commit comments

Comments
 (0)