From 9bb203abe8b2455a54986166414bae8b014e20d4 Mon Sep 17 00:00:00 2001 From: Erwan Leboucher Date: Sun, 13 Sep 2026 00:53:22 +0200 Subject: [PATCH] fix(sync): Omit empty room account data from sliding sync responses --- changelog.d/2226.bugfix.md | 1 + src/api/client/sync/v5.rs | 22 ++++++++++++++-------- 2 files changed, 15 insertions(+), 8 deletions(-) create mode 100644 changelog.d/2226.bugfix.md diff --git a/changelog.d/2226.bugfix.md b/changelog.d/2226.bugfix.md new file mode 100644 index 000000000..1407c9f3c --- /dev/null +++ b/changelog.d/2226.bugfix.md @@ -0,0 +1 @@ +Sliding sync responses no longer include an empty room account data entry for every room in a list's range. Contributed by @eleboucher. diff --git a/src/api/client/sync/v5.rs b/src/api/client/sync/v5.rs index 2148f3ece..d169509a6 100644 --- a/src/api/client/sync/v5.rs +++ b/src/api/client/sync/v5.rs @@ -855,15 +855,21 @@ where }; if body.extensions.account_data.enabled == Some(true) { - response.extensions.account_data.rooms.insert( - room_id.to_owned(), - services + let room_account_data: Vec<_> = services + .account_data + .changes_since(Some(room_id), sender_user, Some(*roomsince), Some(next_batch)) + .ready_filter_map(|e| extract_variant!(e, AnyRawAccountDataEvent::Room)) + .collect() + .await; + + // An empty entry makes clients treat the room as updated. + if !room_account_data.is_empty() { + response + .extensions .account_data - .changes_since(Some(room_id), sender_user, Some(*roomsince), Some(next_batch)) - .ready_filter_map(|e| extract_variant!(e, AnyRawAccountDataEvent::Room)) - .collect() - .await, - ); + .rooms + .insert(room_id.to_owned(), room_account_data); + } } let last_privateread_update = services