Skip to content

Commit b3e3d8f

Browse files
committed
fix one test and broken bits needed for the test (mostly statistics wrangling)
1 parent 902f3d3 commit b3e3d8f

File tree

5 files changed

+60
-50
lines changed

5 files changed

+60
-50
lines changed

spec/unit/matrixrtc/MatrixRTCSession.spec.ts

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,19 @@ See the License for the specific language governing permissions and
1414
limitations under the License.
1515
*/
1616

17-
import { encodeBase64, EventType, MatrixClient, type MatrixError, type MatrixEvent, type Room } from "../../../src";
17+
import {
18+
encodeBase64,
19+
EventType,
20+
IRoomTimelineData,
21+
MatrixClient,
22+
RoomEvent,
23+
type MatrixError,
24+
type MatrixEvent,
25+
type Room,
26+
} from "../../../src";
1827
import { KnownMembership } from "../../../src/@types/membership";
1928
import { DEFAULT_EXPIRE_DURATION, type SessionMembershipData } from "../../../src/matrixrtc/CallMembership";
29+
import { IKeyTransport } from "../../../src/matrixrtc/IKeyTransport";
2030
import { MatrixRTCSession, MatrixRTCSessionEvent } from "../../../src/matrixrtc/MatrixRTCSession";
2131
import { type EncryptionKeysEventContent } from "../../../src/matrixrtc/types";
2232
import { secureRandomString } from "../../../src/randomstring";
@@ -988,7 +998,8 @@ describe("MatrixRTCSession", () => {
988998
it("collects keys from encryption events", () => {
989999
const mockRoom = makeMockRoom([membershipTemplate]);
9901000
sess = MatrixRTCSession.roomSessionForRoom(client, mockRoom);
991-
sess.onCallEncryption({
1001+
sess!.joinRoomSession([mockFocus], mockFocus, { manageMediaKeys: true });
1002+
(sess as unknown as any).encryptionManager.transport.onEncryptionEvent({
9921003
getType: jest.fn().mockReturnValue("io.element.call.encryption_keys"),
9931004
getContent: jest.fn().mockReturnValue({
9941005
device_id: "bobsphone",
@@ -1003,17 +1014,16 @@ describe("MatrixRTCSession", () => {
10031014
getSender: jest.fn().mockReturnValue("@bob:example.org"),
10041015
getTs: jest.fn().mockReturnValue(Date.now()),
10051016
} as unknown as MatrixEvent);
1006-
10071017
const encryptionKeyChangedListener = jest.fn();
10081018
sess!.on(MatrixRTCSessionEvent.EncryptionKeyChanged, encryptionKeyChangedListener);
10091019
sess!.reemitEncryptionKeys();
1010-
expect(encryptionKeyChangedListener).toHaveBeenCalledTimes(1);
1011-
expect(encryptionKeyChangedListener).toHaveBeenCalledWith(
1020+
1021+
expect(encryptionKeyChangedListener).toHaveBeenCalledTimes(2);
1022+
expect(encryptionKeyChangedListener).toHaveBeenLastCalledWith(
10121023
textEncoder.encode("this is the key"),
10131024
0,
10141025
"@bob:example.org:bobsphone",
10151026
);
1016-
10171027
expect(sess!.statistics.counters.roomEventEncryptionKeysReceived).toEqual(1);
10181028
});
10191029

spec/unit/matrixrtc/mocks.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ See the License for the specific language governing permissions and
1414
limitations under the License.
1515
*/
1616

17+
import { EventEmitter } from "stream";
1718
import { EventType, type MatrixClient, type MatrixEvent, type Room } from "../../../src";
1819
import { CallMembership, type SessionMembershipData } from "../../../src/matrixrtc/CallMembership";
1920
import { secureRandomString } from "../../../src/randomstring";
@@ -69,14 +70,14 @@ export function makeMockRoom(membershipData: MembershipData): Room {
6970
const roomId = secureRandomString(8);
7071
// Caching roomState here so it does not get recreated when calling `getLiveTimeline.getState()`
7172
const roomState = makeMockRoomState(membershipData, roomId);
72-
const room = {
73+
const room = Object.assign(new EventEmitter(), {
7374
roomId: roomId,
7475
hasMembershipState: jest.fn().mockReturnValue(true),
7576
getLiveTimeline: jest.fn().mockReturnValue({
7677
getState: jest.fn().mockReturnValue(roomState),
7778
}),
7879
getVersion: jest.fn().mockReturnValue("default"),
79-
} as unknown as Room;
80+
}) as unknown as Room;
8081
return room;
8182
}
8283

src/matrixrtc/EncryptionManager.ts

Lines changed: 5 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
import { logger as rootLogger } from "../logger.ts";
2-
import { type MatrixEvent } from "../models/event.ts";
3-
import { type EncryptionConfig } from "./MatrixRTCSession.ts";
2+
import { Statistics, type EncryptionConfig } from "./MatrixRTCSession.ts";
43
import { secureRandomBase64Url } from "../randomstring.ts";
54
import { decodeBase64, encodeUnpaddedBase64 } from "../base64.ts";
65
import { safeGetRetryAfterMs } from "../http-api/errors.ts";
@@ -9,29 +8,6 @@ import { KeyTransportEventListener, KeyTransportEvents, type IKeyTransport } fro
98

109
const logger = rootLogger.getChild("MatrixRTCSession");
1110

12-
/**
13-
* A type collecting call encryption statistics for a session.
14-
*/
15-
export type Statistics = {
16-
counters: {
17-
/**
18-
* The number of times we have sent a room event containing encryption keys.
19-
*/
20-
roomEventEncryptionKeysSent: number;
21-
/**
22-
* The number of times we have received a room event containing encryption keys.
23-
*/
24-
roomEventEncryptionKeysReceived: number;
25-
};
26-
totals: {
27-
/**
28-
* The total age (in milliseconds) of all room events containing encryption keys that we have received.
29-
* We track the total age so that we can later calculate the average age of all keys received.
30-
*/
31-
roomEventEncryptionKeysReceivedTotalAge: number;
32-
};
33-
};
34-
3511
/**
3612
* This interface is for testing and for making it possible to interchange the encryption manager.
3713
* @internal
@@ -44,8 +20,6 @@ export interface IEncryptionManager {
4420
onMembershipsUpdate(oldMemberships: CallMembership[]): void;
4521

4622
getEncryptionKeys(): Map<string, Array<{ key: Uint8Array; timestamp: number }>>;
47-
48-
statistics: Statistics;
4923
}
5024

5125
/**
@@ -83,22 +57,14 @@ export class EncryptionManager implements IEncryptionManager {
8357

8458
private currentEncryptionKeyIndex = -1;
8559

86-
public statistics: Statistics = {
87-
counters: {
88-
roomEventEncryptionKeysSent: 0,
89-
roomEventEncryptionKeysReceived: 0,
90-
},
91-
totals: {
92-
roomEventEncryptionKeysReceivedTotalAge: 0,
93-
},
94-
};
9560
private joinConfig: EncryptionConfig | undefined;
9661

9762
public constructor(
9863
private userId: string,
9964
private deviceId: string,
10065
private getMemberships: () => CallMembership[],
10166
private transport: IKeyTransport,
67+
private statistics: Statistics,
10268
private onEncryptionKeysChanged: (
10369
keyBin: Uint8Array<ArrayBufferLike>,
10470
encryptionKeyIndex: number,
@@ -116,7 +82,9 @@ export class EncryptionManager implements IEncryptionManager {
11682
this.joinConfig = joinConfig;
11783
this.joined = true;
11884
this.manageMediaKeys = this.joinConfig?.manageMediaKeys ?? this.manageMediaKeys;
85+
11986
this.transport.on(KeyTransportEvents.ReceivedKeys, this.onNewKeyReceived);
87+
this.transport.start();
12088
if (this.joinConfig?.manageMediaKeys) {
12189
this.makeNewSenderKey();
12290
this.requestSendCurrentKey();
@@ -129,6 +97,7 @@ export class EncryptionManager implements IEncryptionManager {
12997
// as they may still be using the same ones.
13098
this.encryptionKeys.set(getParticipantId(this.userId, this.deviceId), []);
13199
this.transport.off(KeyTransportEvents.ReceivedKeys, this.onNewKeyReceived);
100+
this.transport.stop();
132101

133102
if (this.makeNewKeyTimeout !== undefined) {
134103
clearTimeout(this.makeNewKeyTimeout);

src/matrixrtc/MatrixRTCSession.ts

Lines changed: 34 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -25,14 +25,37 @@ import { RoomStateEvent } from "../models/room-state.ts";
2525
import { type Focus } from "./focus.ts";
2626
import { KnownMembership } from "../@types/membership.ts";
2727
import { MembershipManager } from "./NewMembershipManager.ts";
28-
import { EncryptionManager, type IEncryptionManager, type Statistics } from "./EncryptionManager.ts";
28+
import { EncryptionManager, type IEncryptionManager } from "./EncryptionManager.ts";
2929
import { LegacyMembershipManager } from "./LegacyMembershipManager.ts";
3030
import { logDurationSync } from "../utils.ts";
3131
import type { IMembershipManager } from "./types.ts";
3232
import { RoomKeyTransport } from "./RoomKeyTransport.ts";
3333

3434
const logger = rootLogger.getChild("MatrixRTCSession");
3535

36+
/**
37+
* A type collecting call encryption statistics for a session.
38+
*/
39+
export type Statistics = {
40+
counters: {
41+
/**
42+
* The number of times we have sent a room event containing encryption keys.
43+
*/
44+
roomEventEncryptionKeysSent: number;
45+
/**
46+
* The number of times we have received a room event containing encryption keys.
47+
*/
48+
roomEventEncryptionKeysReceived: number;
49+
};
50+
totals: {
51+
/**
52+
* The total age (in milliseconds) of all room events containing encryption keys that we have received.
53+
* We track the total age so that we can later calculate the average age of all keys received.
54+
*/
55+
roomEventEncryptionKeysReceivedTotalAge: number;
56+
};
57+
};
58+
3659
export enum MatrixRTCSessionEvent {
3760
// A member joined, left, or updated a property of their membership.
3861
MembershipsChanged = "memberships_changed",
@@ -173,9 +196,15 @@ export class MatrixRTCSession extends TypedEventEmitter<MatrixRTCSessionEvent, M
173196
/**
174197
* The statistics for this session.
175198
*/
176-
public get statistics(): Statistics {
177-
return this.encryptionManager.statistics;
178-
}
199+
public statistics: Statistics = {
200+
counters: {
201+
roomEventEncryptionKeysSent: 0,
202+
roomEventEncryptionKeysReceived: 0,
203+
},
204+
totals: {
205+
roomEventEncryptionKeysReceivedTotalAge: 0,
206+
},
207+
};
179208

180209
/**
181210
* The callId (sessionId) of the call.
@@ -317,6 +346,7 @@ export class MatrixRTCSession extends TypedEventEmitter<MatrixRTCSessionEvent, M
317346
this.client.getDeviceId()!,
318347
() => this.memberships,
319348
transport,
349+
this.statistics,
320350
(keyBin: Uint8Array<ArrayBufferLike>, encryptionKeyIndex: number, participantId: string) => {
321351
this.emit(MatrixRTCSessionEvent.EncryptionKeyChanged, keyBin, encryptionKeyIndex, participantId);
322352
},

src/matrixrtc/RoomKeyTransport.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,10 +21,10 @@ import { type MatrixError } from "../http-api/errors.ts";
2121
import { logger, type Logger } from "../logger.ts";
2222
import { KeyTransportEvents, KeyTransportEventsHandlerMap, type IKeyTransport } from "./IKeyTransport.ts";
2323
import { type MatrixEvent } from "../models/event.ts";
24-
import { type Statistics } from "./EncryptionManager.ts";
2524
import { type CallMembership } from "./CallMembership.ts";
2625
import { Room, RoomEvent } from "../matrix.ts";
2726
import { TypedEventEmitter } from "../models/typed-event-emitter.ts";
27+
import { Statistics } from "./MatrixRTCSession.ts";
2828

2929
export class RoomKeyTransport
3030
extends TypedEventEmitter<KeyTransportEvents, KeyTransportEventsHandlerMap>
@@ -51,7 +51,7 @@ export class RoomKeyTransport
5151
}
5252

5353
private async consumeCallEncryptionEvent(event: MatrixEvent, isRetry = false): Promise<void> {
54-
await this.client.decryptEventIfNeeded(event);
54+
// await this.client.decryptEventIfNeeded(event);
5555

5656
if (event.isDecryptionFailure()) {
5757
if (!isRetry) {

0 commit comments

Comments
 (0)