Skip to content

Commit a731981

Browse files
committed
Cleanup transport creation and local store hack.
1 parent 4099c43 commit a731981

File tree

4 files changed

+90
-21
lines changed

4 files changed

+90
-21
lines changed

locales/en/app.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@
6464
"developer_mode": {
6565
"always_show_iphone_earpiece": "Show iPhone earpiece option on all platforms",
6666
"crypto_version": "Crypto version: {{version}}",
67+
"custom_livekit_url": "Custom Livekit-url",
6768
"debug_tile_layout_label": "Debug tile layout",
6869
"device_id": "Device ID: {{id}}",
6970
"duplicate_tiles_label": "Number of additional tile copies per participant",
@@ -89,6 +90,7 @@
8990
},
9091
"mute_all_audio": "Mute all audio (participants, reactions, join sounds)",
9192
"show_connection_stats": "Show connection statistics",
93+
"update": "Update",
9294
"url_params": "URL parameters"
9395
},
9496
"disconnected_banner": "Connectivity to the server has been lost.",

src/settings/DeveloperSettingsTab.tsx

Lines changed: 51 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,8 @@ import {
1111
useCallback,
1212
useEffect,
1313
useMemo,
14-
useState,
1514
useId,
15+
useState,
1616
} from "react";
1717
import { useTranslation } from "react-i18next";
1818
import {
@@ -21,6 +21,7 @@ import {
2121
} from "matrix-js-sdk";
2222
import { logger } from "matrix-js-sdk/lib/logger";
2323
import {
24+
Button,
2425
Root as Form,
2526
Heading,
2627
HelpMessage,
@@ -38,6 +39,7 @@ import {
3839
muteAllAudio as muteAllAudioSetting,
3940
alwaysShowIphoneEarpiece as alwaysShowIphoneEarpieceSetting,
4041
matrixRTCMode as matrixRTCModeSetting,
42+
customLivekitUrl as customLivekitUrlSetting,
4143
MatrixRTCMode,
4244
} from "./settings";
4345
import type { Room as LivekitRoom } from "livekit-client";
@@ -85,6 +87,12 @@ export const DeveloperSettingsTab: FC<Props> = ({ client, livekitRooms }) => {
8587
alwaysShowIphoneEarpieceSetting,
8688
);
8789

90+
const [customLivekitUrl, setCustomLivekitUrl] = useSetting(
91+
customLivekitUrlSetting,
92+
);
93+
const [customLivekitUrlTextBuffer, setCustomLivekitUrlTextBuffer] =
94+
useState("");
95+
8896
const [muteAllAudio, setMuteAllAudio] = useSetting(muteAllAudioSetting);
8997

9098
const urlParams = useUrlParams();
@@ -200,6 +208,48 @@ export const DeveloperSettingsTab: FC<Props> = ({ client, livekitRooms }) => {
200208
)}
201209
/>{" "}
202210
</FieldRow>
211+
{/*// TODO this feels a bit off... There has to be better way to create the desired look.
212+
Also the indent should be further to the left...*/}
213+
<InlineField
214+
name={t("developer_mode.custom_livekit_url")}
215+
control={<></>}
216+
>
217+
<Label>{t("developer_mode.custom_livekit_url")}</Label>
218+
<HelpMessage>
219+
{customLivekitUrl === null
220+
? "Use Default"
221+
: `Current:${customLivekitUrl}`}
222+
</HelpMessage>
223+
</InlineField>
224+
<FieldRow>
225+
<InputField
226+
id="customLivekitUrl"
227+
type="text"
228+
label={t("developer_mode.custom_livekit_url")}
229+
value={customLivekitUrlTextBuffer}
230+
onChange={useCallback(
231+
(event: ChangeEvent<HTMLInputElement>): void => {
232+
setCustomLivekitUrlTextBuffer(event.target.value);
233+
},
234+
[setCustomLivekitUrlTextBuffer],
235+
)}
236+
/>
237+
<Button
238+
onClick={useCallback(
239+
(e: React.MouseEvent<HTMLButtonElement, MouseEvent>) => {
240+
e.preventDefault();
241+
setCustomLivekitUrl(
242+
customLivekitUrlTextBuffer === ""
243+
? null
244+
: customLivekitUrlTextBuffer,
245+
);
246+
},
247+
[setCustomLivekitUrl, customLivekitUrlTextBuffer],
248+
)}
249+
>
250+
{t("developer_mode.update")}
251+
</Button>
252+
</FieldRow>
203253
<Heading as="h3" type="body" weight="semibold" size="lg">
204254
{t("developer_mode.matrixRTCMode.title")}
205255
</Heading>

src/settings/settings.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -134,3 +134,8 @@ export const matrixRTCMode = new Setting<MatrixRTCMode>(
134134
"matrix-rtc-mode",
135135
MatrixRTCMode.Legacy,
136136
);
137+
138+
export const customLivekitUrl = new Setting<string | null>(
139+
"custom-livekit-url",
140+
null,
141+
);

src/state/CallViewModel/localMember/LocalTransport.ts

Lines changed: 32 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,15 @@ import {
1313
isLivekitTransportConfig,
1414
} from "matrix-js-sdk/lib/matrixrtc";
1515
import { type MatrixClient } from "matrix-js-sdk";
16-
import { combineLatest, distinctUntilChanged, first, from, map } from "rxjs";
17-
import { logger } from "matrix-js-sdk/lib/logger";
16+
import {
17+
combineLatest,
18+
distinctUntilChanged,
19+
first,
20+
from,
21+
map,
22+
switchMap,
23+
} from "rxjs";
24+
import { logger as rootLogger } from "matrix-js-sdk/lib/logger";
1825
import { AutoDiscovery } from "matrix-js-sdk/lib/autodiscovery";
1926

2027
import { type Behavior } from "../../Behavior.ts";
@@ -26,6 +33,9 @@ import {
2633
type OpenIDClientParts,
2734
} from "../../../livekit/openIDSFU.ts";
2835
import { areLivekitTransportsEqual } from "../remoteMembers/MatrixLivekitMembers.ts";
36+
import { customLivekitUrl } from "../../../settings/settings.ts";
37+
38+
const logger = rootLogger.getChild("[LocalTransport]");
2939

3040
/*
3141
* It figures out “which LiveKit focus URL/alias the local user should use,”
@@ -78,14 +88,16 @@ export const createLocalTransport$ = ({
7888
* @throws
7989
*/
8090
const preferredTransport$: Behavior<LivekitTransport | null> = scope.behavior(
81-
from(makeTransport(client, roomId)),
91+
customLivekitUrl.value$.pipe(
92+
switchMap((customUrl) => from(makeTransport(client, roomId, customUrl))),
93+
),
8294
null,
8395
);
8496

8597
/**
86-
* The transport we should advertise in our MatrixRTC membership.
98+
* The chosen transport we should advertise in our MatrixRTC membership.
8799
*/
88-
const advertisedTransport$ = scope.behavior(
100+
return scope.behavior(
89101
combineLatest([
90102
useOldestMember$,
91103
oldestMemberTransport$,
@@ -99,7 +111,6 @@ export const createLocalTransport$ = ({
99111
distinctUntilChanged(areLivekitTransportsEqual),
100112
),
101113
);
102-
return advertisedTransport$;
103114
};
104115

105116
const FOCI_WK_KEY = "org.matrix.msc4143.rtc_foci";
@@ -114,31 +125,30 @@ const FOCI_WK_KEY = "org.matrix.msc4143.rtc_foci";
114125
async function makeTransport(
115126
client: Pick<MatrixClient, "getDomain"> & OpenIDClientParts,
116127
roomId: string,
128+
urlFromDevSettings: string | null,
117129
): Promise<LivekitTransport> {
118130
let transport: LivekitTransport | undefined;
119-
logger.log("Searching for a preferred transport");
131+
logger.trace("Searching for a preferred transport");
120132
//TODO refactor this to use the jwt service returned alias.
121133
const livekitAlias = roomId;
122-
// TODO-MULTI-SFU: Either remove this dev tool or make it more official
123-
const urlFromStorage =
124-
localStorage.getItem("robin-matrixrtc-auth") ??
125-
localStorage.getItem("timo-focus-url");
126-
if (urlFromStorage !== null) {
134+
135+
// DEVTOOL: Highest priority: Load from devtool setting
136+
if (urlFromDevSettings !== null) {
127137
const transportFromStorage: LivekitTransport = {
128138
type: "livekit",
129-
livekit_service_url: urlFromStorage,
139+
livekit_service_url: urlFromDevSettings,
130140
livekit_alias: livekitAlias,
131141
};
132-
logger.log(
133-
"Using LiveKit transport from local storage: ",
142+
logger.info(
143+
"Using LiveKit transport from dev tools: ",
134144
transportFromStorage,
135145
);
136146
transport = transportFromStorage;
137147
}
138148

139-
// Prioritize the .well-known/matrix/client, if available, over the configured SFU
149+
// WELL_KNOWN: Prioritize the .well-known/matrix/client, if available, over the configured SFU
140150
const domain = client.getDomain();
141-
if (domain) {
151+
if (domain && transport === undefined) {
142152
// we use AutoDiscovery instead of relying on the MatrixClient having already
143153
// been fully configured and started
144154
const wellKnownFoci = (await AutoDiscovery.getRawClientConfig(domain))?.[
@@ -148,22 +158,24 @@ async function makeTransport(
148158
const wellKnownTransport: LivekitTransportConfig | undefined =
149159
wellKnownFoci.find((f) => f && isLivekitTransportConfig(f));
150160
if (wellKnownTransport !== undefined) {
151-
logger.log("Using LiveKit transport from .well-known: ", transport);
161+
logger.info("Using LiveKit transport from .well-known: ", transport);
152162
transport = { ...wellKnownTransport, livekit_alias: livekitAlias };
153163
}
154164
}
155165
}
156166

167+
// CONFIG: Least prioritized; Load from config file
157168
const urlFromConf = Config.get().livekit?.livekit_service_url;
158-
if (urlFromConf) {
169+
if (urlFromConf && transport === undefined) {
159170
const transportFromConf: LivekitTransport = {
160171
type: "livekit",
161172
livekit_service_url: urlFromConf,
162173
livekit_alias: livekitAlias,
163174
};
164-
logger.log("Using LiveKit transport from config: ", transportFromConf);
175+
logger.info("Using LiveKit transport from config: ", transportFromConf);
165176
transport = transportFromConf;
166177
}
178+
167179
if (!transport) throw new MatrixRTCTransportMissingError(domain ?? ""); // this will call the jwt/sfu/get endpoint to pre create the livekit room.
168180

169181
await getSFUConfigWithOpenID(

0 commit comments

Comments
 (0)