From 42f44de2b13588aede30d5f64fc381ee1a72f90c Mon Sep 17 00:00:00 2001 From: krille-chan Date: Thu, 9 May 2024 15:53:35 +0200 Subject: [PATCH] refactor: Cache direct chat matrix ID The direct chat account data content is a map from matrixId to roomId(s). If we want to find the roomId for a given userId, then this is not a problem. But the other way around, if we want to check if a given roomId is a direct chat or not, needs to process all entries which can be hundreds. Doing this very often in an app costs a lot of performance. This adds a simple cache in the room object and validates the cache every time to make this more efficient. --- lib/src/room.dart | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/lib/src/room.dart b/lib/src/room.dart index 04d3a3625..b34147f7a 100644 --- a/lib/src/room.dart +++ b/lib/src/room.dart @@ -356,15 +356,27 @@ class Room { }); } + String? _cachedDirectChatMatrixId; + /// If this room is a direct chat, this is the matrix ID of the user. /// Returns null otherwise. String? get directChatMatrixID { + // Calculating the directChatMatrixId can be expensive. We cache it and + // validate the cache instead every time. + final cache = _cachedDirectChatMatrixId; + if (cache != null) { + final roomIds = client.directChats[cache]; + if (roomIds is List && roomIds.contains(id)) { + return cache; + } + } + if (membership == Membership.invite) { final userID = client.userID; if (userID == null) return null; final invitation = getState(EventTypes.RoomMember, userID); if (invitation != null && invitation.content['is_direct'] == true) { - return invitation.senderId; + return _cachedDirectChatMatrixId = invitation.senderId; } } @@ -373,8 +385,8 @@ class Room { final roomIds = e.value; return roomIds is List && roomIds.contains(id); })?.key; - if (mxId?.isValidMatrixId == true) return mxId; - return null; + if (mxId?.isValidMatrixId == true) return _cachedDirectChatMatrixId = mxId; + return _cachedDirectChatMatrixId = null; } /// Wheither this is a direct chat or not