@@ -13,8 +13,15 @@ import {
1313 isLivekitTransportConfig ,
1414} from "matrix-js-sdk/lib/matrixrtc" ;
1515import { 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" ;
1825import { AutoDiscovery } from "matrix-js-sdk/lib/autodiscovery" ;
1926
2027import { type Behavior } from "../../Behavior.ts" ;
@@ -26,6 +33,9 @@ import {
2633 type OpenIDClientParts ,
2734} from "../../../livekit/openIDSFU.ts" ;
2835import { 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
105116const FOCI_WK_KEY = "org.matrix.msc4143.rtc_foci" ;
@@ -114,31 +125,30 @@ const FOCI_WK_KEY = "org.matrix.msc4143.rtc_foci";
114125async 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