You've already forked matrix-js-sdk
mirror of
https://github.com/matrix-org/matrix-js-sdk.git
synced 2025-11-26 17:03:12 +03:00
Do /keys/changes before second /sync
This will avoid races between /keys/changes and /syncs.
This commit is contained in:
@@ -69,7 +69,6 @@ function Crypto(baseApis, sessionStore, userId, deviceId,
|
|||||||
|
|
||||||
this._olmDevice = new OlmDevice(sessionStore);
|
this._olmDevice = new OlmDevice(sessionStore);
|
||||||
this._deviceList = new DeviceList(baseApis, sessionStore, this._olmDevice);
|
this._deviceList = new DeviceList(baseApis, sessionStore, this._olmDevice);
|
||||||
this._initialDeviceListInvalidationPending = false;
|
|
||||||
|
|
||||||
// the last time we did a check for the number of one-time-keys on the
|
// the last time we did a check for the number of one-time-keys on the
|
||||||
// server.
|
// server.
|
||||||
@@ -150,15 +149,6 @@ Crypto.prototype.init = async function() {
|
|||||||
*/
|
*/
|
||||||
Crypto.prototype.registerEventHandlers = function(eventEmitter) {
|
Crypto.prototype.registerEventHandlers = function(eventEmitter) {
|
||||||
const crypto = this;
|
const crypto = this;
|
||||||
eventEmitter.on("sync", function(syncState, oldState, data) {
|
|
||||||
try {
|
|
||||||
if (syncState === "SYNCING") {
|
|
||||||
crypto._onSyncCompleted(data);
|
|
||||||
}
|
|
||||||
} catch (e) {
|
|
||||||
console.error("Error handling sync", e);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
eventEmitter.on("RoomMember.membership", function(event, member, oldMembership) {
|
eventEmitter.on("RoomMember.membership", function(event, member, oldMembership) {
|
||||||
try {
|
try {
|
||||||
@@ -248,7 +238,7 @@ Crypto.prototype.uploadDeviceKeys = function() {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Stores the current one_time_key count which will be handled later (in a call of
|
* Stores the current one_time_key count which will be handled later (in a call of
|
||||||
* _onSyncCompleted). The count is e.g. coming from a /sync response.
|
* onSyncCompleted). The count is e.g. coming from a /sync response.
|
||||||
*
|
*
|
||||||
* @param {Number} currentCount The current count of one_time_keys to be stored
|
* @param {Number} currentCount The current count of one_time_keys to be stored
|
||||||
*/
|
*/
|
||||||
@@ -837,7 +827,7 @@ Crypto.prototype.onCryptoEvent = async function(event) {
|
|||||||
|
|
||||||
try {
|
try {
|
||||||
// inhibit the device list refresh for now - it will happen once we've
|
// inhibit the device list refresh for now - it will happen once we've
|
||||||
// finished processing the sync, in _onSyncCompleted.
|
// finished processing the sync, in onSyncCompleted.
|
||||||
await this.setRoomEncryption(roomId, content, true);
|
await this.setRoomEncryption(roomId, content, true);
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
console.error("Error configuring encryption in room " + roomId +
|
console.error("Error configuring encryption in room " + roomId +
|
||||||
@@ -853,7 +843,7 @@ Crypto.prototype.onCryptoEvent = async function(event) {
|
|||||||
*
|
*
|
||||||
* @param {Object} syncData the data from the 'MatrixClient.sync' event
|
* @param {Object} syncData the data from the 'MatrixClient.sync' event
|
||||||
*/
|
*/
|
||||||
Crypto.prototype._onSyncCompleted = function(syncData) {
|
Crypto.prototype.onSyncCompleted = async function(syncData) {
|
||||||
const nextSyncToken = syncData.nextSyncToken;
|
const nextSyncToken = syncData.nextSyncToken;
|
||||||
|
|
||||||
if (!syncData.oldSyncToken) {
|
if (!syncData.oldSyncToken) {
|
||||||
@@ -863,18 +853,15 @@ Crypto.prototype._onSyncCompleted = function(syncData) {
|
|||||||
// invalidate devices which have changed since then.
|
// invalidate devices which have changed since then.
|
||||||
const oldSyncToken = this._sessionStore.getEndToEndDeviceSyncToken();
|
const oldSyncToken = this._sessionStore.getEndToEndDeviceSyncToken();
|
||||||
if (oldSyncToken !== null) {
|
if (oldSyncToken !== null) {
|
||||||
this._initialDeviceListInvalidationPending = true;
|
try {
|
||||||
this._invalidateDeviceListsSince(
|
await this._invalidateDeviceListsSince(
|
||||||
oldSyncToken, nextSyncToken,
|
oldSyncToken, nextSyncToken,
|
||||||
).catch((e) => {
|
);
|
||||||
|
} catch (e) {
|
||||||
// if that failed, we fall back to invalidating everyone.
|
// if that failed, we fall back to invalidating everyone.
|
||||||
console.warn("Error fetching changed device list", e);
|
console.warn("Error fetching changed device list", e);
|
||||||
this._deviceList.invalidateAllDeviceLists();
|
this._deviceList.invalidateAllDeviceLists();
|
||||||
}).done(() => {
|
}
|
||||||
this._initialDeviceListInvalidationPending = false;
|
|
||||||
this._deviceList.lastKnownSyncToken = nextSyncToken;
|
|
||||||
this._deviceList.refreshOutdatedDeviceLists();
|
|
||||||
});
|
|
||||||
} else {
|
} else {
|
||||||
// otherwise, we have to invalidate all devices for all users we
|
// otherwise, we have to invalidate all devices for all users we
|
||||||
// are tracking.
|
// are tracking.
|
||||||
@@ -884,14 +871,12 @@ Crypto.prototype._onSyncCompleted = function(syncData) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!this._initialDeviceListInvalidationPending) {
|
// we can now store our sync token so that we can get an update on
|
||||||
// we can now store our sync token so that we can get an update on
|
// restart rather than having to invalidate everyone.
|
||||||
// restart rather than having to invalidate everyone.
|
//
|
||||||
//
|
// (we don't really need to do this on every sync - we could just
|
||||||
// (we don't really need to do this on every sync - we could just
|
// do it periodically)
|
||||||
// do it periodically)
|
this._sessionStore.storeEndToEndDeviceSyncToken(nextSyncToken);
|
||||||
this._sessionStore.storeEndToEndDeviceSyncToken(nextSyncToken);
|
|
||||||
}
|
|
||||||
|
|
||||||
// catch up on any new devices we got told about during the sync.
|
// catch up on any new devices we got told about during the sync.
|
||||||
this._deviceList.lastKnownSyncToken = nextSyncToken;
|
this._deviceList.lastKnownSyncToken = nextSyncToken;
|
||||||
@@ -925,13 +910,11 @@ Crypto.prototype._invalidateDeviceListsSince = function(
|
|||||||
).then((r) => {
|
).then((r) => {
|
||||||
console.log("got key changes since", oldSyncToken, ":", r.changed);
|
console.log("got key changes since", oldSyncToken, ":", r.changed);
|
||||||
|
|
||||||
if (!r.changed || !Array.isArray(r.changed)) {
|
if (r.changed && Array.isArray(r.changed)) {
|
||||||
return;
|
r.changed.forEach((u) => {
|
||||||
|
this._deviceList.invalidateUserDeviceList(u);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
r.changed.forEach((u) => {
|
|
||||||
this._deviceList.invalidateUserDeviceList(u);
|
|
||||||
});
|
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -634,8 +634,14 @@ SyncApi.prototype._sync = async function(syncOptions) {
|
|||||||
syncOptions.hasSyncedBefore = true;
|
syncOptions.hasSyncedBefore = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
// keep emitting SYNCING -> SYNCING for clients who want to do bulk updates
|
|
||||||
if (!isCachedResponse) {
|
if (!isCachedResponse) {
|
||||||
|
// tell the crypto module to do its processing. It may block (to do a
|
||||||
|
// /keys/changes request).
|
||||||
|
if (this.opts.crypto) {
|
||||||
|
await this.opts.crypto.onSyncCompleted(syncEventData);
|
||||||
|
}
|
||||||
|
|
||||||
|
// keep emitting SYNCING -> SYNCING for clients who want to do bulk updates
|
||||||
this._updateSyncState("SYNCING", syncEventData);
|
this._updateSyncState("SYNCING", syncEventData);
|
||||||
|
|
||||||
// tell databases that everything is now in a consistent state and can be
|
// tell databases that everything is now in a consistent state and can be
|
||||||
|
|||||||
Reference in New Issue
Block a user