matrix-react-sdk
Version:
SDK for matrix.org using React
104 lines (99 loc) • 13.1 kB
JavaScript
;
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.Jitsi = void 0;
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _logger = require("matrix-js-sdk/src/logger");
var _matrix = require("matrix-js-sdk/src/matrix");
var _SdkConfig = _interopRequireDefault(require("../SdkConfig"));
var _MatrixClientPeg = require("../MatrixClientPeg");
/*
Copyright 2024 New Vector Ltd.
Copyright 2020 The Matrix.org Foundation C.I.C.
SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only
Please see LICENSE files in the repository root for full details.
*/
const JITSI_WK_PROPERTY_LEGACY = "im.vector.riot.jitsi";
const JITSI_WK_PROPERTY = "io.element.jitsi";
class Jitsi {
constructor() {
(0, _defineProperty2.default)(this, "domain", void 0);
(0, _defineProperty2.default)(this, "_useFor1To1Calls", false);
(0, _defineProperty2.default)(this, "update", async discoveryResponse => {
// Start with a default of the config's domain
let domain = _SdkConfig.default.getObject("jitsi")?.get("preferred_domain") || "meet.element.io";
_logger.logger.log("Attempting to get Jitsi conference information from homeserver");
const wkJitsiConfig = discoveryResponse?.[JITSI_WK_PROPERTY] ?? discoveryResponse?.[JITSI_WK_PROPERTY_LEGACY];
const wkPreferredDomain = wkJitsiConfig?.["preferredDomain"];
if (wkPreferredDomain) domain = wkPreferredDomain;
// Put the result into memory for us to use later
this.domain = domain;
_logger.logger.log("Jitsi conference domain:", this.preferredDomain);
this._useFor1To1Calls = wkJitsiConfig?.["useFor1To1Calls"] || false;
_logger.logger.log("Jitsi use for 1:1 calls:", this.useFor1To1Calls);
});
}
get preferredDomain() {
return this.domain || "meet.element.io";
}
get useFor1To1Calls() {
return this._useFor1To1Calls;
}
/**
* Checks for auth needed by looking up a well-known file
*
* If the file does not exist, we assume no auth.
*
* See https://github.com/matrix-org/prosody-mod-auth-matrix-user-verification
*/
async getJitsiAuth() {
if (!this.preferredDomain) {
return null;
}
let data;
try {
const response = await fetch(`https://${this.preferredDomain}/.well-known/element/jitsi`);
data = await response.json();
} catch (error) {
return null;
}
if (data.auth) {
return data.auth;
}
return null;
}
start() {
const cli = _MatrixClientPeg.MatrixClientPeg.safeGet();
cli.on(_matrix.ClientEvent.ClientWellKnown, this.update);
// call update initially in case we missed the first WellKnown.client event and for if no well-known present
this.update(cli.getClientWellKnown());
}
/**
* Parses the given URL into the data needed for a Jitsi widget, if the widget
* URL matches the preferredDomain for the app.
* @param {string} url The URL to parse.
* @returns {JitsiWidgetData} The widget data if eligible, otherwise null.
*/
parsePreferredConferenceUrl(url) {
const parsed = new URL(url);
if (parsed.hostname !== this.preferredDomain) return null; // invalid
return {
// URL pathnames always contain a leading slash.
// Remove it to be left with just the conference name.
conferenceId: parsed.pathname.substring(1),
domain: parsed.hostname,
isAudioOnly: false
};
}
static getInstance() {
if (!Jitsi.instance) {
Jitsi.instance = new Jitsi();
}
return Jitsi.instance;
}
}
exports.Jitsi = Jitsi;
(0, _defineProperty2.default)(Jitsi, "instance", void 0);
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbG9nZ2VyIiwicmVxdWlyZSIsIl9tYXRyaXgiLCJfU2RrQ29uZmlnIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsIl9NYXRyaXhDbGllbnRQZWciLCJKSVRTSV9XS19QUk9QRVJUWV9MRUdBQ1kiLCJKSVRTSV9XS19QUk9QRVJUWSIsIkppdHNpIiwiY29uc3RydWN0b3IiLCJfZGVmaW5lUHJvcGVydHkyIiwiZGVmYXVsdCIsImRpc2NvdmVyeVJlc3BvbnNlIiwiZG9tYWluIiwiU2RrQ29uZmlnIiwiZ2V0T2JqZWN0IiwiZ2V0IiwibG9nZ2VyIiwibG9nIiwid2tKaXRzaUNvbmZpZyIsIndrUHJlZmVycmVkRG9tYWluIiwicHJlZmVycmVkRG9tYWluIiwiX3VzZUZvcjFUbzFDYWxscyIsInVzZUZvcjFUbzFDYWxscyIsImdldEppdHNpQXV0aCIsImRhdGEiLCJyZXNwb25zZSIsImZldGNoIiwianNvbiIsImVycm9yIiwiYXV0aCIsInN0YXJ0IiwiY2xpIiwiTWF0cml4Q2xpZW50UGVnIiwic2FmZUdldCIsIm9uIiwiQ2xpZW50RXZlbnQiLCJDbGllbnRXZWxsS25vd24iLCJ1cGRhdGUiLCJnZXRDbGllbnRXZWxsS25vd24iLCJwYXJzZVByZWZlcnJlZENvbmZlcmVuY2VVcmwiLCJ1cmwiLCJwYXJzZWQiLCJVUkwiLCJob3N0bmFtZSIsImNvbmZlcmVuY2VJZCIsInBhdGhuYW1lIiwic3Vic3RyaW5nIiwiaXNBdWRpb09ubHkiLCJnZXRJbnN0YW5jZSIsImluc3RhbmNlIiwiZXhwb3J0cyJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy93aWRnZXRzL0ppdHNpLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qXG5Db3B5cmlnaHQgMjAyNCBOZXcgVmVjdG9yIEx0ZC5cbkNvcHlyaWdodCAyMDIwIFRoZSBNYXRyaXgub3JnIEZvdW5kYXRpb24gQy5JLkMuXG5cblNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBR1BMLTMuMC1vbmx5IE9SIEdQTC0zLjAtb25seVxuUGxlYXNlIHNlZSBMSUNFTlNFIGZpbGVzIGluIHRoZSByZXBvc2l0b3J5IHJvb3QgZm9yIGZ1bGwgZGV0YWlscy5cbiovXG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gXCJtYXRyaXgtanMtc2RrL3NyYy9sb2dnZXJcIjtcbmltcG9ydCB7IENsaWVudEV2ZW50LCBJQ2xpZW50V2VsbEtub3duIH0gZnJvbSBcIm1hdHJpeC1qcy1zZGsvc3JjL21hdHJpeFwiO1xuXG5pbXBvcnQgU2RrQ29uZmlnIGZyb20gXCIuLi9TZGtDb25maWdcIjtcbmltcG9ydCB7IE1hdHJpeENsaWVudFBlZyB9IGZyb20gXCIuLi9NYXRyaXhDbGllbnRQZWdcIjtcblxuY29uc3QgSklUU0lfV0tfUFJPUEVSVFlfTEVHQUNZID0gXCJpbS52ZWN0b3IucmlvdC5qaXRzaVwiO1xuY29uc3QgSklUU0lfV0tfUFJPUEVSVFkgPSBcImlvLmVsZW1lbnQuaml0c2lcIjtcblxuZXhwb3J0IGludGVyZmFjZSBKaXRzaVdpZGdldERhdGEge1xuICAgIGNvbmZlcmVuY2VJZDogc3RyaW5nO1xuICAgIGlzQXVkaW9Pbmx5OiBib29sZWFuO1xuICAgIGRvbWFpbjogc3RyaW5nO1xufVxuXG5leHBvcnQgY2xhc3MgSml0c2kge1xuICAgIHByaXZhdGUgc3RhdGljIGluc3RhbmNlOiBKaXRzaTtcblxuICAgIHByaXZhdGUgZG9tYWluPzogc3RyaW5nO1xuICAgIHByaXZhdGUgX3VzZUZvcjFUbzFDYWxscyA9IGZhbHNlO1xuXG4gICAgcHVibGljIGdldCBwcmVmZXJyZWREb21haW4oKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZG9tYWluIHx8IFwibWVldC5lbGVtZW50LmlvXCI7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCB1c2VGb3IxVG8xQ2FsbHMoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLl91c2VGb3IxVG8xQ2FsbHM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGZvciBhdXRoIG5lZWRlZCBieSBsb29raW5nIHVwIGEgd2VsbC1rbm93biBmaWxlXG4gICAgICpcbiAgICAgKiBJZiB0aGUgZmlsZSBkb2VzIG5vdCBleGlzdCwgd2UgYXNzdW1lIG5vIGF1dGguXG4gICAgICpcbiAgICAgKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL21hdHJpeC1vcmcvcHJvc29keS1tb2QtYXV0aC1tYXRyaXgtdXNlci12ZXJpZmljYXRpb25cbiAgICAgKi9cbiAgICBwdWJsaWMgYXN5bmMgZ2V0Sml0c2lBdXRoKCk6IFByb21pc2U8c3RyaW5nIHwgbnVsbD4ge1xuICAgICAgICBpZiAoIXRoaXMucHJlZmVycmVkRG9tYWluKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBsZXQgZGF0YTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goYGh0dHBzOi8vJHt0aGlzLnByZWZlcnJlZERvbWFpbn0vLndlbGwta25vd24vZWxlbWVudC9qaXRzaWApO1xuICAgICAgICAgICAgZGF0YSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkYXRhLmF1dGgpIHtcbiAgICAgICAgICAgIHJldHVybiBkYXRhLmF1dGg7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXJ0KCk6IHZvaWQge1xuICAgICAgICBjb25zdCBjbGkgPSBNYXRyaXhDbGllbnRQZWcuc2FmZUdldCgpO1xuICAgICAgICBjbGkub24oQ2xpZW50RXZlbnQuQ2xpZW50V2VsbEtub3duLCB0aGlzLnVwZGF0ZSk7XG4gICAgICAgIC8vIGNhbGwgdXBkYXRlIGluaXRpYWxseSBpbiBjYXNlIHdlIG1pc3NlZCB0aGUgZmlyc3QgV2VsbEtub3duLmNsaWVudCBldmVudCBhbmQgZm9yIGlmIG5vIHdlbGwta25vd24gcHJlc2VudFxuICAgICAgICB0aGlzLnVwZGF0ZShjbGkuZ2V0Q2xpZW50V2VsbEtub3duKCkpO1xuICAgIH1cblxuICAgIHByaXZhdGUgdXBkYXRlID0gYXN5bmMgKGRpc2NvdmVyeVJlc3BvbnNlPzogSUNsaWVudFdlbGxLbm93bik6IFByb21pc2U8YW55PiA9PiB7XG4gICAgICAgIC8vIFN0YXJ0IHdpdGggYSBkZWZhdWx0IG9mIHRoZSBjb25maWcncyBkb21haW5cbiAgICAgICAgbGV0IGRvbWFpbiA9IFNka0NvbmZpZy5nZXRPYmplY3QoXCJqaXRzaVwiKT8uZ2V0KFwicHJlZmVycmVkX2RvbWFpblwiKSB8fCBcIm1lZXQuZWxlbWVudC5pb1wiO1xuXG4gICAgICAgIGxvZ2dlci5sb2coXCJBdHRlbXB0aW5nIHRvIGdldCBKaXRzaSBjb25mZXJlbmNlIGluZm9ybWF0aW9uIGZyb20gaG9tZXNlcnZlclwiKTtcbiAgICAgICAgY29uc3Qgd2tKaXRzaUNvbmZpZyA9IGRpc2NvdmVyeVJlc3BvbnNlPy5bSklUU0lfV0tfUFJPUEVSVFldID8/IGRpc2NvdmVyeVJlc3BvbnNlPy5bSklUU0lfV0tfUFJPUEVSVFlfTEVHQUNZXTtcblxuICAgICAgICBjb25zdCB3a1ByZWZlcnJlZERvbWFpbiA9IHdrSml0c2lDb25maWc/LltcInByZWZlcnJlZERvbWFpblwiXTtcbiAgICAgICAgaWYgKHdrUHJlZmVycmVkRG9tYWluKSBkb21haW4gPSB3a1ByZWZlcnJlZERvbWFpbjtcblxuICAgICAgICAvLyBQdXQgdGhlIHJlc3VsdCBpbnRvIG1lbW9yeSBmb3IgdXMgdG8gdXNlIGxhdGVyXG4gICAgICAgIHRoaXMuZG9tYWluID0gZG9tYWluO1xuICAgICAgICBsb2dnZXIubG9nKFwiSml0c2kgY29uZmVyZW5jZSBkb21haW46XCIsIHRoaXMucHJlZmVycmVkRG9tYWluKTtcbiAgICAgICAgdGhpcy5fdXNlRm9yMVRvMUNhbGxzID0gd2tKaXRzaUNvbmZpZz8uW1widXNlRm9yMVRvMUNhbGxzXCJdIHx8IGZhbHNlO1xuICAgICAgICBsb2dnZXIubG9nKFwiSml0c2kgdXNlIGZvciAxOjEgY2FsbHM6XCIsIHRoaXMudXNlRm9yMVRvMUNhbGxzKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogUGFyc2VzIHRoZSBnaXZlbiBVUkwgaW50byB0aGUgZGF0YSBuZWVkZWQgZm9yIGEgSml0c2kgd2lkZ2V0LCBpZiB0aGUgd2lkZ2V0XG4gICAgICogVVJMIG1hdGNoZXMgdGhlIHByZWZlcnJlZERvbWFpbiBmb3IgdGhlIGFwcC5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdXJsIFRoZSBVUkwgdG8gcGFyc2UuXG4gICAgICogQHJldHVybnMge0ppdHNpV2lkZ2V0RGF0YX0gVGhlIHdpZGdldCBkYXRhIGlmIGVsaWdpYmxlLCBvdGhlcndpc2UgbnVsbC5cbiAgICAgKi9cbiAgICBwdWJsaWMgcGFyc2VQcmVmZXJyZWRDb25mZXJlbmNlVXJsKHVybDogc3RyaW5nKTogSml0c2lXaWRnZXREYXRhIHwgbnVsbCB7XG4gICAgICAgIGNvbnN0IHBhcnNlZCA9IG5ldyBVUkwodXJsKTtcbiAgICAgICAgaWYgKHBhcnNlZC5ob3N0bmFtZSAhPT0gdGhpcy5wcmVmZXJyZWREb21haW4pIHJldHVybiBudWxsOyAvLyBpbnZhbGlkXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAvLyBVUkwgcGF0aG5hbWVzIGFsd2F5cyBjb250YWluIGEgbGVhZGluZyBzbGFzaC5cbiAgICAgICAgICAgIC8vIFJlbW92ZSBpdCB0byBiZSBsZWZ0IHdpdGgganVzdCB0aGUgY29uZmVyZW5jZSBuYW1lLlxuICAgICAgICAgICAgY29uZmVyZW5jZUlkOiBwYXJzZWQucGF0aG5hbWUuc3Vic3RyaW5nKDEpLFxuICAgICAgICAgICAgZG9tYWluOiBwYXJzZWQuaG9zdG5hbWUsXG4gICAgICAgICAgICBpc0F1ZGlvT25seTogZmFsc2UsXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBnZXRJbnN0YW5jZSgpOiBKaXRzaSB7XG4gICAgICAgIGlmICghSml0c2kuaW5zdGFuY2UpIHtcbiAgICAgICAgICAgIEppdHNpLmluc3RhbmNlID0gbmV3IEppdHNpKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIEppdHNpLmluc3RhbmNlO1xuICAgIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7QUFRQSxJQUFBQSxPQUFBLEdBQUFDLE9BQUE7QUFDQSxJQUFBQyxPQUFBLEdBQUFELE9BQUE7QUFFQSxJQUFBRSxVQUFBLEdBQUFDLHNCQUFBLENBQUFILE9BQUE7QUFDQSxJQUFBSSxnQkFBQSxHQUFBSixPQUFBO0FBWkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBUUEsTUFBTUssd0JBQXdCLEdBQUcsc0JBQXNCO0FBQ3ZELE1BQU1DLGlCQUFpQixHQUFHLGtCQUFrQjtBQVFyQyxNQUFNQyxLQUFLLENBQUM7RUFBQUMsWUFBQTtJQUFBLElBQUFDLGdCQUFBLENBQUFDLE9BQUE7SUFBQSxJQUFBRCxnQkFBQSxDQUFBQyxPQUFBLDRCQUlZLEtBQUs7SUFBQSxJQUFBRCxnQkFBQSxDQUFBQyxPQUFBLGtCQXlDZixNQUFPQyxpQkFBb0MsSUFBbUI7TUFDM0U7TUFDQSxJQUFJQyxNQUFNLEdBQUdDLGtCQUFTLENBQUNDLFNBQVMsQ0FBQyxPQUFPLENBQUMsRUFBRUMsR0FBRyxDQUFDLGtCQUFrQixDQUFDLElBQUksaUJBQWlCO01BRXZGQyxjQUFNLENBQUNDLEdBQUcsQ0FBQyxnRUFBZ0UsQ0FBQztNQUM1RSxNQUFNQyxhQUFhLEdBQUdQLGlCQUFpQixHQUFHTCxpQkFBaUIsQ0FBQyxJQUFJSyxpQkFBaUIsR0FBR04sd0JBQXdCLENBQUM7TUFFN0csTUFBTWMsaUJBQWlCLEdBQUdELGFBQWEsR0FBRyxpQkFBaUIsQ0FBQztNQUM1RCxJQUFJQyxpQkFBaUIsRUFBRVAsTUFBTSxHQUFHTyxpQkFBaUI7O01BRWpEO01BQ0EsSUFBSSxDQUFDUCxNQUFNLEdBQUdBLE1BQU07TUFDcEJJLGNB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