diff --git a/src/MatrixClientPeg.ts b/src/MatrixClientPeg.ts
index ab952c56334..f34753b6798 100644
--- a/src/MatrixClientPeg.ts
+++ b/src/MatrixClientPeg.ts
@@ -340,7 +340,16 @@ class MatrixClientPegClass implements IMatrixClientPeg {
setDeviceIsolationMode(this.matrixClient, SettingsStore.getValue("feature_exclude_insecure_devices"));
- // TODO: device dehydration and whathaveyou
+ // Start dehydration. This code is only for the case where the client
+ // gets restarted, so we only do this if we already have the dehydration
+ // key cached, and we don't have to try to rehydrate a device. If this
+ // is a new login, we will start dehydration after Secret Storage is
+ // unlocked.
+ const crypto = this.matrixClient.getCrypto();
+ if (await crypto?.isDehydrationSupported()) {
+ await crypto.startDehydration({ onlyIfKeyCached: true, rehydrate: false });
+ }
+
return;
}
diff --git a/test/unit-tests/MatrixClientPeg-test.ts b/test/unit-tests/MatrixClientPeg-test.ts
index c46edad55cf..f87a33e07ee 100644
--- a/test/unit-tests/MatrixClientPeg-test.ts
+++ b/test/unit-tests/MatrixClientPeg-test.ts
@@ -80,10 +80,17 @@ describe("MatrixClientPeg", () => {
it("should initialise the rust crypto library by default", async () => {
const mockInitRustCrypto = jest.spyOn(testPeg.safeGet(), "initRustCrypto").mockResolvedValue(undefined);
+ const mockStartDehydration = jest.fn();
+ jest.spyOn(testPeg.safeGet(), "getCrypto").mockReturnValue({
+ isDehydrationSupported: jest.fn().mockResolvedValue(true),
+ startDehydration: mockStartDehydration,
+ setDeviceIsolationMode: jest.fn(),
+ });
const cryptoStoreKey = new Uint8Array([1, 2, 3, 4]);
await testPeg.start({ rustCryptoStoreKey: cryptoStoreKey });
expect(mockInitRustCrypto).toHaveBeenCalledWith({ storageKey: cryptoStoreKey });
+ expect(mockStartDehydration).toHaveBeenCalledWith({ onlyIfKeyCached: true, rehydrate: false });
});
it("Should migrate existing login", async () => {
diff --git a/test/unit-tests/components/structures/MatrixChat-test.tsx b/test/unit-tests/components/structures/MatrixChat-test.tsx
index a29834d51f7..66397a7275a 100644
--- a/test/unit-tests/components/structures/MatrixChat-test.tsx
+++ b/test/unit-tests/components/structures/MatrixChat-test.tsx
@@ -129,6 +129,7 @@ describe("", () => {
getCrypto: jest.fn().mockReturnValue({
getVerificationRequestsToDeviceInProgress: jest.fn().mockReturnValue([]),
isCrossSigningReady: jest.fn().mockReturnValue(false),
+ isDehydrationSupported: jest.fn().mockReturnValue(false),
getUserDeviceInfo: jest.fn().mockReturnValue(new Map()),
getUserVerificationStatus: jest.fn().mockResolvedValue(new UserVerificationStatus(false, false, false)),
getVersion: jest.fn().mockReturnValue("1"),
@@ -1006,6 +1007,7 @@ describe("", () => {
resetKeyBackup: jest.fn(),
isEncryptionEnabledInRoom: jest.fn().mockResolvedValue(false),
checkKeyBackupAndEnable: jest.fn().mockResolvedValue(null),
+ isDehydrationSupported: jest.fn().mockReturnValue(false),
};
loginClient.getCrypto.mockReturnValue(mockCrypto as any);
});