From d294be8bd4b4f4ce7d845b0fb4671bcbabecdb51 Mon Sep 17 00:00:00 2001 From: Valere Date: Thu, 31 Jul 2025 15:47:18 +0200 Subject: [PATCH] custom error for restricted SFU config error --- locales/en/app.json | 2 ++ src/livekit/useECConnectionState.ts | 19 ++++++++++++++----- src/utils/errors.ts | 12 ++++++++++++ 3 files changed, 28 insertions(+), 5 deletions(-) diff --git a/locales/en/app.json b/locales/en/app.json index 96d89d70..d375b629 100644 --- a/locales/en/app.json +++ b/locales/en/app.json @@ -94,6 +94,8 @@ "matrix_rtc_focus_missing": "The server is not configured to work with {{brand}}. Please contact your server admin (Domain: {{domain}}, Error Code: {{ errorCode }}).", "open_elsewhere": "Opened in another tab", "open_elsewhere_description": "{{brand}} has been opened in another tab. If that doesn't sound right, try reloading the page.", + "room_creation_restricted": "Failed to create call", + "room_creation_restricted_description": "Call creation might be restricted to authorized users only. Try again later, or contact your server admin if the problem persists.", "unexpected_ec_error": "An unexpected error occurred (<0>Error Code: <1>{{ errorCode }}). Please contact your server admin." }, "group_call_loader": { diff --git a/src/livekit/useECConnectionState.ts b/src/livekit/useECConnectionState.ts index 3c7b91f8..945363ab 100644 --- a/src/livekit/useECConnectionState.ts +++ b/src/livekit/useECConnectionState.ts @@ -22,6 +22,7 @@ import { PosthogAnalytics } from "../analytics/PosthogAnalytics"; import { ElementCallError, InsufficientCapacityError, + SFURoomCreationRestrictedError, UnknownCallError, } from "../utils/errors.ts"; import { AbortHandle } from "../utils/abortHandle.ts"; @@ -184,11 +185,19 @@ async function connectAndPublish( // participant limits. // LiveKit Cloud uses 429 for connection limits. // Either way, all these errors can be explained as "insufficient capacity". - if ( - e instanceof ConnectionError && - (e.status === 503 || e.status === 200 || e.status === 429) - ) - throw new InsufficientCapacityError(); + if (e instanceof ConnectionError) { + if (e.status === 503 || e.status === 200 || e.status === 429) { + throw new InsufficientCapacityError(); + } + if (e.status === 404) { + // error msg is "Could not establish signal connection: requested room does not exist" + // The room does not exist. There are two different modes of operation for the SFU: + // - the room is created on the fly when connecting (livekit `auto_create` option) + // - Only authorized users can create rooms, so the room must exist before connecting (done by the auth jwt service) + // In the first case there will not be a 404, so we are in the second case. + throw new SFURoomCreationRestrictedError(); + } + } throw e; } diff --git a/src/utils/errors.ts b/src/utils/errors.ts index 674cfdec..5cb0b450 100644 --- a/src/utils/errors.ts +++ b/src/utils/errors.ts @@ -17,6 +17,7 @@ export enum ErrorCode { INSUFFICIENT_CAPACITY_ERROR = "INSUFFICIENT_CAPACITY_ERROR", E2EE_NOT_SUPPORTED = "E2EE_NOT_SUPPORTED", OPEN_ID_ERROR = "OPEN_ID_ERROR", + SFU_ERROR = "SFU_ERROR", UNKNOWN_ERROR = "UNKNOWN_ERROR", } @@ -129,3 +130,14 @@ export class InsufficientCapacityError extends ElementCallError { ); } } + +export class SFURoomCreationRestrictedError extends ElementCallError { + public constructor() { + super( + t("error.room_creation_restricted"), + ErrorCode.SFU_ERROR, + ErrorCategory.CONFIGURATION_ISSUE, + t("error.room_creation_restricted_description"), + ); + } +}