Skip to content

Commit 3a9d03c

Browse files
committed
fix not subscribing to KeyTransportEvents in the EncryptionManager + cleanup
1 parent c8e6279 commit 3a9d03c

File tree

4 files changed

+22
-17
lines changed

4 files changed

+22
-17
lines changed

src/matrixrtc/EncryptionManager.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import { secureRandomBase64Url } from "../randomstring.ts";
55
import { decodeBase64, encodeUnpaddedBase64 } from "../base64.ts";
66
import { safeGetRetryAfterMs } from "../http-api/errors.ts";
77
import { type CallMembership } from "./CallMembership.ts";
8-
import { KeyTransportEventListener, type IKeyTransport } from "./IKeyTransport.ts";
8+
import { KeyTransportEventListener, KeyTransportEvents, type IKeyTransport } from "./IKeyTransport.ts";
99

1010
const logger = rootLogger.getChild("MatrixRTCSession");
1111

@@ -116,6 +116,7 @@ export class EncryptionManager implements IEncryptionManager {
116116
this.joinConfig = joinConfig;
117117
this.joined = true;
118118
this.manageMediaKeys = this.joinConfig?.manageMediaKeys ?? this.manageMediaKeys;
119+
this.transport.on(KeyTransportEvents.ReceivedKeys, this.onNewKeyReceived);
119120
if (this.joinConfig?.manageMediaKeys) {
120121
this.makeNewSenderKey();
121122
this.requestSendCurrentKey();
@@ -127,6 +128,7 @@ export class EncryptionManager implements IEncryptionManager {
127128
// make new keys if we rejoin). We leave keys for other participants
128129
// as they may still be using the same ones.
129130
this.encryptionKeys.set(getParticipantId(this.userId, this.deviceId), []);
131+
this.transport.off(KeyTransportEvents.ReceivedKeys, this.onNewKeyReceived);
130132

131133
if (this.makeNewKeyTimeout !== undefined) {
132134
clearTimeout(this.makeNewKeyTimeout);

src/matrixrtc/MatrixRTCSession.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -296,6 +296,7 @@ export class MatrixRTCSession extends TypedEventEmitter<MatrixRTCSessionEvent, M
296296
| "_unstable_updateDelayedEvent"
297297
| "sendEvent"
298298
| "cancelPendingEvent"
299+
| "decryptEventIfNeeded"
299300
>,
300301
private roomSubset: Pick<
301302
Room,

src/matrixrtc/MatrixRTCSessionManager.ts

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ limitations under the License.
1717
import { logger as rootLogger } from "../logger.ts";
1818
import { type MatrixClient, ClientEvent } from "../client.ts";
1919
import { TypedEventEmitter } from "../models/typed-event-emitter.ts";
20-
import { type Room, RoomEvent } from "../models/room.ts";
20+
import { type Room } from "../models/room.ts";
2121
import { type RoomState, RoomStateEvent } from "../models/room-state.ts";
2222
import { type MatrixEvent } from "../models/event.ts";
2323
import { MatrixRTCSession } from "./MatrixRTCSession.ts";
@@ -116,14 +116,15 @@ export class MatrixRTCSessionManager extends TypedEventEmitter<MatrixRTCSessionM
116116

117117
private refreshRoom(room: Room): void {
118118
const isNewSession = !this.roomSessions.has(room.roomId);
119-
const sess = this.getRoomSession(room);
119+
const session = this.getRoomSession(room);
120120

121-
const wasActiveAndKnown = sess.memberships.length > 0 && !isNewSession;
122-
// TODO remove this and make the session subscribe to this manually.
123-
// move away from magically called methods. Prefer explicit subscriptions.
124-
sess.onRTCSessionMemberUpdate();
121+
const wasActiveAndKnown = session.memberships.length > 0 && !isNewSession;
122+
// TODO: we can move this directly into the rtcSession without any performacn impact.
123+
// Because it is possible to subscribe to state events per room. So each session will just
124+
// subscribe to only a subset of events.
125+
session.onRTCSessionMemberUpdate();
125126

126-
const nowActive = sess.memberships.length > 0;
127+
const nowActive = session.memberships.length > 0;
127128

128129
if (wasActiveAndKnown && !nowActive) {
129130
this.emit(MatrixRTCSessionManagerEvents.SessionEnded, room.roomId, this.roomSessions.get(room.roomId)!);

src/matrixrtc/RoomKeyTransport.ts

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,8 @@ import { KeyTransportEvents, KeyTransportEventsHandlerMap, type IKeyTransport }
2323
import { type MatrixEvent } from "../models/event.ts";
2424
import { type Statistics } from "./EncryptionManager.ts";
2525
import { type CallMembership } from "./CallMembership.ts";
26-
import { Room, RoomEvent, TypedEventEmitter } from "../matrix.ts";
26+
import { Room, RoomEvent } from "../matrix.ts";
27+
import { TypedEventEmitter } from "../models/typed-event-emitter.ts";
2728

2829
export class RoomKeyTransport
2930
extends TypedEventEmitter<KeyTransportEvents, KeyTransportEventsHandlerMap>
@@ -33,22 +34,25 @@ export class RoomKeyTransport
3334

3435
public constructor(
3536
private room: Pick<Room, "on" | "off" | "roomId">,
36-
private client: Pick<MatrixClient, "sendEvent" | "getDeviceId" | "getUserId" | "cancelPendingEvent">,
37+
private client: Pick<
38+
MatrixClient,
39+
"sendEvent" | "getDeviceId" | "getUserId" | "cancelPendingEvent" | "decryptEventIfNeeded"
40+
>,
3741
private statistics: Statistics,
3842
) {
3943
super();
4044
this.prefixedLogger = logger.getChild(`[RTC: ${room.roomId} RoomKeyTransport]`);
4145
}
4246
public start(): void {
43-
this.room.on(RoomEvent.Timeline, this.onTimeline);
47+
this.room.on(RoomEvent.Timeline, (ev) => this.consumeCallEncryptionEvent(ev));
4448
}
4549
public stop(): void {
46-
this.room.off(RoomEvent.Timeline, this.onTimeline);
50+
this.room.off(RoomEvent.Timeline, (ev) => this.consumeCallEncryptionEvent(ev));
4751
}
4852

4953
private async consumeCallEncryptionEvent(event: MatrixEvent, isRetry = false): Promise<void> {
50-
// we should not need this
51-
// await this.client.decryptEventIfNeeded(event);
54+
await this.client.decryptEventIfNeeded(event);
55+
5256
if (event.isDecryptionFailure()) {
5357
if (!isRetry) {
5458
logger.warn(
@@ -73,9 +77,6 @@ export class RoomKeyTransport
7377

7478
this.onEncryptionEvent(event);
7579
}
76-
private onTimeline = (event: MatrixEvent): void => {
77-
void this.consumeCallEncryptionEvent(event);
78-
};
7980

8081
/** implements {@link IKeyTransport#sendKey} */
8182
public async sendKey(keyBase64Encoded: string, index: number, members: CallMembership[]): Promise<void> {

0 commit comments

Comments
 (0)