From 442ed2f1d1b9173f0ab49cc821cb56210bca5f74 Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Wed, 16 Jul 2025 12:09:19 -0600 Subject: [PATCH] Support v12 room IDs MSC: https://github.com/matrix-org/matrix-spec-proposals/pull/4291 Pre-disclosure: https://matrix.org/blog/2025/07/security-predisclosure/ --- src/Link.js | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/src/Link.js b/src/Link.js index 33e496f..6c8e66e 100644 --- a/src/Link.js +++ b/src/Link.js @@ -18,7 +18,7 @@ import {createEnum} from "./utils/enum.js"; import {orderedUnique} from "./utils/unique.js"; const ROOMALIAS_PATTERN = /^#([^:]*):(.+)$/; -const ROOMID_PATTERN = /^!([^:]*):(.+)$/; +const ROOMID_PATTERN = /^!([^:]*)(:(.+))?$/; // As of room version 12, room IDs don't have domains const USERID_PATTERN = /^@([^:]+):(.+)$/; const EVENTID_PATTERN = /^$([^:]+):(.+)$/; const GROUPID_PATTERN = /^\+([^:]+):(.+)$/; @@ -92,7 +92,7 @@ export class Link { static validateIdentifier(identifier) { return !!( USERID_PATTERN.exec(identifier) || - ROOMALIAS_PATTERN.exec(identifier) || + ROOMALIAS_PATTERN.exec(identifier) || ROOMID_PATTERN.exec(identifier) || GROUPID_PATTERN.exec(identifier) ); @@ -166,12 +166,19 @@ export class Link { } constructor(clientId, viaServers, identifierKind, localPart, server, webInstances, eventId) { - const servers = [server]; + const servers = []; + if (server !== undefined) { + servers.push(server); // v12 rooms don't have domains, and therefore no server + } servers.push(...viaServers); this.webInstances = webInstances; this.servers = orderedUnique(servers); this.identifierKind = identifierKind; - this.identifier = `${asPrefix(identifierKind)}${localPart}:${server}`; + if (identifierKind === IdentifierKind.RoomId && !server) { + this.identifier = `${asPrefix(identifierKind)}${localPart}`; + } else { + this.identifier = `${asPrefix(identifierKind)}${localPart}:${server}`; + } this.eventId = eventId; this.clientId = clientId; }