From 8b21a558482a723659d0eb9ee021732b364f28f0 Mon Sep 17 00:00:00 2001 From: Ian Calvert Date: Fri, 7 Feb 2025 12:05:44 +0000 Subject: [PATCH 1/3] Improve typing --- packages/host/app/resources/room.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/host/app/resources/room.ts b/packages/host/app/resources/room.ts index d8a8202f1a..a335c23d68 100644 --- a/packages/host/app/resources/room.ts +++ b/packages/host/app/resources/room.ts @@ -138,7 +138,7 @@ export class RoomResource extends Resource { return this.members.filter((m) => m.membership === 'join'); } - private get events() { + private get events(): DiscreteMatrixEvent[] { return this.matrixRoom?.events ?? []; } From be7cf2b7d5a0efe9b4aa4b3125ea920b56a4c6f7 Mon Sep 17 00:00:00 2001 From: Ian Calvert Date: Fri, 7 Feb 2025 12:06:17 +0000 Subject: [PATCH 2/3] Only process events from the most recent unseen event --- packages/host/app/resources/room.ts | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/packages/host/app/resources/room.ts b/packages/host/app/resources/room.ts index a335c23d68..bc280b510b 100644 --- a/packages/host/app/resources/room.ts +++ b/packages/host/app/resources/room.ts @@ -62,6 +62,7 @@ interface Args { export class RoomResource extends Resource { private _previousRoomId: string | undefined; + private _processedEvents = new Set(); private _messageCache: TrackedMap = new TrackedMap(); private _skillCardsCache: TrackedMap = new TrackedMap(); private _nameEventsCache: TrackedMap = @@ -249,7 +250,19 @@ export class RoomResource extends Resource { private async loadFromEvents(roomId: string) { let index = this._messageCache.size; - for (let event of this.sortedEvents) { + // We want to avoid reprocessing events, here we pick the + // first unprocessed event and run everything in order from there + const firstUnprocessedIndex = this.sortedEvents.findIndex( + (event) => !this._processedEvents.has(event.event_id), + ); + + if (firstUnprocessedIndex === -1) { + // All events have been processed + return; + } + + for (let i = firstUnprocessedIndex; i < this.sortedEvents.length; i++) { + const event = this.sortedEvents[i]; switch (event.type) { case 'm.room.member': await this.loadRoomMemberEvent(roomId, event); @@ -267,6 +280,7 @@ export class RoomResource extends Resource { await this.loadRoomNameEvent(event); break; } + this._processedEvents.add(event.event_id); } } From 594dd5a46fb15b2ef7ac21436b5eac4d6ac38c37 Mon Sep 17 00:00:00 2001 From: Ian Calvert Date: Fri, 7 Feb 2025 13:33:58 +0000 Subject: [PATCH 3/3] Reset the processed events on room switch --- packages/host/app/resources/room.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/host/app/resources/room.ts b/packages/host/app/resources/room.ts index bc280b510b..f27d48a1d4 100644 --- a/packages/host/app/resources/room.ts +++ b/packages/host/app/resources/room.ts @@ -99,6 +99,7 @@ export class RoomResource extends Resource { } private resetCache() { + this._processedEvents.clear(); this._messageCache = new TrackedMap(); this._memberCache = new TrackedMap(); this._fragmentCache = new TrackedMap();