From 46913b120a1d0c17a2db4247e0dab4056ab45f92 Mon Sep 17 00:00:00 2001 From: Timo Date: Wed, 9 Apr 2025 14:16:49 +0200 Subject: [PATCH] add dev setting to choose to-device or room encryption --- locales/en/app.json | 3 +- src/room/GroupCallView.tsx | 51 +++++++++------------------ src/rtcSessionHelpers.ts | 3 +- src/settings/DeveloperSettingsTab.tsx | 19 ++++++++++ src/settings/settings.ts | 6 ++++ src/utils/matrix.ts | 2 +- 6 files changed, 47 insertions(+), 37 deletions(-) diff --git a/locales/en/app.json b/locales/en/app.json index 51beef1b..be75681a 100644 --- a/locales/en/app.json +++ b/locales/en/app.json @@ -73,7 +73,8 @@ "show_connection_stats": "Show connection statistics", "show_non_member_tiles": "Show tiles for non-member media", "url_params": "URL parameters", - "use_new_membership_manager": "Use the new implementation of the call MembershipManager" + "use_new_membership_manager": "Use the new implementation of the call MembershipManager", + "use_to_device_key_transport": "Use to device messages to distribute keys for matrixRTC media" }, "disconnected_banner": "Connectivity to the server has been lost.", "error": { diff --git a/src/room/GroupCallView.tsx b/src/room/GroupCallView.tsx index 3d9b9808..0d727485 100644 --- a/src/room/GroupCallView.tsx +++ b/src/room/GroupCallView.tsx @@ -62,6 +62,7 @@ import { } from "../utils/errors.ts"; import { GroupCallErrorBoundary } from "./GroupCallErrorBoundary.tsx"; import { + useExperimentalToDeviceTransportSetting, useNewMembershipManagerSetting as useNewMembershipManagerSetting, useSetting, } from "../settings/settings"; @@ -151,6 +152,9 @@ export const GroupCallView: FC = ({ const { perParticipantE2EE, returnToLobby } = useUrlParams(); const e2eeSystem = useRoomEncryptionSystem(room.roomId); const [useNewMembershipManager] = useSetting(useNewMembershipManagerSetting); + const [useExperimentalToDeviceTransport] = useSetting( + useExperimentalToDeviceTransportSetting, + ); usePageTitle(roomName); @@ -178,16 +182,13 @@ export const GroupCallView: FC = ({ const latestMuteStates = useLatest(muteStates); const enterRTCSessionOrError = useCallback( - async ( - rtcSession: MatrixRTCSession, - perParticipantE2EE: boolean, - newMembershipManager: boolean, - ): Promise => { + async (rtcSession: MatrixRTCSession): Promise => { try { await enterRTCSession( rtcSession, perParticipantE2EE, - newMembershipManager, + useNewMembershipManager, + useExperimentalToDeviceTransport, ); } catch (e) { if (e instanceof ElementCallError) { @@ -201,7 +202,11 @@ export const GroupCallView: FC = ({ } } }, - [setExternalError], + [ + perParticipantE2EE, + useExperimentalToDeviceTransport, + useNewMembershipManager, + ], ); useEffect(() => { @@ -253,11 +258,7 @@ export const GroupCallView: FC = ({ await defaultDeviceSetup( ev.detail.data as unknown as JoinCallData, ); - await enterRTCSessionOrError( - rtcSession, - perParticipantE2EE, - useNewMembershipManager, - ); + await enterRTCSessionOrError(rtcSession); widget.api.transport.reply(ev.detail, {}); })().catch((e) => { logger.error("Error joining RTC session", e); @@ -270,21 +271,13 @@ export const GroupCallView: FC = ({ } else { // No lobby and no preload: we enter the rtc session right away (async (): Promise => { - await enterRTCSessionOrError( - rtcSession, - perParticipantE2EE, - useNewMembershipManager, - ); + await enterRTCSessionOrError(rtcSession); })().catch((e) => { logger.error("Error joining RTC session", e); }); } } else { - void enterRTCSessionOrError( - rtcSession, - perParticipantE2EE, - useNewMembershipManager, - ); + void enterRTCSessionOrError(rtcSession); } } }, [ @@ -407,13 +400,7 @@ export const GroupCallView: FC = ({ client={client} matrixInfo={matrixInfo} muteStates={muteStates} - onEnter={() => - void enterRTCSessionOrError( - rtcSession, - perParticipantE2EE, - useNewMembershipManager, - ) - } + onEnter={() => void enterRTCSessionOrError(rtcSession)} confineToRoom={confineToRoom} hideHeader={hideHeader} participantCount={participantCount} @@ -491,11 +478,7 @@ export const GroupCallView: FC = ({ recoveryActionHandler={(action) => { if (action == "reconnect") { setLeft(false); - enterRTCSessionOrError( - rtcSession, - perParticipantE2EE, - useNewMembershipManager, - ).catch((e) => { + enterRTCSessionOrError(rtcSession).catch((e) => { logger.error("Error re-entering RTC session", e); }); } diff --git a/src/rtcSessionHelpers.ts b/src/rtcSessionHelpers.ts index b47d7382..51bc79b8 100644 --- a/src/rtcSessionHelpers.ts +++ b/src/rtcSessionHelpers.ts @@ -98,6 +98,7 @@ export async function enterRTCSession( rtcSession: MatrixRTCSession, encryptMedia: boolean, useNewMembershipManager = true, + useExperimentalToDeviceTransport = false, ): Promise { PosthogAnalytics.instance.eventCallEnded.cacheStartCall(new Date()); PosthogAnalytics.instance.eventCallStarted.track(rtcSession.room.roomId); @@ -125,7 +126,7 @@ export async function enterRTCSession( membershipKeepAlivePeriod: matrixRtcSessionConfig?.membership_keep_alive_period, makeKeyDelay: matrixRtcSessionConfig?.key_rotation_on_leave_delay, - useExperimentalToDeviceTransport: true, + useExperimentalToDeviceTransport, }, ); if (widget) { diff --git a/src/settings/DeveloperSettingsTab.tsx b/src/settings/DeveloperSettingsTab.tsx index 0981a843..67de0e0d 100644 --- a/src/settings/DeveloperSettingsTab.tsx +++ b/src/settings/DeveloperSettingsTab.tsx @@ -16,6 +16,7 @@ import { showNonMemberTiles as showNonMemberTilesSetting, showConnectionStats as showConnectionStatsSetting, useNewMembershipManagerSetting, + useExperimentalToDeviceTransportSetting, } from "./settings"; import type { MatrixClient } from "matrix-js-sdk"; import type { Room as LivekitRoom } from "livekit-client"; @@ -44,6 +45,10 @@ export const DeveloperSettingsTab: FC = ({ client, livekitRoom }) => { useNewMembershipManagerSetting, ); + const [ + useExperimentalToDeviceTransport, + setUseExperimentalToDeviceTransport, + ] = useSetting(useExperimentalToDeviceTransportSetting); const urlParams = useUrlParams(); const sfuUrl = useMemo((): URL | null => { @@ -156,6 +161,20 @@ export const DeveloperSettingsTab: FC = ({ client, livekitRoom }) => { )} /> + + ): void => { + setUseExperimentalToDeviceTransport(event.target.checked); + }, + [setUseExperimentalToDeviceTransport], + )} + /> + {livekitRoom ? ( <>

diff --git a/src/settings/settings.ts b/src/settings/settings.ts index 7babcfde..5a7b7a36 100644 --- a/src/settings/settings.ts +++ b/src/settings/settings.ts @@ -117,4 +117,10 @@ export const useNewMembershipManagerSetting = new Setting( "new-membership-manager", true, ); + +export const useExperimentalToDeviceTransportSetting = new Setting( + "experimental-to-device-transport", + false, +); + export const alwaysShowSelf = new Setting("always-show-self", true); diff --git a/src/utils/matrix.ts b/src/utils/matrix.ts index 8707237d..567cc736 100644 --- a/src/utils/matrix.ts +++ b/src/utils/matrix.ts @@ -251,7 +251,7 @@ export async function createRoom( "m.room.encryption": 100, "m.room.name": 50, "m.room.message": 0, - "m.room.encrypted": 50, + "m.room.encrypted": 0, "m.sticker": 50, "org.matrix.msc3401.call.member": 0, },