From 524cb65c5d34ca85589960ff89a38151f9434982 Mon Sep 17 00:00:00 2001 From: Hugh Nimmo-Smith Date: Mon, 24 Feb 2025 20:15:07 +0000 Subject: [PATCH] MatrixRTC: enforce Promise handling using eslint rules (#4725) * MatrixRTC: enforce Promise handling using eslint rules * Fix lints without behaviour change. * fix not calling functions --------- Co-authored-by: Timo --- .eslintrc.cjs | 11 +++++++++++ src/matrixrtc/EncryptionManager.ts | 12 ++++++------ src/matrixrtc/MatrixRTCSession.ts | 4 ++-- src/matrixrtc/MatrixRTCSessionManager.ts | 6 +++--- src/matrixrtc/MembershipManager.ts | 4 ++-- 5 files changed, 24 insertions(+), 13 deletions(-) diff --git a/.eslintrc.cjs b/.eslintrc.cjs index 1ab3fe44b..55c326d36 100644 --- a/.eslintrc.cjs +++ b/.eslintrc.cjs @@ -154,5 +154,16 @@ module.exports = { "@typescript-eslint/no-empty-object-type": "off", }, }, + { + // Enable stricter promise rules for the MatrixRTC codebase + files: ["src/matrixrtc/**/*.ts"], + rules: { + // Encourage proper usage of Promises: + "@typescript-eslint/no-floating-promises": "error", + "@typescript-eslint/no-misused-promises": "error", + "@typescript-eslint/require-await": "error", + "@typescript-eslint/await-thenable": "error", + }, + }, ], }; diff --git a/src/matrixrtc/EncryptionManager.ts b/src/matrixrtc/EncryptionManager.ts index 0ddaf7f87..09cda18d2 100644 --- a/src/matrixrtc/EncryptionManager.ts +++ b/src/matrixrtc/EncryptionManager.ts @@ -41,7 +41,7 @@ export type Statistics = { export interface IEncryptionManager { join(joinConfig: EncryptionConfig | undefined): void; leave(): void; - onMembershipsUpdate(oldMemberships: CallMembership[]): Promise; + onMembershipsUpdate(oldMemberships: CallMembership[]): void; /** * Process `m.call.encryption_keys` events to track the encryption keys for call participants. * This should be called each time the relevant event is received from a room timeline. @@ -150,7 +150,7 @@ export class EncryptionManager implements IEncryptionManager { private isMyMembership = (m: CallMembership): boolean => m.sender === this.client.getUserId() && m.deviceId === this.client.getDeviceId(); - public async onMembershipsUpdate(oldMemberships: CallMembership[]): Promise { + public onMembershipsUpdate(oldMemberships: CallMembership[]): void { if (this.manageMediaKeys && this.joined) { const oldMembershipIds = new Set( oldMemberships.filter((m) => !this.isMyMembership(m)).map(getParticipantIdFromMembership), @@ -231,14 +231,14 @@ export class EncryptionManager implements IEncryptionManager { logger.info("Last encryption key event sent too recently: postponing"); if (this.keysEventUpdateTimeout === undefined) { this.keysEventUpdateTimeout = setTimeout( - this.sendEncryptionKeysEvent, + () => void this.sendEncryptionKeysEvent(), this.updateEncryptionKeyThrottle, ); } return; } - this.sendEncryptionKeysEvent(); + void this.sendEncryptionKeysEvent(); } /** @@ -318,7 +318,7 @@ export class EncryptionManager implements IEncryptionManager { if (this.keysEventUpdateTimeout === undefined) { const resendDelay = safeGetRetryAfterMs(matrixError, 5000); logger.warn(`Failed to send m.call.encryption_key, retrying in ${resendDelay}`, error); - this.keysEventUpdateTimeout = setTimeout(this.sendEncryptionKeysEvent, resendDelay); + this.keysEventUpdateTimeout = setTimeout(() => void this.sendEncryptionKeysEvent(), resendDelay); } else { logger.info("Not scheduling key resend as another re-send is already pending"); } @@ -488,7 +488,7 @@ export class EncryptionManager implements IEncryptionManager { const newKeyIndex = this.makeNewSenderKey(true); // send immediately: if we're about to start sending with a new key, it's // important we get it out to others as soon as we can. - this.sendEncryptionKeysEvent(newKeyIndex); + void this.sendEncryptionKeysEvent(newKeyIndex); }; } diff --git a/src/matrixrtc/MatrixRTCSession.ts b/src/matrixrtc/MatrixRTCSession.ts index 64672500a..87d1211c9 100644 --- a/src/matrixrtc/MatrixRTCSession.ts +++ b/src/matrixrtc/MatrixRTCSession.ts @@ -458,11 +458,11 @@ export class MatrixRTCSession extends TypedEventEmitter this.consumeCallEncryptionEvent(event, true), 1000); + setTimeout(() => void this.consumeCallEncryptionEvent(event, true), 1000); } else { logger.warn(`Decryption failed for event ${event.getId()}: ${event.decryptionFailureReason}`); } @@ -128,7 +128,7 @@ export class MatrixRTCSessionManager extends TypedEventEmitter { - this.consumeCallEncryptionEvent(event); + void this.consumeCallEncryptionEvent(event); }; private onRoom = (room: Room): void => { diff --git a/src/matrixrtc/MembershipManager.ts b/src/matrixrtc/MembershipManager.ts index f398afb70..1cc6b7cc1 100644 --- a/src/matrixrtc/MembershipManager.ts +++ b/src/matrixrtc/MembershipManager.ts @@ -134,7 +134,7 @@ export class LegacyMembershipManager implements IMembershipManager { this.relativeExpiry = this.membershipExpiryTimeout; // We don't wait for this, mostly because it may fail and schedule a retry, so this // function returning doesn't really mean anything at all. - this.triggerCallMembershipEventUpdate(); + void this.triggerCallMembershipEventUpdate(); } public async leave(timeout: number | undefined = undefined): Promise { @@ -351,7 +351,7 @@ export class LegacyMembershipManager implements IMembershipManager { } private scheduleDelayDisconnection(): void { - this.memberEventTimeout = setTimeout(this.delayDisconnection, this.membershipKeepAlivePeriod); + this.memberEventTimeout = setTimeout(() => void this.delayDisconnection(), this.membershipKeepAlivePeriod); } private readonly delayDisconnection = async (): Promise => {