Skip to content

Commit 1c1053a

Browse files
committed
event cache: internalize handling of the account data
(By moving handling of the fully read marker into the event cache itself.)
1 parent 7ac153f commit 1c1053a

File tree

4 files changed

+62
-66
lines changed

4 files changed

+62
-66
lines changed

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

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -185,18 +185,17 @@ impl TimelineBuilder {
185185
inner.clear().await;
186186
}
187187

188-
RoomEventCacheUpdate::Append {
189-
events,
190-
account_data,
191-
ephemeral,
192-
ambiguity_changes,
193-
} => {
188+
RoomEventCacheUpdate::UpdateReadMarker { event_id } => {
189+
trace!(target = %event_id, "Handling fully read marker.");
190+
inner.handle_fully_read_marker(event_id).await;
191+
}
192+
193+
RoomEventCacheUpdate::Append { events, ephemeral, ambiguity_changes } => {
194194
trace!("Received new events");
195195

196-
// TODO: (bnjbvr) account_data and ephemeral should be handled by the
197-
// event cache, and we should replace this with a simple
198-
// `handle_add_events`.
199-
inner.handle_sync_events(events, account_data, ephemeral).await;
196+
// TODO: (bnjbvr) ephemeral should be handled by the event cache, and
197+
// we should replace this with a simple `add_events_at`.
198+
inner.handle_sync_events(events, ephemeral).await;
200199

201200
let member_ambiguity_changes = ambiguity_changes
202201
.values()

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

Lines changed: 7 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -41,8 +41,8 @@ use ruma::{
4141
message::{MessageType, Relation},
4242
redaction::RoomRedactionEventContent,
4343
},
44-
AnyMessageLikeEventContent, AnyRoomAccountDataEvent, AnySyncEphemeralRoomEvent,
45-
AnySyncMessageLikeEvent, AnySyncTimelineEvent, MessageLikeEventType,
44+
AnyMessageLikeEventContent, AnySyncEphemeralRoomEvent, AnySyncMessageLikeEvent,
45+
AnySyncTimelineEvent, MessageLikeEventType,
4646
},
4747
serde::Raw,
4848
EventId, OwnedEventId, OwnedTransactionId, RoomVersionId, TransactionId, UserId,
@@ -426,22 +426,17 @@ impl<P: RoomDataProvider> TimelineInner<P> {
426426
self.state.write().await.clear();
427427
}
428428

429+
pub(super) async fn handle_fully_read_marker(&self, fully_read_event_id: OwnedEventId) {
430+
self.state.write().await.handle_fully_read_marker(fully_read_event_id);
431+
}
432+
429433
pub(super) async fn handle_sync_events(
430434
&self,
431435
events: Vec<SyncTimelineEvent>,
432-
account_data: Vec<Raw<AnyRoomAccountDataEvent>>,
433436
ephemeral: Vec<Raw<AnySyncEphemeralRoomEvent>>,
434437
) {
435438
let mut state = self.state.write().await;
436-
state
437-
.handle_sync_events(
438-
events,
439-
account_data,
440-
ephemeral,
441-
&self.room_data_provider,
442-
&self.settings,
443-
)
444-
.await;
439+
state.handle_sync_events(events, ephemeral, &self.room_data_provider, &self.settings).await;
445440
}
446441

447442
#[cfg(test)]

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

Lines changed: 9 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ use ruma::events::receipt::ReceiptEventContent;
2323
use ruma::{
2424
events::{
2525
relation::Annotation, room::redaction::RoomRedactionEventContent,
26-
AnyMessageLikeEventContent, AnyRoomAccountDataEvent, AnySyncEphemeralRoomEvent,
26+
AnyMessageLikeEventContent, AnySyncEphemeralRoomEvent,
2727
},
2828
push::Action,
2929
serde::Raw,
@@ -109,11 +109,18 @@ impl TimelineInnerState {
109109
handle_many_res
110110
}
111111

112+
/// Marks the given event as fully read, using the read marker received from
113+
/// sync.
114+
pub(super) fn handle_fully_read_marker(&mut self, fully_read_event_id: OwnedEventId) {
115+
let mut txn = self.transaction();
116+
txn.set_fully_read_event(fully_read_event_id);
117+
txn.commit();
118+
}
119+
112120
#[instrument(skip_all)]
113121
pub(super) async fn handle_sync_events<P: RoomDataProvider>(
114122
&mut self,
115123
events: Vec<SyncTimelineEvent>,
116-
account_data: Vec<Raw<AnyRoomAccountDataEvent>>,
117124
ephemeral: Vec<Raw<AnySyncEphemeralRoomEvent>>,
118125
room_data_provider: &P,
119126
settings: &TimelineInnerSettings,
@@ -128,20 +135,6 @@ impl TimelineInnerState {
128135
)
129136
.await;
130137

131-
trace!("Handling account data");
132-
for raw_event in account_data {
133-
match raw_event.deserialize() {
134-
Ok(AnyRoomAccountDataEvent::FullyRead(ev)) => {
135-
txn.set_fully_read_event(ev.content.event_id);
136-
}
137-
Ok(_) => {}
138-
Err(e) => {
139-
let event_type = raw_event.get_field::<String>("type").ok().flatten();
140-
warn!(event_type, "Failed to deserialize account data: {e}");
141-
}
142-
}
143-
}
144-
145138
if !ephemeral.is_empty() {
146139
trace!("Handling ephemeral room events");
147140
let own_user_id = room_data_provider.own_user_id();

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

Lines changed: 37 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -252,13 +252,7 @@ impl EventCache {
252252

253253
room_cache
254254
.inner
255-
.replace_all_events_by(
256-
events,
257-
prev_batch,
258-
Default::default(),
259-
Default::default(),
260-
Default::default(),
261-
)
255+
.replace_all_events_by(events, prev_batch, Default::default(), Default::default())
262256
.await?;
263257

264258
Ok(())
@@ -462,22 +456,47 @@ impl RoomEventCacheInner {
462456
}
463457
}
464458

459+
fn handle_account_data(&self, account_data: Vec<Raw<AnyRoomAccountDataEvent>>) {
460+
trace!("Handling account data");
461+
for raw_event in account_data {
462+
match raw_event.deserialize() {
463+
Ok(AnyRoomAccountDataEvent::FullyRead(ev)) => {
464+
// Propagate to observers. (We ignore the error if there aren't any.)
465+
let _ = self.sender.send(RoomEventCacheUpdate::UpdateReadMarker {
466+
event_id: ev.content.event_id,
467+
});
468+
}
469+
470+
Ok(_) => {
471+
// We're not interested in other room account data updates,
472+
// at this point.
473+
}
474+
475+
Err(e) => {
476+
let event_type = raw_event.get_field::<String>("type").ok().flatten();
477+
warn!(event_type, "Failed to deserialize account data: {e}");
478+
}
479+
}
480+
}
481+
}
482+
465483
async fn handle_joined_room_update(&self, updates: JoinedRoomUpdate) -> Result<()> {
466484
self.handle_timeline(
467485
updates.timeline,
468486
updates.ephemeral.clone(),
469-
updates.account_data,
470487
updates.ambiguity_changes,
471488
)
472489
.await?;
490+
491+
self.handle_account_data(updates.account_data);
492+
473493
Ok(())
474494
}
475495

476496
async fn handle_timeline(
477497
&self,
478498
timeline: Timeline,
479499
ephemeral: Vec<Raw<AnySyncEphemeralRoomEvent>>,
480-
account_data: Vec<Raw<AnyRoomAccountDataEvent>>,
481500
ambiguity_changes: BTreeMap<OwnedEventId, AmbiguityChange>,
482501
) -> Result<()> {
483502
if timeline.limited {
@@ -489,7 +508,6 @@ impl RoomEventCacheInner {
489508
self.replace_all_events_by(
490509
timeline.events,
491510
timeline.prev_batch,
492-
account_data,
493511
ephemeral,
494512
ambiguity_changes,
495513
)
@@ -501,7 +519,6 @@ impl RoomEventCacheInner {
501519
self.append_new_events(
502520
timeline.events,
503521
timeline.prev_batch,
504-
account_data,
505522
ephemeral,
506523
ambiguity_changes,
507524
)
@@ -512,8 +529,7 @@ impl RoomEventCacheInner {
512529
}
513530

514531
async fn handle_left_room_update(&self, updates: LeftRoomUpdate) -> Result<()> {
515-
self.handle_timeline(updates.timeline, Vec::new(), Vec::new(), updates.ambiguity_changes)
516-
.await?;
532+
self.handle_timeline(updates.timeline, Vec::new(), updates.ambiguity_changes).await?;
517533
Ok(())
518534
}
519535

@@ -523,7 +539,6 @@ impl RoomEventCacheInner {
523539
&self,
524540
events: Vec<SyncTimelineEvent>,
525541
prev_batch: Option<String>,
526-
account_data: Vec<Raw<AnyRoomAccountDataEvent>>,
527542
ephemeral: Vec<Raw<AnySyncEphemeralRoomEvent>>,
528543
ambiguity_changes: BTreeMap<OwnedEventId, AmbiguityChange>,
529544
) -> Result<()> {
@@ -541,7 +556,6 @@ impl RoomEventCacheInner {
541556
room_events,
542557
events,
543558
prev_batch,
544-
account_data,
545559
ephemeral,
546560
ambiguity_changes,
547561
)
@@ -554,15 +568,13 @@ impl RoomEventCacheInner {
554568
&self,
555569
events: Vec<SyncTimelineEvent>,
556570
prev_batch: Option<String>,
557-
account_data: Vec<Raw<AnyRoomAccountDataEvent>>,
558571
ephemeral: Vec<Raw<AnySyncEphemeralRoomEvent>>,
559572
ambiguity_changes: BTreeMap<OwnedEventId, AmbiguityChange>,
560573
) -> Result<()> {
561574
self.append_events_locked_impl(
562575
self.events.write().await,
563576
events,
564577
prev_batch,
565-
account_data,
566578
ephemeral,
567579
ambiguity_changes,
568580
)
@@ -579,14 +591,12 @@ impl RoomEventCacheInner {
579591
mut room_events: RwLockWriteGuard<'_, RoomEvents>,
580592
events: Vec<SyncTimelineEvent>,
581593
prev_batch: Option<String>,
582-
account_data: Vec<Raw<AnyRoomAccountDataEvent>>,
583594
ephemeral: Vec<Raw<AnySyncEphemeralRoomEvent>>,
584595
ambiguity_changes: BTreeMap<OwnedEventId, AmbiguityChange>,
585596
) -> Result<()> {
586597
if events.is_empty()
587598
&& prev_batch.is_none()
588599
&& ephemeral.is_empty()
589-
&& account_data.is_empty()
590600
&& ambiguity_changes.is_empty()
591601
{
592602
return Ok(());
@@ -608,12 +618,8 @@ impl RoomEventCacheInner {
608618
self.pagination_token_notifier.notify_one();
609619
}
610620

611-
let _ = self.sender.send(RoomEventCacheUpdate::Append {
612-
events,
613-
account_data,
614-
ephemeral,
615-
ambiguity_changes,
616-
});
621+
let _ =
622+
self.sender.send(RoomEventCacheUpdate::Append { events, ephemeral, ambiguity_changes });
617623

618624
Ok(())
619625
}
@@ -819,13 +825,16 @@ pub enum RoomEventCacheUpdate {
819825
/// The room has been cleared from events.
820826
Clear,
821827

828+
/// The fully read marker has moved to a different event.
829+
UpdateReadMarker {
830+
/// Event at which the read marker is now pointing.
831+
event_id: OwnedEventId,
832+
},
833+
822834
/// The room has new events.
823835
Append {
824836
/// All the new events that have been added to the room's timeline.
825837
events: Vec<SyncTimelineEvent>,
826-
/// XXX: this is temporary, until account data lives in the event cache
827-
/// — or will it live there?
828-
account_data: Vec<Raw<AnyRoomAccountDataEvent>>,
829838
/// XXX: this is temporary, until read receipts are handled in the event
830839
/// cache
831840
ephemeral: Vec<Raw<AnySyncEphemeralRoomEvent>>,

0 commit comments

Comments
 (0)