matrix-react-sdk
Version:
SDK for matrix.org using React
101 lines (95 loc) • 16.5 kB
JavaScript
;
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _PermalinkConstructor = _interopRequireWildcard(require("./PermalinkConstructor"));
function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
/*
Copyright 2024 New Vector Ltd.
Copyright 2019-2021 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.
*/
/**
* Generates permalinks that self-reference the running webapp
*/
class ElementPermalinkConstructor extends _PermalinkConstructor.default {
constructor(elementUrl) {
super();
(0, _defineProperty2.default)(this, "elementUrl", void 0);
this.elementUrl = elementUrl;
if (!this.elementUrl.startsWith("http:") && !this.elementUrl.startsWith("https:")) {
throw new Error("Element prefix URL does not appear to be an HTTP(S) URL");
}
}
forEvent(roomId, eventId, serverCandidates) {
return `${this.elementUrl}/#/room/${roomId}/${eventId}${this.encodeServerCandidates(serverCandidates)}`;
}
forRoom(roomIdOrAlias, serverCandidates) {
return `${this.elementUrl}/#/room/${roomIdOrAlias}${this.encodeServerCandidates(serverCandidates)}`;
}
forUser(userId) {
return `${this.elementUrl}/#/user/${userId}`;
}
forEntity(entityId) {
if (entityId[0] === "!" || entityId[0] === "#") {
return this.forRoom(entityId);
} else if (entityId[0] === "@") {
return this.forUser(entityId);
} else throw new Error("Unrecognized entity");
}
isPermalinkHost(testHost) {
const parsedUrl = new URL(this.elementUrl);
return testHost === (parsedUrl.host || parsedUrl.hostname); // one of the hosts should match
}
encodeServerCandidates(candidates) {
if (!candidates || candidates.length === 0) return "";
return `?via=${candidates.map(c => encodeURIComponent(c)).join("&via=")}`;
}
// Heavily inspired by/borrowed from the matrix-bot-sdk (with permission):
// https://github.com/turt2live/matrix-js-bot-sdk/blob/7c4665c9a25c2c8e0fe4e509f2616505b5b66a1c/src/Permalinks.ts#L33-L61
// Adapted for Element's URL format
parsePermalink(fullUrl) {
if (!fullUrl || !fullUrl.startsWith(this.elementUrl)) {
throw new Error("Does not appear to be a permalink");
}
const parts = fullUrl.substring(`${this.elementUrl}/#/`.length);
return ElementPermalinkConstructor.parseAppRoute(parts);
}
/**
* Parses an app route (`(user|room)/identifier`) to a Matrix entity
* (room, user).
* @param {string} route The app route
* @returns {PermalinkParts}
*/
static parseAppRoute(route) {
const parts = route.split("/");
if (parts.length < 2) {
// we're expecting an entity and an ID of some kind at least
throw new Error("URL is missing parts");
}
// Split optional query out of last part
const [lastPartMaybeWithQuery] = parts.splice(-1, 1);
const [lastPart, query = ""] = lastPartMaybeWithQuery.split("?");
parts.push(lastPart);
const entityType = parts[0];
const entity = parts[1];
if (entityType === "user") {
// Probably a user, no further parsing needed.
return _PermalinkConstructor.PermalinkParts.forUser(entity);
} else if (entityType === "room") {
// Rejoin the rest because v3 events can have slashes (annoyingly)
const eventId = parts.length > 2 ? parts.slice(2).join("/") : "";
const via = query.split(/&?via=/).filter(p => !!p);
return _PermalinkConstructor.PermalinkParts.forEvent(entity, eventId, via);
} else {
throw new Error("Unknown entity type in permalink");
}
}
}
exports.default = ElementPermalinkConstructor;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfUGVybWFsaW5rQ29uc3RydWN0b3IiLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsInJlcXVpcmUiLCJfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUiLCJlIiwiV2Vha01hcCIsInIiLCJ0IiwiX19lc01vZHVsZSIsImRlZmF1bHQiLCJoYXMiLCJnZXQiLCJuIiwiX19wcm90b19fIiwiYSIsIk9iamVjdCIsImRlZmluZVByb3BlcnR5IiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwidSIsImhhc093blByb3BlcnR5IiwiY2FsbCIsImkiLCJzZXQiLCJFbGVtZW50UGVybWFsaW5rQ29uc3RydWN0b3IiLCJQZXJtYWxpbmtDb25zdHJ1Y3RvciIsImNvbnN0cnVjdG9yIiwiZWxlbWVudFVybCIsIl9kZWZpbmVQcm9wZXJ0eTIiLCJzdGFydHNXaXRoIiwiRXJyb3IiLCJmb3JFdmVudCIsInJvb21JZCIsImV2ZW50SWQiLCJzZXJ2ZXJDYW5kaWRhdGVzIiwiZW5jb2RlU2VydmVyQ2FuZGlkYXRlcyIsImZvclJvb20iLCJyb29tSWRPckFsaWFzIiwiZm9yVXNlciIsInVzZXJJZCIsImZvckVudGl0eSIsImVudGl0eUlkIiwiaXNQZXJtYWxpbmtIb3N0IiwidGVzdEhvc3QiLCJwYXJzZWRVcmwiLCJVUkwiLCJob3N0IiwiaG9zdG5hbWUiLCJjYW5kaWRhdGVzIiwibGVuZ3RoIiwibWFwIiwiYyIsImVuY29kZVVSSUNvbXBvbmVudCIsImpvaW4iLCJwYXJzZVBlcm1hbGluayIsImZ1bGxVcmwiLCJwYXJ0cyIsInN1YnN0cmluZyIsInBhcnNlQXBwUm91dGUiLCJyb3V0ZSIsInNwbGl0IiwibGFzdFBhcnRNYXliZVdpdGhRdWVyeSIsInNwbGljZSIsImxhc3RQYXJ0IiwicXVlcnkiLCJwdXNoIiwiZW50aXR5VHlwZSIsImVudGl0eSIsIlBlcm1hbGlua1BhcnRzIiwic2xpY2UiLCJ2aWEiLCJmaWx0ZXIiLCJwIiwiZXhwb3J0cyJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy91dGlscy9wZXJtYWxpbmtzL0VsZW1lbnRQZXJtYWxpbmtDb25zdHJ1Y3Rvci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuQ29weXJpZ2h0IDIwMjQgTmV3IFZlY3RvciBMdGQuXG5Db3B5cmlnaHQgMjAxOS0yMDIxIFRoZSBNYXRyaXgub3JnIEZvdW5kYXRpb24gQy5JLkMuXG5cblNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBR1BMLTMuMC1vbmx5IE9SIEdQTC0zLjAtb25seVxuUGxlYXNlIHNlZSBMSUNFTlNFIGZpbGVzIGluIHRoZSByZXBvc2l0b3J5IHJvb3QgZm9yIGZ1bGwgZGV0YWlscy5cbiovXG5cbmltcG9ydCBQZXJtYWxpbmtDb25zdHJ1Y3RvciwgeyBQZXJtYWxpbmtQYXJ0cyB9IGZyb20gXCIuL1Blcm1hbGlua0NvbnN0cnVjdG9yXCI7XG5cbi8qKlxuICogR2VuZXJhdGVzIHBlcm1hbGlua3MgdGhhdCBzZWxmLXJlZmVyZW5jZSB0aGUgcnVubmluZyB3ZWJhcHBcbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRWxlbWVudFBlcm1hbGlua0NvbnN0cnVjdG9yIGV4dGVuZHMgUGVybWFsaW5rQ29uc3RydWN0b3Ige1xuICAgIHByaXZhdGUgZWxlbWVudFVybDogc3RyaW5nO1xuXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKGVsZW1lbnRVcmw6IHN0cmluZykge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLmVsZW1lbnRVcmwgPSBlbGVtZW50VXJsO1xuXG4gICAgICAgIGlmICghdGhpcy5lbGVtZW50VXJsLnN0YXJ0c1dpdGgoXCJodHRwOlwiKSAmJiAhdGhpcy5lbGVtZW50VXJsLnN0YXJ0c1dpdGgoXCJodHRwczpcIikpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkVsZW1lbnQgcHJlZml4IFVSTCBkb2VzIG5vdCBhcHBlYXIgdG8gYmUgYW4gSFRUUChTKSBVUkxcIik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgZm9yRXZlbnQocm9vbUlkOiBzdHJpbmcsIGV2ZW50SWQ6IHN0cmluZywgc2VydmVyQ2FuZGlkYXRlczogc3RyaW5nW10pOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gYCR7dGhpcy5lbGVtZW50VXJsfS8jL3Jvb20vJHtyb29tSWR9LyR7ZXZlbnRJZH0ke3RoaXMuZW5jb2RlU2VydmVyQ2FuZGlkYXRlcyhzZXJ2ZXJDYW5kaWRhdGVzKX1gO1xuICAgIH1cblxuICAgIHB1YmxpYyBmb3JSb29tKHJvb21JZE9yQWxpYXM6IHN0cmluZywgc2VydmVyQ2FuZGlkYXRlcz86IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIGAke3RoaXMuZWxlbWVudFVybH0vIy9yb29tLyR7cm9vbUlkT3JBbGlhc30ke3RoaXMuZW5jb2RlU2VydmVyQ2FuZGlkYXRlcyhzZXJ2ZXJDYW5kaWRhdGVzKX1gO1xuICAgIH1cblxuICAgIHB1YmxpYyBmb3JVc2VyKHVzZXJJZDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIGAke3RoaXMuZWxlbWVudFVybH0vIy91c2VyLyR7dXNlcklkfWA7XG4gICAgfVxuXG4gICAgcHVibGljIGZvckVudGl0eShlbnRpdHlJZDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgaWYgKGVudGl0eUlkWzBdID09PSBcIiFcIiB8fCBlbnRpdHlJZFswXSA9PT0gXCIjXCIpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmZvclJvb20oZW50aXR5SWQpO1xuICAgICAgICB9IGVsc2UgaWYgKGVudGl0eUlkWzBdID09PSBcIkBcIikge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZm9yVXNlcihlbnRpdHlJZCk7XG4gICAgICAgIH0gZWxzZSB0aHJvdyBuZXcgRXJyb3IoXCJVbnJlY29nbml6ZWQgZW50aXR5XCIpO1xuICAgIH1cblxuICAgIHB1YmxpYyBpc1Blcm1hbGlua0hvc3QodGVzdEhvc3Q6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCBwYXJzZWRVcmwgPSBuZXcgVVJMKHRoaXMuZWxlbWVudFVybCk7XG4gICAgICAgIHJldHVybiB0ZXN0SG9zdCA9PT0gKHBhcnNlZFVybC5ob3N0IHx8IHBhcnNlZFVybC5ob3N0bmFtZSk7IC8vIG9uZSBvZiB0aGUgaG9zdHMgc2hvdWxkIG1hdGNoXG4gICAgfVxuXG4gICAgcHVibGljIGVuY29kZVNlcnZlckNhbmRpZGF0ZXMoY2FuZGlkYXRlcz86IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgICAgICAgaWYgKCFjYW5kaWRhdGVzIHx8IGNhbmRpZGF0ZXMubGVuZ3RoID09PSAwKSByZXR1cm4gXCJcIjtcbiAgICAgICAgcmV0dXJuIGA/dmlhPSR7Y2FuZGlkYXRlcy5tYXAoKGMpID0+IGVuY29kZVVSSUNvbXBvbmVudChjKSkuam9pbihcIiZ2aWE9XCIpfWA7XG4gICAgfVxuXG4gICAgLy8gSGVhdmlseSBpbnNwaXJlZCBieS9ib3Jyb3dlZCBmcm9tIHRoZSBtYXRyaXgtYm90LXNkayAod2l0aCBwZXJtaXNzaW9uKTpcbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vdHVydDJsaXZlL21hdHJpeC1qcy1ib3Qtc2RrL2Jsb2IvN2M0NjY1YzlhMjVjMmM4ZTBmZTRlNTA5ZjI2MTY1MDViNWI2NmExYy9zcmMvUGVybWFsaW5rcy50cyNMMzMtTDYxXG4gICAgLy8gQWRhcHRlZCBmb3IgRWxlbWVudCdzIFVSTCBmb3JtYXRcbiAgICBwdWJsaWMgcGFyc2VQZXJtYWxpbmsoZnVsbFVybDogc3RyaW5nKTogUGVybWFsaW5rUGFydHMge1xuICAgICAgICBpZiAoIWZ1bGxVcmwgfHwgIWZ1bGxVcmwuc3RhcnRzV2l0aCh0aGlzLmVsZW1lbnRVcmwpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJEb2VzIG5vdCBhcHBlYXIgdG8gYmUgYSBwZXJtYWxpbmtcIik7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBwYXJ0cyA9IGZ1bGxVcmwuc3Vic3RyaW5nKGAke3RoaXMuZWxlbWVudFVybH0vIy9gLmxlbmd0aCk7XG4gICAgICAgIHJldHVybiBFbGVtZW50UGVybWFsaW5rQ29uc3RydWN0b3IucGFyc2VBcHBSb3V0ZShwYXJ0cyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGFyc2VzIGFuIGFwcCByb3V0ZSAoYCh1c2VyfHJvb20pL2lkZW50aWZpZXJgKSB0byBhIE1hdHJpeCBlbnRpdHlcbiAgICAgKiAocm9vbSwgdXNlcikuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHJvdXRlIFRoZSBhcHAgcm91dGVcbiAgICAgKiBAcmV0dXJucyB7UGVybWFsaW5rUGFydHN9XG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBwYXJzZUFwcFJvdXRlKHJvdXRlOiBzdHJpbmcpOiBQZXJtYWxpbmtQYXJ0cyB7XG4gICAgICAgIGNvbnN0IHBhcnRzID0gcm91dGUuc3BsaXQoXCIvXCIpO1xuXG4gICAgICAgIGlmIChwYXJ0cy5sZW5ndGggPCAyKSB7XG4gICAgICAgICAgICAvLyB3ZSdyZSBleHBlY3RpbmcgYW4gZW50aXR5IGFuZCBhbiBJRCBvZiBzb21lIGtpbmQgYXQgbGVhc3RcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlVSTCBpcyBtaXNzaW5nIHBhcnRzXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU3BsaXQgb3B0aW9uYWwgcXVlcnkgb3V0IG9mIGxhc3QgcGFydFxuICAgICAgICBjb25zdCBbbGFzdFBhcnRNYXliZVdpdGhRdWVyeV0gPSBwYXJ0cy5zcGxpY2UoLTEsIDEpO1xuICAgICAgICBjb25zdCBbbGFzdFBhcnQsIHF1ZXJ5ID0gXCJcIl0gPSBsYXN0UGFydE1heWJlV2l0aFF1ZXJ5LnNwbGl0KFwiP1wiKTtcbiAgICAgICAgcGFydHMucHVzaChsYXN0UGFydCk7XG5cbiAgICAgICAgY29uc3QgZW50aXR5VHlwZSA9IHBhcnRzWzBdO1xuICAgICAgICBjb25zdCBlbnRpdHkgPSBwYXJ0c1sxXTtcbiAgICAgICAgaWYgKGVudGl0eVR5cGUgPT09IFwidXNlclwiKSB7XG4gICAgICAgICAgICAvLyBQcm9iYWJseSBhIHVzZXIsIG5vIGZ1cnRoZXIgcGFyc2luZyBuZWVkZWQuXG4gICAgICAgICAgICByZXR1cm4gUGVybWFsaW5rUGFydHMuZm9yVXNlcihlbnRpdHkpO1xuICAgICAgICB9IGVsc2UgaWYgKGVudGl0eVR5cGUgPT09IFwicm9vbVwiKSB7XG4gICAgICAgICAgICAvLyBSZWpvaW4gdGhlIHJlc3QgYmVjYXVzZSB2MyBldmVudHMgY2FuIGhhdmUgc2xhc2hlcyAoYW5ub3lpbmdseSlcbiAgICAgICAgICAgIGNvbnN0IGV2ZW50SWQgPSBwYXJ0cy5sZW5ndGggPiAyID8gcGFydHMuc2xpY2UoMikuam9pbihcIi9cIikgOiBcIlwiO1xuICAgICAgICAgICAgY29uc3QgdmlhID0gcXVlcnkuc3BsaXQoLyY/dmlhPS8pLmZpbHRlcigocCkgPT4gISFwKTtcbiAgICAgICAgICAgIHJldHVybiBQZXJtYWxpbmtQYXJ0cy5mb3JFdmVudChlbnRpdHksIGV2ZW50SWQsIHZpYSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJVbmtub3duIGVudGl0eSB0eXBlIGluIHBlcm1hbGlua1wiKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7QUFRQSxJQUFBQSxxQkFBQSxHQUFBQyx1QkFBQSxDQUFBQyxPQUFBO0FBQThFLFNBQUFDLHlCQUFBQyxDQUFBLDZCQUFBQyxPQUFBLG1CQUFBQyxDQUFBLE9BQUFELE9BQUEsSUFBQUUsQ0FBQSxPQUFBRixPQUFBLFlBQUFGLHdCQUFBLFlBQUFBLENBQUFDLENBQUEsV0FBQUEsQ0FBQSxHQUFBRyxDQUFBLEdBQUFELENBQUEsS0FBQUYsQ0FBQTtBQUFBLFNBQUFILHdCQUFBRyxDQUFBLEVBQUFFLENBQUEsU0FBQUEsQ0FBQSxJQUFBRixDQUFBLElBQUFBLENBQUEsQ0FBQUksVUFBQSxTQUFBSixDQUFBLGVBQUFBLENBQUEsdUJBQUFBLENBQUEseUJBQUFBLENBQUEs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