matrix-react-sdk
Version:
SDK for matrix.org using React
83 lines (77 loc) • 14 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.host = exports.default = exports.baseUrlPattern = exports.baseUrl = void 0;
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 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 host = exports.host = "matrix.to";
const baseUrl = exports.baseUrl = `https://${host}`;
const baseUrlPattern = exports.baseUrlPattern = `^(?:https?://)?${host.replace(".", "\\.")}/#/(.*)`;
/**
* Generates matrix.to permalinks
*/
class MatrixToPermalinkConstructor extends _PermalinkConstructor.default {
constructor() {
super();
}
forEvent(roomId, eventId, serverCandidates) {
return `${baseUrl}/#/${roomId}/${eventId}${this.encodeServerCandidates(serverCandidates)}`;
}
forRoom(roomIdOrAlias, serverCandidates) {
return `${baseUrl}/#/${roomIdOrAlias}${this.encodeServerCandidates(serverCandidates)}`;
}
forUser(userId) {
return `${baseUrl}/#/${userId}`;
}
forEntity(entityId) {
return `${baseUrl}/#/${entityId}`;
}
isPermalinkHost(testHost) {
return testHost === host;
}
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
parsePermalink(fullUrl) {
if (!fullUrl) {
throw new Error("Does not appear to be a permalink");
}
const matches = [...fullUrl.matchAll(new RegExp(baseUrlPattern, "gi"))][0];
if (!matches || matches.length < 2) {
throw new Error("Does not appear to be a permalink");
}
const parts = matches[1].split("/");
const entity = parts[0];
if (entity[0] === "@") {
// Probably a user, no further parsing needed.
return _PermalinkConstructor.PermalinkParts.forUser(entity);
} else if (entity[0] === "#" || entity[0] === "!") {
if (parts.length === 1) {
// room without event permalink
const [roomId, query = ""] = entity.split("?");
const via = query.split(/&?via=/g).filter(p => !!p);
return _PermalinkConstructor.PermalinkParts.forRoom(roomId, via);
}
// rejoin the rest because v3 events can have slashes (annoyingly)
const eventIdAndQuery = parts.length > 1 ? parts.slice(1).join("/") : "";
const [eventId, query = ""] = eventIdAndQuery.split("?");
const via = query.split(/&?via=/g).filter(p => !!p);
return _PermalinkConstructor.PermalinkParts.forEvent(entity, eventId, via);
} else {
throw new Error("Unknown entity type in permalink");
}
}
}
exports.default = MatrixToPermalinkConstructor;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfUGVybWFsaW5rQ29uc3RydWN0b3IiLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsInJlcXVpcmUiLCJfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUiLCJlIiwiV2Vha01hcCIsInIiLCJ0IiwiX19lc01vZHVsZSIsImRlZmF1bHQiLCJoYXMiLCJnZXQiLCJuIiwiX19wcm90b19fIiwiYSIsIk9iamVjdCIsImRlZmluZVByb3BlcnR5IiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwidSIsImhhc093blByb3BlcnR5IiwiY2FsbCIsImkiLCJzZXQiLCJob3N0IiwiZXhwb3J0cyIsImJhc2VVcmwiLCJiYXNlVXJsUGF0dGVybiIsInJlcGxhY2UiLCJNYXRyaXhUb1Blcm1hbGlua0NvbnN0cnVjdG9yIiwiUGVybWFsaW5rQ29uc3RydWN0b3IiLCJjb25zdHJ1Y3RvciIsImZvckV2ZW50Iiwicm9vbUlkIiwiZXZlbnRJZCIsInNlcnZlckNhbmRpZGF0ZXMiLCJlbmNvZGVTZXJ2ZXJDYW5kaWRhdGVzIiwiZm9yUm9vbSIsInJvb21JZE9yQWxpYXMiLCJmb3JVc2VyIiwidXNlcklkIiwiZm9yRW50aXR5IiwiZW50aXR5SWQiLCJpc1Blcm1hbGlua0hvc3QiLCJ0ZXN0SG9zdCIsImNhbmRpZGF0ZXMiLCJsZW5ndGgiLCJtYXAiLCJjIiwiZW5jb2RlVVJJQ29tcG9uZW50Iiwiam9pbiIsInBhcnNlUGVybWFsaW5rIiwiZnVsbFVybCIsIkVycm9yIiwibWF0Y2hlcyIsIm1hdGNoQWxsIiwiUmVnRXhwIiwicGFydHMiLCJzcGxpdCIsImVudGl0eSIsIlBlcm1hbGlua1BhcnRzIiwicXVlcnkiLCJ2aWEiLCJmaWx0ZXIiLCJwIiwiZXZlbnRJZEFuZFF1ZXJ5Iiwic2xpY2UiXSwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvdXRpbHMvcGVybWFsaW5rcy9NYXRyaXhUb1Blcm1hbGlua0NvbnN0cnVjdG9yLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qXG5Db3B5cmlnaHQgMjAyNCBOZXcgVmVjdG9yIEx0ZC5cbkNvcHlyaWdodCAyMDE5IFRoZSBNYXRyaXgub3JnIEZvdW5kYXRpb24gQy5JLkMuXG5cblNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBR1BMLTMuMC1vbmx5IE9SIEdQTC0zLjAtb25seVxuUGxlYXNlIHNlZSBMSUNFTlNFIGZpbGVzIGluIHRoZSByZXBvc2l0b3J5IHJvb3QgZm9yIGZ1bGwgZGV0YWlscy5cbiovXG5cbmltcG9ydCBQZXJtYWxpbmtDb25zdHJ1Y3RvciwgeyBQZXJtYWxpbmtQYXJ0cyB9IGZyb20gXCIuL1Blcm1hbGlua0NvbnN0cnVjdG9yXCI7XG5cbmV4cG9ydCBjb25zdCBob3N0ID0gXCJtYXRyaXgudG9cIjtcbmV4cG9ydCBjb25zdCBiYXNlVXJsID0gYGh0dHBzOi8vJHtob3N0fWA7XG5leHBvcnQgY29uc3QgYmFzZVVybFBhdHRlcm4gPSBgXig/Omh0dHBzPzovLyk/JHtob3N0LnJlcGxhY2UoXCIuXCIsIFwiXFxcXC5cIil9LyMvKC4qKWA7XG5cbi8qKlxuICogR2VuZXJhdGVzIG1hdHJpeC50byBwZXJtYWxpbmtzXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIE1hdHJpeFRvUGVybWFsaW5rQ29uc3RydWN0b3IgZXh0ZW5kcyBQZXJtYWxpbmtDb25zdHJ1Y3RvciB7XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlcigpO1xuICAgIH1cblxuICAgIHB1YmxpYyBmb3JFdmVudChyb29tSWQ6IHN0cmluZywgZXZlbnRJZDogc3RyaW5nLCBzZXJ2ZXJDYW5kaWRhdGVzOiBzdHJpbmdbXSk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiBgJHtiYXNlVXJsfS8jLyR7cm9vbUlkfS8ke2V2ZW50SWR9JHt0aGlzLmVuY29kZVNlcnZlckNhbmRpZGF0ZXMoc2VydmVyQ2FuZGlkYXRlcyl9YDtcbiAgICB9XG5cbiAgICBwdWJsaWMgZm9yUm9vbShyb29tSWRPckFsaWFzOiBzdHJpbmcsIHNlcnZlckNhbmRpZGF0ZXM6IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIGAke2Jhc2VVcmx9LyMvJHtyb29tSWRPckFsaWFzfSR7dGhpcy5lbmNvZGVTZXJ2ZXJDYW5kaWRhdGVzKHNlcnZlckNhbmRpZGF0ZXMpfWA7XG4gICAgfVxuXG4gICAgcHVibGljIGZvclVzZXIodXNlcklkOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gYCR7YmFzZVVybH0vIy8ke3VzZXJJZH1gO1xuICAgIH1cblxuICAgIHB1YmxpYyBmb3JFbnRpdHkoZW50aXR5SWQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiBgJHtiYXNlVXJsfS8jLyR7ZW50aXR5SWR9YDtcbiAgICB9XG5cbiAgICBwdWJsaWMgaXNQZXJtYWxpbmtIb3N0KHRlc3RIb3N0OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRlc3RIb3N0ID09PSBob3N0O1xuICAgIH1cblxuICAgIHB1YmxpYyBlbmNvZGVTZXJ2ZXJDYW5kaWRhdGVzKGNhbmRpZGF0ZXM6IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgICAgICAgaWYgKCFjYW5kaWRhdGVzIHx8IGNhbmRpZGF0ZXMubGVuZ3RoID09PSAwKSByZXR1cm4gXCJcIjtcbiAgICAgICAgcmV0dXJuIGA/dmlhPSR7Y2FuZGlkYXRlcy5tYXAoKGMpID0+IGVuY29kZVVSSUNvbXBvbmVudChjKSkuam9pbihcIiZ2aWE9XCIpfWA7XG4gICAgfVxuXG4gICAgLy8gSGVhdmlseSBpbnNwaXJlZCBieS9ib3Jyb3dlZCBmcm9tIHRoZSBtYXRyaXgtYm90LXNkayAod2l0aCBwZXJtaXNzaW9uKTpcbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vdHVydDJsaXZlL21hdHJpeC1qcy1ib3Qtc2RrL2Jsb2IvN2M0NjY1YzlhMjVjMmM4ZTBmZTRlNTA5ZjI2MTY1MDViNWI2NmExYy9zcmMvUGVybWFsaW5rcy50cyNMMzMtTDYxXG4gICAgcHVibGljIHBhcnNlUGVybWFsaW5rKGZ1bGxVcmw6IHN0cmluZyk6IFBlcm1hbGlua1BhcnRzIHtcbiAgICAgICAgaWYgKCFmdWxsVXJsKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJEb2VzIG5vdCBhcHBlYXIgdG8gYmUgYSBwZXJtYWxpbmtcIik7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBtYXRjaGVzID0gWy4uLmZ1bGxVcmwubWF0Y2hBbGwobmV3IFJlZ0V4cChiYXNlVXJsUGF0dGVybiwgXCJnaVwiKSldWzBdO1xuXG4gICAgICAgIGlmICghbWF0Y2hlcyB8fCBtYXRjaGVzLmxlbmd0aCA8IDIpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkRvZXMgbm90IGFwcGVhciB0byBiZSBhIHBlcm1hbGlua1wiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHBhcnRzID0gbWF0Y2hlc1sxXS5zcGxpdChcIi9cIik7XG5cbiAgICAgICAgY29uc3QgZW50aXR5ID0gcGFydHNbMF07XG4gICAgICAgIGlmIChlbnRpdHlbMF0gPT09IFwiQFwiKSB7XG4gICAgICAgICAgICAvLyBQcm9iYWJseSBhIHVzZXIsIG5vIGZ1cnRoZXIgcGFyc2luZyBuZWVkZWQuXG4gICAgICAgICAgICByZXR1cm4gUGVybWFsaW5rUGFydHMuZm9yVXNlcihlbnRpdHkpO1xuICAgICAgICB9IGVsc2UgaWYgKGVudGl0eVswXSA9PT0gXCIjXCIgfHwgZW50aXR5WzBdID09PSBcIiFcIikge1xuICAgICAgICAgICAgaWYgKHBhcnRzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgICAgIC8vIHJvb20gd2l0aG91dCBldmVudCBwZXJtYWxpbmtcbiAgICAgICAgICAgICAgICBjb25zdCBbcm9vbUlkLCBxdWVyeSA9IFwiXCJdID0gZW50aXR5LnNwbGl0KFwiP1wiKTtcbiAgICAgICAgICAgICAgICBjb25zdCB2aWEgPSBxdWVyeS5zcGxpdCgvJj92aWE9L2cpLmZpbHRlcigocCkgPT4gISFwKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gUGVybWFsaW5rUGFydHMuZm9yUm9vbShyb29tSWQsIHZpYSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIHJlam9pbiB0aGUgcmVzdCBiZWNhdXNlIHYzIGV2ZW50cyBjYW4gaGF2ZSBzbGFzaGVzIChhbm5veWluZ2x5KVxuICAgICAgICAgICAgY29uc3QgZXZlbnRJZEFuZFF1ZXJ5ID0gcGFydHMubGVuZ3RoID4gMSA/IHBhcnRzLnNsaWNlKDEpLmpvaW4oXCIvXCIpIDogXCJcIjtcbiAgICAgICAgICAgIGNvbnN0IFtldmVudElkLCBxdWVyeSA9IFwiXCJdID0gZXZlbnRJZEFuZFF1ZXJ5LnNwbGl0KFwiP1wiKTtcbiAgICAgICAgICAgIGNvbnN0IHZpYSA9IHF1ZXJ5LnNwbGl0KC8mP3ZpYT0vZykuZmlsdGVyKChwKSA9PiAhIXApO1xuXG4gICAgICAgICAgICByZXR1cm4gUGVybWFsaW5rUGFydHMuZm9yRXZlbnQoZW50aXR5LCBldmVudElkLCB2aWEpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVW5rbm93biBlbnRpdHkgdHlwZSBpbiBwZXJtYWxpbmtcIik7XG4gICAgICAgIH1cbiAgICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7OztBQVFBLElBQUFBLHFCQUFBLEdBQUFDLHVCQUFBLENBQUFDLE9BQUE7QUFBOEUsU0FBQUMseUJBQUFDLENBQUEsNkJBQUFDLE9BQUEsbUJBQUFDLENBQUEsT0FBQUQsT0FBQSxJQUFBRSxDQUFBLE9BQUFGLE9BQUEsWUFBQUYsd0JBQUEsWUFBQUEsQ0FBQUMsQ0FBQSxXQUFBQSxDQUFBLEdBQUFHLENBQUEsR0FBQUQsQ0FBQSxLQUFBRixDQUFBO0FBQUEsU0FBQUgsd0JBQUFHLENBQUEsRUFBQUUsQ0FBQSxTQUFBQSxDQUFBLElBQUFGLENBQUEsSUFBQUEsQ0FBQSxDQUFBSSxVQUFBLFNBQUFKLENBQUEsZUFBQUEsQ0FBQSx1QkFBQUEsQ0FBQSx5QkFBQUEsQ0FBQSxXQUFBSyxPQUFBLEVB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