From c978a22f20bf162bac54295c68588e7525fffc8a Mon Sep 17 00:00:00 2001 From: Guilherme Gazzo Date: Tue, 24 Mar 2026 13:05:52 -0300 Subject: [PATCH 1/2] fix: include banned and invited servers in event destination set getServerSetInRoom only considered servers with 'join' membership, excluding servers whose users were banned or had pending invites. This caused unban (leave) events to never reach the banned user's server, breaking the state chain and preventing re-invites. Include 'ban' and 'invite' memberships so these servers continue receiving room events needed to maintain a consistent state. --- packages/federation-sdk/src/services/state.service.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/federation-sdk/src/services/state.service.ts b/packages/federation-sdk/src/services/state.service.ts index 9eb6ba38..657568a1 100644 --- a/packages/federation-sdk/src/services/state.service.ts +++ b/packages/federation-sdk/src/services/state.service.ts @@ -697,8 +697,10 @@ export class StateService { const servers = new Set(); + const residentMemberships = new Set(['join', 'invite', 'ban']); + for (const event of state.values()) { - if (!event.isMembershipEvent() || event.getMembership() !== 'join') { + if (!event.isMembershipEvent() || !residentMemberships.has(event.getMembership() ?? '')) { continue; } From 4136d6b0af25cb9cba24a3ba6574a325e713416e Mon Sep 17 00:00:00 2001 From: Guilherme Gazzo Date: Tue, 24 Mar 2026 13:22:45 -0300 Subject: [PATCH 2/2] test: update getServerSetInRoom test to expect banned/invited servers The test previously asserted that banned and invited servers were excluded from the destination set. Updated to match the new behavior where these servers are included to ensure they receive room events. --- .../federation-sdk/src/services/state.service.spec.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/federation-sdk/src/services/state.service.spec.ts b/packages/federation-sdk/src/services/state.service.spec.ts index d6161451..9611aadb 100644 --- a/packages/federation-sdk/src/services/state.service.spec.ts +++ b/packages/federation-sdk/src/services/state.service.spec.ts @@ -2262,7 +2262,7 @@ describe('StateService', async () => { expect(servers.size).toBe(1); }); - it('should exclude servers with non-joined members', async () => { + it('should include servers with banned or invited members but exclude left', async () => { const { roomCreateEvent } = await createRoom('public'); const creator = '@alice:example.com'; // Room creator with admin permissions @@ -2284,9 +2284,9 @@ describe('StateService', async () => { expect(servers.has('joined.com')).toBe(true); expect(servers.has('left.com')).toBe(false); - expect(servers.has('banned.com')).toBe(false); - expect(servers.has('invited.com')).toBe(false); - expect(servers.size).toBe(2); // example.com (creator) + joined.com + expect(servers.has('banned.com')).toBe(true); + expect(servers.has('invited.com')).toBe(true); + expect(servers.size).toBe(4); // example.com (creator) + joined.com + banned.com + invited.com }); it('should return creator server for room with only creator', async () => {