remove option to enable/disable room transport
Signed-off-by: Timo K <toger5@hotmail.de>
This commit is contained in:
@@ -13,7 +13,7 @@ import {
|
|||||||
type MockedFunction,
|
type MockedFunction,
|
||||||
vi,
|
vi,
|
||||||
} from "vitest";
|
} 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 MatrixClient, JoinRule, type RoomState } from "matrix-js-sdk";
|
||||||
import { type RelationsContainer } from "matrix-js-sdk/lib/models/relations-container";
|
import { type RelationsContainer } from "matrix-js-sdk/lib/models/relations-container";
|
||||||
import { type LocalParticipant } from "livekit-client";
|
import { type LocalParticipant } from "livekit-client";
|
||||||
@@ -21,7 +21,6 @@ import { of } from "rxjs";
|
|||||||
import { BrowserRouter } from "react-router-dom";
|
import { BrowserRouter } from "react-router-dom";
|
||||||
import { TooltipProvider } from "@vector-im/compound-web";
|
import { TooltipProvider } from "@vector-im/compound-web";
|
||||||
import { RoomContext, useLocalParticipant } from "@livekit/components-react";
|
import { RoomContext, useLocalParticipant } from "@livekit/components-react";
|
||||||
import { RoomAndToDeviceEvents } from "matrix-js-sdk/lib/matrixrtc/RoomAndToDeviceKeyTransport";
|
|
||||||
|
|
||||||
import { InCallView } from "./InCallView";
|
import { InCallView } from "./InCallView";
|
||||||
import {
|
import {
|
||||||
@@ -38,10 +37,6 @@ import {
|
|||||||
import { E2eeType } from "../e2ee/e2eeType";
|
import { E2eeType } from "../e2ee/e2eeType";
|
||||||
import { getBasicCallViewModelEnvironment } from "../utils/test-viewmodel";
|
import { getBasicCallViewModelEnvironment } from "../utils/test-viewmodel";
|
||||||
import { alice, local } from "../utils/test-fixtures";
|
import { alice, local } from "../utils/test-fixtures";
|
||||||
import {
|
|
||||||
developerMode as developerModeSetting,
|
|
||||||
useExperimentalToDeviceTransport as useExperimentalToDeviceTransportSetting,
|
|
||||||
} from "../settings/settings";
|
|
||||||
import { ReactionsSenderProvider } from "../reactions/useReactionsSender";
|
import { ReactionsSenderProvider } from "../reactions/useReactionsSender";
|
||||||
import { useRoomEncryptionSystem } from "../e2ee/sharedKeyManagement";
|
import { useRoomEncryptionSystem } from "../e2ee/sharedKeyManagement";
|
||||||
import { LivekitRoomAudioRenderer } from "../livekit/MatrixAudioRenderer";
|
import { LivekitRoomAudioRenderer } from "../livekit/MatrixAudioRenderer";
|
||||||
@@ -193,71 +188,4 @@ describe("InCallView", () => {
|
|||||||
expect(container).toMatchSnapshot();
|
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();
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -25,7 +25,6 @@ import classNames from "classnames";
|
|||||||
import { BehaviorSubject, map } from "rxjs";
|
import { BehaviorSubject, map } from "rxjs";
|
||||||
import { useObservable } from "observable-hooks";
|
import { useObservable } from "observable-hooks";
|
||||||
import { logger } from "matrix-js-sdk/lib/logger";
|
import { logger } from "matrix-js-sdk/lib/logger";
|
||||||
import { RoomAndToDeviceEvents } from "matrix-js-sdk/lib/matrixrtc/RoomAndToDeviceKeyTransport";
|
|
||||||
import {
|
import {
|
||||||
VoiceCallSolidIcon,
|
VoiceCallSolidIcon,
|
||||||
VolumeOnSolidIcon,
|
VolumeOnSolidIcon,
|
||||||
@@ -63,10 +62,7 @@ import { CallViewModel, type GridMode } from "../state/CallViewModel";
|
|||||||
import { Grid, type TileProps } from "../grid/Grid";
|
import { Grid, type TileProps } from "../grid/Grid";
|
||||||
import { useInitial } from "../useInitial";
|
import { useInitial } from "../useInitial";
|
||||||
import { SpotlightTile } from "../tile/SpotlightTile";
|
import { SpotlightTile } from "../tile/SpotlightTile";
|
||||||
import {
|
import { type EncryptionSystem } from "../e2ee/sharedKeyManagement";
|
||||||
useRoomEncryptionSystem,
|
|
||||||
type EncryptionSystem,
|
|
||||||
} from "../e2ee/sharedKeyManagement";
|
|
||||||
import { E2eeType } from "../e2ee/e2eeType";
|
import { E2eeType } from "../e2ee/e2eeType";
|
||||||
import { makeGridLayout } from "../grid/GridLayout";
|
import { makeGridLayout } from "../grid/GridLayout";
|
||||||
import {
|
import {
|
||||||
@@ -88,12 +84,9 @@ import { ReactionsOverlay } from "./ReactionsOverlay";
|
|||||||
import { CallEventAudioRenderer } from "./CallEventAudioRenderer";
|
import { CallEventAudioRenderer } from "./CallEventAudioRenderer";
|
||||||
import {
|
import {
|
||||||
debugTileLayout as debugTileLayoutSetting,
|
debugTileLayout as debugTileLayoutSetting,
|
||||||
useExperimentalToDeviceTransport as useExperimentalToDeviceTransportSetting,
|
|
||||||
developerMode as developerModeSetting,
|
|
||||||
useSetting,
|
useSetting,
|
||||||
} from "../settings/settings";
|
} from "../settings/settings";
|
||||||
import { ReactionsReader } from "../reactions/ReactionsReader";
|
import { ReactionsReader } from "../reactions/ReactionsReader";
|
||||||
import { useTypedEventEmitter } from "../useEvents.ts";
|
|
||||||
import { LivekitRoomAudioRenderer } from "../livekit/MatrixAudioRenderer.tsx";
|
import { LivekitRoomAudioRenderer } from "../livekit/MatrixAudioRenderer.tsx";
|
||||||
import { muteAllAudio$ } from "../state/MuteAllAudioModel.ts";
|
import { muteAllAudio$ } from "../state/MuteAllAudioModel.ts";
|
||||||
import { useMediaDevices } from "../MediaDevicesContext.ts";
|
import { useMediaDevices } from "../MediaDevicesContext.ts";
|
||||||
@@ -191,7 +184,6 @@ export const InCallView: FC<InCallViewProps> = ({
|
|||||||
client,
|
client,
|
||||||
vm,
|
vm,
|
||||||
matrixInfo,
|
matrixInfo,
|
||||||
rtcSession,
|
|
||||||
matrixRoom,
|
matrixRoom,
|
||||||
muteStates,
|
muteStates,
|
||||||
|
|
||||||
@@ -238,34 +230,6 @@ export const InCallView: FC<InCallViewProps> = ({
|
|||||||
muted: muteAllAudio,
|
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 audioEnabled = useBehavior(muteStates.audio.enabled$);
|
||||||
const videoEnabled = useBehavior(muteStates.video.enabled$);
|
const videoEnabled = useBehavior(muteStates.video.enabled$);
|
||||||
const toggleAudio = useBehavior(muteStates.audio.toggle$);
|
const toggleAudio = useBehavior(muteStates.audio.toggle$);
|
||||||
@@ -850,18 +814,6 @@ export const InCallView: FC<InCallViewProps> = ({
|
|||||||
onPointerOut={onPointerOut}
|
onPointerOut={onPointerOut}
|
||||||
>
|
>
|
||||||
{header}
|
{header}
|
||||||
{
|
|
||||||
// TODO: remove this once we remove the developer flag gets removed and we have shipped to
|
|
||||||
// device transport as the default.
|
|
||||||
showToDeviceEncryption && (
|
|
||||||
<Text
|
|
||||||
style={{ height: 0, zIndex: 1, alignSelf: "center", margin: 0 }}
|
|
||||||
size="sm"
|
|
||||||
>
|
|
||||||
using to Device key transport
|
|
||||||
</Text>
|
|
||||||
)
|
|
||||||
}
|
|
||||||
{audioParticipants.map(({ livekitRoom, url, participants }) => (
|
{audioParticipants.map(({ livekitRoom, url, participants }) => (
|
||||||
<LivekitRoomAudioRenderer
|
<LivekitRoomAudioRenderer
|
||||||
key={url}
|
key={url}
|
||||||
|
|||||||
@@ -112,7 +112,6 @@ test("It joins the correct Session", async () => {
|
|||||||
expect.objectContaining({
|
expect.objectContaining({
|
||||||
manageMediaKeys: true,
|
manageMediaKeys: true,
|
||||||
useLegacyMemberEvents: false,
|
useLegacyMemberEvents: false,
|
||||||
useExperimentalToDeviceTransport: false,
|
|
||||||
}),
|
}),
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -99,8 +99,6 @@ export async function makeTransport(
|
|||||||
|
|
||||||
export interface EnterRTCSessionOptions {
|
export interface EnterRTCSessionOptions {
|
||||||
encryptMedia: boolean;
|
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. */
|
/** 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;
|
useMultiSfu: boolean;
|
||||||
preferStickyEvents: boolean;
|
preferStickyEvents: boolean;
|
||||||
@@ -115,12 +113,7 @@ export interface EnterRTCSessionOptions {
|
|||||||
export async function enterRTCSession(
|
export async function enterRTCSession(
|
||||||
rtcSession: MatrixRTCSession,
|
rtcSession: MatrixRTCSession,
|
||||||
transport: LivekitTransport,
|
transport: LivekitTransport,
|
||||||
{
|
{ encryptMedia, useMultiSfu, preferStickyEvents }: EnterRTCSessionOptions,
|
||||||
encryptMedia,
|
|
||||||
useExperimentalToDeviceTransport = false,
|
|
||||||
useMultiSfu,
|
|
||||||
preferStickyEvents,
|
|
||||||
}: EnterRTCSessionOptions,
|
|
||||||
): Promise<void> {
|
): Promise<void> {
|
||||||
PosthogAnalytics.instance.eventCallEnded.cacheStartCall(new Date());
|
PosthogAnalytics.instance.eventCallEnded.cacheStartCall(new Date());
|
||||||
PosthogAnalytics.instance.eventCallStarted.track(rtcSession.room.roomId);
|
PosthogAnalytics.instance.eventCallStarted.track(rtcSession.room.roomId);
|
||||||
@@ -154,7 +147,7 @@ export async function enterRTCSession(
|
|||||||
makeKeyDelay: matrixRtcSessionConfig?.wait_for_key_rotation_ms,
|
makeKeyDelay: matrixRtcSessionConfig?.wait_for_key_rotation_ms,
|
||||||
membershipEventExpiryMs:
|
membershipEventExpiryMs:
|
||||||
matrixRtcSessionConfig?.membership_event_expiry_ms,
|
matrixRtcSessionConfig?.membership_event_expiry_ms,
|
||||||
useExperimentalToDeviceTransport,
|
useExperimentalToDeviceTransport: true,
|
||||||
unstableSendStickyEvents: preferStickyEvents,
|
unstableSendStickyEvents: preferStickyEvents,
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -26,7 +26,6 @@ import {
|
|||||||
duplicateTiles as duplicateTilesSetting,
|
duplicateTiles as duplicateTilesSetting,
|
||||||
debugTileLayout as debugTileLayoutSetting,
|
debugTileLayout as debugTileLayoutSetting,
|
||||||
showConnectionStats as showConnectionStatsSetting,
|
showConnectionStats as showConnectionStatsSetting,
|
||||||
useExperimentalToDeviceTransport as useExperimentalToDeviceTransportSetting,
|
|
||||||
multiSfu as multiSfuSetting,
|
multiSfu as multiSfuSetting,
|
||||||
muteAllAudio as muteAllAudioSetting,
|
muteAllAudio as muteAllAudioSetting,
|
||||||
alwaysShowIphoneEarpiece as alwaysShowIphoneEarpieceSetting,
|
alwaysShowIphoneEarpiece as alwaysShowIphoneEarpieceSetting,
|
||||||
@@ -71,10 +70,7 @@ export const DeveloperSettingsTab: FC<Props> = ({ client, livekitRooms }) => {
|
|||||||
const [alwaysShowIphoneEarpiece, setAlwaysShowIphoneEarpiece] = useSetting(
|
const [alwaysShowIphoneEarpiece, setAlwaysShowIphoneEarpiece] = useSetting(
|
||||||
alwaysShowIphoneEarpieceSetting,
|
alwaysShowIphoneEarpieceSetting,
|
||||||
);
|
);
|
||||||
const [
|
|
||||||
useExperimentalToDeviceTransport,
|
|
||||||
setUseExperimentalToDeviceTransport,
|
|
||||||
] = useSetting(useExperimentalToDeviceTransportSetting);
|
|
||||||
const [multiSfu, setMultiSfu] = useSetting(multiSfuSetting);
|
const [multiSfu, setMultiSfu] = useSetting(multiSfuSetting);
|
||||||
|
|
||||||
const [muteAllAudio, setMuteAllAudio] = useSetting(muteAllAudioSetting);
|
const [muteAllAudio, setMuteAllAudio] = useSetting(muteAllAudioSetting);
|
||||||
@@ -180,20 +176,6 @@ export const DeveloperSettingsTab: FC<Props> = ({ client, livekitRooms }) => {
|
|||||||
)}
|
)}
|
||||||
/>
|
/>
|
||||||
</FieldRow>
|
</FieldRow>
|
||||||
<FieldRow>
|
|
||||||
<InputField
|
|
||||||
id="useToDeviceKeyTransport"
|
|
||||||
type="checkbox"
|
|
||||||
label={t("developer_mode.use_to_device_key_transport")}
|
|
||||||
checked={!!useExperimentalToDeviceTransport}
|
|
||||||
onChange={useCallback(
|
|
||||||
(event: ChangeEvent<HTMLInputElement>): void => {
|
|
||||||
setUseExperimentalToDeviceTransport(event.target.checked);
|
|
||||||
},
|
|
||||||
[setUseExperimentalToDeviceTransport],
|
|
||||||
)}
|
|
||||||
/>
|
|
||||||
</FieldRow>
|
|
||||||
<FieldRow>
|
<FieldRow>
|
||||||
<InputField
|
<InputField
|
||||||
id="multiSfu"
|
id="multiSfu"
|
||||||
|
|||||||
@@ -120,11 +120,6 @@ export const soundEffectVolume = new Setting<number>(
|
|||||||
0.5,
|
0.5,
|
||||||
);
|
);
|
||||||
|
|
||||||
export const useExperimentalToDeviceTransport = new Setting<boolean>(
|
|
||||||
"experimental-to-device-transport",
|
|
||||||
true,
|
|
||||||
);
|
|
||||||
|
|
||||||
export const multiSfu = new Setting<boolean>("multi-sfu", false);
|
export const multiSfu = new Setting<boolean>("multi-sfu", false);
|
||||||
|
|
||||||
export const muteAllAudio = new Setting<boolean>("mute-all-audio", false);
|
export const muteAllAudio = new Setting<boolean>("mute-all-audio", false);
|
||||||
|
|||||||
@@ -1818,7 +1818,6 @@ export class CallViewModel {
|
|||||||
this._configError$.next(null);
|
this._configError$.next(null);
|
||||||
await enterRTCSession(this.matrixRTCSession, advertised.transport, {
|
await enterRTCSession(this.matrixRTCSession, advertised.transport, {
|
||||||
encryptMedia: this.options.encryptionSystem.kind !== E2eeType.NONE,
|
encryptMedia: this.options.encryptionSystem.kind !== E2eeType.NONE,
|
||||||
useExperimentalToDeviceTransport: true,
|
|
||||||
useMultiSfu: advertised.multiSfu,
|
useMultiSfu: advertised.multiSfu,
|
||||||
preferStickyEvents: advertised.preferStickyEvents,
|
preferStickyEvents: advertised.preferStickyEvents,
|
||||||
});
|
});
|
||||||
|
|||||||
Reference in New Issue
Block a user