wait until rooms are available
as accountData get processed before rooms, during initial sync or loading sync from cache, accountData gets emitted before any room is available, hence our patching wasn't doing anything. Just as well, because it would have failed (see next commits)
This commit is contained in:
parent
727082b659
commit
c12abab52d
1 changed files with 19 additions and 3 deletions
|
@ -70,13 +70,13 @@ export default class DMRoomMap {
|
||||||
this.matrixClient.removeListener("accountData", this._onAccountData);
|
this.matrixClient.removeListener("accountData", this._onAccountData);
|
||||||
}
|
}
|
||||||
|
|
||||||
_onAccountData(ev) {
|
async _onAccountData(ev) {
|
||||||
if (ev.getType() == 'm.direct') {
|
if (ev.getType() == 'm.direct') {
|
||||||
const userToRooms = this.matrixClient.getAccountData('m.direct').getContent() || {};
|
const userToRooms = this.matrixClient.getAccountData('m.direct').getContent() || {};
|
||||||
const myUserId = this.matrixClient.getUserId();
|
const myUserId = this.matrixClient.getUserId();
|
||||||
const selfDMs = userToRooms[myUserId];
|
const selfDMs = userToRooms[myUserId];
|
||||||
if (selfDMs && selfDMs.length) {
|
if (selfDMs && selfDMs.length) {
|
||||||
const neededPatching = this._patchUpSelfDMs(userToRooms);
|
const neededPatching = await this._patchUpSelfDMs(userToRooms);
|
||||||
// to avoid multiple devices fighting to correct
|
// to avoid multiple devices fighting to correct
|
||||||
// the account data, only try to send the corrected
|
// the account data, only try to send the corrected
|
||||||
// version once.
|
// version once.
|
||||||
|
@ -94,10 +94,13 @@ export default class DMRoomMap {
|
||||||
* with ourself, not the other user. Fix it by guessing the other user and
|
* with ourself, not the other user. Fix it by guessing the other user and
|
||||||
* modifying userToRooms
|
* modifying userToRooms
|
||||||
*/
|
*/
|
||||||
_patchUpSelfDMs(userToRooms) {
|
async _patchUpSelfDMs(userToRooms) {
|
||||||
const myUserId = this.matrixClient.getUserId();
|
const myUserId = this.matrixClient.getUserId();
|
||||||
const selfRoomIds = userToRooms[myUserId];
|
const selfRoomIds = userToRooms[myUserId];
|
||||||
if (selfRoomIds) {
|
if (selfRoomIds) {
|
||||||
|
// account data gets emitted before the rooms are available
|
||||||
|
// so wait for the sync to be ready and then read the rooms.
|
||||||
|
await this._waitForSyncReady();
|
||||||
// any self-chats that should not be self-chats?
|
// any self-chats that should not be self-chats?
|
||||||
const guessedUserIdsThatChanged = selfRoomIds.map((roomId) => {
|
const guessedUserIdsThatChanged = selfRoomIds.map((roomId) => {
|
||||||
const room = this.matrixClient.getRoom(roomId);
|
const room = this.matrixClient.getRoom(roomId);
|
||||||
|
@ -135,6 +138,19 @@ export default class DMRoomMap {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_waitForSyncReady() {
|
||||||
|
return new Promise((resolve) => {
|
||||||
|
const syncState = this.matrixClient.getSyncState();
|
||||||
|
if (syncState === 'PREPARED' || syncState === 'SYNCING') {
|
||||||
|
resolve();
|
||||||
|
} else {
|
||||||
|
// if we already got an accountData event,
|
||||||
|
// next sync should not be ERROR, so just resolve
|
||||||
|
this.matrixClient.once('sync', () => resolve());
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
getDMRoomsForUserId(userId) {
|
getDMRoomsForUserId(userId) {
|
||||||
// Here, we return the empty list if there are no rooms,
|
// Here, we return the empty list if there are no rooms,
|
||||||
// since the number of conversations you have with this user is zero.
|
// since the number of conversations you have with this user is zero.
|
||||||
|
|
Loading…
Reference in a new issue