add dev setting to choose to-device or room encryption

This commit is contained in:
Timo
2025-04-09 14:16:49 +02:00
parent aef375a13f
commit 46913b120a
6 changed files with 47 additions and 37 deletions

View File

@@ -73,7 +73,8 @@
"show_connection_stats": "Show connection statistics", "show_connection_stats": "Show connection statistics",
"show_non_member_tiles": "Show tiles for non-member media", "show_non_member_tiles": "Show tiles for non-member media",
"url_params": "URL parameters", "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.", "disconnected_banner": "Connectivity to the server has been lost.",
"error": { "error": {

View File

@@ -62,6 +62,7 @@ import {
} from "../utils/errors.ts"; } from "../utils/errors.ts";
import { GroupCallErrorBoundary } from "./GroupCallErrorBoundary.tsx"; import { GroupCallErrorBoundary } from "./GroupCallErrorBoundary.tsx";
import { import {
useExperimentalToDeviceTransportSetting,
useNewMembershipManagerSetting as useNewMembershipManagerSetting, useNewMembershipManagerSetting as useNewMembershipManagerSetting,
useSetting, useSetting,
} from "../settings/settings"; } from "../settings/settings";
@@ -151,6 +152,9 @@ export const GroupCallView: FC<Props> = ({
const { perParticipantE2EE, returnToLobby } = useUrlParams(); const { perParticipantE2EE, returnToLobby } = useUrlParams();
const e2eeSystem = useRoomEncryptionSystem(room.roomId); const e2eeSystem = useRoomEncryptionSystem(room.roomId);
const [useNewMembershipManager] = useSetting(useNewMembershipManagerSetting); const [useNewMembershipManager] = useSetting(useNewMembershipManagerSetting);
const [useExperimentalToDeviceTransport] = useSetting(
useExperimentalToDeviceTransportSetting,
);
usePageTitle(roomName); usePageTitle(roomName);
@@ -178,16 +182,13 @@ export const GroupCallView: FC<Props> = ({
const latestMuteStates = useLatest(muteStates); const latestMuteStates = useLatest(muteStates);
const enterRTCSessionOrError = useCallback( const enterRTCSessionOrError = useCallback(
async ( async (rtcSession: MatrixRTCSession): Promise<void> => {
rtcSession: MatrixRTCSession,
perParticipantE2EE: boolean,
newMembershipManager: boolean,
): Promise<void> => {
try { try {
await enterRTCSession( await enterRTCSession(
rtcSession, rtcSession,
perParticipantE2EE, perParticipantE2EE,
newMembershipManager, useNewMembershipManager,
useExperimentalToDeviceTransport,
); );
} catch (e) { } catch (e) {
if (e instanceof ElementCallError) { if (e instanceof ElementCallError) {
@@ -201,7 +202,11 @@ export const GroupCallView: FC<Props> = ({
} }
} }
}, },
[setExternalError], [
perParticipantE2EE,
useExperimentalToDeviceTransport,
useNewMembershipManager,
],
); );
useEffect(() => { useEffect(() => {
@@ -253,11 +258,7 @@ export const GroupCallView: FC<Props> = ({
await defaultDeviceSetup( await defaultDeviceSetup(
ev.detail.data as unknown as JoinCallData, ev.detail.data as unknown as JoinCallData,
); );
await enterRTCSessionOrError( await enterRTCSessionOrError(rtcSession);
rtcSession,
perParticipantE2EE,
useNewMembershipManager,
);
widget.api.transport.reply(ev.detail, {}); widget.api.transport.reply(ev.detail, {});
})().catch((e) => { })().catch((e) => {
logger.error("Error joining RTC session", e); logger.error("Error joining RTC session", e);
@@ -270,21 +271,13 @@ export const GroupCallView: FC<Props> = ({
} else { } else {
// No lobby and no preload: we enter the rtc session right away // No lobby and no preload: we enter the rtc session right away
(async (): Promise<void> => { (async (): Promise<void> => {
await enterRTCSessionOrError( await enterRTCSessionOrError(rtcSession);
rtcSession,
perParticipantE2EE,
useNewMembershipManager,
);
})().catch((e) => { })().catch((e) => {
logger.error("Error joining RTC session", e); logger.error("Error joining RTC session", e);
}); });
} }
} else { } else {
void enterRTCSessionOrError( void enterRTCSessionOrError(rtcSession);
rtcSession,
perParticipantE2EE,
useNewMembershipManager,
);
} }
} }
}, [ }, [
@@ -407,13 +400,7 @@ export const GroupCallView: FC<Props> = ({
client={client} client={client}
matrixInfo={matrixInfo} matrixInfo={matrixInfo}
muteStates={muteStates} muteStates={muteStates}
onEnter={() => onEnter={() => void enterRTCSessionOrError(rtcSession)}
void enterRTCSessionOrError(
rtcSession,
perParticipantE2EE,
useNewMembershipManager,
)
}
confineToRoom={confineToRoom} confineToRoom={confineToRoom}
hideHeader={hideHeader} hideHeader={hideHeader}
participantCount={participantCount} participantCount={participantCount}
@@ -491,11 +478,7 @@ export const GroupCallView: FC<Props> = ({
recoveryActionHandler={(action) => { recoveryActionHandler={(action) => {
if (action == "reconnect") { if (action == "reconnect") {
setLeft(false); setLeft(false);
enterRTCSessionOrError( enterRTCSessionOrError(rtcSession).catch((e) => {
rtcSession,
perParticipantE2EE,
useNewMembershipManager,
).catch((e) => {
logger.error("Error re-entering RTC session", e); logger.error("Error re-entering RTC session", e);
}); });
} }

View File

@@ -98,6 +98,7 @@ export async function enterRTCSession(
rtcSession: MatrixRTCSession, rtcSession: MatrixRTCSession,
encryptMedia: boolean, encryptMedia: boolean,
useNewMembershipManager = true, useNewMembershipManager = true,
useExperimentalToDeviceTransport = false,
): 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);
@@ -125,7 +126,7 @@ export async function enterRTCSession(
membershipKeepAlivePeriod: membershipKeepAlivePeriod:
matrixRtcSessionConfig?.membership_keep_alive_period, matrixRtcSessionConfig?.membership_keep_alive_period,
makeKeyDelay: matrixRtcSessionConfig?.key_rotation_on_leave_delay, makeKeyDelay: matrixRtcSessionConfig?.key_rotation_on_leave_delay,
useExperimentalToDeviceTransport: true, useExperimentalToDeviceTransport,
}, },
); );
if (widget) { if (widget) {

View File

@@ -16,6 +16,7 @@ import {
showNonMemberTiles as showNonMemberTilesSetting, showNonMemberTiles as showNonMemberTilesSetting,
showConnectionStats as showConnectionStatsSetting, showConnectionStats as showConnectionStatsSetting,
useNewMembershipManagerSetting, useNewMembershipManagerSetting,
useExperimentalToDeviceTransportSetting,
} from "./settings"; } from "./settings";
import type { MatrixClient } from "matrix-js-sdk"; import type { MatrixClient } from "matrix-js-sdk";
import type { Room as LivekitRoom } from "livekit-client"; import type { Room as LivekitRoom } from "livekit-client";
@@ -44,6 +45,10 @@ export const DeveloperSettingsTab: FC<Props> = ({ client, livekitRoom }) => {
useNewMembershipManagerSetting, useNewMembershipManagerSetting,
); );
const [
useExperimentalToDeviceTransport,
setUseExperimentalToDeviceTransport,
] = useSetting(useExperimentalToDeviceTransportSetting);
const urlParams = useUrlParams(); const urlParams = useUrlParams();
const sfuUrl = useMemo((): URL | null => { const sfuUrl = useMemo((): URL | null => {
@@ -156,6 +161,20 @@ export const DeveloperSettingsTab: FC<Props> = ({ client, livekitRoom }) => {
)} )}
/> />
</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>
{livekitRoom ? ( {livekitRoom ? (
<> <>
<p> <p>

View File

@@ -117,4 +117,10 @@ export const useNewMembershipManagerSetting = new Setting<boolean>(
"new-membership-manager", "new-membership-manager",
true, true,
); );
export const useExperimentalToDeviceTransportSetting = new Setting<boolean>(
"experimental-to-device-transport",
false,
);
export const alwaysShowSelf = new Setting<boolean>("always-show-self", true); export const alwaysShowSelf = new Setting<boolean>("always-show-self", true);

View File

@@ -251,7 +251,7 @@ export async function createRoom(
"m.room.encryption": 100, "m.room.encryption": 100,
"m.room.name": 50, "m.room.name": 50,
"m.room.message": 0, "m.room.message": 0,
"m.room.encrypted": 50, "m.room.encrypted": 0,
"m.sticker": 50, "m.sticker": 50,
"org.matrix.msc3401.call.member": 0, "org.matrix.msc3401.call.member": 0,
}, },