Merge pull request #1567 from matrix-org/luke/fix-flair-store

Fix multiple requests for publicised groups of given user
This commit is contained in:
David Baker 2017-11-02 16:09:07 +00:00 committed by GitHub
commit 8800081cb9
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -66,7 +66,7 @@ class FlairStore extends EventEmitter {
} }
// Bulk lookup ongoing, return promise to resolve/reject // Bulk lookup ongoing, return promise to resolve/reject
if (this._usersPending[userId]) { if (this._usersPending[userId] || this._usersInFlight[userId]) {
return this._usersPending[userId].prom; return this._usersPending[userId].prom;
} }
@ -91,7 +91,7 @@ class FlairStore extends EventEmitter {
console.error('Could not get groups for user', this.props.userId, err); console.error('Could not get groups for user', this.props.userId, err);
throw err; throw err;
}).finally(() => { }).finally(() => {
delete this._usersPending[userId]; delete this._usersInFlight[userId];
}); });
// This debounce will allow consecutive requests for the public groups of users that // This debounce will allow consecutive requests for the public groups of users that
@ -113,27 +113,25 @@ class FlairStore extends EventEmitter {
} }
async _batchedGetPublicGroups(matrixClient) { async _batchedGetPublicGroups(matrixClient) {
// Take the userIds from the keys of this._usersPending // Move users pending to users in flight
const usersInFlight = Object.keys(this._usersPending); this._usersInFlight = this._usersPending;
this._usersPending = {};
let resp = { let resp = {
users: [], users: [],
}; };
try { try {
resp = await matrixClient.getPublicisedGroups(usersInFlight); resp = await matrixClient.getPublicisedGroups(Object.keys(this._usersInFlight));
} catch (err) { } catch (err) {
// Propagate the same error to all usersInFlight // Propagate the same error to all usersInFlight
usersInFlight.forEach((userId) => { Object.keys(this._usersInFlight).forEach((userId) => {
this._usersPending[userId].reject(err); this._usersInFlight[userId].reject(err);
}); });
return; return;
} }
const updatedUserGroups = resp.users; const updatedUserGroups = resp.users;
usersInFlight.forEach((userId) => { Object.keys(this._usersInFlight).forEach((userId) => {
if (this._usersPending[userId]) { this._usersInFlight[userId].resolve(updatedUserGroups[userId] || []);
this._usersPending[userId].resolve(updatedUserGroups[userId] || []);
} else {
console.error("Promise vanished for resolving groups for " + userId);
}
}); });
} }