Skip to content

Commit 172227f

Browse files
committed
fixup! store: Create Timeline struct to hold event chunks
1 parent f0d08c7 commit 172227f

File tree

1 file changed

+62
-38
lines changed
  • matrix_sdk_base/src/store

1 file changed

+62
-38
lines changed

matrix_sdk_base/src/store/mod.rs

Lines changed: 62 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,8 @@ use matrix_sdk_common::{
3131
async_trait,
3232
events::{
3333
presence::PresenceEvent, room::member::MemberEventContent, AnyGlobalAccountDataEvent,
34-
AnyRoomAccountDataEvent, AnyStrippedStateEvent, AnySyncStateEvent, EventContent, EventType,
34+
AnyRoomAccountDataEvent, AnyRoomEvent, AnyStrippedStateEvent, AnySyncRoomEvent,
35+
AnySyncStateEvent, EventContent, EventType,
3536
},
3637
identifiers::{EventId, RoomId, UserId},
3738
locks::RwLock,
@@ -482,10 +483,38 @@ pub type NextBatchToken = String;
482483
#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, PartialOrd, Ord, Hash)]
483484
pub struct SliceIdx(u128);
484485

486+
impl SliceIdx {
487+
pub fn first() -> Self {
488+
Self(u128::MAX / 2)
489+
}
490+
491+
pub fn from_prev(prev: u128) -> Self {
492+
Self(prev + 1)
493+
}
494+
495+
pub fn from_post(prev: u128) -> Self {
496+
Self(prev - 1)
497+
}
498+
}
499+
485500
/// The position of an event within a slice or chunk.
486501
#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, PartialOrd, Ord, Hash)]
487502
pub struct EventIdx(u128);
488503

504+
impl EventIdx {
505+
pub fn first() -> Self {
506+
Self(u128::MAX / 2)
507+
}
508+
509+
pub fn from_prev(prev: u128) -> Self {
510+
Self(prev + 1)
511+
}
512+
513+
pub fn from_post(prev: u128) -> Self {
514+
Self(prev - 1)
515+
}
516+
}
517+
489518
/// Represents a chunk of events from either /sync or /messages.
490519
#[derive(Clone, Debug)]
491520
pub struct TimelineSlice {
@@ -550,11 +579,12 @@ impl Timeline {
550579
room_id: &RoomId,
551580
prev_batch: &str,
552581
next_batch: &str,
553-
content: &[AnySyncRoomEvent],
582+
limited: bool,
583+
events: &[AnySyncRoomEvent],
554584
) {
555585
let timeline_slice = TimelineSlice::new(prev_batch.to_owned(), next_batch.to_owned());
556586

557-
// The new `prev_batch` token is the `next_batch` token of previous /sync
587+
// The new `prev_batch` token is the `next_batch` token of a previous /sync
558588
if let Some(SliceIdx(idx)) = self.next_slice_map.get(prev_batch) {
559589
let next_idx = SliceIdx(idx + 1);
560590
let last_event_index = self
@@ -567,20 +597,20 @@ impl Timeline {
567597
let EventIdx(idx) = e;
568598
*idx
569599
})
570-
.unwrap_or_default();
600+
.expect("event map is in sync with timeline");
571601

572602
self.prev_slice_map.insert(prev_batch.to_owned(), next_idx);
573603
self.next_slice_map.insert(next_batch.to_owned(), next_idx);
574604
self.slices.insert(next_idx, timeline_slice);
575605

576-
self.update_events_map_forward(content, last_event_index, next_idx);
606+
self.update_events_map_forward(events, last_event_index, next_idx);
577607
} else if self.is_empty() {
578-
let next_idx = SliceIdx(u128::MAX / 2);
608+
let next_idx = SliceIdx::first();
579609
self.prev_slice_map.insert(prev_batch.to_owned(), next_idx);
580610
self.next_slice_map.insert(next_batch.to_owned(), next_idx);
581611
self.slices.insert(next_idx, timeline_slice);
582612

583-
self.update_events_map_forward(content, u128::MAX / 2, next_idx);
613+
self.update_events_map_forward(events, u128::MAX / 2, next_idx);
584614
} else {
585615
todo!("hmmm we got a problem or a gap")
586616
}
@@ -627,7 +657,7 @@ impl Timeline {
627657
let EventIdx(idx) = e;
628658
*idx
629659
})
630-
.unwrap_or_default();
660+
.expect("event map is in sync with timeline");
631661

632662
self.prev_slice_map.insert(prev_batch.to_owned(), prev_idx);
633663
self.next_slice_map.insert(end.to_owned(), prev_idx);
@@ -676,7 +706,7 @@ impl Timeline {
676706
let EventIdx(idx) = e;
677707
*idx
678708
})
679-
.unwrap_or_default();
709+
.expect("event map is in sync with timeline");
680710

681711
self.prev_slice_map.insert(prev_batch.to_owned(), next_idx);
682712
self.next_slice_map.insert(end.to_owned(), next_idx);
@@ -711,7 +741,7 @@ impl Timeline {
711741
let EventIdx(idx) = e;
712742
*idx
713743
})
714-
.unwrap_or_default();
744+
.expect("event map is in sync with timeline");
715745

716746
self.prev_slice_map.insert(prev_batch.to_owned(), prev_idx);
717747
self.next_slice_map.insert(end.to_owned(), prev_idx);
@@ -728,20 +758,20 @@ impl Timeline {
728758
}
729759
(Some(prev), None) => {}
730760
(None, Some(end)) => {}
731-
(None, None) => todo!("problems"),
761+
(None, None) => todo!("can't move forward nor backward, timeline full"),
732762
}
733763
}
734764
}
735765
}
736766

737767
fn update_events_map_forward(
738768
&mut self,
739-
content: &[AnySyncRoomEvent],
769+
events: &[AnySyncRoomEvent],
740770
last_event_index: u128,
741771
slice_idx: SliceIdx,
742772
) {
743773
let mut index_event = BTreeMap::new();
744-
for (i, event) in content.iter().enumerate() {
774+
for (i, event) in events.iter().enumerate() {
745775
let e_idx = EventIdx(last_event_index + ((i + 1) as u128));
746776
let e_id = event.event_id();
747777

@@ -754,13 +784,13 @@ impl Timeline {
754784

755785
fn update_events_map_backward(
756786
&mut self,
757-
content: &[Raw<AnyRoomEvent>],
787+
events: &[Raw<AnyRoomEvent>],
758788
last_event_index: u128,
759789
slice_idx: SliceIdx,
760790
) {
761791
let mut index_event = BTreeMap::new();
762792
// Reverse so that newer events have a smaller index from enumerate
763-
for (i, event) in content
793+
for (i, event) in events
764794
.iter()
765795
// TODO: don't eat events or is this ok?
766796
.filter_map(|e| e.deserialize().ok())
@@ -808,25 +838,12 @@ impl EventIdExt for AnyRoomEvent {
808838
#[cfg(test)]
809839
mod test {
810840
use matrix_sdk_common::{
811-
api::r0::{
812-
account::register::Request as RegistrationRequest,
813-
directory::get_public_rooms_filtered::Request as PublicRoomsFilterRequest,
814-
message::get_message_events::{Direction, Response as MessagesResponse},
815-
sync,
816-
typing::create_typing_event::Typing,
817-
uiaa::AuthData,
818-
},
819-
assign,
820-
directory::Filter,
821-
events::{
822-
room::message::MessageEventContent, AnyMessageEventContent, AnyRoomEvent,
823-
AnySyncRoomEvent,
824-
},
825-
identifiers::{event_id, room_id, user_id},
826-
thirdparty, Raw,
841+
api::r0::message::get_message_events::{Direction, Response as MessagesResponse},
842+
events::{AnyRoomEvent, AnySyncRoomEvent},
843+
identifiers::room_id,
844+
Raw,
827845
};
828-
use matrix_sdk_test::{test_json, EventBuilder, EventsJson};
829-
use serde_json::json;
846+
use matrix_sdk_test::test_json;
830847

831848
use super::Timeline;
832849

@@ -838,18 +855,25 @@ mod test {
838855
test_json::ROOM_MESSAGES["chunk"].clone(),
839856
)
840857
.unwrap();
841-
let sync = serde_json::from_value::<Vec<AnySyncRoomEvent>>(
842-
test_json::SYNC["rooms"]["join"][room_id.as_str()]["timeline"]["events"].clone(),
843-
)
844-
.unwrap();
858+
let sync =
859+
serde_json::from_value::<matrix_sdk_common::api::r0::sync::sync_events::Timeline>(
860+
test_json::SYNC["rooms"]["join"][room_id.as_str()]["timeline"].clone(),
861+
)
862+
.unwrap();
845863

846864
let mut timeline = Timeline::new();
847865

848866
timeline.handle_sync_timeline(
849867
&room_id,
850868
"t392-516_47314_0_7_1_1_1_11444_1",
851869
"s526_47314_0_7_1_1_1_11444_1",
852-
&sync,
870+
sync.limited,
871+
&sync
872+
.events
873+
.into_iter()
874+
.map(|e| e.deserialize())
875+
.collect::<Result<Vec<_>, _>>()
876+
.unwrap(),
853877
);
854878

855879
let mut resp = MessagesResponse::new();

0 commit comments

Comments
 (0)