convert groupby and megolm decryption utils to typescript

This commit is contained in:
Bruno Windels 2021-10-21 14:40:51 +02:00
parent 66a77519d7
commit 77d10c93d6
7 changed files with 27 additions and 25 deletions

View file

@ -15,7 +15,7 @@ limitations under the License.
*/
import {OLM_ALGORITHM} from "./e2ee/common.js";
import {countBy, groupBy} from "../utils/groupBy.js";
import {countBy, groupBy} from "../utils/groupBy";
export class DeviceMessageHandler {
constructor({storage}) {

View file

@ -33,7 +33,7 @@ import {MEGOLM_ALGORITHM} from "./e2ee/common.js";
import {RoomEncryption} from "./e2ee/RoomEncryption.js";
import {DeviceTracker} from "./e2ee/DeviceTracker.js";
import {LockMap} from "../utils/LockMap.js";
import {groupBy} from "../utils/groupBy.js";
import {groupBy} from "../utils/groupBy";
import {
keyFromCredential as ssssKeyFromCredential,
readKey as ssssReadKey,

View file

@ -15,9 +15,9 @@ limitations under the License.
*/
import {MEGOLM_ALGORITHM, DecryptionSource} from "./common.js";
import {groupEventsBySession} from "./megolm/decryption/utils.js";
import {groupEventsBySession} from "./megolm/decryption/utils";
import {mergeMap} from "../../utils/mergeMap.js";
import {groupBy} from "../../utils/groupBy.js";
import {groupBy} from "../../utils/groupBy";
import {makeTxnId} from "../common.js";
const ENCRYPTED_TYPE = "m.room.encrypted";

View file

@ -14,44 +14,46 @@ See the License for the specific language governing permissions and
limitations under the License.
*/
import {groupByWithCreator} from "../../../../utils/groupBy.js";
import {groupByWithCreator} from "../../../../utils/groupBy";
import type {TimelineEvent} from "../../../storage/types";
function getSenderKey(event) {
function getSenderKey(event: TimelineEvent): string | undefined {
return event.content?.["sender_key"];
}
function getSessionId(event) {
function getSessionId(event: TimelineEvent): string | undefined {
return event.content?.["session_id"];
}
function getCiphertext(event) {
function getCiphertext(event: TimelineEvent): string | undefined {
return event.content?.ciphertext;
}
export function validateEvent(event) {
export function validateEvent(event: TimelineEvent) {
return typeof getSenderKey(event) === "string" &&
typeof getSessionId(event) === "string" &&
typeof getCiphertext(event) === "string";
}
class SessionKeyGroup {
export class SessionKeyGroup {
public readonly events: TimelineEvent[];
constructor() {
this.events = [];
}
get senderKey() {
return getSenderKey(this.events[0]);
get senderKey(): string | undefined {
return getSenderKey(this.events[0]!);
}
get sessionId() {
return getSessionId(this.events[0]);
get sessionId(): string | undefined {
return getSessionId(this.events[0]!);
}
}
export function groupEventsBySession(events) {
return groupByWithCreator(events,
event => `${getSenderKey(event)}|${getSessionId(event)}`,
export function groupEventsBySession(events: TimelineEvent[]): Map<string, SessionKeyGroup> {
return groupByWithCreator<string, TimelineEvent, SessionKeyGroup>(events,
(event: TimelineEvent) => `${getSenderKey(event)}|${getSessionId(event)}`,
() => new SessionKeyGroup(),
(group, event) => group.events.push(event)
(group: SessionKeyGroup, event: TimelineEvent) => group.events.push(event)
);
}

View file

@ -15,7 +15,7 @@ limitations under the License.
*/
import {DecryptionError} from "../common.js";
import {groupBy} from "../../../utils/groupBy.js";
import {groupBy} from "../../../utils/groupBy";
import {MultiLock} from "../../../utils/Lock.js";
import {Session} from "./Session.js";
import {DecryptionResult} from "../DecryptionResult.js";

View file

@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
limitations under the License.
*/
import {groupByWithCreator} from "../../../utils/groupBy.js";
import {groupByWithCreator} from "../../../utils/groupBy";
import {verifyEd25519Signature, OLM_ALGORITHM} from "../common.js";
import {createSessionEntry} from "./Session.js";

View file

@ -14,14 +14,14 @@ See the License for the specific language governing permissions and
limitations under the License.
*/
export function groupBy(array, groupFn) {
return groupByWithCreator(array, groupFn,
export function groupBy<K, V>(array: V[], groupFn: (V) => K): Map<K, V[]> {
return groupByWithCreator<K, V, V[]>(array, groupFn,
() => {return [];},
(array, value) => array.push(value)
);
}
export function groupByWithCreator(array, groupFn, createCollectionFn, addCollectionFn) {
export function groupByWithCreator<K, V, C>(array: V[], groupFn: (V) => K, createCollectionFn: () => C, addCollectionFn: (C, V) => void): Map<K, C> {
return array.reduce((map, value) => {
const key = groupFn(value);
let collection = map.get(key);
@ -31,10 +31,10 @@ export function groupByWithCreator(array, groupFn, createCollectionFn, addCollec
}
addCollectionFn(collection, value);
return map;
}, new Map());
}, new Map<K, C>());
}
export function countBy(events, mapper) {
export function countBy<V>(events: V[], mapper: (V) => string | number): { [key: string]: number } {
return events.reduce((counts, event) => {
const mappedValue = mapper(event);
if (!counts[mappedValue]) {