@@ -35,7 +35,7 @@ use ruma::{
3535 } ,
3636 } ,
3737 AnyMessageLikeEventContent , AnyStateEventContent , AnySyncMessageLikeEvent ,
38- AnySyncTimelineEvent , Relations ,
38+ AnySyncTimelineEvent , MessageLikeEventType , Relations , StateEventType ,
3939 } ,
4040 serde:: Raw ,
4141 uint, EventId , MilliSecondsSinceUnixEpoch , OwnedEventId , OwnedTransactionId , OwnedUserId ,
@@ -48,6 +48,7 @@ use super::{
4848 find_event, find_fully_read, EventTimelineItem , Message , TimelineInner , TimelineInnerMetadata ,
4949 TimelineItem , TimelineItemContent , TimelineKey , VirtualTimelineItem ,
5050} ;
51+ use crate :: events:: SyncTimelineEventWithoutContent ;
5152
5253impl TimelineInner {
5354 pub ( super ) async fn handle_live_event (
@@ -221,32 +222,38 @@ fn handle_remote_event(
221222 timeline_items : & mut MutableVecLockMut < ' _ , Arc < TimelineItem > > ,
222223 timeline_meta : & mut MutexGuard < ' _ , TimelineInnerMetadata > ,
223224) {
224- let event = match raw. deserialize ( ) {
225- Ok ( ev) => ev,
226- Err ( _e) => {
227- // TODO: Add some sort of error timeline item
228- return ;
229- }
230- } ;
225+ let ( event_id, sender, origin_server_ts, txn_id, relations, event_kind) =
226+ match raw. deserialize ( ) {
227+ Ok ( event) => (
228+ event. event_id ( ) . to_owned ( ) ,
229+ event. sender ( ) . to_owned ( ) ,
230+ event. origin_server_ts ( ) ,
231+ event. transaction_id ( ) . map ( ToOwned :: to_owned) ,
232+ event. relations ( ) . cloned ( ) ,
233+ event. into ( ) ,
234+ ) ,
235+ Err ( e) => match raw. deserialize_as :: < SyncTimelineEventWithoutContent > ( ) {
236+ Ok ( event) => (
237+ event. event_id ( ) . to_owned ( ) ,
238+ event. sender ( ) . to_owned ( ) ,
239+ event. origin_server_ts ( ) ,
240+ event. transaction_id ( ) . map ( ToOwned :: to_owned) ,
241+ event. relations ( ) . cloned ( ) ,
242+ TimelineEventKind :: failed_to_parse ( event, e) ,
243+ ) ,
244+ Err ( e) => {
245+ warn ! ( "Failed to deserialize timeline event: {e}" ) ;
246+ return ;
247+ }
248+ } ,
249+ } ;
231250
232- let sender = event. sender ( ) . to_owned ( ) ;
233251 let is_own_event = sender == own_user_id;
234- let event_meta = TimelineEventMetadata {
235- sender,
236- is_own_event,
237- relations : event. relations ( ) . cloned ( ) ,
238- encryption_info,
239- } ;
240- let flow = Flow :: Remote {
241- event_id : event. event_id ( ) . to_owned ( ) ,
242- origin_server_ts : event. origin_server_ts ( ) ,
243- raw_event : raw,
244- txn_id : event. transaction_id ( ) . map ( ToOwned :: to_owned) ,
245- position,
246- } ;
252+ let event_meta = TimelineEventMetadata { sender, is_own_event, relations, encryption_info } ;
253+ let flow = Flow :: Remote { event_id, origin_server_ts, raw_event : raw, txn_id, position } ;
247254
248255 TimelineEventHandler :: new ( event_meta, flow, timeline_items, timeline_meta)
249- . handle_event ( event . into ( ) )
256+ . handle_event ( event_kind )
250257}
251258
252259fn update_fully_read_item (
@@ -320,12 +327,52 @@ struct TimelineEventMetadata {
320327
321328#[ derive( Clone ) ]
322329enum TimelineEventKind {
323- Message { content : AnyMessageLikeEventContent } ,
330+ Message {
331+ content : AnyMessageLikeEventContent ,
332+ } ,
324333 RedactedMessage ,
325- Redaction { redacts : OwnedEventId , content : RoomRedactionEventContent } ,
334+ Redaction {
335+ redacts : OwnedEventId ,
336+ content : RoomRedactionEventContent ,
337+ } ,
326338 // FIXME: Split further for state keys of different type
327- State { _content : AnyStateEventContent } ,
339+ State {
340+ _content : AnyStateEventContent ,
341+ } ,
328342 RedactedState , // AnyRedactedStateEventContent
343+ FailedToParseMessageLike {
344+ event_type : MessageLikeEventType ,
345+ error : Arc < serde_json:: Error > ,
346+ } ,
347+ FailedToParseState {
348+ event_type : StateEventType ,
349+ state_key : String ,
350+ error : Arc < serde_json:: Error > ,
351+ } ,
352+ }
353+
354+ impl TimelineEventKind {
355+ fn failed_to_parse ( event : SyncTimelineEventWithoutContent , error : serde_json:: Error ) -> Self {
356+ let error = Arc :: new ( error) ;
357+ match event {
358+ SyncTimelineEventWithoutContent :: OriginalMessageLike ( ev) => {
359+ Self :: FailedToParseMessageLike { event_type : ev. content . event_type , error }
360+ }
361+ SyncTimelineEventWithoutContent :: RedactedMessageLike ( ev) => {
362+ Self :: FailedToParseMessageLike { event_type : ev. content . event_type , error }
363+ }
364+ SyncTimelineEventWithoutContent :: OriginalState ( ev) => Self :: FailedToParseState {
365+ event_type : ev. content . event_type ,
366+ state_key : ev. state_key ,
367+ error,
368+ } ,
369+ SyncTimelineEventWithoutContent :: RedactedState ( ev) => Self :: FailedToParseState {
370+ event_type : ev. content . event_type ,
371+ state_key : ev. state_key ,
372+ error,
373+ } ,
374+ }
375+ }
329376}
330377
331378impl From < AnySyncTimelineEvent > for TimelineEventKind {
@@ -404,8 +451,15 @@ impl<'a, 'i> TimelineEventHandler<'a, 'i> {
404451 TimelineEventKind :: Redaction { redacts, content } => {
405452 self . handle_redaction ( redacts, content)
406453 }
407- // TODO: State events
408- _ => { }
454+ TimelineEventKind :: State { .. } | TimelineEventKind :: RedactedState => {
455+ // TODO
456+ }
457+ TimelineEventKind :: FailedToParseMessageLike { event_type, error } => {
458+ self . add ( NewEventTimelineItem :: failed_to_parse_message_like ( event_type, error) ) ;
459+ }
460+ TimelineEventKind :: FailedToParseState { event_type, state_key, error } => {
461+ self . add ( NewEventTimelineItem :: failed_to_parse_state ( event_type, state_key, error) ) ;
462+ }
409463 }
410464
411465 if !self . event_added {
@@ -449,6 +503,14 @@ impl<'a, 'i> TimelineEventHandler<'a, 'i> {
449503 ) ;
450504 return None ;
451505 }
506+ TimelineItemContent :: FailedToParseMessageLike { .. }
507+ | TimelineItemContent :: FailedToParseState { .. } => {
508+ info ! (
509+ %event_id,
510+ "Edit event applies to event that couldn't be parsed, discarding"
511+ ) ;
512+ return None ;
513+ }
452514 } ;
453515
454516 let content = TimelineItemContent :: Message ( Message {
@@ -705,6 +767,21 @@ impl NewEventTimelineItem {
705767 Self :: from_content ( TimelineItemContent :: RedactedMessage )
706768 }
707769
770+ fn failed_to_parse_message_like (
771+ event_type : MessageLikeEventType ,
772+ error : Arc < serde_json:: Error > ,
773+ ) -> NewEventTimelineItem {
774+ Self :: from_content ( TimelineItemContent :: FailedToParseMessageLike { event_type, error } )
775+ }
776+
777+ fn failed_to_parse_state (
778+ event_type : StateEventType ,
779+ state_key : String ,
780+ error : Arc < serde_json:: Error > ,
781+ ) -> NewEventTimelineItem {
782+ Self :: from_content ( TimelineItemContent :: FailedToParseState { event_type, state_key, error } )
783+ }
784+
708785 fn from_content ( content : TimelineItemContent ) -> Self {
709786 Self { content, reactions : BundledReactions :: default ( ) }
710787 }
0 commit comments