From 2c5cad71ee8155a16273a7fa3a9d159014abd947 Mon Sep 17 00:00:00 2001 From: Bruno Windels Date: Tue, 10 Jul 2018 17:17:27 +0200 Subject: [PATCH] prototype support for lazily loading members in matrixclient --- src/base-apis.js | 12 ++++++++++++ src/client.js | 14 ++++++++++++++ src/models/room.js | 18 ++++++++++++++++++ 3 files changed, 44 insertions(+) diff --git a/src/base-apis.js b/src/base-apis.js index bf2381790..921bec527 100644 --- a/src/base-apis.js +++ b/src/base-apis.js @@ -417,6 +417,18 @@ MatrixBaseApis.prototype.roomState = function(roomId, callback) { return this._http.authedRequest(callback, "GET", path); }; +/** + * @param {string} roomId + * @param {module:client.callback} callback Optional. + * @return {module:client.Promise} Resolves: TODO + * @return {module:http-api.MatrixError} Rejects: with an error response. + */ +MatrixBaseApis.prototype.joinedMembers = function(roomId, callback) { + const path = utils.encodeUri("/rooms/$roomId/joined_members", {$roomId: roomId}); + return this._http.authedRequest(callback, "GET", path); +}; + + /** * @param {string} groupId * @return {module:client.Promise} Resolves: Group summary object diff --git a/src/client.js b/src/client.js index ab8c79b5f..93d837a4b 100644 --- a/src/client.js +++ b/src/client.js @@ -757,6 +757,20 @@ MatrixClient.prototype.getRoom = function(roomId) { return this.store.getRoom(roomId); }; +/** + * Preloads the member list for the given room id, + * in case lazy loading of memberships is in use. + * @param {string} roomId The room ID + */ +MatrixClient.prototype.loadRoomMembersIfNeeded = function(roomId) { + const room = this.getRoom(roomId); + if (!room || !room.membersNeedLoading()) { + return; + } + const membersPromise = this.joinedMembers(roomId); + room.setLazilyLoadedMembers(membersPromise); +} + /** * Retrieve all known rooms. * @return {Room[]} A list of rooms, or an empty list if there is no data store. diff --git a/src/models/room.js b/src/models/room.js index 7e01eab64..0141c164c 100644 --- a/src/models/room.js +++ b/src/models/room.js @@ -171,7 +171,10 @@ function Room(roomId, opts) { // read by megolm; boolean value - null indicates "use global value" this._blacklistUnverifiedDevices = null; + // in case of lazy loading, to keep track of loading state + this._membersNeedLoading = true; } + utils.inherits(Room, EventEmitter); /** @@ -212,7 +215,22 @@ Room.prototype.getPendingEvents = function() { Room.prototype.getLiveTimeline = function() { return this.getUnfilteredTimelineSet().getLiveTimeline(); }; +/** + * Get the lazy loading state, whether loading is needed or not. + */ +Room.prototype.membersNeedLoading = function() { + return this._membersNeedLoading; +} +/** + * + */ +Room.prototype.setLazilyLoadedMembers = async function(joinedMembersPromise) { + this._membersNeedLoading = false; + const members = await joinedMembersPromise; + this.currentState.setJoinedMembers(members.joined); + //for all timelines > room state, call setJoinedMembers? +} /** * Reset the live timeline of all timelineSets, and start new ones.