From 9a95f0c0f9a47e0143fba8e69ab998a1221b01ef Mon Sep 17 00:00:00 2001 From: gnuxie Date: Sun, 2 Feb 2025 13:55:48 +0000 Subject: [PATCH 1/3] Make leaveEvent processing code clearer. I'm not sure wtf was going on with that if but i think it always returned early no matter what, so i have changed it to do what i think it is trying to do. Ban events used to be ignored for sure. --- src/MatrixClient.ts | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/src/MatrixClient.ts b/src/MatrixClient.ts index dbef443d..6585c169 100644 --- a/src/MatrixClient.ts +++ b/src/MatrixClient.ts @@ -827,17 +827,16 @@ export class MatrixClient extends EventEmitter { for (const event of room['timeline']['events']) { if (event['type'] !== 'm.room.member') continue; if (event['state_key'] !== await this.getUserId()) continue; - - const membership = event["content"]?.["membership"]; - if (membership !== "leave" && membership !== "ban") continue; - - const oldAge = leaveEvent && leaveEvent['unsigned'] && leaveEvent['unsigned']['age'] ? leaveEvent['unsigned']['age'] : 0; - const newAge = event['unsigned'] && event['unsigned']['age'] ? event['unsigned']['age'] : 0; - if (leaveEvent && oldAge < newAge) continue; - - leaveEvent = event; + switch (event["content"]?.["membership"]) { + case "leave": + case "ban": { + const oldAge = leaveEvent && leaveEvent['unsigned'] && leaveEvent['unsigned']['age'] ? leaveEvent['unsigned']['age'] : 0; + const newAge = event['unsigned'] && event['unsigned']['age'] ? event['unsigned']['age'] : 0; + if (leaveEvent && oldAge < newAge) continue; + leaveEvent = event; + } + } } - if (!leaveEvent) { LogService.warn("MatrixClientLite", "Left room " + roomId + " without receiving an event"); continue; From 5de1a9bd3d579de2b3d22d9d01dc8f287ae79299 Mon Sep 17 00:00:00 2001 From: gnuxie Date: Sun, 2 Feb 2025 13:57:52 +0000 Subject: [PATCH 2/3] Upgrade a warning about missing leave/ban event to error. If the client isn't alerted to leaving a room this can be pretty serious and represents a flaw in the SDK. --- src/MatrixClient.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/MatrixClient.ts b/src/MatrixClient.ts index 6585c169..b7e303ff 100644 --- a/src/MatrixClient.ts +++ b/src/MatrixClient.ts @@ -838,7 +838,7 @@ export class MatrixClient extends EventEmitter { } } if (!leaveEvent) { - LogService.warn("MatrixClientLite", "Left room " + roomId + " without receiving an event"); + LogService.error("MatrixClientLite", "Left room " + roomId + " without receiving an event"); continue; } From 7eb5d214d000944578c2c9e77bfd57ff2b84cd33 Mon Sep 17 00:00:00 2001 From: gnuxie Date: Sun, 2 Feb 2025 14:06:53 +0000 Subject: [PATCH 3/3] Add a test to verify `MatrixClient`'s `room.leave` emits on ban. --- test/MatrixClientTest.ts | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/test/MatrixClientTest.ts b/test/MatrixClientTest.ts index 377d9ad1..6bc6b376 100644 --- a/test/MatrixClientTest.ts +++ b/test/MatrixClientTest.ts @@ -1457,6 +1457,35 @@ describe('MatrixClient', () => { expect(spy.callCount).toBe(1); }); + it('should process banned rooms as left rooms', async () => { + const { client: realClient } = createTestClient(); + const client = (realClient); + + const userId = "@syncing:example.org"; + const roomId = "!testing:example.org"; + const events = [ + { + type: "m.room.member", + state_key: userId, + unsigned: { age: 0 }, + content: { membership: "ban" }, + }, + ]; + + client.userId = userId; + + const spy = simple.stub().callFn((rid, ev) => { + expect(ev).toMatchObject(events[0]); + expect(rid).toEqual(roomId); + }); + realClient.on("room.leave", spy); + + const roomsObj = {}; + roomsObj[roomId] = { timeline: { events: events } }; + await client.processSync({ rooms: { leave: roomsObj } }); + expect(spy.callCount).toBe(1); + }); + it('should process left rooms account data', async () => { const { client: realClient } = createTestClient(); const client = (realClient);