@@ -22,8 +22,8 @@ use std::{
2222
2323use eyeball_im:: { ObservableVector , ObservableVectorTransaction , ObservableVectorTransactionEntry } ;
2424use indexmap:: IndexMap ;
25- use matrix_sdk:: { deserialized_responses:: SyncTimelineEvent , sync :: Timeline } ;
26- use matrix_sdk_base:: { deserialized_responses:: TimelineEvent , sync :: JoinedRoomUpdate } ;
25+ use matrix_sdk:: deserialized_responses:: SyncTimelineEvent ;
26+ use matrix_sdk_base:: deserialized_responses:: TimelineEvent ;
2727#[ cfg( test) ]
2828use ruma:: events:: receipt:: ReceiptEventContent ;
2929use ruma:: {
@@ -32,6 +32,7 @@ use ruma::{
3232 AnyMessageLikeEventContent , AnyRoomAccountDataEvent , AnySyncEphemeralRoomEvent ,
3333 } ,
3434 push:: Action ,
35+ serde:: Raw ,
3536 EventId , MilliSecondsSinceUnixEpoch , OwnedEventId , OwnedTransactionId , OwnedUserId ,
3637 RoomVersionId , UserId ,
3738} ;
@@ -105,38 +106,35 @@ impl TimelineInnerState {
105106 return Default :: default ( ) ;
106107 }
107108
108- let mut total = HandleManyEventsResult :: default ( ) ;
109-
110- let position = match position {
111- TimelineEnd :: Front => TimelineItemPosition :: Start ,
112- TimelineEnd :: Back { from_cache } => TimelineItemPosition :: End { from_cache } ,
113- } ;
114-
115109 let mut txn = self . transaction ( ) ;
116- for event in events {
117- let handle_one_res =
118- txn. handle_remote_event ( event. into ( ) , position, room_data_provider, settings) . await ;
119-
120- total. items_added += handle_one_res. item_added as u64 ;
121- total. items_updated += handle_one_res. items_updated as u64 ;
122- }
110+ let handle_many_res =
111+ txn. add_events_at ( events, position, room_data_provider, settings) . await ;
123112 txn. commit ( ) ;
124113
125- total
114+ handle_many_res
126115 }
127116
128117 #[ instrument( skip_all) ]
129118 pub ( super ) async fn handle_joined_room_update < P : RoomDataProvider > (
130119 & mut self ,
131- update : JoinedRoomUpdate ,
120+ events : Vec < SyncTimelineEvent > ,
121+ account_data : Vec < Raw < AnyRoomAccountDataEvent > > ,
122+ ephemeral : Vec < Raw < AnySyncEphemeralRoomEvent > > ,
132123 room_data_provider : & P ,
133124 settings : & TimelineInnerSettings ,
134125 ) {
135126 let mut txn = self . transaction ( ) ;
136- txn. handle_sync_timeline ( update. timeline , room_data_provider, settings) . await ;
127+
128+ txn. add_events_at (
129+ events,
130+ TimelineEnd :: Back { from_cache : false } ,
131+ room_data_provider,
132+ settings,
133+ )
134+ . await ;
137135
138136 trace ! ( "Handling account data" ) ;
139- for raw_event in update . account_data {
137+ for raw_event in account_data {
140138 match raw_event. deserialize ( ) {
141139 Ok ( AnyRoomAccountDataEvent :: FullyRead ( ev) ) => {
142140 txn. set_fully_read_event ( ev. content . event_id ) ;
@@ -149,10 +147,10 @@ impl TimelineInnerState {
149147 }
150148 }
151149
152- if !update . ephemeral . is_empty ( ) {
150+ if !ephemeral. is_empty ( ) {
153151 trace ! ( "Handling ephemeral room events" ) ;
154152 let own_user_id = room_data_provider. own_user_id ( ) ;
155- for raw_event in update . ephemeral {
153+ for raw_event in ephemeral {
156154 match raw_event. deserialize ( ) {
157155 Ok ( AnySyncEphemeralRoomEvent :: Receipt ( ev) ) => {
158156 txn. handle_explicit_read_receipts ( ev. content , own_user_id) ;
@@ -439,28 +437,32 @@ pub(in crate::timeline) struct TimelineInnerStateTransaction<'a> {
439437}
440438
441439impl TimelineInnerStateTransaction < ' _ > {
442- #[ instrument( skip_all, fields( limited = timeline. limited) ) ]
443- async fn handle_sync_timeline < P : RoomDataProvider > (
440+ /// Add the given events at the given end of the timeline.
441+ #[ tracing:: instrument( skip( self , events, room_data_provider, settings) ) ]
442+ pub ( super ) async fn add_events_at < P : RoomDataProvider > (
444443 & mut self ,
445- timeline : Timeline ,
444+ events : Vec < impl Into < SyncTimelineEvent > > ,
445+ position : TimelineEnd ,
446446 room_data_provider : & P ,
447447 settings : & TimelineInnerSettings ,
448- ) {
449- if timeline. limited {
450- self . clear ( ) ;
451- }
448+ ) -> HandleManyEventsResult {
449+ let mut total = HandleManyEventsResult :: default ( ) ;
452450
453- let num_events = timeline. events . len ( ) ;
454- for ( i, event) in timeline. events . into_iter ( ) . enumerate ( ) {
455- trace ! ( "Handling event {} out of {num_events}" , i + 1 ) ;
456- self . handle_remote_event (
457- event,
458- TimelineItemPosition :: End { from_cache : false } ,
459- room_data_provider,
460- settings,
461- )
462- . await ;
451+ let position = match position {
452+ TimelineEnd :: Front => TimelineItemPosition :: Start ,
453+ TimelineEnd :: Back { from_cache } => TimelineItemPosition :: End { from_cache } ,
454+ } ;
455+
456+ for event in events {
457+ let handle_one_res = self
458+ . handle_remote_event ( event. into ( ) , position, room_data_provider, settings)
459+ . await ;
460+
461+ total. items_added += handle_one_res. item_added as u64 ;
462+ total. items_updated += handle_one_res. items_updated as u64 ;
463463 }
464+
465+ total
464466 }
465467
466468 /// Handle a remote event.
0 commit comments