Skip to content

Commit 6b93f66

Browse files
committed
feat(sdk): Add RoomEventCacheGenericUpdate::Cleared.
This patch adds the `RoomEventCacheGenericUpdate::Cleared` variant. It's helpful to know when a room has been cleared.
1 parent c92a89d commit 6b93f66

File tree

2 files changed

+45
-0
lines changed

2 files changed

+45
-0
lines changed

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

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -488,10 +488,17 @@ impl EventCacheInner {
488488
// propagate updates to observers.
489489
try_join_all(room_locks.into_iter().map(|(room, mut state_guard)| async move {
490490
let updates_as_vector_diffs = state_guard.reset().await?;
491+
491492
let _ = room.inner.sender.send(RoomEventCacheUpdate::UpdateTimelineEvents {
492493
diffs: updates_as_vector_diffs,
493494
origin: EventsOrigin::Cache,
494495
});
496+
497+
let _ = room
498+
.inner
499+
.generic_update_sender
500+
.send(RoomEventCacheGenericUpdate::Cleared { room_id: room.inner.room_id.clone() });
501+
495502
Ok::<_, EventCacheError>(())
496503
}))
497504
.await?;
@@ -637,13 +644,20 @@ pub enum RoomEventCacheGenericUpdate {
637644
/// The room ID owning the timeline.
638645
room_id: OwnedRoomId,
639646
},
647+
648+
/// The room has been cleared, all events have been deleted.
649+
Cleared {
650+
/// The ID of the room that has been cleared.
651+
room_id: OwnedRoomId,
652+
},
640653
}
641654

642655
impl RoomEventCacheGenericUpdate {
643656
/// Get the room ID that has triggered this generic update.
644657
pub fn room_id(&self) -> &RoomId {
645658
match self {
646659
Self::TimelineUpdated { room_id } => room_id,
660+
Self::Cleared { room_id } => room_id,
647661
}
648662
}
649663
}

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

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -383,6 +383,12 @@ impl RoomEventCache {
383383
origin: EventsOrigin::Cache,
384384
});
385385

386+
// Notify observers about the generic update.
387+
let _ = self
388+
.inner
389+
.generic_update_sender
390+
.send(RoomEventCacheGenericUpdate::Cleared { room_id: self.inner.room_id.clone() });
391+
386392
Ok(())
387393
}
388394

@@ -2444,6 +2450,7 @@ mod timed_tests {
24442450
let (room_event_cache, _drop_handles) = room.event_cache().await.unwrap();
24452451

24462452
let (items, mut stream) = room_event_cache.subscribe().await;
2453+
let mut generic_stream = event_cache.subscribe_to_room_generic_updates();
24472454

24482455
// The rooms knows about all cached events.
24492456
{
@@ -2486,6 +2493,18 @@ mod timed_tests {
24862493
assert_eq!(diffs.len(), 1);
24872494
assert_let!(VectorDiff::Clear = &diffs[0]);
24882495

2496+
// … same with a generic update.
2497+
assert_let_timeout!(
2498+
Ok(RoomEventCacheGenericUpdate::TimelineUpdated { room_id: received_room_id }) =
2499+
generic_stream.recv()
2500+
);
2501+
assert_eq!(received_room_id, room_id);
2502+
assert_let_timeout!(
2503+
Ok(RoomEventCacheGenericUpdate::Cleared { room_id: received_room_id }) =
2504+
generic_stream.recv()
2505+
);
2506+
assert_eq!(received_room_id, room_id);
2507+
24892508
// Events individually are not forgotten by the event cache, after clearing a
24902509
// room.
24912510
assert!(room_event_cache.find_event(event_id1).await.is_some());
@@ -2896,6 +2915,8 @@ mod timed_tests {
28962915
assert_eq!(events[0].event_id().as_deref(), Some(evid2));
28972916
assert!(stream.is_empty());
28982917

2918+
let mut generic_stream = event_cache.subscribe_to_room_generic_updates();
2919+
28992920
// Force loading the full linked chunk by back-paginating.
29002921
let outcome = room_event_cache.pagination().run_backwards_once(20).await.unwrap();
29012922
assert_eq!(outcome.events.len(), 1);
@@ -2913,6 +2934,13 @@ mod timed_tests {
29132934

29142935
assert!(stream.is_empty());
29152936

2937+
// Same for the generic update.
2938+
assert_let_timeout!(
2939+
Ok(RoomEventCacheGenericUpdate::TimelineUpdated { room_id: received_room_id }) =
2940+
generic_stream.recv()
2941+
);
2942+
assert_eq!(received_room_id, room_id);
2943+
29162944
// Shrink the linked chunk to the last chunk.
29172945
let diffs = room_event_cache
29182946
.inner
@@ -2933,6 +2961,9 @@ mod timed_tests {
29332961

29342962
assert!(stream.is_empty());
29352963

2964+
// No generic update is sent in this case.
2965+
assert!(generic_stream.is_empty());
2966+
29362967
// When reading the events, we do get only the last one.
29372968
let events = room_event_cache.events().await;
29382969
assert_eq!(events.len(), 1);

0 commit comments

Comments
 (0)