diff --git a/src/e2ee/matrixKeyProvider.ts b/src/e2ee/matrixKeyProvider.ts
index c5f6c8797..43b5abcaf 100644
--- a/src/e2ee/matrixKeyProvider.ts
+++ b/src/e2ee/matrixKeyProvider.ts
@@ -5,7 +5,11 @@ SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial
Please see LICENSE in the repository root for full details.
*/
-import { BaseKeyProvider, createKeyMaterialFromBuffer } from "livekit-client";
+import {
+ BaseKeyProvider,
+ createKeyMaterialFromBuffer,
+ KeyProviderEvent,
+} from "livekit-client";
import { logger } from "matrix-js-sdk/lib/logger";
import {
type MatrixRTCSession,
@@ -16,7 +20,11 @@ export class MatrixKeyProvider extends BaseKeyProvider {
private rtcSession?: MatrixRTCSession;
public constructor() {
- super({ ratchetWindowSize: 0, keyringSize: 256 });
+ // ratchetWindowSize the amount of ratchets we try consecutively before
+ // throwing an error log. After those attempts we will still try more retry batches.
+ // So there can be more than 10 ratchets in total.
+ super({ ratchetWindowSize: 10, keyringSize: 256 });
+ this.on(KeyProviderEvent.KeyRatcheted, this.onKeyRatcheted);
}
public setRTCSession(rtcSession: MatrixRTCSession): void {
@@ -60,4 +68,12 @@ export class MatrixKeyProvider extends BaseKeyProvider {
},
);
};
+
+ public onKeyRatcheted = (material: CryptoKey, keyIndex?: number): void => {
+ logger.debug(
+ `Key ratcheted event received for livekit room=${this.rtcSession?.room.roomId} keyIndex=${keyIndex}`,
+ `material:`,
+ material,
+ );
+ };
}
diff --git a/src/livekit/useLiveKit.ts b/src/livekit/useLiveKit.ts
index da180ab81..833735f21 100644
--- a/src/livekit/useLiveKit.ts
+++ b/src/livekit/useLiveKit.ts
@@ -13,7 +13,7 @@ import {
type RoomOptions,
Track,
} from "livekit-client";
-import { useEffect, useMemo, useRef } from "react";
+import { useCallback, useEffect, useMemo, useRef } from "react";
import E2EEWorker from "livekit-client/e2ee-worker?worker";
import { logger } from "matrix-js-sdk/lib/logger";
import { type MatrixRTCSession } from "matrix-js-sdk/lib/matrixrtc";
@@ -37,6 +37,7 @@ import { type EncryptionSystem } from "../e2ee/sharedKeyManagement";
interface UseLivekitResult {
livekitRoom?: Room;
connState: ECConnectionState;
+ doKeyRatchet: () => void;
}
export function useLiveKit(
@@ -331,8 +332,16 @@ export function useLiveKit(
}
}, [room, devices, connectionState]);
+ const doKeyRatchet = useCallback(() => {
+ // not providing a key index will default to the current key
+ e2eeOptions?.keyProvider.ratchetKey(
+ room.localParticipant.identity,
+ undefined,
+ );
+ }, [e2eeOptions?.keyProvider, room.localParticipant.identity]);
return {
connState: connectionState,
livekitRoom: room,
+ doKeyRatchet,
};
}
diff --git a/src/room/InCallView.tsx b/src/room/InCallView.tsx
index b434a1da1..3fb3ad3bb 100644
--- a/src/room/InCallView.tsx
+++ b/src/room/InCallView.tsx
@@ -114,7 +114,7 @@ export interface ActiveCallProps
export const ActiveCall: FC