From 08c22b5fccdd792e3a9002316736c3991acbcd42 Mon Sep 17 00:00:00 2001 From: Erwan Leboucher Date: Fri, 24 Jul 2026 16:53:53 +0200 Subject: [PATCH] fix(sync): Wake local target user after membership changes are committed --- changelog.d/wake-local-member-sync.bugfix.md | 1 + src/service/rooms/timeline/append.rs | 12 ++++++++++++ src/service/rooms/timeline/build.rs | 12 ++++++++++++ 3 files changed, 25 insertions(+) create mode 100644 changelog.d/wake-local-member-sync.bugfix.md diff --git a/changelog.d/wake-local-member-sync.bugfix.md b/changelog.d/wake-local-member-sync.bugfix.md new file mode 100644 index 000000000..69ba5ebee --- /dev/null +++ b/changelog.d/wake-local-member-sync.bugfix.md @@ -0,0 +1 @@ +Fixed local invites and invite acceptances not being reflected in sync promptly. Contributed by @eleboucher diff --git a/src/service/rooms/timeline/append.rs b/src/service/rooms/timeline/append.rs index c1959c94d..377781160 100644 --- a/src/service/rooms/timeline/append.rs +++ b/src/service/rooms/timeline/append.rs @@ -132,6 +132,18 @@ impl super::Service { self.services.sync.wake_all_joined(&room_id).await; + if *pdu.kind() == TimelineEventType::RoomMember { + if let Some(target_user) = pdu + .state_key + .as_ref() + .and_then(|state_key| UserId::parse(state_key.as_str()).ok()) + { + if self.services.globals.user_is_local(&target_user) { + self.services.sync.wake(&target_user).await; + } + } + } + Ok(Some(pdu_id)) } diff --git a/src/service/rooms/timeline/build.rs b/src/service/rooms/timeline/build.rs index 1c0ee0f94..fcc984cab 100644 --- a/src/service/rooms/timeline/build.rs +++ b/src/service/rooms/timeline/build.rs @@ -155,6 +155,18 @@ impl super::Service { self.services.sync.wake_all_joined(&room_id).await; + if *pdu.kind() == TimelineEventType::RoomMember { + if let Some(target_user) = pdu + .state_key + .as_ref() + .and_then(|state_key| UserId::parse(state_key.as_str()).ok()) + { + if self.services.globals.user_is_local(&target_user) { + self.services.sync.wake(&target_user).await; + } + } + } + let mut servers: HashSet = self .services .state_cache