You've already forked matrix-js-sdk
mirror of
https://github.com/matrix-org/matrix-js-sdk.git
synced 2025-11-29 16:43:09 +03:00
Emit when count of sessions to backup changes
This will be used in the React SDK to display upload progress when there are many sessions to upload.
This commit is contained in:
@@ -448,6 +448,7 @@ MatrixClient.prototype.initCrypto = async function() {
|
|||||||
|
|
||||||
this.reEmitter.reEmit(crypto, [
|
this.reEmitter.reEmit(crypto, [
|
||||||
"crypto.keyBackupFailed",
|
"crypto.keyBackupFailed",
|
||||||
|
"crypto.keyBackupSessionsRemaining",
|
||||||
"crypto.roomKeyRequest",
|
"crypto.roomKeyRequest",
|
||||||
"crypto.roomKeyRequestCancellation",
|
"crypto.roomKeyRequestCancellation",
|
||||||
"crypto.warning",
|
"crypto.warning",
|
||||||
|
|||||||
@@ -1052,6 +1052,9 @@ Crypto.prototype._backupPendingKeys = async function(limit) {
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
let remaining = await this._cryptoStore.countSessionsNeedingBackup();
|
||||||
|
this.emit("crypto.keyBackupSessionsRemaining", remaining);
|
||||||
|
|
||||||
const data = {};
|
const data = {};
|
||||||
for (const session of sessions) {
|
for (const session of sessions) {
|
||||||
const roomId = session.sessionData.room_id;
|
const roomId = session.sessionData.room_id;
|
||||||
@@ -1088,7 +1091,10 @@ Crypto.prototype._backupPendingKeys = async function(limit) {
|
|||||||
undefined, undefined, this.backupInfo.version,
|
undefined, undefined, this.backupInfo.version,
|
||||||
{rooms: data},
|
{rooms: data},
|
||||||
);
|
);
|
||||||
|
|
||||||
await this._cryptoStore.unmarkSessionsNeedingBackup(sessions);
|
await this._cryptoStore.unmarkSessionsNeedingBackup(sessions);
|
||||||
|
remaining = await this._cryptoStore.countSessionsNeedingBackup();
|
||||||
|
this.emit("crypto.keyBackupSessionsRemaining", remaining);
|
||||||
|
|
||||||
return sessions.length;
|
return sessions.length;
|
||||||
};
|
};
|
||||||
@@ -1128,6 +1134,9 @@ Crypto.prototype.backupAllGroupSessions = async function(version) {
|
|||||||
},
|
},
|
||||||
);
|
);
|
||||||
|
|
||||||
|
const remaining = await this._cryptoStore.countSessionsNeedingBackup();
|
||||||
|
this.emit("crypto.keyBackupSessionsRemaining", remaining);
|
||||||
|
|
||||||
let numKeysBackedUp;
|
let numKeysBackedUp;
|
||||||
do {
|
do {
|
||||||
numKeysBackedUp = await this._backupPendingKeys(KEY_BACKUP_KEYS_PER_REQUEST);
|
numKeysBackedUp = await this._backupPendingKeys(KEY_BACKUP_KEYS_PER_REQUEST);
|
||||||
|
|||||||
@@ -563,8 +563,22 @@ export class Backend {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
unmarkSessionsNeedingBackup(sessions) {
|
countSessionsNeedingBackup(txn) {
|
||||||
const txn = this._db.transaction("sessions_needing_backup", "readwrite");
|
if (!txn) {
|
||||||
|
txn = this._db.transaction("sessions_needing_backup", "readonly");
|
||||||
|
}
|
||||||
|
const objectStore = txn.objectStore("sessions_needing_backup");
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
const req = objectStore.count();
|
||||||
|
req.onerror = reject;
|
||||||
|
req.onsuccess = () => resolve(req.result);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
unmarkSessionsNeedingBackup(sessions, txn) {
|
||||||
|
if (!txn) {
|
||||||
|
txn = this._db.transaction("sessions_needing_backup", "readwrite");
|
||||||
|
}
|
||||||
const objectStore = txn.objectStore("sessions_needing_backup");
|
const objectStore = txn.objectStore("sessions_needing_backup");
|
||||||
return Promise.all(sessions.map((session) => {
|
return Promise.all(sessions.map((session) => {
|
||||||
return new Promise((resolve, reject) => {
|
return new Promise((resolve, reject) => {
|
||||||
|
|||||||
@@ -480,14 +480,26 @@ export default class IndexedDBCryptoStore {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Count the inbound group sessions that need to be backed up.
|
||||||
|
* @param {*} txn An active transaction. See doTxn(). (optional)
|
||||||
|
* @returns {Promise} resolves to the number of sessions
|
||||||
|
*/
|
||||||
|
countSessionsNeedingBackup(txn) {
|
||||||
|
return this._connect().then((backend) => {
|
||||||
|
return backend.countSessionsNeedingBackup(txn);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Unmark sessions as needing to be backed up.
|
* Unmark sessions as needing to be backed up.
|
||||||
* @param {Array<object>} sessions The sessions that need to be backed up.
|
* @param {Array<object>} sessions The sessions that need to be backed up.
|
||||||
|
* @param {*} txn An active transaction. See doTxn(). (optional)
|
||||||
* @returns {Promise} resolves when the sessions are unmarked
|
* @returns {Promise} resolves when the sessions are unmarked
|
||||||
*/
|
*/
|
||||||
unmarkSessionsNeedingBackup(sessions) {
|
unmarkSessionsNeedingBackup(sessions, txn) {
|
||||||
return this._connect().then((backend) => {
|
return this._connect().then((backend) => {
|
||||||
return backend.unmarkSessionsNeedingBackup(sessions);
|
return backend.unmarkSessionsNeedingBackup(sessions, txn);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -221,6 +221,12 @@ export default class LocalStorageCryptoStore extends MemoryCryptoStore {
|
|||||||
return Promise.resolve(sessions);
|
return Promise.resolve(sessions);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
countSessionsNeedingBackup() {
|
||||||
|
const sessionsNeedingBackup
|
||||||
|
= getJsonItem(this.store, KEY_SESSIONS_NEEDING_BACKUP) || {};
|
||||||
|
return Promise.resolve(Object.keys(sessionsNeedingBackup).length);
|
||||||
|
}
|
||||||
|
|
||||||
unmarkSessionsNeedingBackup(sessions) {
|
unmarkSessionsNeedingBackup(sessions) {
|
||||||
const sessionsNeedingBackup
|
const sessionsNeedingBackup
|
||||||
= getJsonItem(this.store, KEY_SESSIONS_NEEDING_BACKUP) || {};
|
= getJsonItem(this.store, KEY_SESSIONS_NEEDING_BACKUP) || {};
|
||||||
|
|||||||
@@ -336,6 +336,10 @@ export default class MemoryCryptoStore {
|
|||||||
return Promise.resolve(sessions);
|
return Promise.resolve(sessions);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
countSessionsNeedingBackup() {
|
||||||
|
return Promise.resolve(Object.keys(this._sessionsNeedingBackup).length);
|
||||||
|
}
|
||||||
|
|
||||||
unmarkSessionsNeedingBackup(sessions) {
|
unmarkSessionsNeedingBackup(sessions) {
|
||||||
for (const session of sessions) {
|
for (const session of sessions) {
|
||||||
const sessionKey = session.senderKey + '/' + session.sessionId;
|
const sessionKey = session.senderKey + '/' + session.sessionId;
|
||||||
|
|||||||
Reference in New Issue
Block a user