fix: clean up slack socket waiters on start hooks

This commit is contained in:
Bek
2026-04-21 16:46:35 -04:00
committed by Peter Steinberger
parent cd1977bf16
commit 270003aefd
2 changed files with 34 additions and 8 deletions

View File

@@ -19,6 +19,10 @@ class FakeEmitter {
listener(...args);
}
}
listenerCount(event: string) {
return this.listeners.get(event)?.size ?? 0;
}
}
describe("slack socket reconnect helpers", () => {
@@ -117,6 +121,28 @@ describe("slack socket reconnect helpers", () => {
expect(onStarted).toHaveBeenCalledTimes(1);
});
it("cancels the disconnect waiter when onStarted throws", async () => {
const client = new FakeEmitter();
const app = {
receiver: { client },
start: vi.fn().mockResolvedValue(undefined),
};
const err = new Error("status sink failed");
await expect(
__testing.startSlackSocketAndWaitForDisconnect({
app: app as never,
onStarted: () => {
throw err;
},
}),
).rejects.toThrow("status sink failed");
expect(client.listenerCount("disconnected")).toBe(0);
expect(client.listenerCount("unable_to_socket_mode_start")).toBe(0);
expect(client.listenerCount("error")).toBe(0);
});
it("preserves error payload from unable_to_socket_mode_start event", async () => {
const client = new FakeEmitter();
const app = { receiver: { client } };

View File

@@ -245,18 +245,18 @@ async function startSlackSocketAndWaitForDisconnect(params: {
const disconnectWaiter = createSlackSocketDisconnectWaiter(params.app, params.abortSignal);
try {
await Promise.resolve(params.app.start());
if (params.abortSignal?.aborted) {
disconnectWaiter.cancel();
return null;
}
params.onStarted?.();
const disconnect = await disconnectWaiter.promise;
disconnectWaiter.complete();
return disconnect;
} catch (err) {
disconnectWaiter.cancel();
throw err;
}
if (params.abortSignal?.aborted) {
disconnectWaiter.cancel();
return null;
}
params.onStarted?.();
const disconnect = await disconnectWaiter.promise;
disconnectWaiter.complete();
return disconnect;
}
function resolveSlackSocketShutdownClient(app: unknown): SlackSocketShutdownClient | undefined {