fix(sync/v3): Do not include the last membership event when syncing left rooms

This commit is contained in:
Ginger 2025-11-05 17:40:14 -05:00
parent 8ffc6d4f15
commit ee51d4357f
2 changed files with 16 additions and 14 deletions

View file

@ -39,6 +39,7 @@ impl TimelinePdus {
}
}
/// Load up to `limit` PDUs in the range (starting_count, ending_count].
async fn load_timeline(
services: &Services,
sender_user: &UserId,

View file

@ -137,20 +137,21 @@ pub(super) async fn load_left_room(
// if the user went from `join` to `leave`, they should be able to view the
// timeline.
let timeline_start_count = if let Some(last_sync_end_count) =
last_sync_end_count
{
// for incremental syncs, start the timeline after `since`
PduCount::Normal(last_sync_end_count)
} else {
// for initial syncs, start the timeline at the previous membership event
services
.rooms
.timeline
.get_pdu_count(&prev_member_event.event_id)
.await?
.saturating_sub(1)
};
let timeline_start_count =
if let Some(last_sync_end_count) = last_sync_end_count {
// for incremental syncs, start the timeline after `since`
PduCount::Normal(last_sync_end_count)
} else {
// for initial syncs, start the timeline after the previous membership
// event. we don't want to include the membership event itself
// because clients get confused when they see a `join`
// membership event in a `leave` room.
services
.rooms
.timeline
.get_pdu_count(&prev_member_event.event_id)
.await?
};
// end the timeline at the user's leave event
let timeline_end_count = services