diff --git a/changelog.d/+cde4a9ec3.bugfix.md b/changelog.d/+cde4a9ec3.bugfix.md new file mode 100644 index 000000000..bd8e32adf --- /dev/null +++ b/changelog.d/+cde4a9ec3.bugfix.md @@ -0,0 +1 @@ +Fixed freshly left room failing to sync. diff --git a/src/api/client/sync/v3/left.rs b/src/api/client/sync/v3/left.rs index 209387713..83077a9df 100644 --- a/src/api/client/sync/v3/left.rs +++ b/src/api/client/sync/v3/left.rs @@ -230,7 +230,7 @@ async fn build_left_state_and_timeline( .and_then(|limit| limit.try_into().ok()) .unwrap_or(DEFAULT_TIMELINE_LIMIT); - let timeline = load_timeline( + let mut timeline = load_timeline( services, syncing_user, room_id, @@ -240,6 +240,20 @@ async fn build_left_state_and_timeline( ) .await?; + // the timeline index can lag behind the leave PDU, so `load_timeline` may omit + // it. we already hold the leave event, so ensure it's always synced to the + // client. + let leave_synced = timeline + .pdus + .iter() + .any(|(_, pdu)| pdu.event_id() == leave_membership_event.event_id()); + + if !leave_synced { + timeline + .pdus + .push_back((timeline_end_count, leave_membership_event)); + } + let lazily_loaded_members = prepare_lazily_loaded_members(services, sync_context, room_id, timeline.senders()).await;