diff --git a/src/MatrixClientPeg.ts b/src/MatrixClientPeg.ts index c6ee6c546f..1ac929ab73 100644 --- a/src/MatrixClientPeg.ts +++ b/src/MatrixClientPeg.ts @@ -49,6 +49,7 @@ export interface IOpts { initialSyncLimit?: number; pendingEventOrdering?: "detached" | "chronological"; lazyLoadMembers?: boolean; + clientWellKnownPollPeriod?: number; } export interface IMatrixClientPeg { @@ -209,6 +210,7 @@ class _MatrixClientPeg implements IMatrixClientPeg { // the react sdk doesn't work without this, so don't allow opts.pendingEventOrdering = "detached"; opts.lazyLoadMembers = true; + opts.clientWellKnownPollPeriod = 4 * 60 * 60; // 4 hours // Connect the matrix client to the dispatcher and setting handlers MatrixActionCreators.start(this.matrixClient); diff --git a/src/integrations/IntegrationManagers.js b/src/integrations/IntegrationManagers.js index 3ba1aab135..5fd28d7c54 100644 --- a/src/integrations/IntegrationManagers.js +++ b/src/integrations/IntegrationManagers.js @@ -21,10 +21,8 @@ import {IntegrationManagerInstance, KIND_ACCOUNT, KIND_CONFIG, KIND_HOMESERVER} import type {MatrixClient, MatrixEvent, Room} from "matrix-js-sdk"; import WidgetUtils from "../utils/WidgetUtils"; import {MatrixClientPeg} from "../MatrixClientPeg"; -import {AutoDiscovery} from "matrix-js-sdk"; import SettingsStore from "../settings/SettingsStore"; -const HS_MANAGERS_REFRESH_INTERVAL = 8 * 60 * 60 * 1000; // 8 hours const KIND_PREFERENCE = [ // Ordered: first is most preferred, last is least preferred. KIND_ACCOUNT, @@ -44,7 +42,6 @@ export class IntegrationManagers { _managers: IntegrationManagerInstance[] = []; _client: MatrixClient; - _wellknownRefreshTimerId: number = null; _primaryManager: IntegrationManagerInstance; constructor() { @@ -55,20 +52,19 @@ export class IntegrationManagers { this.stopWatching(); this._client = MatrixClientPeg.get(); this._client.on("accountData", this._onAccountData); + this._client.on("WellKnown.client", this._setupHomeserverManagers); this._compileManagers(); - setInterval(() => this._setupHomeserverManagers(), HS_MANAGERS_REFRESH_INTERVAL); } stopWatching(): void { if (!this._client) return; this._client.removeListener("accountData", this._onAccountData); - if (this._wellknownRefreshTimerId !== null) clearInterval(this._wellknownRefreshTimerId); + this._client.removeListener("WellKnown.client", this._setupHomeserverManagers); } _compileManagers() { this._managers = []; this._setupConfiguredManager(); - this._setupHomeserverManagers(); this._setupAccountManagers(); } @@ -82,39 +78,31 @@ export class IntegrationManagers { } } - async _setupHomeserverManagers() { - if (!MatrixClientPeg.get()) return; - try { - console.log("Updating homeserver-configured integration managers..."); - const homeserverDomain = MatrixClientPeg.getHomeserverName(); - const discoveryResponse = await AutoDiscovery.getRawClientConfig(homeserverDomain); - if (discoveryResponse && discoveryResponse['m.integrations']) { - let managers = discoveryResponse['m.integrations']['managers']; - if (!Array.isArray(managers)) managers = []; // make it an array so we can wipe the HS managers + async _setupHomeserverManagers(discoveryResponse) { + console.log("Updating homeserver-configured integration managers..."); + if (discoveryResponse && discoveryResponse['m.integrations']) { + let managers = discoveryResponse['m.integrations']['managers']; + if (!Array.isArray(managers)) managers = []; // make it an array so we can wipe the HS managers - console.log(`Homeserver has ${managers.length} integration managers`); + console.log(`Homeserver has ${managers.length} integration managers`); - // Clear out any known managers for the homeserver - // TODO: Log out of the scalar clients - this._managers = this._managers.filter(m => m.kind !== KIND_HOMESERVER); + // Clear out any known managers for the homeserver + // TODO: Log out of the scalar clients + this._managers = this._managers.filter(m => m.kind !== KIND_HOMESERVER); - // Now add all the managers the homeserver wants us to have - for (const hsManager of managers) { - if (!hsManager["api_url"]) continue; - this._managers.push(new IntegrationManagerInstance( - KIND_HOMESERVER, - hsManager["api_url"], - hsManager["ui_url"], // optional - )); - } - - this._primaryManager = null; // reset primary - } else { - console.log("Homeserver has no integration managers"); + // Now add all the managers the homeserver wants us to have + for (const hsManager of managers) { + if (!hsManager["api_url"]) continue; + this._managers.push(new IntegrationManagerInstance( + KIND_HOMESERVER, + hsManager["api_url"], + hsManager["ui_url"], // optional + )); } - } catch (e) { - console.error(e); - // Errors during discovery are non-fatal + + this._primaryManager = null; // reset primary + } else { + console.log("Homeserver has no integration managers"); } } diff --git a/src/widgets/Jitsi.ts b/src/widgets/Jitsi.ts index 15df4953aa..f6ac766020 100644 --- a/src/widgets/Jitsi.ts +++ b/src/widgets/Jitsi.ts @@ -16,10 +16,8 @@ limitations under the License. import SdkConfig from "../SdkConfig"; import {MatrixClientPeg} from "../MatrixClientPeg"; -import {AutoDiscovery} from "matrix-js-sdk/src/autodiscovery"; const JITSI_WK_PROPERTY = "im.vector.riot.jitsi"; -const JITSI_WK_CHECK_INTERVAL = 2 * 60 * 60 * 1000; // 2 hours, arbitrarily selected export interface JitsiWidgetData { conferenceId: string; @@ -36,33 +34,21 @@ export class Jitsi { return this.domain || 'jitsi.riot.im'; } - constructor() { - // We rely on the first call to be an .update() instead of doing one here. Doing one - // here could result in duplicate calls to the homeserver. - - // Start a timer to update the server info regularly - setInterval(() => this.update(), JITSI_WK_CHECK_INTERVAL); - } - public async update(): Promise { // Start with a default of the config's domain let domain = (SdkConfig.get()['jitsi'] || {})['preferredDomain'] || 'jitsi.riot.im'; - // Now request the .well-known config to see if it changed - if (MatrixClientPeg.get()) { - try { - console.log("Attempting to get Jitsi conference information from homeserver"); + const cli = MatrixClientPeg.get(); + const discoveryResponse = cli && MatrixClientPeg.get().getClientWellKnown(); - const homeserverDomain = MatrixClientPeg.getHomeserverName(); - const discoveryResponse = await AutoDiscovery.getRawClientConfig(homeserverDomain); - if (discoveryResponse && discoveryResponse[JITSI_WK_PROPERTY]) { - const wkPreferredDomain = discoveryResponse[JITSI_WK_PROPERTY]['preferredDomain']; - if (wkPreferredDomain) domain = wkPreferredDomain; - } - } catch (e) { - // These are non-fatal errors - console.error(e); - } + if (cli) { + cli.on("WellKnown.client", this.update); + } + + console.log("Attempting to get Jitsi conference information from homeserver"); + if (discoveryResponse && discoveryResponse[JITSI_WK_PROPERTY]) { + const wkPreferredDomain = discoveryResponse[JITSI_WK_PROPERTY]['preferredDomain']; + if (wkPreferredDomain) domain = wkPreferredDomain; } // Put the result into memory for us to use later