From 4f9daf9821731b09212262ff86f9b9ad809d31a3 Mon Sep 17 00:00:00 2001 From: efe-arv Date: Mon, 2 Mar 2026 01:54:20 +0300 Subject: [PATCH] fix: propagate client.start() errors to caller instead of swallowing Codex review feedback: ensureSharedClientStarted now throws the error from client.start() if it rejects during the 2s grace window, so resolveSharedMatrixClient() properly reports failure (e.g. bad token, unreachable homeserver) instead of leaving the provider in a running-but-not-syncing state. --- extensions/matrix/src/matrix/client/shared.ts | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/extensions/matrix/src/matrix/client/shared.ts b/extensions/matrix/src/matrix/client/shared.ts index 2f711889296..5587f8f0fe9 100644 --- a/extensions/matrix/src/matrix/client/shared.ts +++ b/extensions/matrix/src/matrix/client/shared.ts @@ -87,16 +87,19 @@ async function ensureSharedClientStarted(params: { // bot-sdk start() returns a promise that never resolves (infinite sync loop). // Fire-and-forget: the sync loop runs and events fire on the client, // but we must not await or the entire provider startup hangs forever. - let startFailed = false; + // If start() rejects during the grace window (e.g. bad token, unreachable + // homeserver), we propagate the error so the caller knows startup failed. + let startError: unknown = undefined; client.start().catch((err: unknown) => { - startFailed = true; + startError = err; LogService.error("MatrixClientLite", "client.start() error:", err); }); // Give the sync loop a moment to initialize before marking ready await new Promise(resolve => setTimeout(resolve, 2000)); - if (!startFailed) { - params.state.started = true; + if (startError) { + throw startError; } + params.state.started = true; })(); sharedClientStartPromises.set(key, startPromise); try {