Skip to content

Commit 91f04a2

Browse files
committed
feat(sdk): Split RoomEventCacheUpdate::SyncEvents.
This patch splits `RoomEventCacheUpdate::SyncEvents` into 2 new variants: `AddTimelineEvents` and `AddEphemeralEvents`. This patch takes this opportunity to update `matrix_sdk_ui::timeline` a little bit too. `handle_sync_events` is renamed `handle_ephemeral_events`, and the `SyncTimelineEvent` argument is removed: it's possible to use `add_events_at` directly to handle the `SyncTimelineEvent`s.
1 parent be22621 commit 91f04a2

File tree

5 files changed

+80
-56
lines changed

5 files changed

+80
-56
lines changed

crates/matrix-sdk-ui/src/timeline/builder.rs

Lines changed: 25 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,11 @@
1515
use std::{collections::BTreeSet, sync::Arc};
1616

1717
use futures_util::{pin_mut, StreamExt};
18-
use matrix_sdk::{event_cache::RoomEventCacheUpdate, executor::spawn, Room};
18+
use matrix_sdk::{
19+
event_cache::{EventsOrigin, RoomEventCacheUpdate},
20+
executor::spawn,
21+
Room,
22+
};
1923
use ruma::{events::AnySyncTimelineEvent, RoomVersionId};
2024
use tokio::sync::{broadcast, mpsc};
2125
use tracing::{info, info_span, trace, warn, Instrument, Span};
@@ -27,7 +31,10 @@ use super::{
2731
queue::send_queued_messages,
2832
Error, Timeline, TimelineDropHandle, TimelineFocus,
2933
};
30-
use crate::{timeline::event_item::RemoteEventOrigin, unable_to_decrypt_hook::UtdHookManager};
34+
use crate::{
35+
timeline::{event_item::RemoteEventOrigin, inner::TimelineEnd},
36+
unable_to_decrypt_hook::UtdHookManager,
37+
};
3138

3239
/// Builder that allows creating and configuring various parts of a
3340
/// [`Timeline`].
@@ -220,12 +227,23 @@ impl TimelineBuilder {
220227
inner.clear().await;
221228
}
222229

223-
RoomEventCacheUpdate::SyncEvents { timeline, ephemeral } => {
224-
trace!("Received new events from sync.");
230+
RoomEventCacheUpdate::AddTimelineEvents { events, origin } => {
231+
trace!("Received new timeline events from sync.");
232+
233+
inner.add_events_at(
234+
events,
235+
TimelineEnd::Back,
236+
match origin {
237+
EventsOrigin::Sync => RemoteEventOrigin::Sync,
238+
}
239+
).await;
240+
}
241+
242+
RoomEventCacheUpdate::AddEphemeralEvents { events } => {
243+
trace!("Received new ephemeral events from sync.");
225244

226-
// TODO: (bnjbvr) ephemeral should be handled by the event cache, and
227-
// we should replace this with a simple `add_events_at`.
228-
inner.handle_sync_events(timeline, ephemeral).await;
245+
// TODO: (bnjbvr) ephemeral should be handled by the event cache.
246+
inner.handle_ephemeral_events(events).await;
229247
}
230248

231249
RoomEventCacheUpdate::UpdateMembers { ambiguity_changes } => {

crates/matrix-sdk-ui/src/timeline/inner/mod.rs

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -606,13 +606,12 @@ impl<P: RoomDataProvider> TimelineInner<P> {
606606
self.state.write().await.handle_fully_read_marker(fully_read_event_id);
607607
}
608608

609-
pub(super) async fn handle_sync_events(
609+
pub(super) async fn handle_ephemeral_events(
610610
&self,
611-
events: Vec<SyncTimelineEvent>,
612-
ephemeral: Vec<Raw<AnySyncEphemeralRoomEvent>>,
611+
events: Vec<Raw<AnySyncEphemeralRoomEvent>>,
613612
) {
614613
let mut state = self.state.write().await;
615-
state.handle_sync_events(events, ephemeral, &self.room_data_provider, &self.settings).await;
614+
state.handle_ephemeral_events(events, &self.room_data_provider).await;
616615
}
617616

618617
#[cfg(test)]

crates/matrix-sdk-ui/src/timeline/inner/state.rs

Lines changed: 17 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -127,37 +127,28 @@ impl TimelineInnerState {
127127
}
128128

129129
#[instrument(skip_all)]
130-
pub(super) async fn handle_sync_events<P: RoomDataProvider>(
130+
pub(super) async fn handle_ephemeral_events<P: RoomDataProvider>(
131131
&mut self,
132-
events: Vec<SyncTimelineEvent>,
133-
ephemeral: Vec<Raw<AnySyncEphemeralRoomEvent>>,
132+
events: Vec<Raw<AnySyncEphemeralRoomEvent>>,
134133
room_data_provider: &P,
135-
settings: &TimelineInnerSettings,
136134
) {
135+
if events.is_empty() {
136+
return;
137+
}
138+
137139
let mut txn = self.transaction();
138140

139-
txn.add_events_at(
140-
events,
141-
TimelineEnd::Back,
142-
RemoteEventOrigin::Sync,
143-
room_data_provider,
144-
settings,
145-
)
146-
.await;
147-
148-
if !ephemeral.is_empty() {
149-
trace!("Handling ephemeral room events");
150-
let own_user_id = room_data_provider.own_user_id();
151-
for raw_event in ephemeral {
152-
match raw_event.deserialize() {
153-
Ok(AnySyncEphemeralRoomEvent::Receipt(ev)) => {
154-
txn.handle_explicit_read_receipts(ev.content, own_user_id);
155-
}
156-
Ok(_) => {}
157-
Err(e) => {
158-
let event_type = raw_event.get_field::<String>("type").ok().flatten();
159-
warn!(event_type, "Failed to deserialize ephemeral event: {e}");
160-
}
141+
trace!("Handling ephemeral room events");
142+
let own_user_id = room_data_provider.own_user_id();
143+
for raw_event in events {
144+
match raw_event.deserialize() {
145+
Ok(AnySyncEphemeralRoomEvent::Receipt(ev)) => {
146+
txn.handle_explicit_read_receipts(ev.content, own_user_id);
147+
}
148+
Ok(_) => {}
149+
Err(e) => {
150+
let event_type = raw_event.get_field::<String>("type").ok().flatten();
151+
warn!(event_type, "Failed to deserialize ephemeral event: {e}");
161152
}
162153
}
163154
}

crates/matrix-sdk/src/event_cache/mod.rs

Lines changed: 26 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,6 @@
4444
use std::{
4545
collections::BTreeMap,
4646
fmt::Debug,
47-
result::Result as StdResult,
4847
sync::{Arc, OnceLock},
4948
};
5049

@@ -60,10 +59,7 @@ use ruma::{
6059
OwnedEventId, OwnedRoomId, RoomId,
6160
};
6261
use tokio::sync::{
63-
broadcast::{
64-
error::{RecvError, SendError},
65-
Receiver, Sender,
66-
},
62+
broadcast::{error::RecvError, Receiver, Sender},
6763
Mutex, RwLock, RwLockWriteGuard,
6864
};
6965
use tracing::{error, info_span, instrument, trace, warn, Instrument as _, Span};
@@ -676,7 +672,13 @@ impl RoomEventCacheInner {
676672
}
677673

678674
// The ordering is important here.
679-
let _ = self.sender.send(RoomEventCacheUpdate::SyncEvents { timeline, ephemeral })?;
675+
let _ = self.sender.send(RoomEventCacheUpdate::AddTimelineEvents {
676+
events: sync_timeline_events,
677+
origin: EventsOrigin::Sync,
678+
});
679+
let _ = self
680+
.sender
681+
.send(RoomEventCacheUpdate::AddEphemeralEvents { events: sync_ephemeral_events });
680682
let _ = self.sender.send(RoomEventCacheUpdate::UpdateMembers { ambiguity_changes });
681683

682684
Ok(())
@@ -721,16 +723,30 @@ pub enum RoomEventCacheUpdate {
721723
ambiguity_changes: BTreeMap<OwnedEventId, AmbiguityChange>,
722724
},
723725

724-
/// The room has new events.
725-
SyncEvents {
726+
/// The room has received new timeline events.
727+
AddTimelineEvents {
726728
/// All the new events that have been added to the room's timeline.
727-
timeline: Vec<SyncTimelineEvent>,
729+
events: Vec<SyncTimelineEvent>,
730+
731+
/// Where the events are coming from.
732+
origin: EventsOrigin,
733+
},
734+
735+
/// The room has received new ephemeral events.
736+
AddEphemeralEvents {
728737
/// XXX: this is temporary, until read receipts are handled in the event
729738
/// cache
730-
ephemeral: Vec<Raw<AnySyncEphemeralRoomEvent>>,
739+
events: Vec<Raw<AnySyncEphemeralRoomEvent>>,
731740
},
732741
}
733742

743+
/// Indicate where events are coming from.
744+
#[derive(Debug, Clone)]
745+
pub enum EventsOrigin {
746+
/// Events are coming from a sync.
747+
Sync,
748+
}
749+
734750
#[cfg(test)]
735751
mod tests {
736752
use assert_matches2::assert_matches;

crates/matrix-sdk/tests/integration/event_cache.rs

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -104,9 +104,9 @@ async fn test_add_initial_events() {
104104
.expect("should've received a room event cache update");
105105

106106
// Which contains the event that was sent beforehand.
107-
assert_let!(RoomEventCacheUpdate::SyncEvents { timeline: timeline_events, .. } = update);
108-
assert_eq!(timeline_events.len(), 1);
109-
assert_event_matches_msg(&timeline_events[0], "bonjour monde");
107+
assert_let!(RoomEventCacheUpdate::AddTimelineEvents { events, .. } = update);
108+
assert_eq!(events.len(), 1);
109+
assert_event_matches_msg(&events[0], "bonjour monde");
110110

111111
// And when I later add initial events to this room,
112112

@@ -130,9 +130,9 @@ async fn test_add_initial_events() {
130130
.await
131131
.expect("timeout after receiving a sync update")
132132
.expect("should've received a room event cache update");
133-
assert_let!(RoomEventCacheUpdate::SyncEvents { timeline: timeline_events, .. } = update);
134-
assert_eq!(timeline_events.len(), 1);
135-
assert_event_matches_msg(&timeline_events[0], "new choice!");
133+
assert_let!(RoomEventCacheUpdate::AddTimelineEvents { events, .. } = update);
134+
assert_eq!(events.len(), 1);
135+
assert_event_matches_msg(&events[0], "new choice!");
136136

137137
// That's all, folks!
138138
assert!(subscriber.is_empty());
@@ -233,9 +233,9 @@ async fn test_ignored_unignored() {
233233
.expect("timeout after receiving a sync update")
234234
.expect("should've received a room event cache update");
235235

236-
assert_let!(RoomEventCacheUpdate::SyncEvents { timeline: timeline_events, .. } = update);
237-
assert_eq!(timeline_events.len(), 1);
238-
assert_event_matches_msg(&timeline_events[0], "i don't like this dexter");
236+
assert_let!(RoomEventCacheUpdate::AddTimelineEvents { events, .. } = update);
237+
assert_eq!(events.len(), 1);
238+
assert_event_matches_msg(&events[0], "i don't like this dexter");
239239

240240
// The other room has been cleared too.
241241
{

0 commit comments

Comments
 (0)