diff --git a/extensions/matrix/src/matrix/actions/client.test.ts b/extensions/matrix/src/matrix/actions/client.test.ts index 1f2d3070b7c..c6ec7bac6fd 100644 --- a/extensions/matrix/src/matrix/actions/client.test.ts +++ b/extensions/matrix/src/matrix/actions/client.test.ts @@ -12,7 +12,7 @@ const { getMatrixRuntimeMock, getActiveMatrixClientMock, resolveSharedMatrixClientMock, - stopSharedClientInstanceMock, + removeSharedClientInstanceMock, isBunRuntimeMock, resolveMatrixAuthContextMock, } = matrixClientResolverMocks; @@ -32,7 +32,7 @@ vi.mock("../client.js", () => ({ })); vi.mock("../client/shared.js", () => ({ - stopSharedClientInstance: (...args: unknown[]) => stopSharedClientInstanceMock(...args), + removeSharedClientInstance: (...args: unknown[]) => removeSharedClientInstanceMock(...args), })); vi.mock("../send.js", () => ({ @@ -74,7 +74,7 @@ describe("action client helpers", () => { const sharedClient = await resolveSharedMatrixClientMock.mock.results[0]?.value; expect(sharedClient.prepareForOneOff).toHaveBeenCalledTimes(1); expect(sharedClient.stop).toHaveBeenCalledTimes(1); - expect(stopSharedClientInstanceMock).toHaveBeenCalledWith(sharedClient); + expect(removeSharedClientInstanceMock).toHaveBeenCalledWith(sharedClient); expect(result).toBe("ok"); }); @@ -95,7 +95,7 @@ describe("action client helpers", () => { expect(sharedClient.prepareForOneOff).not.toHaveBeenCalled(); expect(sharedClient.stop).not.toHaveBeenCalled(); expect(sharedClient.stopAndPersist).toHaveBeenCalledTimes(1); - expect(stopSharedClientInstanceMock).toHaveBeenCalledWith(sharedClient); + expect(removeSharedClientInstanceMock).toHaveBeenCalledWith(sharedClient); }); it("reuses active monitor client when available", async () => { @@ -197,7 +197,7 @@ describe("action client helpers", () => { expect(result).toBe("ok"); expect(sharedClient.stop).toHaveBeenCalledTimes(1); expect(sharedClient.stopAndPersist).not.toHaveBeenCalled(); - expect(stopSharedClientInstanceMock).toHaveBeenCalledWith(sharedClient); + expect(removeSharedClientInstanceMock).toHaveBeenCalledWith(sharedClient); }); it("stops shared action clients when the wrapped call throws", async () => { diff --git a/extensions/matrix/src/matrix/client-bootstrap.ts b/extensions/matrix/src/matrix/client-bootstrap.ts index 93c700abef6..37b3387c72b 100644 --- a/extensions/matrix/src/matrix/client-bootstrap.ts +++ b/extensions/matrix/src/matrix/client-bootstrap.ts @@ -2,7 +2,7 @@ import { getMatrixRuntime } from "../runtime.js"; import type { CoreConfig } from "../types.js"; import { getActiveMatrixClient } from "./active-client.js"; import { isBunRuntime, resolveMatrixAuthContext, resolveSharedMatrixClient } from "./client.js"; -import { stopSharedClientInstance } from "./client/shared.js"; +import { removeSharedClientInstance } from "./client/shared.js"; import type { MatrixClient } from "./sdk.js"; type ResolvedRuntimeMatrixClient = { @@ -78,7 +78,7 @@ async function resolveRuntimeMatrixClient(opts: { } else { client.stop(); } - stopSharedClientInstance(client); + removeSharedClientInstance(client); }, }; } diff --git a/extensions/matrix/src/matrix/client-resolver.test-helpers.ts b/extensions/matrix/src/matrix/client-resolver.test-helpers.ts index a6ee7b86d9b..06605e0afed 100644 --- a/extensions/matrix/src/matrix/client-resolver.test-helpers.ts +++ b/extensions/matrix/src/matrix/client-resolver.test-helpers.ts @@ -6,7 +6,7 @@ type MatrixClientResolverMocks = { getMatrixRuntimeMock: Mock<() => unknown>; getActiveMatrixClientMock: Mock<(...args: unknown[]) => MatrixClient | null>; resolveSharedMatrixClientMock: Mock<(...args: unknown[]) => Promise>; - stopSharedClientInstanceMock: Mock<(...args: unknown[]) => void>; + removeSharedClientInstanceMock: Mock<(...args: unknown[]) => void>; isBunRuntimeMock: Mock<() => boolean>; resolveMatrixAuthContextMock: Mock< (params: { cfg: unknown; accountId?: string | null }) => unknown @@ -18,7 +18,7 @@ export const matrixClientResolverMocks: MatrixClientResolverMocks = { getMatrixRuntimeMock: vi.fn(), getActiveMatrixClientMock: vi.fn(), resolveSharedMatrixClientMock: vi.fn(), - stopSharedClientInstanceMock: vi.fn(), + removeSharedClientInstanceMock: vi.fn(), isBunRuntimeMock: vi.fn(() => false), resolveMatrixAuthContextMock: vi.fn(), }; @@ -44,7 +44,7 @@ export function primeMatrixClientResolverMocks(params?: { getMatrixRuntimeMock, getActiveMatrixClientMock, resolveSharedMatrixClientMock, - stopSharedClientInstanceMock, + removeSharedClientInstanceMock, isBunRuntimeMock, resolveMatrixAuthContextMock, } = matrixClientResolverMocks; @@ -70,7 +70,7 @@ export function primeMatrixClientResolverMocks(params?: { }); getActiveMatrixClientMock.mockReturnValue(null); isBunRuntimeMock.mockReturnValue(false); - stopSharedClientInstanceMock.mockReset(); + removeSharedClientInstanceMock.mockReset(); resolveMatrixAuthContextMock.mockImplementation( ({ cfg: explicitCfg, diff --git a/extensions/matrix/src/matrix/client.ts b/extensions/matrix/src/matrix/client.ts index 57395b22c24..ccf35b58d70 100644 --- a/extensions/matrix/src/matrix/client.ts +++ b/extensions/matrix/src/matrix/client.ts @@ -11,6 +11,7 @@ export { } from "./client/config.js"; export { createMatrixClient } from "./client/create-client.js"; export { + removeSharedClientInstance, resolveSharedMatrixClient, stopSharedClientForAccount, stopSharedClientInstance, diff --git a/extensions/matrix/src/matrix/client/shared.ts b/extensions/matrix/src/matrix/client/shared.ts index dca912133eb..a7b1a14ce96 100644 --- a/extensions/matrix/src/matrix/client/shared.ts +++ b/extensions/matrix/src/matrix/client/shared.ts @@ -194,14 +194,21 @@ export function stopSharedClientForAccount(auth: MatrixAuth): void { sharedClientPromises.delete(key); } -export function stopSharedClientInstance(client: MatrixClient): void { +export function removeSharedClientInstance(client: MatrixClient): boolean { for (const [key, state] of sharedClientStates.entries()) { if (state.client !== client) { continue; } - state.client.stop(); sharedClientStates.delete(key); sharedClientPromises.delete(key); + return true; + } + return false; +} + +export function stopSharedClientInstance(client: MatrixClient): void { + if (!removeSharedClientInstance(client)) { return; } + client.stop(); } diff --git a/extensions/matrix/src/matrix/send/client.test.ts b/extensions/matrix/src/matrix/send/client.test.ts index 5366aae5958..8f29130876e 100644 --- a/extensions/matrix/src/matrix/send/client.test.ts +++ b/extensions/matrix/src/matrix/send/client.test.ts @@ -9,7 +9,7 @@ const { getMatrixRuntimeMock, getActiveMatrixClientMock, resolveSharedMatrixClientMock, - stopSharedClientInstanceMock, + removeSharedClientInstanceMock, isBunRuntimeMock, resolveMatrixAuthContextMock, } = matrixClientResolverMocks; @@ -25,7 +25,7 @@ vi.mock("../client.js", () => ({ })); vi.mock("../client/shared.js", () => ({ - stopSharedClientInstance: (...args: unknown[]) => stopSharedClientInstanceMock(...args), + removeSharedClientInstance: (...args: unknown[]) => removeSharedClientInstanceMock(...args), })); vi.mock("../../runtime.js", () => ({ @@ -63,7 +63,7 @@ describe("withResolvedMatrixClient", () => { const sharedClient = await resolveSharedMatrixClientMock.mock.results[0]?.value; expect(sharedClient.prepareForOneOff).toHaveBeenCalledTimes(1); expect(sharedClient.stop).toHaveBeenCalledTimes(1); - expect(stopSharedClientInstanceMock).toHaveBeenCalledWith(sharedClient); + expect(removeSharedClientInstanceMock).toHaveBeenCalledWith(sharedClient); expect(result).toBe("ok"); }); @@ -132,6 +132,6 @@ describe("withResolvedMatrixClient", () => { ).rejects.toThrow("boom"); expect(sharedClient.stop).toHaveBeenCalledTimes(1); - expect(stopSharedClientInstanceMock).toHaveBeenCalledWith(sharedClient); + expect(removeSharedClientInstanceMock).toHaveBeenCalledWith(sharedClient); }); });