From 8da111d39d41f84f595fe23f931866ee5d905910 Mon Sep 17 00:00:00 2001 From: Timo K Date: Wed, 22 Oct 2025 14:13:31 +0200 Subject: [PATCH] remove option to enable/disable room transport Signed-off-by: Timo K --- src/room/InCallView.test.tsx | 74 +-------------------------- src/room/InCallView.tsx | 50 +----------------- src/rtcSessionHelpers.test.ts | 1 - src/rtcSessionHelpers.ts | 11 +--- src/settings/DeveloperSettingsTab.tsx | 20 +------- src/settings/settings.ts | 5 -- src/state/CallViewModel.ts | 1 - 7 files changed, 5 insertions(+), 157 deletions(-) diff --git a/src/room/InCallView.test.tsx b/src/room/InCallView.test.tsx index d75fd598..52a40702 100644 --- a/src/room/InCallView.test.tsx +++ b/src/room/InCallView.test.tsx @@ -13,7 +13,7 @@ import { type MockedFunction, vi, } from "vitest"; -import { act, render, type RenderResult } from "@testing-library/react"; +import { render, type RenderResult } from "@testing-library/react"; import { type MatrixClient, JoinRule, type RoomState } from "matrix-js-sdk"; import { type RelationsContainer } from "matrix-js-sdk/lib/models/relations-container"; import { type LocalParticipant } from "livekit-client"; @@ -21,7 +21,6 @@ import { of } from "rxjs"; import { BrowserRouter } from "react-router-dom"; import { TooltipProvider } from "@vector-im/compound-web"; import { RoomContext, useLocalParticipant } from "@livekit/components-react"; -import { RoomAndToDeviceEvents } from "matrix-js-sdk/lib/matrixrtc/RoomAndToDeviceKeyTransport"; import { InCallView } from "./InCallView"; import { @@ -38,10 +37,6 @@ import { import { E2eeType } from "../e2ee/e2eeType"; import { getBasicCallViewModelEnvironment } from "../utils/test-viewmodel"; import { alice, local } from "../utils/test-fixtures"; -import { - developerMode as developerModeSetting, - useExperimentalToDeviceTransport as useExperimentalToDeviceTransportSetting, -} from "../settings/settings"; import { ReactionsSenderProvider } from "../reactions/useReactionsSender"; import { useRoomEncryptionSystem } from "../e2ee/sharedKeyManagement"; import { LivekitRoomAudioRenderer } from "../livekit/MatrixAudioRenderer"; @@ -193,71 +188,4 @@ describe("InCallView", () => { expect(container).toMatchSnapshot(); }); }); - describe("toDevice label", () => { - it("is shown if setting activated and room encrypted", () => { - useRoomEncryptionSystemMock.mockReturnValue({ - kind: E2eeType.PER_PARTICIPANT, - }); - useExperimentalToDeviceTransportSetting.setValue(true); - developerModeSetting.setValue(true); - const { getByText } = createInCallView(); - expect(getByText("using to Device key transport")).toBeInTheDocument(); - }); - - it("is not shown in unenecrypted room", () => { - useRoomEncryptionSystemMock.mockReturnValue({ - kind: E2eeType.NONE, - }); - useExperimentalToDeviceTransportSetting.setValue(true); - developerModeSetting.setValue(true); - const { queryByText } = createInCallView(); - expect( - queryByText("using to Device key transport"), - ).not.toBeInTheDocument(); - }); - - it("is hidden once fallback was triggered", async () => { - useRoomEncryptionSystemMock.mockReturnValue({ - kind: E2eeType.PER_PARTICIPANT, - }); - useExperimentalToDeviceTransportSetting.setValue(true); - developerModeSetting.setValue(true); - const { rtcSession, queryByText } = createInCallView(); - expect(queryByText("using to Device key transport")).toBeInTheDocument(); - expect(rtcSession).toBeDefined(); - await act(() => - rtcSession.emit(RoomAndToDeviceEvents.EnabledTransportsChanged, { - toDevice: true, - room: true, - }), - ); - expect( - queryByText("using to Device key transport"), - ).not.toBeInTheDocument(); - }); - - it("is not shown if setting is disabled", () => { - useExperimentalToDeviceTransportSetting.setValue(false); - developerModeSetting.setValue(true); - useRoomEncryptionSystemMock.mockReturnValue({ - kind: E2eeType.PER_PARTICIPANT, - }); - const { queryByText } = createInCallView(); - expect( - queryByText("using to Device key transport"), - ).not.toBeInTheDocument(); - }); - - it("is not shown if developer mode is disabled", () => { - useExperimentalToDeviceTransportSetting.setValue(true); - developerModeSetting.setValue(false); - useRoomEncryptionSystemMock.mockReturnValue({ - kind: E2eeType.PER_PARTICIPANT, - }); - const { queryByText } = createInCallView(); - expect( - queryByText("using to Device key transport"), - ).not.toBeInTheDocument(); - }); - }); }); diff --git a/src/room/InCallView.tsx b/src/room/InCallView.tsx index bca7c964..6f6bae93 100644 --- a/src/room/InCallView.tsx +++ b/src/room/InCallView.tsx @@ -25,7 +25,6 @@ import classNames from "classnames"; import { BehaviorSubject, map } from "rxjs"; import { useObservable } from "observable-hooks"; import { logger } from "matrix-js-sdk/lib/logger"; -import { RoomAndToDeviceEvents } from "matrix-js-sdk/lib/matrixrtc/RoomAndToDeviceKeyTransport"; import { VoiceCallSolidIcon, VolumeOnSolidIcon, @@ -63,10 +62,7 @@ import { CallViewModel, type GridMode } from "../state/CallViewModel"; import { Grid, type TileProps } from "../grid/Grid"; import { useInitial } from "../useInitial"; import { SpotlightTile } from "../tile/SpotlightTile"; -import { - useRoomEncryptionSystem, - type EncryptionSystem, -} from "../e2ee/sharedKeyManagement"; +import { type EncryptionSystem } from "../e2ee/sharedKeyManagement"; import { E2eeType } from "../e2ee/e2eeType"; import { makeGridLayout } from "../grid/GridLayout"; import { @@ -88,12 +84,9 @@ import { ReactionsOverlay } from "./ReactionsOverlay"; import { CallEventAudioRenderer } from "./CallEventAudioRenderer"; import { debugTileLayout as debugTileLayoutSetting, - useExperimentalToDeviceTransport as useExperimentalToDeviceTransportSetting, - developerMode as developerModeSetting, useSetting, } from "../settings/settings"; import { ReactionsReader } from "../reactions/ReactionsReader"; -import { useTypedEventEmitter } from "../useEvents.ts"; import { LivekitRoomAudioRenderer } from "../livekit/MatrixAudioRenderer.tsx"; import { muteAllAudio$ } from "../state/MuteAllAudioModel.ts"; import { useMediaDevices } from "../MediaDevicesContext.ts"; @@ -191,7 +184,6 @@ export const InCallView: FC = ({ client, vm, matrixInfo, - rtcSession, matrixRoom, muteStates, @@ -238,34 +230,6 @@ export const InCallView: FC = ({ muted: muteAllAudio, }); - // This seems like it might be enough logic to use move it into the call view model? - const [didFallbackToRoomKey, setDidFallbackToRoomKey] = useState(false); - useTypedEventEmitter( - rtcSession, - RoomAndToDeviceEvents.EnabledTransportsChanged, - (enabled) => setDidFallbackToRoomKey(enabled.room), - ); - - const [developerMode] = useSetting(developerModeSetting); - const [useExperimentalToDeviceTransport] = useSetting( - useExperimentalToDeviceTransportSetting, - ); - const encryptionSystem = useRoomEncryptionSystem(matrixRoom.roomId); - - const showToDeviceEncryption = useMemo( - () => - developerMode && - useExperimentalToDeviceTransport && - encryptionSystem.kind === E2eeType.PER_PARTICIPANT && - !didFallbackToRoomKey, - [ - developerMode, - useExperimentalToDeviceTransport, - encryptionSystem.kind, - didFallbackToRoomKey, - ], - ); - const audioEnabled = useBehavior(muteStates.audio.enabled$); const videoEnabled = useBehavior(muteStates.video.enabled$); const toggleAudio = useBehavior(muteStates.audio.toggle$); @@ -850,18 +814,6 @@ export const InCallView: FC = ({ onPointerOut={onPointerOut} > {header} - { - // TODO: remove this once we remove the developer flag gets removed and we have shipped to - // device transport as the default. - showToDeviceEncryption && ( - - using to Device key transport - - ) - } {audioParticipants.map(({ livekitRoom, url, participants }) => ( { expect.objectContaining({ manageMediaKeys: true, useLegacyMemberEvents: false, - useExperimentalToDeviceTransport: false, }), ); }); diff --git a/src/rtcSessionHelpers.ts b/src/rtcSessionHelpers.ts index ecbff79f..90e1fca1 100644 --- a/src/rtcSessionHelpers.ts +++ b/src/rtcSessionHelpers.ts @@ -99,8 +99,6 @@ export async function makeTransport( export interface EnterRTCSessionOptions { encryptMedia: boolean; - // TODO: remove this flag, to-device transport is stable enough now - useExperimentalToDeviceTransport?: boolean; /** EXPERIMENTAL: If true, will use the multi-sfu codepath where each member connects to its SFU instead of everyone connecting to an elected on. */ useMultiSfu: boolean; preferStickyEvents: boolean; @@ -115,12 +113,7 @@ export interface EnterRTCSessionOptions { export async function enterRTCSession( rtcSession: MatrixRTCSession, transport: LivekitTransport, - { - encryptMedia, - useExperimentalToDeviceTransport = false, - useMultiSfu, - preferStickyEvents, - }: EnterRTCSessionOptions, + { encryptMedia, useMultiSfu, preferStickyEvents }: EnterRTCSessionOptions, ): Promise { PosthogAnalytics.instance.eventCallEnded.cacheStartCall(new Date()); PosthogAnalytics.instance.eventCallStarted.track(rtcSession.room.roomId); @@ -154,7 +147,7 @@ export async function enterRTCSession( makeKeyDelay: matrixRtcSessionConfig?.wait_for_key_rotation_ms, membershipEventExpiryMs: matrixRtcSessionConfig?.membership_event_expiry_ms, - useExperimentalToDeviceTransport, + useExperimentalToDeviceTransport: true, unstableSendStickyEvents: preferStickyEvents, }, ); diff --git a/src/settings/DeveloperSettingsTab.tsx b/src/settings/DeveloperSettingsTab.tsx index 63c5dabc..08c22557 100644 --- a/src/settings/DeveloperSettingsTab.tsx +++ b/src/settings/DeveloperSettingsTab.tsx @@ -26,7 +26,6 @@ import { duplicateTiles as duplicateTilesSetting, debugTileLayout as debugTileLayoutSetting, showConnectionStats as showConnectionStatsSetting, - useExperimentalToDeviceTransport as useExperimentalToDeviceTransportSetting, multiSfu as multiSfuSetting, muteAllAudio as muteAllAudioSetting, alwaysShowIphoneEarpiece as alwaysShowIphoneEarpieceSetting, @@ -71,10 +70,7 @@ export const DeveloperSettingsTab: FC = ({ client, livekitRooms }) => { const [alwaysShowIphoneEarpiece, setAlwaysShowIphoneEarpiece] = useSetting( alwaysShowIphoneEarpieceSetting, ); - const [ - useExperimentalToDeviceTransport, - setUseExperimentalToDeviceTransport, - ] = useSetting(useExperimentalToDeviceTransportSetting); + const [multiSfu, setMultiSfu] = useSetting(multiSfuSetting); const [muteAllAudio, setMuteAllAudio] = useSetting(muteAllAudioSetting); @@ -180,20 +176,6 @@ export const DeveloperSettingsTab: FC = ({ client, livekitRooms }) => { )} /> - - ): void => { - setUseExperimentalToDeviceTransport(event.target.checked); - }, - [setUseExperimentalToDeviceTransport], - )} - /> - ( 0.5, ); -export const useExperimentalToDeviceTransport = new Setting( - "experimental-to-device-transport", - true, -); - export const multiSfu = new Setting("multi-sfu", false); export const muteAllAudio = new Setting("mute-all-audio", false); diff --git a/src/state/CallViewModel.ts b/src/state/CallViewModel.ts index ab546a0f..349032f7 100644 --- a/src/state/CallViewModel.ts +++ b/src/state/CallViewModel.ts @@ -1818,7 +1818,6 @@ export class CallViewModel { this._configError$.next(null); await enterRTCSession(this.matrixRTCSession, advertised.transport, { encryptMedia: this.options.encryptionSystem.kind !== E2eeType.NONE, - useExperimentalToDeviceTransport: true, useMultiSfu: advertised.multiSfu, preferStickyEvents: advertised.preferStickyEvents, });