You've already forked matrix-js-sdk
mirror of
https://github.com/matrix-org/matrix-js-sdk.git
synced 2025-11-23 17:02:25 +03:00
Report backup key import progress on start and improve types (#4711)
* report key import progress on start and improve types * fix lint * add documentation for exported types * link `ImportRoomKeyProgressData` type in `ImportRoomKeyStage` Co-authored-by: Richard van der Hoff <1389908+richvdh@users.noreply.github.com> * link `ImportRoomKeyFetchProgress` in fetch stage doc Co-authored-by: Richard van der Hoff <1389908+richvdh@users.noreply.github.com> * link `ImportRoomKeyLoadProgress` in load_keys stage Co-authored-by: Richard van der Hoff <1389908+richvdh@users.noreply.github.com> * link `ImportRoomKeyProgressData` in `ImportRoomKeyFetchProgress` type doc Co-authored-by: Richard van der Hoff <1389908+richvdh@users.noreply.github.com> * link `ImportRoomKeyProgressData` in `ImportRoomKeyLoadProgress` type doc Co-authored-by: Richard van der Hoff <1389908+richvdh@users.noreply.github.com> * link `ImportRoomKeyStage.Fetch` Co-authored-by: Richard van der Hoff <1389908+richvdh@users.noreply.github.com> * convert `ImportRoomKeyStage.LoadKeys` to link in `ImportRoomKeyLoadProgress` stage doc Co-authored-by: Richard van der Hoff <1389908+richvdh@users.noreply.github.com> * remove whitespace * improve `ImportRoomKeyStage.Fetch` stage doc Co-authored-by: Richard van der Hoff <1389908+richvdh@users.noreply.github.com> * improve `ImportRoomKeyStage.LoadKeys ` stage doc Co-authored-by: Richard van der Hoff <1389908+richvdh@users.noreply.github.com> --------- Co-authored-by: Richard van der Hoff <1389908+richvdh@users.noreply.github.com>
This commit is contained in:
@@ -500,8 +500,10 @@ describe("RustCrypto", () => {
|
|||||||
const someRoomKeys = testData.MEGOLM_SESSION_DATA_ARRAY;
|
const someRoomKeys = testData.MEGOLM_SESSION_DATA_ARRAY;
|
||||||
let importTotal = 0;
|
let importTotal = 0;
|
||||||
const opt: ImportRoomKeysOpts = {
|
const opt: ImportRoomKeysOpts = {
|
||||||
progressCallback: (stage) => {
|
progressCallback: (progress) => {
|
||||||
importTotal = stage.total ?? 0;
|
if (progress.stage === "load_keys") {
|
||||||
|
importTotal = progress.total;
|
||||||
|
}
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
await rustCrypto.importRoomKeys(someRoomKeys, opt);
|
await rustCrypto.importRoomKeys(someRoomKeys, opt);
|
||||||
@@ -523,8 +525,10 @@ describe("RustCrypto", () => {
|
|||||||
const someRoomKeys = testData.MEGOLM_SESSION_DATA_ARRAY;
|
const someRoomKeys = testData.MEGOLM_SESSION_DATA_ARRAY;
|
||||||
let importTotal = 0;
|
let importTotal = 0;
|
||||||
const opt: ImportRoomKeysOpts = {
|
const opt: ImportRoomKeysOpts = {
|
||||||
progressCallback: (stage) => {
|
progressCallback: (progress) => {
|
||||||
importTotal = stage.total ?? 0;
|
if (progress.stage === "load_keys") {
|
||||||
|
importTotal = progress.total;
|
||||||
|
}
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
await rustCrypto.importRoomKeysAsJson(JSON.stringify(someRoomKeys), opt);
|
await rustCrypto.importRoomKeysAsJson(JSON.stringify(someRoomKeys), opt);
|
||||||
|
|||||||
@@ -1000,18 +1000,72 @@ export class DeviceVerificationStatus {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Enum representing the different stages of importing room keys.
|
||||||
|
*
|
||||||
|
* This is the type of the `stage` property of {@link ImportRoomKeyProgressData}.
|
||||||
|
*/
|
||||||
|
export enum ImportRoomKeyStage {
|
||||||
|
/**
|
||||||
|
* The stage where room keys are being fetched.
|
||||||
|
*
|
||||||
|
* @see {@link ImportRoomKeyFetchProgress}.
|
||||||
|
*/
|
||||||
|
Fetch = "fetch",
|
||||||
|
/**
|
||||||
|
* The stage where room keys are being loaded.
|
||||||
|
*
|
||||||
|
* @see {@link ImportRoomKeyLoadProgress}.
|
||||||
|
*/
|
||||||
|
LoadKeys = "load_keys",
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Type representing the progress during the 'fetch' stage of the room key import process.
|
||||||
|
*
|
||||||
|
* @see {@link ImportRoomKeyProgressData}.
|
||||||
|
*/
|
||||||
|
export type ImportRoomKeyFetchProgress = {
|
||||||
|
/**
|
||||||
|
* The current stage of the import process.
|
||||||
|
*/
|
||||||
|
stage: ImportRoomKeyStage.Fetch;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Type representing the progress during the 'load_keys' stage of the room key import process.
|
||||||
|
*
|
||||||
|
* @see {@link ImportRoomKeyProgressData}.
|
||||||
|
*/
|
||||||
|
export type ImportRoomKeyLoadProgress = {
|
||||||
|
/**
|
||||||
|
* The current stage of the import process.
|
||||||
|
*/
|
||||||
|
stage: ImportRoomKeyStage.LoadKeys;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The number of successfully loaded room keys so far.
|
||||||
|
*/
|
||||||
|
successes: number;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The number of room keys that failed to load so far.
|
||||||
|
*/
|
||||||
|
failures: number;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The total number of room keys being loaded.
|
||||||
|
*/
|
||||||
|
total: number;
|
||||||
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Room key import progress report.
|
* Room key import progress report.
|
||||||
* Used when calling {@link CryptoApi#importRoomKeys},
|
* Used when calling {@link CryptoApi#importRoomKeys},
|
||||||
* {@link CryptoApi#importRoomKeysAsJson} or {@link CryptoApi#restoreKeyBackup} as the parameter of
|
* {@link CryptoApi#importRoomKeysAsJson} or {@link CryptoApi#restoreKeyBackup} as the parameter of
|
||||||
* the progressCallback. Used to display feedback.
|
* the progressCallback. Used to display feedback.
|
||||||
*/
|
*/
|
||||||
export interface ImportRoomKeyProgressData {
|
export type ImportRoomKeyProgressData = ImportRoomKeyFetchProgress | ImportRoomKeyLoadProgress;
|
||||||
stage: string; // TODO: Enum
|
|
||||||
successes?: number;
|
|
||||||
failures?: number;
|
|
||||||
total?: number;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Options object for {@link CryptoApi#importRoomKeys} and
|
* Options object for {@link CryptoApi#importRoomKeys} and
|
||||||
|
|||||||
@@ -35,7 +35,12 @@ import { encodeUri, logDuration } from "../utils.ts";
|
|||||||
import { type OutgoingRequestProcessor } from "./OutgoingRequestProcessor.ts";
|
import { type OutgoingRequestProcessor } from "./OutgoingRequestProcessor.ts";
|
||||||
import { sleep } from "../utils.ts";
|
import { sleep } from "../utils.ts";
|
||||||
import { type BackupDecryptor } from "../common-crypto/CryptoBackend.ts";
|
import { type BackupDecryptor } from "../common-crypto/CryptoBackend.ts";
|
||||||
import { type ImportRoomKeyProgressData, type ImportRoomKeysOpts, CryptoEvent } from "../crypto-api/index.ts";
|
import {
|
||||||
|
type ImportRoomKeyProgressData,
|
||||||
|
type ImportRoomKeysOpts,
|
||||||
|
CryptoEvent,
|
||||||
|
ImportRoomKeyStage,
|
||||||
|
} from "../crypto-api/index.ts";
|
||||||
import { type AESEncryptedSecretStoragePayload } from "../@types/AESEncryptedSecretStoragePayload.ts";
|
import { type AESEncryptedSecretStoragePayload } from "../@types/AESEncryptedSecretStoragePayload.ts";
|
||||||
import { type IMegolmSessionData } from "../@types/crypto.ts";
|
import { type IMegolmSessionData } from "../@types/crypto.ts";
|
||||||
|
|
||||||
@@ -235,7 +240,7 @@ export class RustBackupManager extends TypedEventEmitter<RustBackupCryptoEvents,
|
|||||||
const importOpt: ImportRoomKeyProgressData = {
|
const importOpt: ImportRoomKeyProgressData = {
|
||||||
total: Number(total),
|
total: Number(total),
|
||||||
successes: Number(progress),
|
successes: Number(progress),
|
||||||
stage: "load_keys",
|
stage: ImportRoomKeyStage.LoadKeys,
|
||||||
failures: 0,
|
failures: 0,
|
||||||
};
|
};
|
||||||
opts?.progressCallback?.(importOpt);
|
opts?.progressCallback?.(importOpt);
|
||||||
@@ -264,7 +269,7 @@ export class RustBackupManager extends TypedEventEmitter<RustBackupCryptoEvents,
|
|||||||
const importOpt: ImportRoomKeyProgressData = {
|
const importOpt: ImportRoomKeyProgressData = {
|
||||||
total: Number(total),
|
total: Number(total),
|
||||||
successes: Number(progress),
|
successes: Number(progress),
|
||||||
stage: "load_keys",
|
stage: ImportRoomKeyStage.LoadKeys,
|
||||||
failures: Number(failures),
|
failures: Number(failures),
|
||||||
};
|
};
|
||||||
opts?.progressCallback?.(importOpt);
|
opts?.progressCallback?.(importOpt);
|
||||||
@@ -619,9 +624,6 @@ export class RustBackupManager extends TypedEventEmitter<RustBackupCryptoEvents,
|
|||||||
opts?: KeyBackupRestoreOpts,
|
opts?: KeyBackupRestoreOpts,
|
||||||
): Promise<KeyBackupRestoreResult> {
|
): Promise<KeyBackupRestoreResult> {
|
||||||
const keyBackup = await this.downloadKeyBackup(backupVersion);
|
const keyBackup = await this.downloadKeyBackup(backupVersion);
|
||||||
opts?.progressCallback?.({
|
|
||||||
stage: "load_keys",
|
|
||||||
});
|
|
||||||
|
|
||||||
return this.importKeyBackup(keyBackup, backupVersion, backupDecryptor, opts);
|
return this.importKeyBackup(keyBackup, backupVersion, backupDecryptor, opts);
|
||||||
}
|
}
|
||||||
@@ -672,6 +674,13 @@ export class RustBackupManager extends TypedEventEmitter<RustBackupCryptoEvents,
|
|||||||
let totalImported = 0;
|
let totalImported = 0;
|
||||||
let totalFailures = 0;
|
let totalFailures = 0;
|
||||||
|
|
||||||
|
opts?.progressCallback?.({
|
||||||
|
total: totalKeyCount,
|
||||||
|
successes: totalImported,
|
||||||
|
stage: ImportRoomKeyStage.LoadKeys,
|
||||||
|
failures: totalFailures,
|
||||||
|
});
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This method is called when we have enough chunks to decrypt.
|
* This method is called when we have enough chunks to decrypt.
|
||||||
* It will decrypt the chunks and try to import the room keys.
|
* It will decrypt the chunks and try to import the room keys.
|
||||||
@@ -704,7 +713,7 @@ export class RustBackupManager extends TypedEventEmitter<RustBackupCryptoEvents,
|
|||||||
opts?.progressCallback?.({
|
opts?.progressCallback?.({
|
||||||
total: totalKeyCount,
|
total: totalKeyCount,
|
||||||
successes: totalImported,
|
successes: totalImported,
|
||||||
stage: "load_keys",
|
stage: ImportRoomKeyStage.LoadKeys,
|
||||||
failures: totalFailures,
|
failures: totalFailures,
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -67,6 +67,7 @@ import {
|
|||||||
type KeyBackupRestoreOpts,
|
type KeyBackupRestoreOpts,
|
||||||
type KeyBackupRestoreResult,
|
type KeyBackupRestoreResult,
|
||||||
type StartDehydrationOpts,
|
type StartDehydrationOpts,
|
||||||
|
ImportRoomKeyStage,
|
||||||
} from "../crypto-api/index.ts";
|
} from "../crypto-api/index.ts";
|
||||||
import { deviceKeysToDeviceMap, rustDeviceToJsDevice } from "./device-converter.ts";
|
import { deviceKeysToDeviceMap, rustDeviceToJsDevice } from "./device-converter.ts";
|
||||||
import { type IDownloadKeyResult, type IQueryKeysRequest } from "../client.ts";
|
import { type IDownloadKeyResult, type IQueryKeysRequest } from "../client.ts";
|
||||||
@@ -1340,7 +1341,7 @@ export class RustCrypto extends TypedEventEmitter<RustCryptoEvents, CryptoEventH
|
|||||||
|
|
||||||
try {
|
try {
|
||||||
opts?.progressCallback?.({
|
opts?.progressCallback?.({
|
||||||
stage: "fetch",
|
stage: ImportRoomKeyStage.Fetch,
|
||||||
});
|
});
|
||||||
|
|
||||||
return await this.backupManager.restoreKeyBackup(backupVersion, backupDecryptor, opts);
|
return await this.backupManager.restoreKeyBackup(backupVersion, backupDecryptor, opts);
|
||||||
|
|||||||
Reference in New Issue
Block a user