sfu config: add some network retry and more logging

This commit is contained in:
Valere
2026-03-19 18:53:34 +01:00
parent 385ab0a0ed
commit f244a00d6c

View File

@@ -42,6 +42,7 @@ import {
} from "../../../livekit/openIDSFU.ts"; } from "../../../livekit/openIDSFU.ts";
import { areLivekitTransportsEqual } from "../remoteMembers/MatrixLivekitMembers.ts"; import { areLivekitTransportsEqual } from "../remoteMembers/MatrixLivekitMembers.ts";
import { customLivekitUrl } from "../../../settings/settings.ts"; import { customLivekitUrl } from "../../../settings/settings.ts";
import { doNetworkOperationWithRetry } from "../../../utils/matrix.ts";
const logger = rootLogger.getChild("[LocalTransport]"); const logger = rootLogger.getChild("[LocalTransport]");
@@ -323,7 +324,9 @@ async function makeTransport(
forceJwtEndpoint: JwtEndpointVersion, forceJwtEndpoint: JwtEndpointVersion,
delayId?: string, delayId?: string,
): Promise<LocalTransportWithSFUConfig> { ): Promise<LocalTransportWithSFUConfig> {
logger.trace("Searching for a preferred transport"); logger.trace(
`Searching for a preferred transport, forceJwtEndpoint: ${forceJwtEndpoint}`,
);
async function doOpenIdAndJWTFromUrl( async function doOpenIdAndJWTFromUrl(
url: string, url: string,
@@ -371,11 +374,18 @@ async function makeTransport(
for (const potentialTransport of transports) { for (const potentialTransport of transports) {
if (isLivekitTransportConfig(potentialTransport)) { if (isLivekitTransportConfig(potentialTransport)) {
try { try {
logger.debug(
`Checking auth for transport: ${potentialTransport.livekit_service_url} `,
);
// This will call the jwt/sfu/get endpoint to pre create the livekit room. // This will call the jwt/sfu/get endpoint to pre create the livekit room.
return await doOpenIdAndJWTFromUrl( return await doOpenIdAndJWTFromUrl(
potentialTransport.livekit_service_url, potentialTransport.livekit_service_url,
); );
} catch (ex) { } catch (ex) {
logger.error(
`Could not use SFU service "${potentialTransport.livekit_service_url}" as SFU`,
ex,
);
// Explictly throw these // Explictly throw these
if (ex instanceof FailToGetOpenIdToken) { if (ex instanceof FailToGetOpenIdToken) {
throw ex; throw ex;
@@ -383,11 +393,12 @@ async function makeTransport(
if (ex instanceof NoMatrix2AuthorizationService) { if (ex instanceof NoMatrix2AuthorizationService) {
throw ex; throw ex;
} }
logger.debug(
`Could not use SFU service "${potentialTransport.livekit_service_url}" as SFU`,
ex,
);
} }
} else {
logger.debug(
`Unsupported transport type: ${potentialTransport.type}, skipping: `,
potentialTransport,
);
} }
} }
return null; return null;
@@ -396,7 +407,13 @@ async function makeTransport(
// MSC4143: Attempt to fetch transports from backend. // MSC4143: Attempt to fetch transports from backend.
if ("_unstable_getRTCTransports" in client) { if ("_unstable_getRTCTransports" in client) {
try { try {
const transportList = await client._unstable_getRTCTransports(); const transportList = await doNetworkOperationWithRetry(
async () => await client._unstable_getRTCTransports(),
);
logger.info(
`Got ${transportList.length} transports from backend-configured endpoint: `,
transportList,
);
const selectedTransport = await getFirstUsableTransport(transportList); const selectedTransport = await getFirstUsableTransport(transportList);
if (selectedTransport) { if (selectedTransport) {
logger.info( logger.info(
@@ -409,10 +426,11 @@ async function makeTransport(
if (ex instanceof MatrixError && ex.httpStatus === 404) { if (ex instanceof MatrixError && ex.httpStatus === 404) {
// Expected, this is an unstable endpoint and it's not required. // Expected, this is an unstable endpoint and it's not required.
// There will be expected 404 errors in the console. When we check if synapse supports the endpoint. // There will be expected 404 errors in the console. When we check if synapse supports the endpoint.
logger.debug( logger.info(
"Matrix homeserver does not provide any RTC transports via `/rtc/transports` (will retry with well-known.)", "Matrix homeserver does not provide any RTC transports via `/rtc/transports` (will retry with well-known.)",
); );
} else if (ex instanceof FailToGetOpenIdToken) { } else if (ex instanceof FailToGetOpenIdToken) {
logger.warn(`Failed to validate backend-configured SFU: ${ex}`);
throw ex; throw ex;
} else { } else {
// We got an error that wasn't just missing support for the feature, so log it loudly. // We got an error that wasn't just missing support for the feature, so log it loudly.
@@ -427,21 +445,28 @@ async function makeTransport(
// Legacy MSC4143 (to be removed) WELL_KNOWN: Prioritize the .well-known/matrix/client, if available. // Legacy MSC4143 (to be removed) WELL_KNOWN: Prioritize the .well-known/matrix/client, if available.
const domain = client.getDomain(); const domain = client.getDomain();
if (domain) { if (domain) {
logger.debug("Fetching .well-known SFU from ", domain);
// we use AutoDiscovery instead of relying on the MatrixClient having already // we use AutoDiscovery instead of relying on the MatrixClient having already
// been fully configured and started // been fully configured and started
const wellKnownFoci = (await AutoDiscovery.getRawClientConfig(domain))?.[ const wellKnown = await doNetworkOperationWithRetry(
FOCI_WK_KEY async () => await AutoDiscovery.getRawClientConfig(domain),
]; );
const wellKnownFoci = wellKnown?.[FOCI_WK_KEY];
const selectedTransport = Array.isArray(wellKnownFoci) const selectedTransport = Array.isArray(wellKnownFoci)
? await getFirstUsableTransport(wellKnownFoci) ? await getFirstUsableTransport(wellKnownFoci)
: null; : null;
if (selectedTransport) { if (selectedTransport) {
logger.info("Using .well-known SFU", selectedTransport); logger.info("Using .well-known SFU", selectedTransport);
return selectedTransport; return selectedTransport;
} else {
logger.info("No .well-known usable SFU found in ", wellKnown);
} }
} }
// CONFIG: Least prioritized; Load from config file // CONFIG: Least prioritized; Load from config file
logger.debug("Last fallback fetching SFU from config");
const urlFromConf = Config.get().livekit?.livekit_service_url; const urlFromConf = Config.get().livekit?.livekit_service_url;
if (urlFromConf) { if (urlFromConf) {
try { try {