From ba8e08186d76fcd4ab7b6dd0c82b704200207bb6 Mon Sep 17 00:00:00 2001 From: gustavo Date: Sun, 8 Feb 2026 15:39:53 -0500 Subject: [PATCH] Matrix: consolidate decrypt retry wiring and harden sdk imports --- extensions/matrix/src/matrix/sdk.ts | 20 ++----------- .../matrix/src/matrix/sdk/decrypt-bridge.ts | 30 +++++++++++++++++++ .../src/matrix/sdk/verification-manager.ts | 4 +-- 3 files changed, 35 insertions(+), 19 deletions(-) diff --git a/extensions/matrix/src/matrix/sdk.ts b/extensions/matrix/src/matrix/sdk.ts index a2e636456ab..4d7c29c39f2 100644 --- a/extensions/matrix/src/matrix/sdk.ts +++ b/extensions/matrix/src/matrix/sdk.ts @@ -7,8 +7,8 @@ import { type MatrixClient as MatrixJsClient, type MatrixEvent, } from "matrix-js-sdk"; -import { CryptoEvent } from "matrix-js-sdk/src/crypto-api/CryptoEvent.ts"; -import { VerificationMethod } from "matrix-js-sdk/src/types.ts"; +import { CryptoEvent } from "matrix-js-sdk/lib/crypto-api/CryptoEvent.js"; +import { VerificationMethod } from "matrix-js-sdk/lib/types.js"; import { EventEmitter } from "node:events"; import fs from "node:fs"; import path from "node:path"; @@ -438,21 +438,7 @@ export class MatrixClient { } }); - const triggerDecryptRetry = (reason: string): void => { - this.decryptBridge.retryPendingNow(reason); - }; - crypto.on(CryptoEvent.KeyBackupDecryptionKeyCached, () => { - triggerDecryptRetry("crypto.keyBackupDecryptionKeyCached"); - }); - crypto.on(CryptoEvent.RehydrationCompleted, () => { - triggerDecryptRetry("dehydration.RehydrationCompleted"); - }); - crypto.on(CryptoEvent.DevicesUpdated, () => { - triggerDecryptRetry("crypto.devicesUpdated"); - }); - crypto.on(CryptoEvent.KeysChanged, () => { - triggerDecryptRetry("crossSigning.keysChanged"); - }); + this.decryptBridge.bindCryptoRetrySignals(crypto); LogService.info("MatrixClientLite", "Verification request handler registered"); } diff --git a/extensions/matrix/src/matrix/sdk/decrypt-bridge.ts b/extensions/matrix/src/matrix/sdk/decrypt-bridge.ts index 14917df5817..1df9e8748bd 100644 --- a/extensions/matrix/src/matrix/sdk/decrypt-bridge.ts +++ b/extensions/matrix/src/matrix/sdk/decrypt-bridge.ts @@ -1,4 +1,5 @@ import { MatrixEventEvent, type MatrixEvent } from "matrix-js-sdk"; +import { CryptoEvent } from "matrix-js-sdk/lib/crypto-api/CryptoEvent.js"; import { LogService, noop } from "./logger.js"; type MatrixDecryptIfNeededClient = { @@ -23,6 +24,10 @@ type DecryptBridgeRawEvent = { event_id: string; }; +type MatrixCryptoRetrySignalSource = { + on: (eventName: string, listener: (...args: unknown[]) => void) => void; +}; + const MATRIX_DECRYPT_RETRY_BASE_DELAY_MS = 1_500; const MATRIX_DECRYPT_RETRY_MAX_DELAY_MS = 30_000; const MATRIX_DECRYPT_RETRY_MAX_ATTEMPTS = 8; @@ -46,6 +51,7 @@ export class MatrixDecryptBridge { private readonly decryptedMessageDedupe = new Map(); private readonly decryptRetries = new Map(); private readonly failedDecryptionsNotified = new Set(); + private cryptoRetrySignalsBound = false; constructor( private readonly deps: { @@ -103,6 +109,30 @@ export class MatrixDecryptBridge { } } + bindCryptoRetrySignals(crypto: MatrixCryptoRetrySignalSource | undefined): void { + if (!crypto || this.cryptoRetrySignalsBound) { + return; + } + this.cryptoRetrySignalsBound = true; + + const trigger = (reason: string): void => { + this.retryPendingNow(reason); + }; + + crypto.on(CryptoEvent.KeyBackupDecryptionKeyCached, () => { + trigger("crypto.keyBackupDecryptionKeyCached"); + }); + crypto.on(CryptoEvent.RehydrationCompleted, () => { + trigger("dehydration.RehydrationCompleted"); + }); + crypto.on(CryptoEvent.DevicesUpdated, () => { + trigger("crypto.devicesUpdated"); + }); + crypto.on(CryptoEvent.KeysChanged, () => { + trigger("crossSigning.keysChanged"); + }); + } + stop(): void { for (const retryKey of this.decryptRetries.keys()) { this.clearDecryptRetry(retryKey); diff --git a/extensions/matrix/src/matrix/sdk/verification-manager.ts b/extensions/matrix/src/matrix/sdk/verification-manager.ts index 2527a31182b..517e1db2f95 100644 --- a/extensions/matrix/src/matrix/sdk/verification-manager.ts +++ b/extensions/matrix/src/matrix/sdk/verification-manager.ts @@ -2,8 +2,8 @@ import { VerificationPhase, VerificationRequestEvent, VerifierEvent, -} from "matrix-js-sdk/src/crypto-api/verification.ts"; -import { VerificationMethod } from "matrix-js-sdk/src/types.ts"; +} from "matrix-js-sdk/lib/crypto-api/verification.js"; +import { VerificationMethod } from "matrix-js-sdk/lib/types.js"; export type MatrixVerificationMethod = "sas" | "show-qr" | "scan-qr";