From c584bcb2e8a361b6d6cf632fa1bbe801e88b419e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 27 May 2026 22:16:13 +0000 Subject: [PATCH 1/3] build(deps): bump uuid and matrix-js-sdk Removes [uuid](https://github.com/uuidjs/uuid). It's no longer used after updating ancestor dependency [matrix-js-sdk](https://github.com/matrix-org/matrix-js-sdk). These dependencies need to be updated together. Removes `uuid` Updates `matrix-js-sdk` from 24.1.0 to 41.6.0 - [Release notes](https://github.com/matrix-org/matrix-js-sdk/releases) - [Changelog](https://github.com/matrix-org/matrix-js-sdk/blob/develop/CHANGELOG.md) - [Commits](https://github.com/matrix-org/matrix-js-sdk/compare/v24.1.0...v41.6.0) --- updated-dependencies: - dependency-name: matrix-js-sdk dependency-version: 41.6.0-rc.0 dependency-type: direct:production - dependency-name: uuid dependency-version: dependency-type: indirect ... Signed-off-by: dependabot[bot] --- package-lock.json | 225 ++++++++++++++++++++++++---------------------- package.json | 2 +- 2 files changed, 119 insertions(+), 108 deletions(-) diff --git a/package-lock.json b/package-lock.json index 95a6229f..3eb8cdcb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -17,7 +17,7 @@ "express": "^5.2.1", "kafkajs": "^2.2.4", "knex": "^3.2.4", - "matrix-js-sdk": "24.1.0", + "matrix-js-sdk": "41.6.0", "pg": "^8.20.0", "prom-client": "^15.1.3", "reflect-metadata": "^0.2.2", @@ -1516,13 +1516,13 @@ "@jridgewell/sourcemap-codec": "^1.4.14" } }, - "node_modules/@matrix-org/matrix-sdk-crypto-js": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/@matrix-org/matrix-sdk-crypto-js/-/matrix-sdk-crypto-js-0.1.4.tgz", - "integrity": "sha512-OxG84iSeR89zYLFeb+DCaFtZT+DDiIu+kTkqY8OYfhE5vpGLFX2sDVBRrAdos1IUqEoboDloDBR9+yU7hNRyog==", + "node_modules/@matrix-org/matrix-sdk-crypto-wasm": { + "version": "18.3.0", + "resolved": "https://registry.npmjs.org/@matrix-org/matrix-sdk-crypto-wasm/-/matrix-sdk-crypto-wasm-18.3.0.tgz", + "integrity": "sha512-9a4feyt8QLysARu7PHKaRWT+wcCd+IYH074LXp9QK5WqfN4zUXueRhiSSMNT18Bm+8q3sBR/4zxDxOSDR0M8Kg==", "license": "Apache-2.0", "engines": { - "node": ">= 10" + "node": ">= 18" } }, "node_modules/@napi-rs/wasm-runtime": { @@ -1847,12 +1847,6 @@ "dev": true, "license": "MIT" }, - "node_modules/@types/retry": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", - "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==", - "license": "MIT" - }, "node_modules/@types/send": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/@types/send/-/send-1.2.1.tgz", @@ -3219,9 +3213,9 @@ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, "node_modules/base-x": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/base-x/-/base-x-4.0.1.tgz", - "integrity": "sha512-uAZ8x6r6S3aUM9rbHGVOIsR15U/ZSc82b3ymnCPsT45Gk1DDvhDPdIgB5MrhirZWt+5K0EEPQH985kNqZgNPFw==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/base-x/-/base-x-5.0.1.tgz", + "integrity": "sha512-M7uio8Zt++eg3jPj+rHMfCC+IuygQHHCOU+IYsVtik6FWjuYpVt/+MRKcgsAMHh8mMFAwnB+Bs+mTrFiXjMzKg==", "license": "MIT" }, "node_modules/baseline-browser-mapping": { @@ -3365,12 +3359,12 @@ } }, "node_modules/bs58": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/bs58/-/bs58-5.0.0.tgz", - "integrity": "sha512-r+ihvQJvahgYT50JD05dyJNKlmmSlMoOGwn1lCcEzanPglg7TxYjioQUYehQ9mAR/+hOSd2jRc/Z2y5UxBymvQ==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/bs58/-/bs58-6.0.0.tgz", + "integrity": "sha512-PD0wEnEYg6ijszw/u8s+iI3H17cTymlrwkKhDhPZq+Sokl3AU4htyBFTjAeNAlCCmg0f53g6ih3jATyCKftTfw==", "license": "MIT", "dependencies": { - "base-x": "^4.0.0" + "base-x": "^5.0.0" } }, "node_modules/bser": { @@ -5964,6 +5958,18 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-network-error": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/is-network-error/-/is-network-error-1.3.2.tgz", + "integrity": "sha512-PhBY86zaxNZUuWP6h13Vu5oFe0XY6/UlKzQnYFELzGVHygP3MxmvTfYSG7GN3aIab/iWudSMgjSnG9Dq+nHrgA==", + "license": "MIT", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", @@ -7035,6 +7041,15 @@ "node": ">=6" } }, + "node_modules/jwt-decode": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jwt-decode/-/jwt-decode-4.0.0.tgz", + "integrity": "sha512-+KJGIyHgkGuIq3IEBNftfhW/LfWhXUIY6OmyVWjliu5KH1y0fw7VQ8YndE2O4qZdMSd9SqbnC8GOcZEy0Om7sA==", + "license": "MIT", + "engines": { + "node": ">=18" + } + }, "node_modules/kafkajs": { "version": "2.2.4", "resolved": "https://registry.npmjs.org/kafkajs/-/kafkajs-2.2.4.tgz", @@ -7449,26 +7464,27 @@ "integrity": "sha512-1QEOsXO+bhyCroIe2/A5OwaxHvBm7EsSQ46DEDn8RBIfQwN5HWBpFvyWWR4QY0KHPPnnJdI99wgRiAl7Ad5qaA==" }, "node_modules/matrix-js-sdk": { - "version": "24.1.0", - "resolved": "https://registry.npmjs.org/matrix-js-sdk/-/matrix-js-sdk-24.1.0.tgz", - "integrity": "sha512-xEx2ZoNsS56dwgqLJ3rIv2SUpFxdQLrLKmJCpMatMUKCAg+NGuZfpQ3QXblIbGaqFNQZCH7fC7S48AeTMZp1Jw==", + "version": "41.6.0", + "resolved": "https://registry.npmjs.org/matrix-js-sdk/-/matrix-js-sdk-41.6.0.tgz", + "integrity": "sha512-FOEQBE9i3I+yRymMzKdDO5ptonawqrbtwxSqlkkpqaiFRnsA5zplaPZozdukt+IjBTuE2KceFY+bjFXiNi/+Eg==", "license": "Apache-2.0", "dependencies": { "@babel/runtime": "^7.12.5", - "@matrix-org/matrix-sdk-crypto-js": "^0.1.0-alpha.5", + "@matrix-org/matrix-sdk-crypto-wasm": "^18.2.0", "another-json": "^0.2.0", - "bs58": "^5.0.0", + "bs58": "^6.0.0", "content-type": "^1.0.4", - "loglevel": "^1.7.1", + "jwt-decode": "^4.0.0", + "loglevel": "^1.9.2", "matrix-events-sdk": "0.0.1", - "matrix-widget-api": "^1.3.1", - "p-retry": "4", - "sdp-transform": "^2.14.1", - "unhomoglyph": "^1.0.6", - "uuid": "9" + "matrix-widget-api": "^1.16.1", + "oidc-client-ts": "^3.0.1", + "p-retry": "8", + "sdp-transform": "^3.0.0", + "unhomoglyph": "^1.0.6" }, "engines": { - "node": ">=16.0.0" + "node": ">=22.0.0" } }, "node_modules/matrix-widget-api": { @@ -7761,6 +7777,18 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/oidc-client-ts": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/oidc-client-ts/-/oidc-client-ts-3.5.0.tgz", + "integrity": "sha512-l2q8l9CTCTOlbX+AnK4p3M+4CEpKpyQhle6blQkdFhm0IsBqsxm15bYaSa11G7pWdsYr6epdsRZxJpCyCRbT8A==", + "license": "Apache-2.0", + "dependencies": { + "jwt-decode": "^4.0.0" + }, + "engines": { + "node": ">=18" + } + }, "node_modules/on-finished": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", @@ -7872,16 +7900,18 @@ } }, "node_modules/p-retry": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz", - "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-8.0.0.tgz", + "integrity": "sha512-kFVqH1HxOHp8LupNsOys7bSV09VYTRLxarH/mokO4Rqhk6wGi70E0jh4VzvVGXfEVNggHoHLAMWsQqHyU1Ey9A==", "license": "MIT", "dependencies": { - "@types/retry": "0.12.0", - "retry": "^0.13.1" + "is-network-error": "^1.3.0" }, "engines": { - "node": ">=8" + "node": ">=22" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/p-try": { @@ -8621,15 +8651,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/retry": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", - "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, "node_modules/rfdc": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", @@ -8766,9 +8787,9 @@ "license": "MIT" }, "node_modules/sdp-transform": { - "version": "2.15.0", - "resolved": "https://registry.npmjs.org/sdp-transform/-/sdp-transform-2.15.0.tgz", - "integrity": "sha512-KrOH82c/W+GYQ0LHqtr3caRpM3ITglq3ljGUIb8LTki7ByacJZ9z+piSGiwZDsRyhQbYBOBJgr2k6X4BZXi3Kw==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/sdp-transform/-/sdp-transform-3.0.0.tgz", + "integrity": "sha512-gfYVRGxjHkGF2NPeUWHw5u6T/KGFtS5/drPms73gaSuMaVHKCY3lpLnGDfswVQO0kddeePoti09AwhYP4zA8dQ==", "license": "MIT", "bin": { "sdp-verify": "checker.js" @@ -10148,19 +10169,6 @@ "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", "license": "MIT" }, - "node_modules/uuid": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", - "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", - "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" - ], - "license": "MIT", - "bin": { - "uuid": "dist/bin/uuid" - } - }, "node_modules/v8-compile-cache-lib": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", @@ -11734,10 +11742,10 @@ "@jridgewell/sourcemap-codec": "^1.4.14" } }, - "@matrix-org/matrix-sdk-crypto-js": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/@matrix-org/matrix-sdk-crypto-js/-/matrix-sdk-crypto-js-0.1.4.tgz", - "integrity": "sha512-OxG84iSeR89zYLFeb+DCaFtZT+DDiIu+kTkqY8OYfhE5vpGLFX2sDVBRrAdos1IUqEoboDloDBR9+yU7hNRyog==" + "@matrix-org/matrix-sdk-crypto-wasm": { + "version": "18.3.0", + "resolved": "https://registry.npmjs.org/@matrix-org/matrix-sdk-crypto-wasm/-/matrix-sdk-crypto-wasm-18.3.0.tgz", + "integrity": "sha512-9a4feyt8QLysARu7PHKaRWT+wcCd+IYH074LXp9QK5WqfN4zUXueRhiSSMNT18Bm+8q3sBR/4zxDxOSDR0M8Kg==" }, "@napi-rs/wasm-runtime": { "version": "0.2.12", @@ -12023,11 +12031,6 @@ "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", "dev": true }, - "@types/retry": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", - "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==" - }, "@types/send": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/@types/send/-/send-1.2.1.tgz", @@ -12863,9 +12866,9 @@ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, "base-x": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/base-x/-/base-x-4.0.1.tgz", - "integrity": "sha512-uAZ8x6r6S3aUM9rbHGVOIsR15U/ZSc82b3ymnCPsT45Gk1DDvhDPdIgB5MrhirZWt+5K0EEPQH985kNqZgNPFw==" + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/base-x/-/base-x-5.0.1.tgz", + "integrity": "sha512-M7uio8Zt++eg3jPj+rHMfCC+IuygQHHCOU+IYsVtik6FWjuYpVt/+MRKcgsAMHh8mMFAwnB+Bs+mTrFiXjMzKg==" }, "baseline-browser-mapping": { "version": "2.10.9", @@ -12954,11 +12957,11 @@ } }, "bs58": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/bs58/-/bs58-5.0.0.tgz", - "integrity": "sha512-r+ihvQJvahgYT50JD05dyJNKlmmSlMoOGwn1lCcEzanPglg7TxYjioQUYehQ9mAR/+hOSd2jRc/Z2y5UxBymvQ==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/bs58/-/bs58-6.0.0.tgz", + "integrity": "sha512-PD0wEnEYg6ijszw/u8s+iI3H17cTymlrwkKhDhPZq+Sokl3AU4htyBFTjAeNAlCCmg0f53g6ih3jATyCKftTfw==", "requires": { - "base-x": "^4.0.0" + "base-x": "^5.0.0" } }, "bser": { @@ -14638,6 +14641,11 @@ "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", "dev": true }, + "is-network-error": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/is-network-error/-/is-network-error-1.3.2.tgz", + "integrity": "sha512-PhBY86zaxNZUuWP6h13Vu5oFe0XY6/UlKzQnYFELzGVHygP3MxmvTfYSG7GN3aIab/iWudSMgjSnG9Dq+nHrgA==" + }, "is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", @@ -15382,6 +15390,11 @@ "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", "dev": true }, + "jwt-decode": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jwt-decode/-/jwt-decode-4.0.0.tgz", + "integrity": "sha512-+KJGIyHgkGuIq3IEBNftfhW/LfWhXUIY6OmyVWjliu5KH1y0fw7VQ8YndE2O4qZdMSd9SqbnC8GOcZEy0Om7sA==" + }, "kafkajs": { "version": "2.2.4", "resolved": "https://registry.npmjs.org/kafkajs/-/kafkajs-2.2.4.tgz", @@ -15650,22 +15663,23 @@ "integrity": "sha512-1QEOsXO+bhyCroIe2/A5OwaxHvBm7EsSQ46DEDn8RBIfQwN5HWBpFvyWWR4QY0KHPPnnJdI99wgRiAl7Ad5qaA==" }, "matrix-js-sdk": { - "version": "24.1.0", - "resolved": "https://registry.npmjs.org/matrix-js-sdk/-/matrix-js-sdk-24.1.0.tgz", - "integrity": "sha512-xEx2ZoNsS56dwgqLJ3rIv2SUpFxdQLrLKmJCpMatMUKCAg+NGuZfpQ3QXblIbGaqFNQZCH7fC7S48AeTMZp1Jw==", + "version": "41.6.0", + "resolved": "https://registry.npmjs.org/matrix-js-sdk/-/matrix-js-sdk-41.6.0.tgz", + "integrity": "sha512-FOEQBE9i3I+yRymMzKdDO5ptonawqrbtwxSqlkkpqaiFRnsA5zplaPZozdukt+IjBTuE2KceFY+bjFXiNi/+Eg==", "requires": { "@babel/runtime": "^7.12.5", - "@matrix-org/matrix-sdk-crypto-js": "^0.1.0-alpha.5", + "@matrix-org/matrix-sdk-crypto-wasm": "^18.2.0", "another-json": "^0.2.0", - "bs58": "^5.0.0", + "bs58": "^6.0.0", "content-type": "^1.0.4", - "loglevel": "^1.7.1", + "jwt-decode": "^4.0.0", + "loglevel": "^1.9.2", "matrix-events-sdk": "0.0.1", - "matrix-widget-api": "^1.3.1", - "p-retry": "4", - "sdp-transform": "^2.14.1", - "unhomoglyph": "^1.0.6", - "uuid": "9" + "matrix-widget-api": "^1.16.1", + "oidc-client-ts": "^3.0.1", + "p-retry": "8", + "sdp-transform": "^3.0.0", + "unhomoglyph": "^1.0.6" } }, "matrix-widget-api": { @@ -15856,6 +15870,14 @@ "es-object-atoms": "^1.0.0" } }, + "oidc-client-ts": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/oidc-client-ts/-/oidc-client-ts-3.5.0.tgz", + "integrity": "sha512-l2q8l9CTCTOlbX+AnK4p3M+4CEpKpyQhle6blQkdFhm0IsBqsxm15bYaSa11G7pWdsYr6epdsRZxJpCyCRbT8A==", + "requires": { + "jwt-decode": "^4.0.0" + } + }, "on-finished": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", @@ -15933,12 +15955,11 @@ } }, "p-retry": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz", - "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-8.0.0.tgz", + "integrity": "sha512-kFVqH1HxOHp8LupNsOys7bSV09VYTRLxarH/mokO4Rqhk6wGi70E0jh4VzvVGXfEVNggHoHLAMWsQqHyU1Ey9A==", "requires": { - "@types/retry": "0.12.0", - "retry": "^0.13.1" + "is-network-error": "^1.3.0" } }, "p-try": { @@ -16433,11 +16454,6 @@ } } }, - "retry": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", - "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==" - }, "rfdc": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", @@ -16537,9 +16553,9 @@ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, "sdp-transform": { - "version": "2.15.0", - "resolved": "https://registry.npmjs.org/sdp-transform/-/sdp-transform-2.15.0.tgz", - "integrity": "sha512-KrOH82c/W+GYQ0LHqtr3caRpM3ITglq3ljGUIb8LTki7ByacJZ9z+piSGiwZDsRyhQbYBOBJgr2k6X4BZXi3Kw==" + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/sdp-transform/-/sdp-transform-3.0.0.tgz", + "integrity": "sha512-gfYVRGxjHkGF2NPeUWHw5u6T/KGFtS5/drPms73gaSuMaVHKCY3lpLnGDfswVQO0kddeePoti09AwhYP4zA8dQ==" }, "semver": { "version": "7.7.4", @@ -17428,11 +17444,6 @@ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" }, - "uuid": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", - "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==" - }, "v8-compile-cache-lib": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", diff --git a/package.json b/package.json index 91b98028..57c428fa 100644 --- a/package.json +++ b/package.json @@ -56,7 +56,7 @@ "express": "^5.2.1", "kafkajs": "^2.2.4", "knex": "^3.2.4", - "matrix-js-sdk": "24.1.0", + "matrix-js-sdk": "41.6.0", "pg": "^8.20.0", "prom-client": "^15.1.3", "reflect-metadata": "^0.2.2", From 6440cb80a71fc64ccdbc5ac4e684835ff96a80ca Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 29 May 2026 09:07:49 +0000 Subject: [PATCH 2/3] fix: resolve CI failures caused by matrix-js-sdk v41 ESM-only upgrade - tsconfig.json: add es2021 to lib for AggregateError (fixes TS2304) - SynapseService.ts: replace static ESM import with lazy dynamic import() using private getMatrix()/getClient() methods; define local IMatrixClient interface to avoid import type TS1541/TS1542 errors with module:Node16 - SynapseService.spec.ts: replace jest.requireActual with explicit mock values (fixes ESM load failure); add Method/Visibility/EventType/MsgType enum values to mock - jest.unit.config.js: set module:CommonJS + moduleResolution:node for ts-jest so dynamic import() compiles as require() that Jest can mock --- jest.unit.config.js | 2 + src/services/synapse/SynapseService.spec.ts | 12 +- src/services/synapse/SynapseService.ts | 169 +++++++++++++------- tsconfig.json | 1 + 4 files changed, 124 insertions(+), 60 deletions(-) diff --git a/jest.unit.config.js b/jest.unit.config.js index d5a4a802..e2d70c01 100644 --- a/jest.unit.config.js +++ b/jest.unit.config.js @@ -6,6 +6,8 @@ module.exports = { { tsconfig: { isolatedModules: true, + module: 'CommonJS', + moduleResolution: 'node', }, }, ], diff --git a/src/services/synapse/SynapseService.spec.ts b/src/services/synapse/SynapseService.spec.ts index a4701d58..03011c6a 100644 --- a/src/services/synapse/SynapseService.spec.ts +++ b/src/services/synapse/SynapseService.spec.ts @@ -1,7 +1,10 @@ jest.mock('@user-office-software/duo-logger'); jest.mock('matrix-js-sdk', () => ({ - ...jest.requireActual('matrix-js-sdk'), createClient: jest.fn(), + Method: { Get: 'GET', Post: 'POST', Put: 'PUT' }, + Visibility: { Private: 'private' }, + EventType: { RoomMessage: 'm.room.message' }, + MsgType: { Text: 'm.text' }, })); jest.mock('./produceSynapseUserId', () => ({ produceSynapseUserId: jest.fn(), @@ -9,7 +12,6 @@ jest.mock('./produceSynapseUserId', () => ({ import { logger } from '@user-office-software/duo-logger'; import { AxiosError } from 'axios'; -import { createClient } from 'matrix-js-sdk'; import { produceSynapseUserId } from './produceSynapseUserId'; import { SynapseService } from './SynapseService'; @@ -64,7 +66,9 @@ describe('SynapseService', () => { beforeEach(() => { jest.resetAllMocks(); - (createClient as jest.Mock).mockReturnValue(mockCreateClient); + ( + jest.requireMock('matrix-js-sdk').createClient as jest.Mock + ).mockReturnValue(mockCreateClient); mockLoggerLogError = jest.spyOn(logger, 'logError'); mockLoggerLogInfo = jest.spyOn(logger, 'logInfo'); process.env.SYNAPSE_SERVICE_USER = 'serviceUser'; @@ -139,7 +143,7 @@ describe('SynapseService', () => { const removeUserFromRoomSpy = jest .spyOn(synapseService, 'removeUserFromRoom') - .mockResolvedValueOnce(); + .mockResolvedValueOnce(undefined); (produceSynapseUserId as jest.Mock) .mockResolvedValueOnce(member.oidcSub) diff --git a/src/services/synapse/SynapseService.ts b/src/services/synapse/SynapseService.ts index 9bee5e8e..b5d5ed3e 100644 --- a/src/services/synapse/SynapseService.ts +++ b/src/services/synapse/SynapseService.ts @@ -1,14 +1,4 @@ import { logger } from '@user-office-software/duo-logger'; -import { - MatrixClient, - Method, - User, - Visibility, - createClient, - EventType, - MsgType, - RoomMember, -} from 'matrix-js-sdk'; import { produceSynapseUserId } from './produceSynapseUserId'; import { axiosFetch } from '../../config/utils'; @@ -26,6 +16,32 @@ interface MemberObject { }; } +/** Minimal subset of MatrixClient used by SynapseService */ +interface IMatrixClient { + loginWithPassword(userId: string, password: string): Promise; + logout(): Promise; + http: { + authedRequest( + method: string, + path: string, + queryParams?: Record, + data?: unknown, + opts?: { prefix?: string } + // eslint-disable-next-line @typescript-eslint/no-explicit-any + ): Promise; + }; + getJoinedRoomMembers( + roomId: string + ): Promise<{ joined: Record }>; + sendEvent( + roomId: string, + eventType: string, + content: unknown, + txnId?: string + ): Promise; + joinRoom(roomId: string): Promise; +} + const serverUrl = process.env.SYNAPSE_SERVER_URL; const serverName = process.env.SYNAPSE_SERVER_NAME; const oauthIssuer = process.env.SYNAPSE_OAUTH_ISSUER; @@ -40,7 +56,9 @@ const ADMIN_API_PREFIX_V1 = '/_synapse/admin/v1'; const CLIENT_API_PREFIX_V1 = '/_matrix/client/api/v1'; export class SynapseService { - private client: MatrixClient; + private sdkCache: any; + private clientCache: IMatrixClient | undefined; + constructor() { if (!serverUrl) throw new Error('SYNAPSE_SERVER_NAME is not set'); if (!serverName) throw new Error('SYNAPSE_SERVER_NAME is not set'); @@ -49,13 +67,26 @@ export class SynapseService { throw new Error('SYNAPSE_SERVICE_USER is not set'); if (!serviceAccount.password) throw new Error('SYNAPSE_SERVICE_PASSWORD is not set'); + } + + private async getMatrix() { + if (!this.sdkCache) { + this.sdkCache = await import('matrix-js-sdk'); + } - this.client = createClient({ - baseUrl: serverUrl, - fetchFn: axiosFetch, - }); - // TODO, If consumer service is started after downtime, and there are some pending messages in the queue - // then it could be that queue handler will delegate handling of messages before connection to supabase is established + return this.sdkCache; + } + + private async getClient(): Promise { + if (!this.clientCache) { + const { createClient } = await this.getMatrix(); + this.clientCache = createClient({ + baseUrl: serverUrl!, + fetchFn: axiosFetch, + }) as IMatrixClient; + } + + return this.clientCache!; } async login(consumerName = 'ChatroomCreationQueueConsumer') { @@ -65,7 +96,8 @@ export class SynapseService { throw new Error('SYNAPSE_SERVICE_PASSWORD is not set'); try { - await this.client.loginWithPassword( + const client = await this.getClient(); + await client.loginWithPassword( serviceAccount.userId, serviceAccount.password ); @@ -79,7 +111,8 @@ export class SynapseService { async logout() { try { - await this.client.logout(); + const client = await this.getClient(); + await client.logout(); } catch (error) { logger.logError('Failed to logout from Synapse', { error }); throw error; @@ -90,7 +123,9 @@ export class SynapseService { const membersList = await Promise.all( members.map(async (member) => await produceSynapseUserId(member, this)) ); - const room = await this.client.http + const { Method, Visibility } = await this.getMatrix(); + const client = await this.getClient(); + const room = await client.http .authedRequest( Method.Post, '/createRoom', @@ -117,6 +152,7 @@ export class SynapseService { } async sendMessage(roomName: string, message: string) { + const { EventType, MsgType } = await this.getMatrix(); const messageContent = { body: message, msgtype: MsgType.Text, @@ -130,8 +166,9 @@ export class SynapseService { */ const roomId = await this.getRoomIdByName(roomName); + const client = await this.getClient(); - const members = await this.client + const members = await client .getJoinedRoomMembers(roomId) .then((members) => members.joined); @@ -148,8 +185,14 @@ export class SynapseService { await this.joinRoom(roomId); } - await this.client - .sendEvent(roomId, EventType.RoomMessage, messageContent, '') + await client + .sendEvent( + roomId, + EventType.RoomMessage, + // eslint-disable-next-line @typescript-eslint/no-explicit-any + messageContent as any, + '' + ) .catch((reason) => { logger.logError('Failed sending message to chatroom', { roomId: roomId, @@ -163,10 +206,12 @@ export class SynapseService { async invite(roomId: string, members: ProposalUser[]) { const invitedUsers: { userId: string; invited: boolean }[] = []; const usersToBeRemoved = await this.getRoomMembers(roomId); + const { Method } = await this.getMatrix(); + const client = await this.getClient(); for (const member of members) { const userId = await produceSynapseUserId(member, this); - await this.client.http + await client.http .authedRequest( Method.Post, `/join/${roomId}`, @@ -201,7 +246,9 @@ export class SynapseService { } async getRoomByName(name: string) { - const result = await this.client.http + const { Method } = await this.getMatrix(); + const client = await this.getClient(); + const result = await client.http .authedRequest(Method.Get, '/rooms', { search_term: name }, undefined, { prefix: ADMIN_API_PREFIX_V1, }) @@ -215,8 +262,10 @@ export class SynapseService { return response.rooms; } async getUserByOidcSub(oidcSub: string) { - const result = await this.client.http - .authedRequest( + const { Method } = await this.getMatrix(); + const client = await this.getClient(); + const result = await client.http + .authedRequest( Method.Get, `/auth_providers/${oauthIssuer}/users/${oidcSub}`, {}, @@ -225,7 +274,7 @@ export class SynapseService { prefix: ADMIN_API_PREFIX_V1, } ) - .catch((reason) => { + .catch((reason: Error) => { if (!reason.message.includes('User not found')) { logger.logError('Not able to find user by oidc_sub', { message: reason.message, @@ -235,13 +284,15 @@ export class SynapseService { return undefined; }); - return result; + return result as UserId | undefined; } async getUserByEmail(email: string) { const lowerCaseEmail = email.toLowerCase(); - const result = await this.client.http - .authedRequest( + const { Method } = await this.getMatrix(); + const client = await this.getClient(); + const result = await client.http + .authedRequest( Method.Get, `/threepid/${thirdPartyId}/users/${lowerCaseEmail}`, {}, @@ -250,7 +301,7 @@ export class SynapseService { prefix: ADMIN_API_PREFIX_V1, } ) - .catch((reason) => { + .catch((reason: Error) => { if (!reason.message.includes('User not found')) { logger.logError('Not able to find user by Email', { message: reason.message, @@ -260,29 +311,31 @@ export class SynapseService { return undefined; }); - return result; + return result as UserId | undefined; } async getRoomMembers(roomId: string): Promise> { // Get all joined room members except service account const serviceAccountSynapseId = `@${serviceAccount.userId}:${serverName}`; + const { Method } = await this.getMatrix(); + const client = await this.getClient(); - const joinedRoomMembers = await this.client.http - .authedRequest<{ joined: Record }>( + const joinedRoomMembers = await client.http + .authedRequest( Method.Get, `/rooms/${roomId}/joined_members`, {}, undefined, { prefix: CLIENT_API_PREFIX_V1 } ) - .then((response) => { + .then((response: { joined: Record }) => { return new Set( Object.keys(response.joined).filter( (userId) => userId !== serviceAccountSynapseId ) ); }) - .catch((reason) => { + .catch((reason: Error) => { logger.logError('Failed to get joined room members', { reason, roomId, @@ -294,7 +347,10 @@ export class SynapseService { } async removeUserFromRoom(roomId: string, userId: string) { - return this.client.http + const { Method } = await this.getMatrix(); + const client = await this.getClient(); + + return client.http .authedRequest( Method.Post, `/rooms/${roomId}/kick`, @@ -318,17 +374,13 @@ export class SynapseService { } async getUserInfo(userId: string) { - const result = await this.client.http - .authedRequest( - Method.Get, - `/users/${userId}`, - {}, - undefined, - { - prefix: ADMIN_API_PREFIX_V2, - } - ) - .catch((reason) => { + const { Method } = await this.getMatrix(); + const client = await this.getClient(); + const result = await client.http + .authedRequest(Method.Get, `/users/${userId}`, {}, undefined, { + prefix: ADMIN_API_PREFIX_V2, + }) + .catch((reason: Error) => { logger.logError('Not able to get user information', { message: reason.message, }); @@ -336,7 +388,7 @@ export class SynapseService { return undefined; }); - return result; + return result as SynapseUser | undefined; } async getRoomIdByName(name: string) { @@ -351,8 +403,9 @@ export class SynapseService { async joinRoom(roomName: string) { const roomId = await this.getRoomIdByName(roomName); + const client = await this.getClient(); try { - await this.client.joinRoom(roomId); + await client.joinRoom(roomId); logger.logInfo('Joined room', { roomId }); } catch (reason) { logger.logError('Failed to join room', { reason, roomId }); @@ -360,9 +413,11 @@ export class SynapseService { } } - async updateUser(member: ProposalUser): Promise { + async updateUser(member: ProposalUser) { const userid = await produceSynapseUserId(member, this); - const result = await this.client.http + const { Method } = await this.getMatrix(); + const client = await this.getClient(); + const result = await client.http .authedRequest( Method.Put, `/users/${userid}`, @@ -389,7 +444,7 @@ export class SynapseService { throw reason; }); - return result as User; + return result; } async getUserId(member: ProposalUser) { @@ -406,7 +461,9 @@ export class SynapseService { async createUser(member: ProposalUser, password: string) { const userid = await produceSynapseUserId(member, this); - const result = await this.client.http + const { Method } = await this.getMatrix(); + const client = await this.getClient(); + const result = await client.http .authedRequest( Method.Put, `/users/${userid}`, @@ -437,6 +494,6 @@ export class SynapseService { throw reason; }); - return result as User; + return result; } } diff --git a/tsconfig.json b/tsconfig.json index 017c1010..2955a812 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -7,6 +7,7 @@ "es2019", "es2016", "es2020", + "es2021", "dom", "esnext.asynciterable" ] /* Specify library files to be included in the compilation. */, From 833335f9a52b6a20c1c29b45b9a28646c43daa90 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 29 May 2026 09:10:40 +0000 Subject: [PATCH 3/3] fix: address code review feedback on SynapseService - Replace `sdkCache: any` with typed `IMatrixSdk` interface - Remove redundant `!` non-null assertion from `getClient()` - Remove unnecessary `as any` cast on `sendEvent` content arg --- src/services/synapse/SynapseService.ts | 26 ++++++++++++++------------ 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/src/services/synapse/SynapseService.ts b/src/services/synapse/SynapseService.ts index b5d5ed3e..30a4a3a2 100644 --- a/src/services/synapse/SynapseService.ts +++ b/src/services/synapse/SynapseService.ts @@ -55,8 +55,16 @@ const ADMIN_API_PREFIX_V2 = '/_synapse/admin/v2'; const ADMIN_API_PREFIX_V1 = '/_synapse/admin/v1'; const CLIENT_API_PREFIX_V1 = '/_matrix/client/api/v1'; +interface IMatrixSdk { + createClient: (opts: { baseUrl: string; fetchFn?: unknown }) => unknown; + Method: Record; + Visibility: Record; + EventType: Record; + MsgType: Record; +} + export class SynapseService { - private sdkCache: any; + private sdkCache: IMatrixSdk | undefined; private clientCache: IMatrixClient | undefined; constructor() { @@ -69,12 +77,12 @@ export class SynapseService { throw new Error('SYNAPSE_SERVICE_PASSWORD is not set'); } - private async getMatrix() { + private async getMatrix(): Promise { if (!this.sdkCache) { - this.sdkCache = await import('matrix-js-sdk'); + this.sdkCache = (await import('matrix-js-sdk')) as unknown as IMatrixSdk; } - return this.sdkCache; + return this.sdkCache as IMatrixSdk; } private async getClient(): Promise { @@ -86,7 +94,7 @@ export class SynapseService { }) as IMatrixClient; } - return this.clientCache!; + return this.clientCache; } async login(consumerName = 'ChatroomCreationQueueConsumer') { @@ -186,13 +194,7 @@ export class SynapseService { } await client - .sendEvent( - roomId, - EventType.RoomMessage, - // eslint-disable-next-line @typescript-eslint/no-explicit-any - messageContent as any, - '' - ) + .sendEvent(roomId, EventType.RoomMessage, messageContent, '') .catch((reason) => { logger.logError('Failed sending message to chatroom', { roomId: roomId,