From 5edd30a91d5d24c414c0d683ee2e599b85bbe992 Mon Sep 17 00:00:00 2001 From: Valere Date: Mon, 17 Nov 2025 17:10:44 +0100 Subject: [PATCH] playwright: Fix error boundary mgmt or openId errors --- .../localMember/LocalMembership.ts | 28 +++++++++++++++++-- .../localMember/LocalTransport.ts | 14 ++++++---- 2 files changed, 35 insertions(+), 7 deletions(-) diff --git a/src/state/CallViewModel/localMember/LocalMembership.ts b/src/state/CallViewModel/localMember/LocalMembership.ts index d9a3887b..8be87c17 100644 --- a/src/state/CallViewModel/localMember/LocalMembership.ts +++ b/src/state/CallViewModel/localMember/LocalMembership.ts @@ -22,6 +22,7 @@ import { ClientEvent, SyncState, type Room as MatrixRoom } from "matrix-js-sdk"; import { BehaviorSubject, combineLatest, + distinctUntilChanged, fromEvent, map, type Observable, @@ -52,7 +53,10 @@ import { getUrlParams } from "../../../UrlParams.ts"; import { PosthogAnalytics } from "../../../analytics/PosthogAnalytics.ts"; import { MatrixRTCMode } from "../../../settings/settings.ts"; import { Config } from "../../../config/Config.ts"; -import { type Connection } from "../remoteMembers/Connection.ts"; +import { + type Connection, + type ConnectionState, +} from "../remoteMembers/Connection.ts"; export enum LivekitState { Uninitialized = "uninitialized", @@ -446,8 +450,8 @@ export const createLocalMembership$ = ({ scope.reconcile(localTransport$, async (advertised) => { if (advertised !== null && advertised !== undefined) { try { - configError$.next(null); await enterRTCSession(matrixRTCSession, advertised, options.value); + configError$.next(null); } catch (e) { logger.error("Error entering RTC session", e); } @@ -477,6 +481,26 @@ export const createLocalMembership$ = ({ } }); + localConnection$ + .pipe( + distinctUntilChanged(), + switchMap((c) => + c === null ? of({ state: "Initialized" } as ConnectionState) : c.state$, + ), + tap((s) => { + logger.trace(`Local connection state update: ${s.state}`); + if (s.state == "FailedToStart") { + configError$.next(s.error as ElementCallError); + } else { + // TODO do we need to clear errors on other states? + // It is a fatal error so the user needs to reload or similar anyway. + configError$.next(null); + } + }), + scope.bind(), + ) + .subscribe(); + /** * Whether the user is currently sharing their screen. */ diff --git a/src/state/CallViewModel/localMember/LocalTransport.ts b/src/state/CallViewModel/localMember/LocalTransport.ts index 94c89deb..83c997e8 100644 --- a/src/state/CallViewModel/localMember/LocalTransport.ts +++ b/src/state/CallViewModel/localMember/LocalTransport.ts @@ -166,10 +166,14 @@ async function makeTransport( ): Promise { const transport = await makeTransportInternal(client, roomId); // this will call the jwt/sfu/get endpoint to pre create the livekit room. - await getSFUConfigWithOpenID( - client, - transport.livekit_service_url, - transport.livekit_alias, - ); + try { + await getSFUConfigWithOpenID( + client, + transport.livekit_service_url, + transport.livekit_alias, + ); + } catch (e) { + logger.warn(`Failed to get SFU config for transport: ${e}`); + } return transport; }