mirror of
https://github.com/vector-im/element-call.git
synced 2026-08-08 20:09:19 +00:00
sfu config: add some network retry and more logging
This commit is contained in:
@@ -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 {
|
||||||
|
|||||||
Reference in New Issue
Block a user