diff --git a/src/crypto/algorithms/megolm.ts b/src/crypto/algorithms/megolm.ts index b7bb1165a..8bf5a7c62 100644 --- a/src/crypto/algorithms/megolm.ts +++ b/src/crypto/algorithms/megolm.ts @@ -592,7 +592,8 @@ class MegolmEncryption extends EncryptionAlgorithm { payload: IPayload, ): Promise { const contentMap: Record> = {}; - const deviceInfoByDeviceId = new Map(); + // Map from userId to a map of deviceId to deviceInfo + const deviceInfoByUserIdAndDeviceId = new Map>(); const promises: Promise[] = []; for (let i = 0; i < userDeviceMap.length; i++) { @@ -605,7 +606,18 @@ class MegolmEncryption extends EncryptionAlgorithm { const userId = val.userId; const deviceInfo = val.deviceInfo; const deviceId = deviceInfo.deviceId; - deviceInfoByDeviceId.set(deviceId, deviceInfo); + + // Assign to temp value to make type-checking happy + let userIdDeviceInfo = deviceInfoByUserIdAndDeviceId.get(userId); + + if (userIdDeviceInfo === undefined) { + userIdDeviceInfo = new Map(); + + deviceInfoByUserIdAndDeviceId.set(userId, userIdDeviceInfo); + } + + // We hold by reference, this updates deviceInfoByUserIdAndDeviceId[userId] + userIdDeviceInfo.set(deviceId, deviceInfo); if (!contentMap[userId]) { contentMap[userId] = {}; @@ -660,7 +672,7 @@ class MegolmEncryption extends EncryptionAlgorithm { session.markSharedWithDevice( userId, deviceId, - deviceInfoByDeviceId.get(deviceId).getIdentityKey(), + deviceInfoByUserIdAndDeviceId.get(userId).get(deviceId).getIdentityKey(), chainIndex, ); }