Add error screens for connecting to the JWT service

This commit is contained in:
Robin
2025-01-15 22:28:35 -05:00
parent cda802a2e9
commit 5240d5eafb
3 changed files with 164 additions and 37 deletions

View File

@@ -12,6 +12,10 @@ import { useEffect, useState } from "react";
import { type LivekitFocus } from "matrix-js-sdk/src/matrixrtc/LivekitFocus";
import { useActiveLivekitFocus } from "../room/useActiveFocus";
import {
AuthConnectionFailedError,
AuthConnectionRejectedError,
} from "../RichError";
export interface SFUConfig {
url: string;
@@ -35,25 +39,24 @@ export function useOpenIDSFU(
client: OpenIDClientParts,
rtcSession: MatrixRTCSession,
): SFUConfig | undefined {
const [sfuConfig, setSFUConfig] = useState<SFUConfig | undefined>(undefined);
const [sfuConfig, setSFUConfig] = useState<SFUConfig | Error | undefined>(
undefined,
);
const activeFocus = useActiveLivekitFocus(rtcSession);
useEffect(() => {
if (activeFocus) {
getSFUConfigWithOpenID(client, activeFocus).then(
(sfuConfig) => {
setSFUConfig(sfuConfig);
},
(e) => {
logger.error("Failed to get SFU config", e);
},
(sfuConfig) => setSFUConfig(sfuConfig),
(e) => setSFUConfig(e),
);
} else {
setSFUConfig(undefined);
}
}, [client, activeFocus]);
if (sfuConfig instanceof Error) throw sfuConfig;
return sfuConfig;
}
@@ -64,26 +67,18 @@ export async function getSFUConfigWithOpenID(
const openIdToken = await client.getOpenIdToken();
logger.debug("Got openID token", openIdToken);
try {
logger.info(
`Trying to get JWT from call's active focus URL of ${activeFocus.livekit_service_url}...`,
);
const sfuConfig = await getLiveKitJWT(
client,
activeFocus.livekit_service_url,
activeFocus.livekit_alias,
openIdToken,
);
logger.info(`Got JWT from call's active focus URL.`);
logger.info(
`Trying to get JWT from call's active focus URL of ${activeFocus.livekit_service_url}...`,
);
const sfuConfig = await getLiveKitJWT(
client,
activeFocus.livekit_service_url,
activeFocus.livekit_alias,
openIdToken,
);
logger.info(`Got JWT from call's active focus URL.`);
return sfuConfig;
} catch (e) {
logger.warn(
`Failed to get JWT from RTC session's active focus URL of ${activeFocus.livekit_service_url}.`,
e,
);
return undefined;
}
return sfuConfig;
}
async function getLiveKitJWT(
@@ -92,8 +87,9 @@ async function getLiveKitJWT(
roomName: string,
openIDToken: IOpenIDToken,
): Promise<SFUConfig> {
let res: Response;
try {
const res = await fetch(livekitServiceURL + "/sfu/get", {
res = await fetch(livekitServiceURL + "/sfu/get", {
method: "POST",
headers: {
"Content-Type": "application/json",
@@ -104,11 +100,11 @@ async function getLiveKitJWT(
device_id: client.getDeviceId(),
}),
});
if (!res.ok) {
throw new Error("SFU Config fetch failed with status code " + res.status);
}
return await res.json();
} catch (e) {
throw new Error("SFU Config fetch failed with exception " + e);
throw new AuthConnectionFailedError(livekitServiceURL, e);
}
if (!res.ok) {
throw new AuthConnectionRejectedError(livekitServiceURL, res.status);
}
return await res.json();
}