@@ -31,7 +31,8 @@ use matrix_sdk_common::{
31
31
async_trait,
32
32
events:: {
33
33
presence:: PresenceEvent , room:: member:: MemberEventContent , AnyGlobalAccountDataEvent ,
34
- AnyRoomAccountDataEvent , AnyStrippedStateEvent , AnySyncStateEvent , EventContent , EventType ,
34
+ AnyRoomAccountDataEvent , AnyRoomEvent , AnyStrippedStateEvent , AnySyncRoomEvent ,
35
+ AnySyncStateEvent , EventContent , EventType ,
35
36
} ,
36
37
identifiers:: { EventId , RoomId , UserId } ,
37
38
locks:: RwLock ,
@@ -482,10 +483,38 @@ pub type NextBatchToken = String;
482
483
#[ derive( Clone , Copy , Debug , Default , PartialEq , Eq , PartialOrd , Ord , Hash ) ]
483
484
pub struct SliceIdx ( u128 ) ;
484
485
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
+
485
500
/// The position of an event within a slice or chunk.
486
501
#[ derive( Clone , Copy , Debug , Default , PartialEq , Eq , PartialOrd , Ord , Hash ) ]
487
502
pub struct EventIdx ( u128 ) ;
488
503
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
+
489
518
/// Represents a chunk of events from either /sync or /messages.
490
519
#[ derive( Clone , Debug ) ]
491
520
pub struct TimelineSlice {
@@ -550,11 +579,12 @@ impl Timeline {
550
579
room_id : & RoomId ,
551
580
prev_batch : & str ,
552
581
next_batch : & str ,
553
- content : & [ AnySyncRoomEvent ] ,
582
+ limited : bool ,
583
+ events : & [ AnySyncRoomEvent ] ,
554
584
) {
555
585
let timeline_slice = TimelineSlice :: new ( prev_batch. to_owned ( ) , next_batch. to_owned ( ) ) ;
556
586
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
558
588
if let Some ( SliceIdx ( idx) ) = self . next_slice_map . get ( prev_batch) {
559
589
let next_idx = SliceIdx ( idx + 1 ) ;
560
590
let last_event_index = self
@@ -567,20 +597,20 @@ impl Timeline {
567
597
let EventIdx ( idx) = e;
568
598
* idx
569
599
} )
570
- . unwrap_or_default ( ) ;
600
+ . expect ( "event map is in sync with timeline" ) ;
571
601
572
602
self . prev_slice_map . insert ( prev_batch. to_owned ( ) , next_idx) ;
573
603
self . next_slice_map . insert ( next_batch. to_owned ( ) , next_idx) ;
574
604
self . slices . insert ( next_idx, timeline_slice) ;
575
605
576
- self . update_events_map_forward ( content , last_event_index, next_idx) ;
606
+ self . update_events_map_forward ( events , last_event_index, next_idx) ;
577
607
} else if self . is_empty ( ) {
578
- let next_idx = SliceIdx ( u128 :: MAX / 2 ) ;
608
+ let next_idx = SliceIdx :: first ( ) ;
579
609
self . prev_slice_map . insert ( prev_batch. to_owned ( ) , next_idx) ;
580
610
self . next_slice_map . insert ( next_batch. to_owned ( ) , next_idx) ;
581
611
self . slices . insert ( next_idx, timeline_slice) ;
582
612
583
- self . update_events_map_forward ( content , u128:: MAX / 2 , next_idx) ;
613
+ self . update_events_map_forward ( events , u128:: MAX / 2 , next_idx) ;
584
614
} else {
585
615
todo ! ( "hmmm we got a problem or a gap" )
586
616
}
@@ -627,7 +657,7 @@ impl Timeline {
627
657
let EventIdx ( idx) = e;
628
658
* idx
629
659
} )
630
- . unwrap_or_default ( ) ;
660
+ . expect ( "event map is in sync with timeline" ) ;
631
661
632
662
self . prev_slice_map . insert ( prev_batch. to_owned ( ) , prev_idx) ;
633
663
self . next_slice_map . insert ( end. to_owned ( ) , prev_idx) ;
@@ -676,7 +706,7 @@ impl Timeline {
676
706
let EventIdx ( idx) = e;
677
707
* idx
678
708
} )
679
- . unwrap_or_default ( ) ;
709
+ . expect ( "event map is in sync with timeline" ) ;
680
710
681
711
self . prev_slice_map . insert ( prev_batch. to_owned ( ) , next_idx) ;
682
712
self . next_slice_map . insert ( end. to_owned ( ) , next_idx) ;
@@ -711,7 +741,7 @@ impl Timeline {
711
741
let EventIdx ( idx) = e;
712
742
* idx
713
743
} )
714
- . unwrap_or_default ( ) ;
744
+ . expect ( "event map is in sync with timeline" ) ;
715
745
716
746
self . prev_slice_map . insert ( prev_batch. to_owned ( ) , prev_idx) ;
717
747
self . next_slice_map . insert ( end. to_owned ( ) , prev_idx) ;
@@ -728,20 +758,20 @@ impl Timeline {
728
758
}
729
759
( Some ( prev) , None ) => { }
730
760
( None , Some ( end) ) => { }
731
- ( None , None ) => todo ! ( "problems " ) ,
761
+ ( None , None ) => todo ! ( "can't move forward nor backward, timeline full " ) ,
732
762
}
733
763
}
734
764
}
735
765
}
736
766
737
767
fn update_events_map_forward (
738
768
& mut self ,
739
- content : & [ AnySyncRoomEvent ] ,
769
+ events : & [ AnySyncRoomEvent ] ,
740
770
last_event_index : u128 ,
741
771
slice_idx : SliceIdx ,
742
772
) {
743
773
let mut index_event = BTreeMap :: new ( ) ;
744
- for ( i, event) in content . iter ( ) . enumerate ( ) {
774
+ for ( i, event) in events . iter ( ) . enumerate ( ) {
745
775
let e_idx = EventIdx ( last_event_index + ( ( i + 1 ) as u128 ) ) ;
746
776
let e_id = event. event_id ( ) ;
747
777
@@ -754,13 +784,13 @@ impl Timeline {
754
784
755
785
fn update_events_map_backward (
756
786
& mut self ,
757
- content : & [ Raw < AnyRoomEvent > ] ,
787
+ events : & [ Raw < AnyRoomEvent > ] ,
758
788
last_event_index : u128 ,
759
789
slice_idx : SliceIdx ,
760
790
) {
761
791
let mut index_event = BTreeMap :: new ( ) ;
762
792
// Reverse so that newer events have a smaller index from enumerate
763
- for ( i, event) in content
793
+ for ( i, event) in events
764
794
. iter ( )
765
795
// TODO: don't eat events or is this ok?
766
796
. filter_map ( |e| e. deserialize ( ) . ok ( ) )
@@ -808,25 +838,12 @@ impl EventIdExt for AnyRoomEvent {
808
838
#[ cfg( test) ]
809
839
mod test {
810
840
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 ,
827
845
} ;
828
- use matrix_sdk_test:: { test_json, EventBuilder , EventsJson } ;
829
- use serde_json:: json;
846
+ use matrix_sdk_test:: test_json;
830
847
831
848
use super :: Timeline ;
832
849
@@ -838,18 +855,25 @@ mod test {
838
855
test_json:: ROOM_MESSAGES [ "chunk" ] . clone ( ) ,
839
856
)
840
857
. 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 ( ) ;
845
863
846
864
let mut timeline = Timeline :: new ( ) ;
847
865
848
866
timeline. handle_sync_timeline (
849
867
& room_id,
850
868
"t392-516_47314_0_7_1_1_1_11444_1" ,
851
869
"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 ( ) ,
853
877
) ;
854
878
855
879
let mut resp = MessagesResponse :: new ( ) ;
0 commit comments