@@ -284,10 +284,10 @@ impl MemoryStore {
284
284
info ! ( "Save new timeline batch from messages response for {}" , room) ;
285
285
}
286
286
287
- let data = if timeline. limited {
287
+ let mut delete_timeline = false ;
288
+ if timeline. limited {
288
289
info ! ( "Delete stored timeline for {} because the sync response was limited" , room) ;
289
- self . room_timeline . remove ( room) ;
290
- None
290
+ delete_timeline = true ;
291
291
} else if let Some ( mut data) = self . room_timeline . get_mut ( room) {
292
292
if !timeline. sync && Some ( & timeline. start ) != data. end . as_ref ( ) {
293
293
// This should only happen when a developer adds a wrong timeline
@@ -298,7 +298,6 @@ impl MemoryStore {
298
298
}
299
299
300
300
// Check if the event already exists in the store
301
- let mut delete_timeline = false ;
302
301
for event in & timeline. events {
303
302
if let Some ( event_id) = event. event_id ( ) {
304
303
if data. event_id_to_position . contains_key ( & event_id) {
@@ -308,37 +307,39 @@ impl MemoryStore {
308
307
}
309
308
}
310
309
311
- if delete_timeline {
312
- info ! ( "Delete stored timeline for {} because of duplicated events" , room) ;
313
- self . room_timeline . remove ( room) ;
314
- None
315
- } else if timeline. sync {
316
- data. start = timeline. start . clone ( ) ;
317
- Some ( data)
318
- } else {
319
- data. end = timeline. end . clone ( ) ;
320
- Some ( data)
310
+ if !delete_timeline {
311
+ if timeline. sync {
312
+ data. start = timeline. start . clone ( ) ;
313
+ } else {
314
+ data. end = timeline. end . clone ( ) ;
315
+ }
321
316
}
322
- } else {
323
- None
324
- } ;
317
+ }
325
318
326
- let mut data = & mut * if let Some ( data) = data {
327
- data
328
- } else {
329
- let data = TimelineData {
319
+ if delete_timeline {
320
+ info ! ( "Delete stored timeline for {} because of duplicated events" , room) ;
321
+ self . room_timeline . remove ( room) ;
322
+ }
323
+
324
+ let mut data =
325
+ self . room_timeline . entry ( room. to_owned ( ) ) . or_insert_with ( || TimelineData {
330
326
start : timeline. start . clone ( ) ,
331
327
end : timeline. end . clone ( ) ,
332
328
..Default :: default ( )
333
- } ;
334
- self . room_timeline . insert ( room. to_owned ( ) , data) ;
335
- self . room_timeline . get_mut ( room) . unwrap ( )
329
+ } ) ;
330
+
331
+ let make_room_version = || {
332
+ self . room_info
333
+ . get ( room)
334
+ . and_then ( |info| {
335
+ info. base_info . create . as_ref ( ) . map ( |event| event. room_version . clone ( ) )
336
+ } )
337
+ . unwrap_or_else ( || {
338
+ warn ! ( "Unable to find the room version for {}, assume version 9" , room) ;
339
+ RoomVersionId :: V9
340
+ } )
336
341
} ;
337
342
338
- // Create a copy of the events if the stream created via `room_timeline()` isn't
339
- // fully consumed
340
- let data_events = Arc :: make_mut ( & mut data. events ) ;
341
-
342
343
if timeline. sync {
343
344
let mut room_version = None ;
344
345
for event in timeline. events . iter ( ) . rev ( ) {
@@ -347,21 +348,13 @@ impl MemoryStore {
347
348
redaction,
348
349
) ) ) = event. event . deserialize ( )
349
350
{
350
- if let Some ( position) = data. event_id_to_position . get ( & redaction. redacts ) {
351
- if let Some ( mut full_event) = data_events. get_mut ( position) {
351
+ let pos = data. event_id_to_position . get ( & redaction. redacts ) . copied ( ) ;
352
+
353
+ if let Some ( position) = pos {
354
+ if let Some ( mut full_event) = data. events . get_mut ( & position. clone ( ) ) {
352
355
let inner_event = full_event. event . deserialize ( ) ?;
353
356
if room_version. is_none ( ) {
354
- room_version = Some ( self . room_info
355
- . get ( room)
356
- . and_then ( |info| {
357
- info. base_info
358
- . create
359
- . as_ref ( )
360
- . map ( |event| event. room_version . clone ( ) )
361
- } ) . unwrap_or_else ( || {
362
- warn ! ( "Unable to find the room version for {}, assume version 9" , room) ;
363
- RoomVersionId :: V9
364
- } ) ) ;
357
+ room_version = Some ( make_room_version ( ) ) ;
365
358
}
366
359
367
360
full_event. event = Raw :: new ( & AnySyncRoomEvent :: from (
@@ -372,20 +365,22 @@ impl MemoryStore {
372
365
}
373
366
374
367
data. start_position -= 1 ;
368
+ let start_position = data. start_position ;
375
369
// Only add event with id to the position map
376
370
if let Some ( event_id) = event. event_id ( ) {
377
- data. event_id_to_position . insert ( event_id, data . start_position ) ;
371
+ data. event_id_to_position . insert ( event_id, start_position) ;
378
372
}
379
- data_events . insert ( data . start_position , event. to_owned ( ) ) ;
373
+ data . events . insert ( start_position, event. clone ( ) ) ;
380
374
}
381
375
} else {
382
376
for event in timeline. events . iter ( ) {
383
377
data. end_position += 1 ;
378
+ let end_position = data. end_position ;
384
379
// Only add event with id to the position map
385
380
if let Some ( event_id) = event. event_id ( ) {
386
- data. event_id_to_position . insert ( event_id, data . end_position ) ;
381
+ data. event_id_to_position . insert ( event_id, end_position) ;
387
382
}
388
- data_events . insert ( data . end_position , event. to_owned ( ) ) ;
383
+ data . events . insert ( end_position, event. clone ( ) ) ;
389
384
}
390
385
}
391
386
}
@@ -580,22 +575,22 @@ impl MemoryStore {
580
575
& self ,
581
576
room_id : & RoomId ,
582
577
) -> Result < Option < ( BoxStream < Result < SyncRoomEvent > > , Option < String > ) > > {
583
- if let Some ( data) = self . room_timeline . get ( room_id) {
584
- let events = data. events . clone ( ) ;
585
- let stream = stream ! {
586
- for item in events. values( ) {
587
- yield Ok ( item. to_owned( ) ) ;
588
- }
589
- } ;
590
- info ! (
591
- "Found previously stored timeline for {}, with end token {:?}" ,
592
- room_id, data. end
593
- ) ;
594
- Ok ( Some ( ( Box :: pin ( stream) , data. end . to_owned ( ) ) ) )
578
+ let ( events, end_token) = if let Some ( data) = self . room_timeline . get ( room_id) {
579
+ ( data. events . clone ( ) , data. end . clone ( ) )
595
580
} else {
596
581
info ! ( "No timeline for {} was previously stored" , room_id) ;
597
- Ok ( None )
598
- }
582
+ return Ok ( None ) ;
583
+ } ;
584
+
585
+ let stream = stream ! {
586
+ for ( _, item) in events {
587
+ yield Ok ( item) ;
588
+ }
589
+ } ;
590
+
591
+ info ! ( "Found previously stored timeline for {}, with end token {:?}" , room_id, end_token) ;
592
+
593
+ Ok ( Some ( ( Box :: pin ( stream) , end_token) ) )
599
594
}
600
595
}
601
596
@@ -762,7 +757,7 @@ struct TimelineData {
762
757
pub start_position : isize ,
763
758
pub end : Option < String > ,
764
759
pub end_position : isize ,
765
- pub events : Arc < BTreeMap < isize , SyncRoomEvent > > ,
760
+ pub events : BTreeMap < isize , SyncRoomEvent > ,
766
761
pub event_id_to_position : HashMap < Box < EventId > , isize > ,
767
762
}
768
763
0 commit comments