From 276b52f0fe4b70e1e95a88853d8e1b2e1f3ec10b Mon Sep 17 00:00:00 2001 From: Hubert Chathi Date: Wed, 14 Apr 2021 10:29:39 -0400 Subject: [PATCH 01/19] add missing await --- src/client.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/client.js b/src/client.js index f845a5a08..f344bce87 100644 --- a/src/client.js +++ b/src/client.js @@ -500,7 +500,7 @@ MatrixClient.prototype.rehydrateDevice = async function() { return; } - const getDeviceResult = this.getDehydratedDevice(); + const getDeviceResult = await this.getDehydratedDevice(); if (!getDeviceResult) { return; } From 338301bb5dd50fff05ecfe7c7c7b467da8ad22b2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hanno=20J=2E=20G=C3=B6decke?= Date: Sat, 17 Apr 2021 09:34:31 +0200 Subject: [PATCH 02/19] fix: failure during sync --- src/pushprocessor.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/pushprocessor.js b/src/pushprocessor.js index 57ab74317..711f3b488 100644 --- a/src/pushprocessor.js +++ b/src/pushprocessor.js @@ -267,6 +267,10 @@ export function PushProcessor(client) { if (cond.value) { return cond.value === val; } + + if (typeof cond.pattern !== 'string') { + return false; + } let regex; From b13f5aebfd39a7d54861b334e876ab811999149a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hanno=20J=2E=20G=C3=B6decke?= Date: Sat, 17 Apr 2021 09:42:44 +0200 Subject: [PATCH 03/19] lint --- src/pushprocessor.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pushprocessor.js b/src/pushprocessor.js index 711f3b488..0e8958b09 100644 --- a/src/pushprocessor.js +++ b/src/pushprocessor.js @@ -267,7 +267,7 @@ export function PushProcessor(client) { if (cond.value) { return cond.value === val; } - + if (typeof cond.pattern !== 'string') { return false; } From dc12b1df004fc4c2d6060d3d2acfd7d163eb4006 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hanno=20J=2E=20G=C3=B6decke?= Date: Sun, 18 Apr 2021 16:01:51 +0200 Subject: [PATCH 04/19] feat: room.getMembers MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Hanno Gödecke --- src/models/room.js | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/models/room.js b/src/models/room.js index d6b6a8d9d..7bb263320 100644 --- a/src/models/room.js +++ b/src/models/room.js @@ -982,6 +982,15 @@ Room.prototype.addEventsToTimeline = function(events, toStartOfTimeline, return this.currentState.getMember(userId); }; +/** + * Get all currently loaded members from the current + * room state. + * @returns {RoomMember[]} Room members + */ +Room.prototype.getMembers = function() { + return this.currentState.getMembers(); +}; + /** * Get a list of members whose membership state is "join". * @return {RoomMember[]} A list of currently joined members. From c0af2f25a1cb9a1d18f2943f600b9016342967fb Mon Sep 17 00:00:00 2001 From: David Baker Date: Mon, 19 Apr 2021 20:28:42 +0100 Subject: [PATCH 05/19] Support MSC3086 asserted identity --- src/@types/event.ts | 2 ++ src/webrtc/call.ts | 23 +++++++++++++++++++++++ src/webrtc/callEventHandler.ts | 17 ++++++++++++++++- 3 files changed, 41 insertions(+), 1 deletion(-) diff --git a/src/@types/event.ts b/src/@types/event.ts index 92f90ea62..a908088d7 100644 --- a/src/@types/event.ts +++ b/src/@types/event.ts @@ -53,6 +53,8 @@ export enum EventType { CallSelectAnswer = "m.call.select_answer", CallNegotiate = "m.call.negotiate", CallReplaces = "m.call.replaces", + CallAssertedIdentity = "m.call.asserted_identity", + CallAssertedIdentityPrefix = "org.matrix.call.asserted_identity", KeyVerificationRequest = "m.key.verification.request", KeyVerificationStart = "m.key.verification.start", KeyVerificationCancel = "m.key.verification.cancel", diff --git a/src/webrtc/call.ts b/src/webrtc/call.ts index 53680702a..4dabf2984 100644 --- a/src/webrtc/call.ts +++ b/src/webrtc/call.ts @@ -62,6 +62,11 @@ interface TurnServer { ttl?: number, } +interface AssertedIdentity { + id: string, + displayName: string, +} + export enum CallState { Fledgling = 'fledgling', InviteSent = 'invite_sent', @@ -101,6 +106,8 @@ export enum CallEvent { RemoteHoldUnhold = 'remote_hold_unhold', // backwards compat alias for LocalHoldUnhold: remove in a major version bump HoldUnhold = 'hold_unhold', + + AssertedIdentityChanged = 'asserted_identity_changed', } export enum CallErrorCode { @@ -292,6 +299,8 @@ export class MatrixCall extends EventEmitter { // the call) we buffer them up here so we can then add the ones from the party we pick private remoteCandidateBuffer = new Map(); + private remoteAssertedIdentity: AssertedIdentity; + constructor(opts: CallOpts) { super(); this.roomId = opts.roomId; @@ -419,6 +428,10 @@ export class MatrixCall extends EventEmitter { return Boolean(this.opponentCaps && this.opponentCaps["m.call.transferee"]); } + public getRemoteAssertedIdentity(): AssertedIdentity { + return this.remoteAssertedIdentity; + } + /** * Retrieve the local <video> DOM element. * @return {Element} The dom element @@ -1199,6 +1212,16 @@ export class MatrixCall extends EventEmitter { } } + async onAssertedIdentityReceived(event: MatrixEvent) { + if (!event.getContent().asserted_identity) return; + + this.remoteAssertedIdentity = { + id: event.getContent().asserted_identity.id, + displayName: event.getContent().asserted_identity.displayName, + }; + this.emit(CallEvent.AssertedIdentityChanged); + } + private callHasEnded(): boolean { // This exists as workaround to typescript trying to be clever and erroring // when putting if (this.state === CallState.Ended) return; twice in the same diff --git a/src/webrtc/callEventHandler.ts b/src/webrtc/callEventHandler.ts index c45bf62b3..58145724e 100644 --- a/src/webrtc/callEventHandler.ts +++ b/src/webrtc/callEventHandler.ts @@ -87,7 +87,11 @@ export class CallEventHandler { private onEvent = (event: MatrixEvent) => { // any call events or ones that might be once they're decrypted - if (event.getType().indexOf("m.call.") === 0 || event.isBeingDecrypted()) { + if ( + event.getType().indexOf("m.call.") === 0 || + event.getType().indexOf("org.matrix.call.") === 0 + || event.isBeingDecrypted() + ) { // queue up for processing once all events from this sync have been // processed (see above). this.callEventBuffer.push(event); @@ -271,6 +275,17 @@ export class CallEventHandler { } call.onNegotiateReceived(event); + } else if ( + event.getType() === EventType.CallAssertedIdentity || event.getType() === EventType.CallAssertedIdentityPrefix + ) { + if (!call) return; + + if (event.getContent().party_id === call.ourPartyId) { + // Ignore remote echo (not that we send asserted identity, but still...) + return; + } + + call.onAssertedIdentityReceived(event); } } } From 56797948afc4c09055313c3ef13d6551772a5b1e Mon Sep 17 00:00:00 2001 From: David Baker Date: Mon, 19 Apr 2021 20:36:00 +0100 Subject: [PATCH 06/19] lint --- src/webrtc/callEventHandler.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/webrtc/callEventHandler.ts b/src/webrtc/callEventHandler.ts index 58145724e..9c4c38b26 100644 --- a/src/webrtc/callEventHandler.ts +++ b/src/webrtc/callEventHandler.ts @@ -276,7 +276,8 @@ export class CallEventHandler { call.onNegotiateReceived(event); } else if ( - event.getType() === EventType.CallAssertedIdentity || event.getType() === EventType.CallAssertedIdentityPrefix + event.getType() === EventType.CallAssertedIdentity || + event.getType() === EventType.CallAssertedIdentityPrefix ) { if (!call) return; From 1b31d0622e6a216b66e8cebc8ff43676c40da5bf Mon Sep 17 00:00:00 2001 From: David Baker Date: Tue, 20 Apr 2021 11:08:06 +0100 Subject: [PATCH 07/19] Unit test for asserted identity messages --- spec/unit/webrtc/call.spec.ts | 39 +++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/spec/unit/webrtc/call.spec.ts b/spec/unit/webrtc/call.spec.ts index 0e7b67547..6a9d0cd52 100644 --- a/spec/unit/webrtc/call.spec.ts +++ b/spec/unit/webrtc/call.spec.ts @@ -254,4 +254,43 @@ describe('Call', function() { sdpMid: '', }); }); + + it('should map asserted identity messages to remoteAssertedIdentity', async function() { + const callPromise = call.placeVoiceCall(); + await client.httpBackend.flush(); + await callPromise; + await call.onAnswerReceived({ + getContent: () => { + return { + version: 1, + call_id: call.callId, + party_id: 'party_id', + answer: { + sdp: DUMMY_SDP, + }, + }; + }, + }); + + await call.onAssertedIdentityReceived({ + getContent: () => { + return { + version: 1, + call_id: call.callId, + party_id: 'party_id', + asserted_identity: { + id: "@steve:example.com", + display_name: "Steve Gibbons", + }, + }; + }, + }); + + const ident = call.getRemoteAssertedIdentity(); + expect(ident.id).toEqual("@steve:example.com"); + expect(ident.displayName).toEqual("Steve Gibbons"); + + // Hangup to stop timers + call.hangup(CallErrorCode.UserHangup, true); + }); }); From d46021a05e9409cd42c3ca858b0c3884f4cc31a7 Mon Sep 17 00:00:00 2001 From: Germain Souquet Date: Tue, 20 Apr 2021 11:22:16 +0100 Subject: [PATCH 08/19] Restrict event emit for room members that had power levels changed --- src/models/room-state.js | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/models/room-state.js b/src/models/room-state.js index 67d63faec..9be252f2c 100644 --- a/src/models/room-state.js +++ b/src/models/room-state.js @@ -351,8 +351,14 @@ RoomState.prototype.setStateEvents = function(stateEvents) { } else if (event.getType() === "m.room.power_levels") { const members = utils.values(self.members); utils.forEach(members, function(member) { + // We only propagate `RoomState.members` event if the + // power levels has been changed + // large room suffer from large re-rendering especially when not needed + const oldLastModified = member.getLastModifiedTime(); member.setPowerLevelEvent(event); - self.emit("RoomState.members", event, self, member); + if (oldLastModified !== member.getLastModifiedTime()) { + self.emit("RoomState.members", event, self, member); + } }); // assume all our sentinels are now out-of-date From 74ef760591a3e316c4aadcdeb95db5573ae667ca Mon Sep 17 00:00:00 2001 From: David Baker Date: Tue, 20 Apr 2021 12:48:54 +0100 Subject: [PATCH 09/19] Tests: They find bugs --- src/webrtc/call.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/webrtc/call.ts b/src/webrtc/call.ts index 4dabf2984..12b62c660 100644 --- a/src/webrtc/call.ts +++ b/src/webrtc/call.ts @@ -1217,7 +1217,7 @@ export class MatrixCall extends EventEmitter { this.remoteAssertedIdentity = { id: event.getContent().asserted_identity.id, - displayName: event.getContent().asserted_identity.displayName, + displayName: event.getContent().asserted_identity.display_name, }; this.emit(CallEvent.AssertedIdentityChanged); } From 54077175341e297a45178e05fa6c623c2f639ba2 Mon Sep 17 00:00:00 2001 From: David Baker Date: Tue, 20 Apr 2021 12:57:11 +0100 Subject: [PATCH 10/19] Assert event emitted --- spec/unit/webrtc/call.spec.ts | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/spec/unit/webrtc/call.spec.ts b/spec/unit/webrtc/call.spec.ts index 6a9d0cd52..46102c30d 100644 --- a/spec/unit/webrtc/call.spec.ts +++ b/spec/unit/webrtc/call.spec.ts @@ -15,7 +15,7 @@ limitations under the License. */ import {TestClient} from '../../TestClient'; -import {MatrixCall, CallErrorCode} from '../../../src/webrtc/call'; +import {MatrixCall, CallErrorCode, CallEvent} from '../../../src/webrtc/call'; const DUMMY_SDP = ( "v=0\r\n" + @@ -272,6 +272,9 @@ describe('Call', function() { }, }); + const identChangedCallback = jest.fn(); + call.on(CallEvent.AssertedIdentityChanged, identChangedCallback) + await call.onAssertedIdentityReceived({ getContent: () => { return { @@ -286,6 +289,8 @@ describe('Call', function() { }, }); + expect(identChangedCallback).toHaveBeenCalled(); + const ident = call.getRemoteAssertedIdentity(); expect(ident.id).toEqual("@steve:example.com"); expect(ident.displayName).toEqual("Steve Gibbons"); From bca8568d64e4964fafdc5772cf14eec10bd8662e Mon Sep 17 00:00:00 2001 From: David Baker Date: Tue, 20 Apr 2021 12:58:33 +0100 Subject: [PATCH 11/19] missing semicolon --- spec/unit/webrtc/call.spec.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spec/unit/webrtc/call.spec.ts b/spec/unit/webrtc/call.spec.ts index 46102c30d..e5ef6de87 100644 --- a/spec/unit/webrtc/call.spec.ts +++ b/spec/unit/webrtc/call.spec.ts @@ -273,7 +273,7 @@ describe('Call', function() { }); const identChangedCallback = jest.fn(); - call.on(CallEvent.AssertedIdentityChanged, identChangedCallback) + call.on(CallEvent.AssertedIdentityChanged, identChangedCallback); await call.onAssertedIdentityReceived({ getContent: () => { From dd84e51161069bd552dae7171376b580b3588270 Mon Sep 17 00:00:00 2001 From: RiotRobot Date: Wed, 21 Apr 2021 16:40:22 +0100 Subject: [PATCH 12/19] Prepare changelog for v10.0.0-rc.1 --- CHANGELOG.md | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 070f1faec..3b3784b53 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,24 @@ +Changes in [10.0.0-rc.1](https://github.com/matrix-org/matrix-js-sdk/releases/tag/v10.0.0-rc.1) (2021-04-21) +============================================================================================================ +[Full Changelog](https://github.com/matrix-org/matrix-js-sdk/compare/v9.11.0...v10.0.0-rc.1) + + * Restrict event emit for room members that had power levels changed + [\#1675](https://github.com/matrix-org/matrix-js-sdk/pull/1675) + * Fix sync with misconfigured push rules + [\#1669](https://github.com/matrix-org/matrix-js-sdk/pull/1669) + * Add missing await + [\#1665](https://github.com/matrix-org/matrix-js-sdk/pull/1665) + * Migrate to `eslint-plugin-matrix-org` + [\#1642](https://github.com/matrix-org/matrix-js-sdk/pull/1642) + * Add missing event type enum for key verification done + [\#1664](https://github.com/matrix-org/matrix-js-sdk/pull/1664) + * Fix timeline jumpiness by setting correct txnId + [\#1663](https://github.com/matrix-org/matrix-js-sdk/pull/1663) + * Fix calling addEventListener if it does not exist + [\#1661](https://github.com/matrix-org/matrix-js-sdk/pull/1661) + * Persist unsent messages for subsequent sessions + [\#1655](https://github.com/matrix-org/matrix-js-sdk/pull/1655) + Changes in [9.11.0](https://github.com/matrix-org/matrix-js-sdk/releases/tag/v9.11.0) (2021-04-12) ================================================================================================== [Full Changelog](https://github.com/matrix-org/matrix-js-sdk/compare/v9.11.0-rc.1...v9.11.0) From e3ba08fbbc5cd74b066364b1b4e48809e94e3b34 Mon Sep 17 00:00:00 2001 From: RiotRobot Date: Wed, 21 Apr 2021 16:40:23 +0100 Subject: [PATCH 13/19] v10.0.0-rc.1 --- package.json | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/package.json b/package.json index 56cae38de..19091fd0d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "matrix-js-sdk", - "version": "9.11.0", + "version": "10.0.0-rc.1", "description": "Matrix Client-Server SDK for Javascript", "scripts": { "prepublishOnly": "yarn build", @@ -27,7 +27,7 @@ "keywords": [ "matrix-org" ], - "main": "./src/index.ts", + "main": "./lib/index.js", "browser": "./lib/browser-index.js", "matrix_src_main": "./src/index.ts", "matrix_src_browser": "./src/browser-index.js", @@ -98,5 +98,6 @@ }, "jest": { "testEnvironment": "node" - } + }, + "typings": "./lib/index.d.ts" } From 069ca4a89d80dcd5ad22e72e2b1581405e239ba7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timo=20K=C3=B6sters?= Date: Sun, 18 Apr 2021 14:01:58 +0200 Subject: [PATCH 14/19] fix: make /search with no results field work again --- src/client.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/client.js b/src/client.js index f344bce87..a57f84539 100644 --- a/src/client.js +++ b/src/client.js @@ -4799,7 +4799,8 @@ MatrixClient.prototype._processRoomEventsSearch = function(searchResults, respon searchResults.highlights = Object.keys(highlights); // append the new results to our existing results - for (let i = 0; i < room_events.results.length; i++) { + const resultsLength = room_events.results ? room_events.results.length : 0; + for (let i = 0; i < resultsLength; i++) { const sr = SearchResult.fromJson(room_events.results[i], this.getEventMapper()); searchResults.results.push(sr); } From 4a51ac7a7499cca7aa774b1ecf6c50dd5d9b8341 Mon Sep 17 00:00:00 2001 From: David Baker Date: Fri, 23 Apr 2021 14:36:56 +0100 Subject: [PATCH 15/19] Move createNewMatrixCall to the client object So we can mock it out it tests (and also I'm not sure why it was like this in the first place: we passed the client in anyway...) Deprecate createNewMatrixCall --- src/client.js | 11 +++++++++++ src/webrtc/call.ts | 3 +++ 2 files changed, 14 insertions(+) diff --git a/src/client.js b/src/client.js index f344bce87..e99896792 100644 --- a/src/client.js +++ b/src/client.js @@ -729,6 +729,17 @@ MatrixClient.prototype.setSupportsCallTransfer = function(supportsCallTransfer) this._supportsCallTransfer = supportsCallTransfer; }; +/** + * Creates a new call. + * The place*Call methods on the returned call can be used to actually place a call + * + * @param {string} roomId The room the call is to be placed in. + * @return {MatrixCall} the call or null if the browser doesn't support calling. + */ +MatrixClient.prototype.createCall = function(roomId) { + return createNewMatrixCall(this, roomId); +}; + /** * Get the current sync state. * @return {?string} the sync state, which may be null. diff --git a/src/webrtc/call.ts b/src/webrtc/call.ts index 12b62c660..233c6e1fa 100644 --- a/src/webrtc/call.ts +++ b/src/webrtc/call.ts @@ -1936,6 +1936,9 @@ export function setAudioInput(deviceId: string) { audioInput = deviceId; } export function setVideoInput(deviceId: string) { videoInput = deviceId; } /** + * DEPRECATED + * Use client.createCall() + * * Create a new Matrix call for the browser. * @param {MatrixClient} client The client instance to use. * @param {string} roomId The room the call is in. From 1177bf39a27e752e58f237af9e55fd9f64f03a07 Mon Sep 17 00:00:00 2001 From: RiotRobot Date: Mon, 26 Apr 2021 17:34:16 +0100 Subject: [PATCH 16/19] Prepare changelog for v10.0.0 --- CHANGELOG.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3b3784b53..6a60fa04f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,9 @@ +Changes in [10.0.0](https://github.com/matrix-org/matrix-js-sdk/releases/tag/v10.0.0) (2021-04-26) +================================================================================================== +[Full Changelog](https://github.com/matrix-org/matrix-js-sdk/compare/v10.0.0-rc.1...v10.0.0) + + * No changes since rc.1 + Changes in [10.0.0-rc.1](https://github.com/matrix-org/matrix-js-sdk/releases/tag/v10.0.0-rc.1) (2021-04-21) ============================================================================================================ [Full Changelog](https://github.com/matrix-org/matrix-js-sdk/compare/v9.11.0...v10.0.0-rc.1) From 340fa6c63e632d531009abe01d73deddabc56a95 Mon Sep 17 00:00:00 2001 From: RiotRobot Date: Mon, 26 Apr 2021 17:34:17 +0100 Subject: [PATCH 17/19] v10.0.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 19091fd0d..b1e488bff 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "matrix-js-sdk", - "version": "10.0.0-rc.1", + "version": "10.0.0", "description": "Matrix Client-Server SDK for Javascript", "scripts": { "prepublishOnly": "yarn build", From c8f69c0b7937b9064938c134d708c4d064b71315 Mon Sep 17 00:00:00 2001 From: RiotRobot Date: Mon, 26 Apr 2021 17:37:06 +0100 Subject: [PATCH 18/19] Resetting package fields for development --- package.json | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/package.json b/package.json index b1e488bff..0bb9aa532 100644 --- a/package.json +++ b/package.json @@ -27,7 +27,7 @@ "keywords": [ "matrix-org" ], - "main": "./lib/index.js", + "main": "./src/index.ts", "browser": "./lib/browser-index.js", "matrix_src_main": "./src/index.ts", "matrix_src_browser": "./src/browser-index.js", @@ -98,6 +98,5 @@ }, "jest": { "testEnvironment": "node" - }, - "typings": "./lib/index.d.ts" + } } From b911a890cff5ac4d10a4f3a94b43276caeedca83 Mon Sep 17 00:00:00 2001 From: RiotRobot Date: Mon, 26 Apr 2021 18:03:19 +0100 Subject: [PATCH 19/19] Add breaking notice --- CHANGELOG.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6a60fa04f..c2eac122a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,14 @@ Changes in [10.0.0-rc.1](https://github.com/matrix-org/matrix-js-sdk/releases/ta ============================================================================================================ [Full Changelog](https://github.com/matrix-org/matrix-js-sdk/compare/v9.11.0...v10.0.0-rc.1) +BREAKING CHANGES +--- + + * The `RoomState.members` event is now only emitted when the room member's power level or the room's normal power level actually changes + +All changes +--- + * Restrict event emit for room members that had power levels changed [\#1675](https://github.com/matrix-org/matrix-js-sdk/pull/1675) * Fix sync with misconfigured push rules