1
0
mirror of https://github.com/matrix-org/matrix-js-sdk.git synced 2025-12-14 19:22:15 +03:00

Create sentinel members on-demand

We only need sentinel members for things like the 'sender' field
of events, so we previously created sentinels for everyone in the
room, but a large number of them were never used.

Instead, create them on-demand and cache them.
This commit is contained in:
David Baker
2018-02-16 11:53:24 +00:00
parent 7df2bfe7bc
commit 1e638c376b

View File

@@ -80,7 +80,20 @@ RoomState.prototype.getMember = function(userId) {
* @return {RoomMember} The member or null if they do not exist. * @return {RoomMember} The member or null if they do not exist.
*/ */
RoomState.prototype.getSentinelMember = function(userId) { RoomState.prototype.getSentinelMember = function(userId) {
return this._sentinels[userId] || null; let sentinel = this._sentinels[userId];
if (sentinel === undefined) {
sentinel = new RoomMember(this.roomId, userId);
const membershipEvent = this.getStateEvents("m.room.member", userId);
if (!membershipEvent) return null;
sentinel.setMembershipEvent(membershipEvent, this);
const pwrLvlEvent = this.getStateEvents("m.room.power_levels", "");
if (pwrLvlEvent) {
sentinel.setPowerLevelEvent(pwrLvlEvent);
}
this._sentinels[userId] = sentinel;
}
return sentinel;
}; };
/** /**
@@ -173,13 +186,8 @@ RoomState.prototype.setStateEvents = function(stateEvents) {
member = new RoomMember(event.getRoomId(), userId); member = new RoomMember(event.getRoomId(), userId);
self.emit("RoomState.newMember", event, self, member); self.emit("RoomState.newMember", event, self, member);
} }
// Add a new sentinel for this change. We apply the same
// operations to both sentinel and member rather than deep copying utils.forEach([member], function(roomMember) {
// so we don't make assumptions about the properties of RoomMember
// (e.g. and manage to break it because deep copying doesn't do
// everything).
const sentinel = new RoomMember(event.getRoomId(), userId);
utils.forEach([member, sentinel], function(roomMember) {
roomMember.setMembershipEvent(event, self); roomMember.setMembershipEvent(event, self);
// this member may have a power level already, so set it. // this member may have a power level already, so set it.
const pwrLvlEvent = self.getStateEvents("m.room.power_levels", ""); const pwrLvlEvent = self.getStateEvents("m.room.power_levels", "");
@@ -188,7 +196,9 @@ RoomState.prototype.setStateEvents = function(stateEvents) {
} }
}); });
self._sentinels[userId] = sentinel; // blow away the sentinel which is now outdated
delete self._sentinels[userId];
self.members[userId] = member; self.members[userId] = member;
self.emit("RoomState.members", event, self, member); self.emit("RoomState.members", event, self, member);
} else if (event.getType() === "m.room.power_levels") { } else if (event.getType() === "m.room.power_levels") {
@@ -198,15 +208,8 @@ RoomState.prototype.setStateEvents = function(stateEvents) {
self.emit("RoomState.members", event, self, member); self.emit("RoomState.members", event, self, member);
}); });
// Go through the sentinel members and see if any of them would be // assume all our sentinels are now out-of-date
// affected by the new power levels. If so, replace the sentinel. self._sentinels = {};
for (const userId of Object.keys(self._sentinels)) {
const oldSentinel = self._sentinels[userId];
const newSentinel = new RoomMember(event.getRoomId(), userId);
newSentinel.setMembershipEvent(oldSentinel.events.member, self);
newSentinel.setPowerLevelEvent(event);
self._sentinels[userId] = newSentinel;
}
} }
}); });
}; };