You've already forked matrix-js-sdk
mirror of
https://github.com/matrix-org/matrix-js-sdk.git
synced 2025-11-23 17:02:25 +03:00
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 <toger5@hotmail.de>
This commit is contained in:
@@ -154,5 +154,16 @@ module.exports = {
|
|||||||
"@typescript-eslint/no-empty-object-type": "off",
|
"@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",
|
||||||
|
},
|
||||||
|
},
|
||||||
],
|
],
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -41,7 +41,7 @@ export type Statistics = {
|
|||||||
export interface IEncryptionManager {
|
export interface IEncryptionManager {
|
||||||
join(joinConfig: EncryptionConfig | undefined): void;
|
join(joinConfig: EncryptionConfig | undefined): void;
|
||||||
leave(): void;
|
leave(): void;
|
||||||
onMembershipsUpdate(oldMemberships: CallMembership[]): Promise<void>;
|
onMembershipsUpdate(oldMemberships: CallMembership[]): void;
|
||||||
/**
|
/**
|
||||||
* Process `m.call.encryption_keys` events to track the encryption keys for call participants.
|
* 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.
|
* 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 =>
|
private isMyMembership = (m: CallMembership): boolean =>
|
||||||
m.sender === this.client.getUserId() && m.deviceId === this.client.getDeviceId();
|
m.sender === this.client.getUserId() && m.deviceId === this.client.getDeviceId();
|
||||||
|
|
||||||
public async onMembershipsUpdate(oldMemberships: CallMembership[]): Promise<void> {
|
public onMembershipsUpdate(oldMemberships: CallMembership[]): void {
|
||||||
if (this.manageMediaKeys && this.joined) {
|
if (this.manageMediaKeys && this.joined) {
|
||||||
const oldMembershipIds = new Set(
|
const oldMembershipIds = new Set(
|
||||||
oldMemberships.filter((m) => !this.isMyMembership(m)).map(getParticipantIdFromMembership),
|
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");
|
logger.info("Last encryption key event sent too recently: postponing");
|
||||||
if (this.keysEventUpdateTimeout === undefined) {
|
if (this.keysEventUpdateTimeout === undefined) {
|
||||||
this.keysEventUpdateTimeout = setTimeout(
|
this.keysEventUpdateTimeout = setTimeout(
|
||||||
this.sendEncryptionKeysEvent,
|
() => void this.sendEncryptionKeysEvent(),
|
||||||
this.updateEncryptionKeyThrottle,
|
this.updateEncryptionKeyThrottle,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
this.sendEncryptionKeysEvent();
|
void this.sendEncryptionKeysEvent();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -318,7 +318,7 @@ export class EncryptionManager implements IEncryptionManager {
|
|||||||
if (this.keysEventUpdateTimeout === undefined) {
|
if (this.keysEventUpdateTimeout === undefined) {
|
||||||
const resendDelay = safeGetRetryAfterMs(matrixError, 5000);
|
const resendDelay = safeGetRetryAfterMs(matrixError, 5000);
|
||||||
logger.warn(`Failed to send m.call.encryption_key, retrying in ${resendDelay}`, error);
|
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 {
|
} else {
|
||||||
logger.info("Not scheduling key resend as another re-send is already pending");
|
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);
|
const newKeyIndex = this.makeNewSenderKey(true);
|
||||||
// send immediately: if we're about to start sending with a new key, it's
|
// 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.
|
// important we get it out to others as soon as we can.
|
||||||
this.sendEncryptionKeysEvent(newKeyIndex);
|
void this.sendEncryptionKeysEvent(newKeyIndex);
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -458,11 +458,11 @@ export class MatrixRTCSession extends TypedEventEmitter<MatrixRTCSessionEvent, M
|
|||||||
logger.info(`Memberships for call in room ${this.room.roomId} have changed: emitting`);
|
logger.info(`Memberships for call in room ${this.room.roomId} have changed: emitting`);
|
||||||
this.emit(MatrixRTCSessionEvent.MembershipsChanged, oldMemberships, this.memberships);
|
this.emit(MatrixRTCSessionEvent.MembershipsChanged, oldMemberships, this.memberships);
|
||||||
|
|
||||||
this.membershipManager?.onRTCSessionMemberUpdate(this.memberships);
|
void this.membershipManager?.onRTCSessionMemberUpdate(this.memberships);
|
||||||
}
|
}
|
||||||
// This also needs to be done if `changed` = false
|
// This also needs to be done if `changed` = false
|
||||||
// A member might have updated their fingerprint (created_ts)
|
// A member might have updated their fingerprint (created_ts)
|
||||||
this.encryptionManager.onMembershipsUpdate(oldMemberships);
|
void this.encryptionManager.onMembershipsUpdate(oldMemberships);
|
||||||
|
|
||||||
this.setExpiryTimer();
|
this.setExpiryTimer();
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -71,7 +71,7 @@ export class MatrixRTCSessionManager extends TypedEventEmitter<MatrixRTCSessionM
|
|||||||
|
|
||||||
public stop(): void {
|
public stop(): void {
|
||||||
for (const sess of this.roomSessions.values()) {
|
for (const sess of this.roomSessions.values()) {
|
||||||
sess.stop();
|
void sess.stop();
|
||||||
}
|
}
|
||||||
this.roomSessions.clear();
|
this.roomSessions.clear();
|
||||||
|
|
||||||
@@ -108,7 +108,7 @@ export class MatrixRTCSessionManager extends TypedEventEmitter<MatrixRTCSessionM
|
|||||||
`Decryption failed for event ${event.getId()}: ${event.decryptionFailureReason} will retry once only`,
|
`Decryption failed for event ${event.getId()}: ${event.decryptionFailureReason} will retry once only`,
|
||||||
);
|
);
|
||||||
// retry after 1 second. After this we give up.
|
// retry after 1 second. After this we give up.
|
||||||
setTimeout(() => this.consumeCallEncryptionEvent(event, true), 1000);
|
setTimeout(() => void this.consumeCallEncryptionEvent(event, true), 1000);
|
||||||
} else {
|
} else {
|
||||||
logger.warn(`Decryption failed for event ${event.getId()}: ${event.decryptionFailureReason}`);
|
logger.warn(`Decryption failed for event ${event.getId()}: ${event.decryptionFailureReason}`);
|
||||||
}
|
}
|
||||||
@@ -128,7 +128,7 @@ export class MatrixRTCSessionManager extends TypedEventEmitter<MatrixRTCSessionM
|
|||||||
this.getRoomSession(room).onCallEncryption(event);
|
this.getRoomSession(room).onCallEncryption(event);
|
||||||
}
|
}
|
||||||
private onTimeline = (event: MatrixEvent): void => {
|
private onTimeline = (event: MatrixEvent): void => {
|
||||||
this.consumeCallEncryptionEvent(event);
|
void this.consumeCallEncryptionEvent(event);
|
||||||
};
|
};
|
||||||
|
|
||||||
private onRoom = (room: Room): void => {
|
private onRoom = (room: Room): void => {
|
||||||
|
|||||||
@@ -134,7 +134,7 @@ export class LegacyMembershipManager implements IMembershipManager {
|
|||||||
this.relativeExpiry = this.membershipExpiryTimeout;
|
this.relativeExpiry = this.membershipExpiryTimeout;
|
||||||
// We don't wait for this, mostly because it may fail and schedule a retry, so this
|
// 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.
|
// function returning doesn't really mean anything at all.
|
||||||
this.triggerCallMembershipEventUpdate();
|
void this.triggerCallMembershipEventUpdate();
|
||||||
}
|
}
|
||||||
|
|
||||||
public async leave(timeout: number | undefined = undefined): Promise<boolean> {
|
public async leave(timeout: number | undefined = undefined): Promise<boolean> {
|
||||||
@@ -351,7 +351,7 @@ export class LegacyMembershipManager implements IMembershipManager {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private scheduleDelayDisconnection(): void {
|
private scheduleDelayDisconnection(): void {
|
||||||
this.memberEventTimeout = setTimeout(this.delayDisconnection, this.membershipKeepAlivePeriod);
|
this.memberEventTimeout = setTimeout(() => void this.delayDisconnection(), this.membershipKeepAlivePeriod);
|
||||||
}
|
}
|
||||||
|
|
||||||
private readonly delayDisconnection = async (): Promise<void> => {
|
private readonly delayDisconnection = async (): Promise<void> => {
|
||||||
|
|||||||
Reference in New Issue
Block a user