From af10b0c44b4a427c8d2224bfd6feb03a12cfd27e Mon Sep 17 00:00:00 2001 From: David Baker Date: Wed, 14 Jun 2023 12:11:22 +0100 Subject: [PATCH 01/76] Add hacky option to disable the actual calling part of group calls. So we can try using livekit instead. --- src/client.ts | 11 +++++++++++ src/webrtc/groupCall.ts | 26 +++++++++++++++++++++----- src/webrtc/groupCallEventHandler.ts | 1 + 3 files changed, 33 insertions(+), 5 deletions(-) diff --git a/src/client.ts b/src/client.ts index bf7b5adfcc5..1adffd01c63 100644 --- a/src/client.ts +++ b/src/client.ts @@ -381,6 +381,12 @@ export interface ICreateClientOpts { * Default: false. */ isVoipWithNoMediaAllowed?: boolean; + + /** + * If true, group calls will not establish media connectivity and only create the signaling events, + * so that livekit media can be used in the application layert (js-sdk contains no livekit code). + */ + useLivekitForGroupCalls?: boolean; } export interface IMatrixClientCreateOpts extends ICreateClientOpts { @@ -1205,6 +1211,8 @@ export class MatrixClient extends TypedEventEmitter { @@ -1931,6 +1941,7 @@ export class MatrixClient extends TypedEventEmitter { + if (this.useLivekit) { + logger.info("Livekit group call: not starting local call feed."); + return; + } + if (this.state !== GroupCallState.LocalCallFeedUninitialized) { throw new Error(`Cannot initialize local call feed in the "${this.state}" state.`); } @@ -537,11 +546,13 @@ export class GroupCall extends TypedEventEmitter< this.onIncomingCall(call); } - this.retryCallLoopInterval = setInterval(this.onRetryCallLoop, this.retryCallInterval); + if (!this.useLivekit) { + this.retryCallLoopInterval = setInterval(this.onRetryCallLoop, this.retryCallInterval); - this.activeSpeaker = undefined; - this.onActiveSpeakerLoop(); - this.activeSpeakerLoopInterval = setInterval(this.onActiveSpeakerLoop, this.activeSpeakerInterval); + this.activeSpeaker = undefined; + this.onActiveSpeakerLoop(); + this.activeSpeakerLoopInterval = setInterval(this.onActiveSpeakerLoop, this.activeSpeakerInterval); + } } private dispose(): void { @@ -923,6 +934,11 @@ export class GroupCall extends TypedEventEmitter< return; } + if (this.useLivekit) { + logger.info("Received incoming call whilst in signaling-only mode! Ignoring."); + return; + } + const deviceMap = this.calls.get(opponentUserId) ?? new Map(); const prevCall = deviceMap.get(newCall.getOpponentDeviceId()!); @@ -1629,7 +1645,7 @@ export class GroupCall extends TypedEventEmitter< } }); - if (this.state === GroupCallState.Entered) this.placeOutgoingCalls(); + if (this.state === GroupCallState.Entered && !this.useLivekit) this.placeOutgoingCalls(); // Update the participants stored in the stats object }; diff --git a/src/webrtc/groupCallEventHandler.ts b/src/webrtc/groupCallEventHandler.ts index 08487bdd234..58ac18b5bc8 100644 --- a/src/webrtc/groupCallEventHandler.ts +++ b/src/webrtc/groupCallEventHandler.ts @@ -189,6 +189,7 @@ export class GroupCallEventHandler { content?.dataChannelsEnabled || this.client.isVoipWithNoMediaAllowed, dataChannelOptions, this.client.isVoipWithNoMediaAllowed, + this.client.useLivekitForGroupCalls, ); this.groupCalls.set(room.roomId, groupCall); From 4b3406daa95c8f969f386341b8b632ba4a60501a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0imon=20Brandner?= Date: Wed, 5 Jul 2023 14:28:57 +0200 Subject: [PATCH 02/76] Put LiveKit info into the `m.call` state event (#3522) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Put LK info into state Signed-off-by: Šimon Brandner * Update to the new way the LK service works Signed-off-by: Šimon Brandner --------- Signed-off-by: Šimon Brandner --- src/client.ts | 11 +++++++++++ src/webrtc/callEventTypes.ts | 4 ++++ src/webrtc/groupCall.ts | 17 ++++++++++++++++- src/webrtc/groupCallEventHandler.ts | 15 +++++++++++++++ 4 files changed, 46 insertions(+), 1 deletion(-) diff --git a/src/client.ts b/src/client.ts index 1adffd01c63..109ab91e714 100644 --- a/src/client.ts +++ b/src/client.ts @@ -209,6 +209,7 @@ import { ServerSideSecretStorage, ServerSideSecretStorageImpl, } from "./secret-storage"; +import { FocusInfo } from "./webrtc/callEventTypes"; export type Store = IStore; @@ -367,6 +368,8 @@ export interface ICreateClientOpts { */ useE2eForGroupCall?: boolean; + foci?: FocusInfo[]; + cryptoCallbacks?: ICryptoCallbacks; /** @@ -1260,6 +1263,7 @@ export class MatrixClient extends TypedEventEmitter Date: Fri, 7 Jul 2023 10:27:55 +0100 Subject: [PATCH 03/76] Send 'contentLoaded' event As per comment, so we can start digging ourselves out of the widget API hole we're currently in. --- src/embedded.ts | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/embedded.ts b/src/embedded.ts index c2c30105a42..3a64c30e84b 100644 --- a/src/embedded.ts +++ b/src/embedded.ts @@ -151,6 +151,12 @@ export class RoomWidgetClient extends MatrixClient { // Open communication with the host widgetApi.start(); + // Send a content loaded event now we've started the widget API + // Note that element-web currently does not use waitForIFrameLoad=false and so + // does *not* (yes, that is the right way around) wait for this event. Let's + // start sending this, then once this has rolled out, we can change element-web to + // use waitForIFrameLoad=false and have a widget API that's less racy. + widgetApi.sendContentLoaded(); } public async startClient(opts: IStartClientOpts = {}): Promise { From 44cebce52b9b8adfb3d794939833f89d46a0c462 Mon Sep 17 00:00:00 2001 From: David Baker Date: Mon, 10 Jul 2023 13:28:03 +0100 Subject: [PATCH 04/76] Add comment on updating the livekit service URL --- src/webrtc/groupCallEventHandler.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/webrtc/groupCallEventHandler.ts b/src/webrtc/groupCallEventHandler.ts index e52302c0c83..979c9a91645 100644 --- a/src/webrtc/groupCallEventHandler.ts +++ b/src/webrtc/groupCallEventHandler.ts @@ -188,6 +188,9 @@ export class GroupCallEventHandler { } else { focus = this.client.getFoci()[0]!; content["io.element.livekit_service_url"] = focus.livekitServiceUrl; + // try to update the state event to add our livekit service url. We may not be able to + // as we don't currently have permission to send this event in embedded mode + // (although it doesn't actually appear to reject when it fails). this.client.sendStateEvent(room.roomId, EventType.GroupCallPrefix, content, groupCallId); } From 07dd1bd947e1ecbd2ecc62e3d2f6aa08824d5307 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0imon=20Brandner?= Date: Mon, 10 Jul 2023 15:41:19 +0200 Subject: [PATCH 05/76] Appease CI on `livekit` branch (#3566) --- spec/test-utils/webrtc.ts | 1 + spec/unit/embedded.spec.ts | 1 + spec/unit/webrtc/groupCallEventHandler.spec.ts | 3 ++- 3 files changed, 4 insertions(+), 1 deletion(-) diff --git a/spec/test-utils/webrtc.ts b/spec/test-utils/webrtc.ts index d4d50b458d7..41ab56c84dd 100644 --- a/spec/test-utils/webrtc.ts +++ b/spec/test-utils/webrtc.ts @@ -485,6 +485,7 @@ export class MockCallMatrixClient extends TypedEventEmitter().mockReturnValue([]); public getRoom = jest.fn(); + public getFoci = jest.fn(); public supportsThreads(): boolean { return true; diff --git a/spec/unit/embedded.spec.ts b/spec/unit/embedded.spec.ts index caab40ac056..3593769ee89 100644 --- a/spec/unit/embedded.spec.ts +++ b/spec/unit/embedded.spec.ts @@ -51,6 +51,7 @@ class MockWidgetApi extends EventEmitter { public sendToDevice = jest.fn(); public readStateEvents = jest.fn(() => []); public getTurnServers = jest.fn(() => []); + public sendContentLoaded = jest.fn(); public transport = { reply: jest.fn() }; } diff --git a/spec/unit/webrtc/groupCallEventHandler.spec.ts b/spec/unit/webrtc/groupCallEventHandler.spec.ts index c8d65538c60..7fe5cb6a014 100644 --- a/spec/unit/webrtc/groupCallEventHandler.spec.ts +++ b/spec/unit/webrtc/groupCallEventHandler.spec.ts @@ -71,7 +71,8 @@ describe("Group Call Event Handler", function () { getMember: (userId: string) => (userId === FAKE_USER_ID ? mockMember : null), } as unknown as Room; - (mockClient as any).getRoom = jest.fn().mockReturnValue(mockRoom); + mockClient.getRoom = jest.fn().mockReturnValue(mockRoom); + mockClient.getFoci.mockReturnValue([{}]); }); describe("reacts to state changes", () => { From 71c944edfe9ca871e15e169a836b0f3df2f06d2a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0imon=20Brandner?= Date: Mon, 10 Jul 2023 15:51:38 +0200 Subject: [PATCH 06/76] Update codeowners on `livekit` branch (#3567) --- .github/CODEOWNERS | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index dd0bfc9ebfa..dd7aeb18c10 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -1,6 +1 @@ -* @matrix-org/element-web -/.github/workflows/** @matrix-org/element-web-app-team -/package.json @matrix-org/element-web-app-team -/yarn.lock @matrix-org/element-web-app-team -/src/webrtc @matrix-org/element-call-reviewers -/spec/*/webrtc @matrix-org/element-call-reviewers +* @matrix-org/element-call-reviewers From 2756ea023be71198513c53439af45866df0004a3 Mon Sep 17 00:00:00 2001 From: Timo K Date: Mon, 10 Jul 2023 16:56:56 +0200 Subject: [PATCH 07/76] add getOpenIdToken to embedded client backend Signed-off-by: Timo K --- src/embedded.ts | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/src/embedded.ts b/src/embedded.ts index 3a64c30e84b..80235dab7e0 100644 --- a/src/embedded.ts +++ b/src/embedded.ts @@ -29,7 +29,14 @@ import { MatrixEvent, IEvent, IContent, EventStatus } from "./models/event"; import { ISendEventResponse } from "./@types/requests"; import { EventType } from "./@types/event"; import { logger } from "./logger"; -import { MatrixClient, ClientEvent, IMatrixClientCreateOpts, IStartClientOpts, SendToDeviceContentMap } from "./client"; +import { + MatrixClient, + ClientEvent, + IMatrixClientCreateOpts, + IStartClientOpts, + SendToDeviceContentMap, + IOpenIDToken, +} from "./client"; import { SyncApi, SyncState } from "./sync"; import { SlidingSyncSdk } from "./sliding-sync-sdk"; import { User } from "./models/user"; @@ -245,6 +252,18 @@ export class RoomWidgetClient extends MatrixClient { return {}; } + public async getOpenIdToken(): Promise { + const token = await this.widgetApi.requestOpenIDConnectToken(); + // the IOpenIDCredentials from the widget-api and IOpenIDToken form the matrix-js-sdk are compatible. + // we still recreate the token to make this transparent and cathcable by the linter in case the types change in the future. + return { + access_token: token.access_token, + expires_in: token.expires_in, + matrix_server_name: token.matrix_server_name, + token_type: token.token_type, + }; + } + public async queueToDevice({ eventType, batch }: ToDeviceBatch): Promise { // map: user Id → device Id → payload const contentMap: MapWithDefault> = new MapWithDefault(() => new Map()); From 9eae6b280cbd1b76ce7c16b9db521f0995a100d1 Mon Sep 17 00:00:00 2001 From: Timo K Date: Mon, 10 Jul 2023 17:27:38 +0200 Subject: [PATCH 08/76] add test and update comment Signed-off-by: Timo K --- spec/unit/embedded.spec.ts | 28 ++++++++++++++++++++++++++-- src/embedded.ts | 2 +- 2 files changed, 27 insertions(+), 3 deletions(-) diff --git a/spec/unit/embedded.spec.ts b/spec/unit/embedded.spec.ts index 3593769ee89..115e0a419ca 100644 --- a/spec/unit/embedded.spec.ts +++ b/spec/unit/embedded.spec.ts @@ -23,7 +23,14 @@ limitations under the License. // eslint-disable-next-line no-restricted-imports import { EventEmitter } from "events"; import { MockedObject } from "jest-mock"; -import { WidgetApi, WidgetApiToWidgetAction, MatrixCapabilities, ITurnServer, IRoomEvent } from "matrix-widget-api"; +import { + WidgetApi, + WidgetApiToWidgetAction, + MatrixCapabilities, + ITurnServer, + IRoomEvent, + IOpenIDCredentials, +} from "matrix-widget-api"; import { createRoomWidgetClient, MsgType } from "../../src/matrix"; import { MatrixClient, ClientEvent, ITurnServer as IClientTurnServer } from "../../src/client"; @@ -33,6 +40,12 @@ import { MatrixEvent } from "../../src/models/event"; import { ToDeviceBatch } from "../../src/models/ToDeviceMessage"; import { DeviceInfo } from "../../src/crypto/deviceinfo"; +const testOIDCToken = { + access_token: "12345678", + expires_in: "10", + matrix_server_name: "homeserver.oabc", + token_type: "Bearer", +}; class MockWidgetApi extends EventEmitter { public start = jest.fn(); public requestCapability = jest.fn(); @@ -49,6 +62,12 @@ class MockWidgetApi extends EventEmitter { public sendRoomEvent = jest.fn(() => ({ event_id: `$${Math.random()}` })); public sendStateEvent = jest.fn(); public sendToDevice = jest.fn(); + public requestOpenIDConnectToken = jest.fn(() => { + return testOIDCToken; + return new Promise(() => { + return testOIDCToken; + }); + }); public readStateEvents = jest.fn(() => []); public getTurnServers = jest.fn(() => []); public sendContentLoaded = jest.fn(); @@ -286,7 +305,12 @@ describe("RoomWidgetClient", () => { expect(await emittedSync).toEqual(SyncState.Syncing); }); }); - + describe("oidc token", () => { + it("requests an oidc token", async () => { + await makeClient({}); + expect(await client.getOpenIdToken()).toStrictEqual(testOIDCToken); + }); + }); it("gets TURN servers", async () => { const server1: ITurnServer = { uris: [ diff --git a/src/embedded.ts b/src/embedded.ts index 80235dab7e0..04bc051672f 100644 --- a/src/embedded.ts +++ b/src/embedded.ts @@ -255,7 +255,7 @@ export class RoomWidgetClient extends MatrixClient { public async getOpenIdToken(): Promise { const token = await this.widgetApi.requestOpenIDConnectToken(); // the IOpenIDCredentials from the widget-api and IOpenIDToken form the matrix-js-sdk are compatible. - // we still recreate the token to make this transparent and cathcable by the linter in case the types change in the future. + // we still recreate the token to make this transparent and catch'able by the linter in case the types change in the future. return { access_token: token.access_token, expires_in: token.expires_in, From 82975888df60f53e5429471479403b4bfa049079 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0imon=20Brandner?= Date: Mon, 10 Jul 2023 17:35:39 +0200 Subject: [PATCH 09/76] Merge `develop` into `livekit` (#3569) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Co-authored-by: Richard van der Hoff <1389908+richvdh@users.noreply.github.com> Co-authored-by: Michael Telatynski <7t3chguy@gmail.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: RiotRobot Co-authored-by: Florian Duros Co-authored-by: Kerry Co-authored-by: David Baker Co-authored-by: Erik Johnston Co-authored-by: Valere Co-authored-by: Hubert Chathi Close IDB database before deleting it to prevent spurious unexpected close errors (#3478) Fix export type `GeneratedSecretStorageKey` (#3479) Fix order of things in `crypto-api.ts` (#3491) Fix bug where switching media caused media in subsequent calls to fail (#3489) fixes (#3515) fix the integ tests, where #3509 etc fix the unit tests. fix breakage on node 16 (#3527) Fix an instance of failed to decrypt error when an in flight `/keys/query` fails. (#3486) Fix `TypedEventEmitter::removeAllListeners(void)` not working (#3561) --- .eslintrc.js | 2 +- .github/workflows/cypress.yml | 2 +- .github/workflows/downstream-artifacts.yml | 2 +- .github/workflows/tests.yml | 5 +- .github/workflows/upgrade_dependencies.yml | 2 +- CHANGELOG.md | 48 + README.md | 2 + package.json | 12 +- spec/integ/crypto/cross-signing.spec.ts | 38 +- spec/integ/crypto/crypto.spec.ts | 288 +- spec/integ/crypto/verification.spec.ts | 828 +++-- .../matrix-client-event-timeline.spec.ts | 107 +- spec/test-utils/E2EKeyReceiver.ts | 7 + spec/test-utils/E2EKeyResponder.ts | 123 + spec/test-utils/mockEndpoints.ts | 25 + spec/test-utils/oidc.ts | 53 + spec/test-utils/thread.ts | 2 +- spec/unit/autodiscovery.spec.ts | 94 +- spec/unit/event-timeline-set.spec.ts | 29 + spec/unit/interactive-auth.spec.ts | 1 - spec/unit/models/event.spec.ts | 21 + spec/unit/models/thread.spec.ts | 12 +- spec/unit/oidc/authorize.spec.ts | 283 ++ spec/unit/oidc/register.spec.ts | 84 + spec/unit/oidc/validate.spec.ts | 142 +- spec/unit/room.spec.ts | 20 +- spec/unit/rust-crypto/rust-crypto.spec.ts | 197 +- spec/unit/rust-crypto/verification.spec.ts | 102 + src/@types/auth.ts | 166 +- src/@types/registration.ts | 116 + src/@types/requests.ts | 3 +- src/autodiscovery.ts | 82 +- src/client.ts | 168 +- src/common-crypto/CryptoBackend.ts | 10 - src/crypto-api.ts | 186 +- src/crypto-api/keybackup.ts | 42 + src/crypto-api/verification.ts | 23 +- src/crypto/algorithms/olm.ts | 29 +- src/crypto/api.ts | 48 +- src/crypto/backup.ts | 18 + src/crypto/index.ts | 87 +- src/crypto/keybackup.ts | 27 +- src/crypto/verification/QRCode.ts | 3 +- src/crypto/verification/SAS.ts | 29 +- .../request/VerificationRequest.ts | 22 +- src/interactive-auth.ts | 178 +- src/logger.ts | 6 +- src/models/event-timeline-set.ts | 24 +- src/models/event.ts | 39 +- src/models/read-receipt.ts | 9 + src/models/room.ts | 5 + src/models/thread.ts | 68 +- src/models/typed-event-emitter.ts | 4 + src/oidc/authorize.ts | 265 ++ src/oidc/discovery.ts | 61 + src/oidc/error.ts | 28 + src/oidc/register.ts | 111 + src/oidc/validate.ts | 159 +- src/rust-crypto/index.ts | 27 +- src/rust-crypto/rust-crypto.ts | 318 +- src/rust-crypto/verification.ts | 517 ++++ src/store/indexeddb-local-backend.ts | 6 +- src/webrtc/mediaHandler.ts | 12 + yarn.lock | 2725 +++++++++-------- 64 files changed, 5950 insertions(+), 2202 deletions(-) create mode 100644 spec/test-utils/E2EKeyResponder.ts create mode 100644 spec/test-utils/oidc.ts create mode 100644 spec/unit/oidc/authorize.spec.ts create mode 100644 spec/unit/oidc/register.spec.ts create mode 100644 spec/unit/rust-crypto/verification.spec.ts create mode 100644 src/@types/registration.ts create mode 100644 src/crypto-api/keybackup.ts create mode 100644 src/oidc/authorize.ts create mode 100644 src/oidc/discovery.ts create mode 100644 src/oidc/error.ts create mode 100644 src/oidc/register.ts create mode 100644 src/rust-crypto/verification.ts diff --git a/.eslintrc.js b/.eslintrc.js index 1a2b5f822f2..7db8e71402f 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -74,7 +74,7 @@ module.exports = { "jest/no-standalone-expect": [ "error", { - additionalTestBlockFunctions: ["beforeAll", "beforeEach", "oldBackendOnly"], + additionalTestBlockFunctions: ["beforeAll", "beforeEach", "oldBackendOnly", "newBackendOnly"], }, ], }, diff --git a/.github/workflows/cypress.yml b/.github/workflows/cypress.yml index c6c715ceaf7..2724ff37d0c 100644 --- a/.github/workflows/cypress.yml +++ b/.github/workflows/cypress.yml @@ -15,7 +15,7 @@ concurrency: jobs: cypress: name: Cypress - uses: matrix-org/matrix-react-sdk/.github/workflows/cypress.yaml@develop + uses: matrix-org/matrix-react-sdk/.github/workflows/cypress.yaml@v3.74.0 permissions: actions: read issues: read diff --git a/.github/workflows/downstream-artifacts.yml b/.github/workflows/downstream-artifacts.yml index b16528cb66c..d2056eac1e5 100644 --- a/.github/workflows/downstream-artifacts.yml +++ b/.github/workflows/downstream-artifacts.yml @@ -19,7 +19,7 @@ concurrency: jobs: build-element-web: name: Build element-web - uses: matrix-org/matrix-react-sdk/.github/workflows/element-web.yaml@develop + uses: matrix-org/matrix-react-sdk/.github/workflows/element-web.yaml@v3.74.0 with: matrix-js-sdk-sha: ${{ github.sha }} react-sdk-repository: matrix-org/matrix-react-sdk diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index f76a23bf486..46512cd9119 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -18,7 +18,7 @@ jobs: strategy: matrix: specs: [browserify, integ, unit] - node: [16, 18, latest] + node: [18, latest] steps: - name: Checkout code uses: actions/checkout@v3 @@ -50,6 +50,9 @@ jobs: env: JEST_SONAR_UNIQUE_OUTPUT_NAME: true + # tell jest to use coloured output + FORCE_COLOR: true + - name: Move coverage files into place if: env.ENABLE_COVERAGE == 'true' run: mv coverage/lcov.info coverage/${{ matrix.node }}-${{ matrix.specs }}.lcov.info diff --git a/.github/workflows/upgrade_dependencies.yml b/.github/workflows/upgrade_dependencies.yml index e86e7694a7a..46fc2cde730 100644 --- a/.github/workflows/upgrade_dependencies.yml +++ b/.github/workflows/upgrade_dependencies.yml @@ -20,7 +20,7 @@ jobs: - name: Create Pull Request id: cpr - uses: peter-evans/create-pull-request@284f54f989303d2699d373481a0cfa13ad5a6666 # v5 + uses: peter-evans/create-pull-request@153407881ec5c347639a548ade7d8ad1d6740e38 # v5 with: token: ${{ secrets.ELEMENT_BOT_TOKEN }} branch: actions/upgrade-deps diff --git a/CHANGELOG.md b/CHANGELOG.md index 2e64473376c..5a0e121a4a9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,51 @@ +Changes in [26.2.0](https://github.com/matrix-org/matrix-js-sdk/releases/tag/v26.2.0) (2023-07-04) +================================================================================================== + +## 🦖 Deprecations + * The Browserify artifact is being deprecated, scheduled for removal in the October 10th release cycle. ([\#3189](https://github.com/matrix-org/matrix-js-sdk/issues/3189)). + * ElementR: Add `CryptoApi#bootstrapSecretStorage` ([\#3483](https://github.com/matrix-org/matrix-js-sdk/pull/3483)). Contributed by @florianduros. + * Deprecate `MatrixClient.findVerificationRequestDMInProgress`, `MatrixClient.getVerificationRequestsToDeviceInProgress`, and `MatrixClient.requestVerification`, in favour of methods in `CryptoApi`. ([\#3474](https://github.com/matrix-org/matrix-js-sdk/pull/3474)). + * Introduce a new `Crypto.VerificationRequest` interface, and deprecate direct access to the old `VerificationRequest` class. Also deprecate some related classes that were exported from `src/crypto/verification/request/VerificationRequest` ([\#3449](https://github.com/matrix-org/matrix-js-sdk/pull/3449)). + +## ✨ Features + * OIDC: navigate to authorization endpoint ([\#3499](https://github.com/matrix-org/matrix-js-sdk/pull/3499)). Contributed by @kerryarchibald. + * Support for interactive device verification in Element-R. ([\#3505](https://github.com/matrix-org/matrix-js-sdk/pull/3505)). + * Support for interactive device verification in Element-R. ([\#3508](https://github.com/matrix-org/matrix-js-sdk/pull/3508)). + * Support for interactive device verification in Element-R. ([\#3490](https://github.com/matrix-org/matrix-js-sdk/pull/3490)). Fixes vector-im/element-web#25316. + * Element-R: Store cross signing keys in secret storage ([\#3498](https://github.com/matrix-org/matrix-js-sdk/pull/3498)). Contributed by @florianduros. + * OIDC: add dynamic client registration util function ([\#3481](https://github.com/matrix-org/matrix-js-sdk/pull/3481)). Contributed by @kerryarchibald. + * Add getLastUnthreadedReceiptFor utility to Thread delegating to the underlying Room ([\#3493](https://github.com/matrix-org/matrix-js-sdk/pull/3493)). + * ElementR: Add `rust-crypto#createRecoveryKeyFromPassphrase` implementation ([\#3472](https://github.com/matrix-org/matrix-js-sdk/pull/3472)). Contributed by @florianduros. + +## 🐛 Bug Fixes + * Aggregate relations regardless of whether event fits into the timeline ([\#3496](https://github.com/matrix-org/matrix-js-sdk/pull/3496)). Fixes vector-im/element-web#25596. + * Fix bug where switching media caused media in subsequent calls to fail ([\#3489](https://github.com/matrix-org/matrix-js-sdk/pull/3489)). + * Fix: remove polls from room state on redaction ([\#3475](https://github.com/matrix-org/matrix-js-sdk/pull/3475)). Fixes vector-im/element-web#25573. Contributed by @kerryarchibald. + * Fix export type `GeneratedSecretStorageKey` ([\#3479](https://github.com/matrix-org/matrix-js-sdk/pull/3479)). Contributed by @florianduros. + * Close IDB database before deleting it to prevent spurious unexpected close errors ([\#3478](https://github.com/matrix-org/matrix-js-sdk/pull/3478)). Fixes vector-im/element-web#25597. + +Changes in [26.1.0](https://github.com/matrix-org/matrix-js-sdk/releases/tag/v26.1.0) (2023-06-20) +================================================================================================== + +## 🦖 Deprecations + * Introduce a new `Crypto.Verifier` interface, and deprecate direct access to `VerificationBase`, `SAS` and `ReciprocateQRCode` ([\#3414](https://github.com/matrix-org/matrix-js-sdk/pull/3414)). + +## ✨ Features + * Add `rust-crypto#isCrossSigningReady` implementation ([\#3462](https://github.com/matrix-org/matrix-js-sdk/pull/3462)). Contributed by @florianduros. + * OIDC: Validate `m.authentication` configuration ([\#3419](https://github.com/matrix-org/matrix-js-sdk/pull/3419)). Contributed by @kerryarchibald. + * ElementR: Add `CryptoApi.getCrossSigningStatus` ([\#3452](https://github.com/matrix-org/matrix-js-sdk/pull/3452)). Contributed by @florianduros. + * Extend stats summary with call device and user count based on room state ([\#3424](https://github.com/matrix-org/matrix-js-sdk/pull/3424)). Contributed by @toger5. + * Update MSC3912 implementation to use `with_rel_type` instead of `with_relations` ([\#3420](https://github.com/matrix-org/matrix-js-sdk/pull/3420)). + * Export thread-related types from SDK ([\#3447](https://github.com/matrix-org/matrix-js-sdk/pull/3447)). Contributed by @stas-demydiuk. + * Use correct /v3 prefix for /refresh ([\#3016](https://github.com/matrix-org/matrix-js-sdk/pull/3016)). Contributed by @davidisaaclee. + +## 🐛 Bug Fixes + * Fix thread list being ordered based on all updates ([\#3458](https://github.com/matrix-org/matrix-js-sdk/pull/3458)). Fixes vector-im/element-web#25522. + * Fix: handle `baseUrl` with trailing slash in `fetch.getUrl` ([\#3455](https://github.com/matrix-org/matrix-js-sdk/pull/3455)). Fixes vector-im/element-web#25526. Contributed by @kerryarchibald. + * use cli.canSupport to determine intentional mentions support ([\#3445](https://github.com/matrix-org/matrix-js-sdk/pull/3445)). Fixes vector-im/element-web#25497. Contributed by @kerryarchibald. + * Make sliding sync linearize processing of sync requests ([\#3442](https://github.com/matrix-org/matrix-js-sdk/pull/3442)). + * Fix edge cases around 2nd order relations and threads ([\#3437](https://github.com/matrix-org/matrix-js-sdk/pull/3437)). + Changes in [26.0.1](https://github.com/matrix-org/matrix-js-sdk/releases/tag/v26.0.1) (2023-06-09) ================================================================================================== diff --git a/README.md b/README.md index 6d5aaa77662..ee41f49b0e2 100644 --- a/README.md +++ b/README.md @@ -21,6 +21,8 @@ endpoints from before Matrix 1.1, for example. ## In a browser +### Note, the browserify build has been deprecated. Please use a bundler like webpack or vite instead. + Download the browser version from https://github.com/matrix-org/matrix-js-sdk/releases/latest and add that as a `