UNPKG

matrix-js-sdk

Version:
120 lines 5.32 kB
import { OlmMachine } from "@matrix-org/matrix-sdk-crypto-wasm"; import { KeyBackupInfo } from "../crypto-api/keybackup"; import { Logger } from "../logger"; import { IHttpOpts, MatrixHttpApi } from "../http-api"; import { RustBackupManager } from "./backup"; /** * Used when an 'unable to decrypt' error occurs. It attempts to download the key from the backup. * * The current backup API lacks pagination, which can lead to lengthy key retrieval times for large histories (several 10s of minutes). * To mitigate this, keys are downloaded on demand as decryption errors occurs. * While this approach may result in numerous requests, it improves user experience by reducing wait times for message decryption. * * The PerSessionKeyBackupDownloader is resistant to backup configuration changes: it will automatically resume querying when * the backup is configured correctly. */ export declare class PerSessionKeyBackupDownloader { private readonly olmMachine; private readonly http; private readonly backupManager; private stopped; /** * The version and decryption key to use with current backup if all set up correctly. * * Will not be set unless `hasConfigurationProblem` is `false`. */ private configuration; /** We remember when a session was requested and not found in backup to avoid query again too soon. * Map of session_id to timestamp */ private sessionLastCheckAttemptedTime; /** The logger to use */ private readonly logger; /** Whether the download loop is running. */ private downloadLoopRunning; /** The list of requests that are queued. */ private queuedRequests; /** Remembers if we have a configuration problem. */ private hasConfigurationProblem; /** The current server backup version check promise. To avoid doing a server call if one is in flight. */ private currentBackupVersionCheck; /** * Creates a new instance of PerSessionKeyBackupDownloader. * * @param backupManager - The backup manager to use. * @param olmMachine - The olm machine to use. * @param http - The http instance to use. * @param logger - The logger to use. */ constructor(logger: Logger, olmMachine: OlmMachine, http: MatrixHttpApi<IHttpOpts & { onlyData: true; }>, backupManager: RustBackupManager); /** * Check if key download is successfully configured and active. * * @return `true` if key download is correctly configured and active; otherwise `false`. */ isKeyBackupDownloadConfigured(): boolean; /** * Return the details of the latest backup on the server, when we last checked. * * This is just a convenience method to expose {@link RustBackupManager.getServerBackupInfo}. */ getServerBackupInfo(): Promise<KeyBackupInfo | null | undefined>; /** * Called when a MissingRoomKey or UnknownMessageIndex decryption error is encountered. * * This will try to download the key from the backup if there is a trusted active backup. * In case of success the key will be imported and the onRoomKeysUpdated callback will be called * internally by the rust-sdk and decryption will be retried. * * @param roomId - The room ID of the room where the error occurred. * @param megolmSessionId - The megolm session ID that is missing. */ onDecryptionKeyMissingError(roomId: string, megolmSessionId: string): void; stop(): void; /** * Called when the backup status changes (CryptoEvents) * This will trigger a check of the backup configuration. */ private onBackupStatusChanged; /** Returns true if the megolm session is already queued for download. */ private isAlreadyInQueue; /** * Marks the session as not found in backup, to avoid retrying to soon for a key not in backup * * @param megolmSessionId - The megolm session ID that is missing. */ private markAsNotFoundInBackup; /** Returns true if the session was requested recently. */ private wasRequestedRecently; private getBackupDecryptionKey; /** * Requests a key from the server side backup. * * @param version - The backup version to use. * @param roomId - The room ID of the room where the error occurred. * @param sessionId - The megolm session ID that is missing. */ private requestRoomKeyFromBackup; private downloadKeysLoop; /** * Query the backup for a key. * * @param targetRoomId - ID of the room that the session is used in. * @param targetSessionId - ID of the session for which to check backup. * @param configuration - The backup configuration to use. */ private queryKeyBackup; private decryptAndImport; /** * Gets the current backup configuration or create one if it doesn't exist. * * When a valid configuration is found it is cached and returned for subsequent calls. * Otherwise, if a check is forced or a check has not yet been done, a new check is done. * * @returns The backup configuration to use or null if there is a configuration problem. */ private getOrCreateBackupConfiguration; private internalCheckFromServer; } //# sourceMappingURL=PerSessionKeyBackupDownloader.d.ts.map