diff --git a/README.md b/README.md index 16f6de47ed2..f194a72715e 100644 --- a/README.md +++ b/README.md @@ -11,7 +11,7 @@ This is the [Matrix](https://matrix.org) Client-Server SDK for JavaScript and TypeScript. This SDK can be run in a browser or in Node.js. -#### Minimum Matrix server version: v1.5 +#### Minimum Matrix server version: v1.1 The Matrix specification is constantly evolving - while this SDK aims for maximum backwards compatibility, it only guarantees that a feature will be supported for at least 4 spec releases. For example, if a feature the js-sdk supports diff --git a/src/autodiscovery.ts b/src/autodiscovery.ts index e2f664ed7f8..9bf6cdafa81 100644 --- a/src/autodiscovery.ts +++ b/src/autodiscovery.ts @@ -28,7 +28,7 @@ import { validateWellKnownAuthentication, } from "./oidc/validate"; import { OidcError } from "./oidc/error"; -import { MINIMUM_MATRIX_VERSION } from "./version-support"; +import { SUPPORTED_MATRIX_VERSIONS } from "./version-support"; // Dev note: Auto discovery is part of the spec. // See: https://matrix.org/docs/spec/client_server/r0.4.0.html#server-discovery @@ -51,7 +51,10 @@ export enum AutoDiscoveryError { InvalidIs = "Invalid identity server discovery response", MissingWellknown = "No .well-known JSON file found", InvalidJson = "Invalid JSON", - HomeserverTooOld = "The homeserver does not meet the minimum version requirements", + UnsupportedHomeserverSpecVersion = "The homeserver does not meet the version requirements", + + /** @deprecated Replaced by `UnsupportedHomeserverSpecVersion` */ + HomeserverTooOld = UnsupportedHomeserverSpecVersion, // TODO: Implement when Sydent supports the `/versions` endpoint - https://github.com/matrix-org/sydent/issues/424 //IdentityServerTooOld = "The identity server does not meet the minimum version requirements", } @@ -112,7 +115,11 @@ export class AutoDiscovery { public static readonly ERROR_INVALID_JSON = AutoDiscoveryError.InvalidJson; - public static readonly ERROR_HOMESERVER_TOO_OLD = AutoDiscoveryError.HomeserverTooOld; + public static readonly ERROR_UNSUPPORTED_HOMESERVER_SPEC_VERSION = + AutoDiscoveryError.UnsupportedHomeserverSpecVersion; + + /** @deprecated Replaced by ERROR_UNSUPPORTED_HOMESERVER_SPEC_VERSION */ + public static readonly ERROR_HOMESERVER_TOO_OLD = AutoDiscovery.ERROR_UNSUPPORTED_HOMESERVER_SPEC_VERSION; public static readonly ALL_ERRORS = Object.keys(AutoDiscoveryError) as AutoDiscoveryError[]; @@ -216,10 +223,19 @@ export class AutoDiscovery { return Promise.resolve(clientConfig); } - // Step 3.1: Non-spec check to ensure the server will actually work for us - if (!hsVersions.raw!["versions"].includes(MINIMUM_MATRIX_VERSION)) { - logger.error("Homeserver does not meet minimum version requirements"); - clientConfig["m.homeserver"].error = AutoDiscovery.ERROR_HOMESERVER_TOO_OLD; + // Step 3.1: Non-spec check to ensure the server will actually work for us. We need to check if + // any of the versions in `SUPPORTED_MATRIX_VERSIONS` are listed in the /versions response. + const hsVersionSet = new Set(hsVersions.raw!["versions"]); + let supportedVersionFound = false; + for (const version of SUPPORTED_MATRIX_VERSIONS) { + if (hsVersionSet.has(version)) { + supportedVersionFound = true; + break; + } + } + if (!supportedVersionFound) { + logger.error("Homeserver does not meet version requirements"); + clientConfig["m.homeserver"].error = AutoDiscovery.ERROR_UNSUPPORTED_HOMESERVER_SPEC_VERSION; // Supply the base_url to the caller because they may be ignoring liveliness // errors, like this one. diff --git a/src/version-support.ts b/src/version-support.ts index 25fe72d70b5..acf229fc8da 100644 --- a/src/version-support.ts +++ b/src/version-support.ts @@ -15,9 +15,22 @@ limitations under the License. */ /** - * The minimum Matrix specification version the js-sdk supports. + * A list of the spec versions which the js-sdk is compatible with. * - * (This means that we require any servers we connect to to declare support for this spec version, so it is important - * for it not to be too old, as well as not too new.) + * In practice, this means: when we connect to a server, it must declare support for one of the versions in this list. + * + * Note that it does not *necessarily* mean that the js-sdk has good support for all the features in the listed spec + * versions; only that we should be able to provide a base level of functionality with a server that offers support for + * any of the listed versions. + */ +export const SUPPORTED_MATRIX_VERSIONS = ["v1.1", "v1.2", "v1.3", "v1.4", "v1.5", "v1.6", "v1.7", "v1.8", "v1.9"]; + +/** + * The oldest Matrix specification version the js-sdk supports. + */ +export const MINIMUM_MATRIX_VERSION = SUPPORTED_MATRIX_VERSIONS[0]; + +/** + * The most recent Matrix specification version the js-sdk supports. */ -export const MINIMUM_MATRIX_VERSION = "v1.5"; +export const MAXIMUM_MATRIX_VERSION = SUPPORTED_MATRIX_VERSIONS[SUPPORTED_MATRIX_VERSIONS.length - 1];