diff --git a/src/widget.ts b/src/widget.ts index 0bee23f00..a36fc45ff 100644 --- a/src/widget.ts +++ b/src/widget.ts @@ -23,6 +23,7 @@ import type { MatrixClient } from "matrix-js-sdk/src/client"; import type { IWidgetApiRequest } from "matrix-widget-api"; import { LazyEventEmitter } from "./LazyEventEmitter"; import { getUrlParams } from "./UrlParams"; +import { Config } from "./config/Config"; // Subset of the actions in matrix-react-sdk export enum ElementWidgetActions { @@ -156,9 +157,33 @@ export const widget: WidgetHelpers | null = (() => { timelineSupport: true, useE2eForGroupCall: e2eEnabled, fallbackICEServerAllowed: allowIceFallback, + // XXX: The client expects the list of foci in its constructor, but we don't + // know this until we fetch the config file. However, we can't wait to construct + // the client object or we'll miss the 'capabilities' request from the host app. + // As of writing this, I have made the embedded widget client send the 'contentLoaded' + // message so that we can use the widget API in less racy mode, but we need to change + // element-web to use waitForIFrameLoad=false. Once that change has rolled out, + // we can just start the client after we've fetched the config. + foci: [], } ); - const clientPromise = client.startClient().then(() => client); + + const clientPromise = new Promise((resolve) => { + (async () => { + await Config.init(); + const livekit = Config.get().livekit; + const focus = livekit?.livekit_service_url; + // Now we've fetched the config, be evil and use the getter to inject the focus + // into the client (see above XXX). + if (focus) { + client.getFoci().push({ + livekitServiceUrl: livekit.livekit_service_url, + }); + } + await client.startClient(); + resolve(client); + })(); + }); return { api, lazyActions, client: clientPromise }; } else {