Skip to content

Commit 5cb033a

Browse files
mgoldenbergbnjbvr
authored andcommitted
feat(indexeddb): add IndexedDB-backed impl for EventCacheStore::filter_duplicated_events
Signed-off-by: Michael Goldenberg <[email protected]>
1 parent 0e622cc commit 5cb033a

File tree

3 files changed

+36
-4
lines changed

3 files changed

+36
-4
lines changed

crates/matrix-sdk-indexeddb/src/event_cache_store/integration_tests.rs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -748,6 +748,13 @@ macro_rules! event_cache_store_integration_tests {
748748
get_event_cache_store().await.unwrap().into_event_cache_store();
749749
event_cache_store.test_remove_room().await;
750750
}
751+
752+
#[async_test]
753+
async fn test_filter_duplicated_events() {
754+
let event_cache_store =
755+
get_event_cache_store().await.unwrap().into_event_cache_store();
756+
event_cache_store.test_filter_duplicated_events().await;
757+
}
751758
}
752759
};
753760
}

crates/matrix-sdk-indexeddb/src/event_cache_store/mod.rs

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -435,10 +435,24 @@ impl_event_cache_store! {
435435
events: Vec<OwnedEventId>,
436436
) -> Result<Vec<(OwnedEventId, Position)>, IndexeddbEventCacheStoreError> {
437437
let _timer = timer!("method");
438-
self.memory_store
439-
.filter_duplicated_events(linked_chunk_id, events)
440-
.await
441-
.map_err(IndexeddbEventCacheStoreError::MemoryStore)
438+
439+
if events.is_empty() {
440+
return Ok(Vec::new());
441+
}
442+
443+
let linked_chunk_id = linked_chunk_id.to_owned();
444+
let room_id = linked_chunk_id.room_id();
445+
let transaction =
446+
self.transaction(&[keys::EVENTS], IdbTransactionMode::Readonly)?;
447+
let mut duplicated = Vec::new();
448+
for event_id in events {
449+
if let Some(types::Event::InBand(event)) =
450+
transaction.get_event_by_id(room_id, &event_id).await?
451+
{
452+
duplicated.push((event_id, event.position.into()));
453+
}
454+
}
455+
Ok(duplicated)
442456
}
443457

444458
#[instrument(skip(self, event_id))]

crates/matrix-sdk-indexeddb/src/event_cache_store/transaction.rs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -570,6 +570,17 @@ impl<'a> IndexeddbEventCacheStoreTransaction<'a> {
570570
self.delete_items_in_room::<Chunk, IndexedChunkIdKey>(room_id).await
571571
}
572572

573+
/// Query IndexedDB for events that match the given event id in the given
574+
/// room. If more than one item is found, an error is returned.
575+
pub async fn get_event_by_id(
576+
&self,
577+
room_id: &RoomId,
578+
event_id: &OwnedEventId,
579+
) -> Result<Option<Event>, IndexeddbEventCacheStoreTransactionError> {
580+
let key = self.serializer.encode_key(room_id, event_id);
581+
self.get_item_by_key::<Event, IndexedEventIdKey>(room_id, key).await
582+
}
583+
573584
/// Query IndexedDB for events in the given position range in the given
574585
/// room.
575586
pub async fn get_events_by_position(

0 commit comments

Comments
 (0)