matrix_sdk/event_cache/caches/room/
updates.rs1use std::collections::BTreeMap;
16
17use matrix_sdk_base::{
18 deserialized_responses::{AmbiguityChange, ThreadSummary},
19 event_cache::{Event, Gap},
20 linked_chunk::{self, OwnedLinkedChunkId},
21};
22use ruma::{
23 OwnedEventId, OwnedMxcUri, OwnedRoomId, OwnedUserId, events::receipt::ReceiptEventContent,
24};
25use tokio::sync::broadcast::{Receiver, Sender};
26
27use super::super::TimelineVectorDiffs;
28
29#[derive(Debug, Clone)]
31pub enum RoomEventCacheUpdate {
32 MoveReadMarkerTo {
34 event_id: OwnedEventId,
36 },
37
38 UpdateMembers {
40 ambiguity_changes: BTreeMap<OwnedEventId, AmbiguityChange>,
45
46 avatar_changes: Option<BTreeMap<OwnedUserId, Option<OwnedMxcUri>>>,
48 },
49
50 UpdateTimelineEvents(TimelineVectorDiffs),
52
53 UpdateThreadSummary {
56 thread_root: OwnedEventId,
60
61 thread_summary: ThreadSummary,
63 },
64
65 AddReadReceiptEvent {
67 event: ReceiptEventContent,
69 },
70}
71
72#[derive(Clone, Debug)]
80pub struct RoomEventCacheGenericUpdate {
81 pub room_id: OwnedRoomId,
83}
84
85#[derive(Clone, Debug)]
88pub struct RoomEventCacheLinkedChunkUpdate {
89 pub linked_chunk_id: OwnedLinkedChunkId,
91
92 pub updates: Vec<linked_chunk::Update<Event, Gap>>,
95}
96
97impl RoomEventCacheLinkedChunkUpdate {
98 pub fn events(self) -> impl DoubleEndedIterator<Item = Event> {
101 use itertools::Either;
102 self.updates.into_iter().flat_map(|update| match update {
103 linked_chunk::Update::PushItems { items, .. } => {
104 Either::Left(Either::Left(items.into_iter()))
105 }
106 linked_chunk::Update::ReplaceItem { item, .. } => {
107 Either::Left(Either::Right(std::iter::once(item)))
108 }
109 linked_chunk::Update::RemoveItem { .. }
110 | linked_chunk::Update::DetachLastItems { .. }
111 | linked_chunk::Update::StartReattachItems
112 | linked_chunk::Update::EndReattachItems
113 | linked_chunk::Update::NewItemsChunk { .. }
114 | linked_chunk::Update::NewGapChunk { .. }
115 | linked_chunk::Update::RemoveChunk(..)
116 | linked_chunk::Update::Clear => {
117 Either::Right(std::iter::empty())
119 }
120 })
121 }
122}
123
124#[derive(Clone, Debug)]
129pub struct LinkedChunkUpdateSender {
130 sender: Sender<RoomEventCacheLinkedChunkUpdate>,
131
132 #[cfg(feature = "experimental-search")]
133 search_index_sender: tokio::sync::mpsc::UnboundedSender<(OwnedRoomId, Vec<Event>)>,
134}
135
136impl LinkedChunkUpdateSender {
137 pub fn new(
140 #[cfg(feature = "experimental-search")]
141 search_index_sender: tokio::sync::mpsc::UnboundedSender<(OwnedRoomId, Vec<Event>)>,
142 ) -> Self {
143 Self {
144 sender: Sender::new(128),
145 #[cfg(feature = "experimental-search")]
146 search_index_sender,
147 }
148 }
149
150 pub fn send(&self, update: RoomEventCacheLinkedChunkUpdate) {
152 #[cfg(feature = "experimental-search")]
153 if let OwnedLinkedChunkId::Room(room_id) = &update.linked_chunk_id {
154 self.send_to_search_index(room_id.clone(), update.clone().events().collect());
155 }
156
157 let _ = self.sender.send(update);
158 }
159
160 #[cfg(feature = "experimental-search")]
162 pub fn send_to_search_index(&self, room_id: OwnedRoomId, events: Vec<Event>) {
163 if !events.is_empty() {
164 let _ = self.search_index_sender.send((room_id, events));
165 }
166 }
167
168 pub fn subscribe(&self) -> Receiver<RoomEventCacheLinkedChunkUpdate> {
170 self.sender.subscribe()
171 }
172}
173
174#[derive(Clone)]
176pub struct RoomEventCacheUpdateSender {
177 room_sender: Sender<RoomEventCacheUpdate>,
178 generic_sender: Sender<RoomEventCacheGenericUpdate>,
179}
180
181impl RoomEventCacheUpdateSender {
182 pub fn new(generic_sender: Sender<RoomEventCacheGenericUpdate>) -> Self {
184 Self { room_sender: Sender::new(32), generic_sender }
185 }
186
187 pub fn send(
190 &self,
191 room_update: RoomEventCacheUpdate,
192 generic_update: Option<RoomEventCacheGenericUpdate>,
193 ) {
194 let _ = self.room_sender.send(room_update);
195
196 if let Some(generic_update) = generic_update {
197 let _ = self.generic_sender.send(generic_update);
198 }
199 }
200
201 pub(in super::super) fn generic_update_sender(&self) -> &Sender<RoomEventCacheGenericUpdate> {
203 &self.generic_sender
204 }
205
206 pub(super) fn new_room_receiver(&self) -> Receiver<RoomEventCacheUpdate> {
208 self.room_sender.subscribe()
209 }
210}