1
0
mirror of https://github.com/matrix-org/matrix-js-sdk.git synced 2025-11-28 05:03:59 +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:
J. Ryan Stinnett
2019-01-09 09:40:31 -06:00
parent 14b42abfa4
commit 0cbced43bd
6 changed files with 50 additions and 4 deletions

View File

@@ -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",

View File

@@ -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);

View File

@@ -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) => {

View File

@@ -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);
}); });
} }

View File

@@ -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) || {};

View File

@@ -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;