diff --git a/src/matrix/e2ee/olm/Decryption.js b/src/matrix/e2ee/olm/Decryption.js index f701f4df..ec87af74 100644 --- a/src/matrix/e2ee/olm/Decryption.js +++ b/src/matrix/e2ee/olm/Decryption.js @@ -15,6 +15,7 @@ limitations under the License. */ import {DecryptionError} from "../common.js"; +import {groupBy} from "../../../utils/groupBy.js"; const SESSION_LIMIT_PER_SENDER_KEY = 4; @@ -49,16 +50,7 @@ export class Decryption { // // doing it one by one would be possible, but we would lose the opportunity for parallelization async decryptAll(events) { - const eventsPerSenderKey = events.reduce((map, event) => { - const senderKey = event.content?.["sender_key"]; - let list = map.get(senderKey); - if (!list) { - list = []; - map.set(senderKey, list); - } - list.push(event); - return map; - }, new Map()); + const eventsPerSenderKey = groupBy(events, event => event.content?.["sender_key"]); const timestamp = this._now(); const readSessionsTxn = await this._storage.readTxn([this._storage.storeNames.olmSessions]); // decrypt events for different sender keys in parallel diff --git a/src/utils/groupBy.js b/src/utils/groupBy.js new file mode 100644 index 00000000..5df2f36d --- /dev/null +++ b/src/utils/groupBy.js @@ -0,0 +1,35 @@ +/* +Copyright 2020 The Matrix.org Foundation C.I.C. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +export function groupBy(array, groupFn) { + return groupByWithCreator(array, groupFn, + () => {return [];}, + (array, value) => array.push(value) + ); +} + +export function groupByWithCreator(array, groupFn, createCollectionFn, addCollectionFn) { + return array.reduce((map, value) => { + const key = groupFn(value); + let collection = map.get(key); + if (!collection) { + collection = createCollectionFn(); + map.set(key, collection); + } + addCollectionFn(collection, value); + return map; + }, new Map()); +}