From 9a3717a274103cc259f448baa201e1b5f0855121 Mon Sep 17 00:00:00 2001 From: Bruno Windels Date: Fri, 7 Sep 2018 19:53:01 +0200 Subject: [PATCH 1/2] only dispatch an action for self-membership as everything listens to the dispatcher, dispatching an action can be quite slow, especially when only matched in one listener, and the rest all having to be called to just say "no, thanks". This is especially the case for the RoomMember.membership event being put on the dispatcher, as there can be thousands of these events when the room members are loading. Since the RoomMember.membership action is only used on one place, and only for the syncing user, change it to just that and only dispatch in that case. This saves 100-300ms when setting the OOB members in a big room (7000k members) Maybe later on we can back this by room.getMyMembership() and avoid the listener even... --- src/actions/MatrixActionCreators.js | 19 ++++++++++++------- src/stores/RoomListStore.js | 3 +-- 2 files changed, 13 insertions(+), 9 deletions(-) diff --git a/src/actions/MatrixActionCreators.js b/src/actions/MatrixActionCreators.js index 6e1d52a88f..893564b325 100644 --- a/src/actions/MatrixActionCreators.js +++ b/src/actions/MatrixActionCreators.js @@ -149,9 +149,9 @@ function createRoomTimelineAction(matrixClient, timelineEvent, room, toStartOfTi */ /** - * Create a MatrixActions.RoomMember.membership action that represents - * a MatrixClient `RoomMember.membership` matrix event, emitted when a - * member's membership is updated. + * Create a MatrixActions.Room.selfMembership action that represents + * a MatrixClient `RoomMember.membership` matrix event for the syncing user, + * emitted when the member's membership is updated. * * @param {MatrixClient} matrixClient the matrix client. * @param {MatrixEvent} membershipEvent the m.room.member event. @@ -159,8 +159,10 @@ function createRoomTimelineAction(matrixClient, timelineEvent, room, toStartOfTi * @param {string} oldMembership the member's previous membership. * @returns {RoomMembershipAction} an action of type `MatrixActions.RoomMember.membership`. */ -function createRoomMembershipAction(matrixClient, membershipEvent, member, oldMembership) { - return { action: 'MatrixActions.RoomMember.membership', member }; +function createSelfRoomMembershipAction(matrixClient, membershipEvent, member, oldMembership) { + if (member.userId === matrixClient.getUserId()) { + return { action: 'MatrixActions.Room.selfMembership', member }; + } } /** @@ -202,7 +204,7 @@ export default { this._addMatrixClientListener(matrixClient, 'Room', createRoomAction); this._addMatrixClientListener(matrixClient, 'Room.tags', createRoomTagsAction); this._addMatrixClientListener(matrixClient, 'Room.timeline', createRoomTimelineAction); - this._addMatrixClientListener(matrixClient, 'RoomMember.membership', createRoomMembershipAction); + this._addMatrixClientListener(matrixClient, 'RoomMember.membership', createSelfRoomMembershipAction); this._addMatrixClientListener(matrixClient, 'Event.decrypted', createEventDecryptedAction); }, @@ -217,7 +219,10 @@ export default { */ _addMatrixClientListener(matrixClient, eventName, actionCreator) { const listener = (...args) => { - dis.dispatch(actionCreator(matrixClient, ...args), true); + const payload = actionCreator(matrixClient, ...args); + if (payload) { + dis.dispatch(payload, true); + } }; matrixClient.on(eventName, listener); this._matrixClientListenersStop.push(() => { diff --git a/src/stores/RoomListStore.js b/src/stores/RoomListStore.js index 6571e1590f..02d728ff2e 100644 --- a/src/stores/RoomListStore.js +++ b/src/stores/RoomListStore.js @@ -120,8 +120,7 @@ class RoomListStore extends Store { this._generateRoomLists(); } break; - case 'MatrixActions.RoomMember.membership': { - if (!this._matrixClient || payload.member.userId !== this._matrixClient.credentials.userId) break; + case 'MatrixActions.Room.selfMembership': { this._generateRoomLists(); } break; From dcc8a45aa119b26d4caa37ea47feee3f26b37cd4 Mon Sep 17 00:00:00 2001 From: Bruno Windels Date: Mon, 10 Sep 2018 16:55:24 +0200 Subject: [PATCH 2/2] add final return for clarity --- src/actions/MatrixActionCreators.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/actions/MatrixActionCreators.js b/src/actions/MatrixActionCreators.js index 893564b325..17be9a5e0f 100644 --- a/src/actions/MatrixActionCreators.js +++ b/src/actions/MatrixActionCreators.js @@ -163,6 +163,7 @@ function createSelfRoomMembershipAction(matrixClient, membershipEvent, member, o if (member.userId === matrixClient.getUserId()) { return { action: 'MatrixActions.Room.selfMembership', member }; } + return null; } /**