From 5d5d75ebdf3dab22f810eff4c64e8219c009bf74 Mon Sep 17 00:00:00 2001 From: Timo K Date: Mon, 5 Jan 2026 21:08:33 +0100 Subject: [PATCH] fixup merge --- sdk/main.ts | 7 +-- src/livekit/openIDSFU.test.ts | 7 +++ .../localMember/LocalTransport.test.ts | 19 +++++++- .../localMember/LocalTransport.ts | 47 +++++++++++-------- 4 files changed, 53 insertions(+), 27 deletions(-) diff --git a/sdk/main.ts b/sdk/main.ts index 376674a4..8d07ab07 100644 --- a/sdk/main.ts +++ b/sdk/main.ts @@ -101,12 +101,7 @@ export async function createMatrixRTCSdk( const mediaDevices = new MediaDevices(scope); const muteStates = new MuteStates(scope, mediaDevices, constant(true)); const slot = { application, id }; - const rtcSession = new MatrixRTCSession( - client, - room, - MatrixRTCSession.sessionMembershipsForSlot(room, slot), - slot, - ); + const rtcSession = new MatrixRTCSession(client, room, slot); const callViewModel = createCallViewModel$( scope, rtcSession, diff --git a/src/livekit/openIDSFU.test.ts b/src/livekit/openIDSFU.test.ts index 2a260b01..8b263662 100644 --- a/src/livekit/openIDSFU.test.ts +++ b/src/livekit/openIDSFU.test.ts @@ -18,6 +18,7 @@ import fetchMock from "fetch-mock"; import { getSFUConfigWithOpenID, type OpenIDClientParts } from "./openIDSFU"; import { testJWTToken } from "../utils/test-fixtures"; +import { ownMemberMock } from "../utils/test"; const sfuUrl = "https://sfu.example.org"; @@ -42,7 +43,9 @@ describe("getSFUConfigWithOpenID", () => { }); const config = await getSFUConfigWithOpenID( matrixClient, + ownMemberMock, "https://sfu.example.org", + false, "!example_room_id", ); expect(config).toEqual({ @@ -63,7 +66,9 @@ describe("getSFUConfigWithOpenID", () => { try { await getSFUConfigWithOpenID( matrixClient, + ownMemberMock, "https://sfu.example.org", + false, "!example_room_id", ); } catch (ex) { @@ -98,7 +103,9 @@ describe("getSFUConfigWithOpenID", () => { }); const config = await getSFUConfigWithOpenID( matrixClient, + ownMemberMock, "https://sfu.example.org", + false, "!example_room_id", ); expect(config).toEqual({ diff --git a/src/state/CallViewModel/localMember/LocalTransport.test.ts b/src/state/CallViewModel/localMember/LocalTransport.test.ts index c77297ef..2199ca94 100644 --- a/src/state/CallViewModel/localMember/LocalTransport.test.ts +++ b/src/state/CallViewModel/localMember/LocalTransport.test.ts @@ -49,6 +49,8 @@ describe("LocalTransport", () => { useOldestMember$: constant(false), memberships$: constant(new Epoch([])), client: { + // eslint-disable-next-line @typescript-eslint/naming-convention + _unstable_getRTCTransports: async () => Promise.resolve([]), getDomain: () => "", baseUrl: "example.org", // These won't be called in this error path but satisfy the type @@ -130,6 +132,8 @@ describe("LocalTransport", () => { useOldestMember$: constant(false), memberships$: constant(new Epoch([])), client: { + // eslint-disable-next-line @typescript-eslint/naming-convention + _unstable_getRTCTransports: async () => Promise.resolve([]), getDomain: () => "", getOpenIdToken: vi.fn(), getDeviceId: vi.fn(), @@ -140,7 +144,12 @@ describe("LocalTransport", () => { delayId$: constant("delay_id_mock"), }); - openIdResolver.resolve?.({ url: "https://lk.example.org", jwt: "jwt" }); + openIdResolver.resolve?.({ + url: "https://lk.example.org", + jwt: "jwt", + livekitAlias: "!room:example.org", + livekitIdentity: ownMemberMock.userId + ":" + ownMemberMock.deviceId, + }); expect(localTransport$.value).toBe(null); await flushPromises(); // final @@ -203,11 +212,15 @@ describe("LocalTransport", () => { mockConfig({}); customLivekitUrl.setValue(customLivekitUrl.defaultValue); localTransportOpts = { + ownMembershipIdentity: ownMemberMock, scope, roomId: "!example_room_id", useOldestMember$: constant(false), + useOldJwtEndpoint$: constant(false), + delayId$: constant(null), memberships$: constant(new Epoch([])), client: { + baseUrl: "https://example.org", getDomain: vi.fn().mockReturnValue(""), // eslint-disable-next-line @typescript-eslint/naming-convention _unstable_getRTCTransports: vi.fn().mockResolvedValue([]), @@ -317,11 +330,15 @@ describe("LocalTransport", () => { it("throws if no options are available", async () => { const localTransport$ = createLocalTransport$({ scope, + ownMembershipIdentity: ownMemberMock, roomId: "!example_room_id", useOldestMember$: constant(false), + useOldJwtEndpoint$: constant(false), + delayId$: constant(null), memberships$: constant(new Epoch([])), client: { getDomain: () => "", + baseUrl: "https://example.org", // eslint-disable-next-line @typescript-eslint/naming-convention _unstable_getRTCTransports: async () => Promise.resolve([]), // These won't be called in this error path but satisfy the type diff --git a/src/state/CallViewModel/localMember/LocalTransport.ts b/src/state/CallViewModel/localMember/LocalTransport.ts index d8b5dfce..1853ff6d 100644 --- a/src/state/CallViewModel/localMember/LocalTransport.ts +++ b/src/state/CallViewModel/localMember/LocalTransport.ts @@ -178,7 +178,6 @@ async function makeTransport( forceOldJwtEndpoint: boolean, delayId?: string, ): Promise { - let transport: LivekitTransport | undefined; logger.trace("Searching for a preferred transport"); // We will call `getSFUConfigWithOpenID` once per transport here as it's our @@ -194,32 +193,47 @@ async function makeTransport( logger.info("Using LiveKit transport from dev tools: ", urlFromDevSettings); // Validate that the SFU is up. Otherwise, we want to fail on this // as we don't permit other SFUs. - const config = await getSFUConfigWithOpenID( + // This will call the jwt/sfu/get endpoint to pre create the livekit room. + const { livekitAlias } = await getSFUConfigWithOpenID( client, + membership, urlFromDevSettings, + forceOldJwtEndpoint, roomId, + client.baseUrl, + delayId, + logger, ); return { type: "livekit", livekit_service_url: urlFromDevSettings, - livekit_alias: config.livekitAlias, + livekit_alias: livekitAlias, + forceOldJwtEndpoint, }; } async function getFirstUsableTransport( transports: Transport[], - ): Promise { + ): Promise<(LivekitTransport & { forceOldJwtEndpoint: boolean }) | null> { for (const potentialTransport of transports) { if (isLivekitTransportConfig(potentialTransport)) { try { + // This will call the jwt/sfu/get endpoint to pre create the livekit room. const { livekitAlias } = await getSFUConfigWithOpenID( client, + membership, potentialTransport.livekit_service_url, + forceOldJwtEndpoint, roomId, + client.baseUrl, + delayId, + logger, ); + return { ...potentialTransport, livekit_alias: livekitAlias, + forceOldJwtEndpoint, }; } catch (ex) { if (ex instanceof FailToGetOpenIdToken) { @@ -283,10 +297,16 @@ async function makeTransport( const urlFromConf = Config.get().livekit?.livekit_service_url; if (urlFromConf) { try { + // This will call the jwt/sfu/get endpoint to pre create the livekit room. const { livekitAlias } = await getSFUConfigWithOpenID( client, + membership, urlFromConf, + forceOldJwtEndpoint, roomId, + client.baseUrl, + delayId, + logger, ); const selectedTransport: LivekitTransport = { type: "livekit", @@ -294,7 +314,7 @@ async function makeTransport( livekit_alias: livekitAlias, }; logger.info("Using config SFU", selectedTransport); - return selectedTransport; + return { ...selectedTransport, forceOldJwtEndpoint }; } catch (ex) { if (ex instanceof FailToGetOpenIdToken) { throw ex; @@ -303,19 +323,6 @@ async function makeTransport( } } - if (!transport) throw new MatrixRTCTransportMissingError(domain ?? ""); - - // this will call the jwt/sfu/get endpoint to pre create the livekit room. - await getSFUConfigWithOpenID( - client, - membership, - transport.livekit_service_url, - forceOldJwtEndpoint, - transport.livekit_alias, - client.baseUrl, - delayId, - logger, - ); - - return { ...transport, forceOldJwtEndpoint }; + // If we do not have returned a transport by now we throw an error + throw new MatrixRTCTransportMissingError(domain ?? ""); }