diff --git a/extensions/feishu/src/monitor.startup.test.ts b/extensions/feishu/src/monitor.startup.test.ts index 601df225263..d6cd6861666 100644 --- a/extensions/feishu/src/monitor.startup.test.ts +++ b/extensions/feishu/src/monitor.startup.test.ts @@ -44,8 +44,8 @@ async function waitForStartedAccount(started: string[], accountId: string) { } } -afterEach(() => { - stopFeishuMonitor(); +afterEach(async () => { + await stopFeishuMonitor(); }); describe("Feishu monitor startup preflight", () => { diff --git a/extensions/feishu/src/monitor.state.ts b/extensions/feishu/src/monitor.state.ts index 55b8d0dea5a..d73eb44db75 100644 --- a/extensions/feishu/src/monitor.state.ts +++ b/extensions/feishu/src/monitor.state.ts @@ -132,13 +132,15 @@ export function recordWebhookStatus( }); } -export function stopFeishuMonitorState(accountId?: string): void { +export async function stopFeishuMonitorState(accountId?: string): Promise { if (accountId) { wsClients.delete(accountId); const server = httpServers.get(accountId); if (server) { - server.close(); httpServers.delete(accountId); + await new Promise((resolve) => { + server.close(() => resolve()); + }); } botOpenIds.delete(accountId); botNames.delete(accountId); @@ -146,10 +148,16 @@ export function stopFeishuMonitorState(accountId?: string): void { } wsClients.clear(); + const closePromises: Promise[] = []; for (const server of httpServers.values()) { - server.close(); + closePromises.push( + new Promise((resolve) => { + server.close(() => resolve()); + }), + ); } httpServers.clear(); + await Promise.all(closePromises); botOpenIds.clear(); botNames.clear(); } diff --git a/extensions/feishu/src/monitor.ts b/extensions/feishu/src/monitor.ts index 67be9c259f6..7cbba562731 100644 --- a/extensions/feishu/src/monitor.ts +++ b/extensions/feishu/src/monitor.ts @@ -90,6 +90,6 @@ export async function monitorFeishuProvider(opts: MonitorFeishuOpts = {}): Promi await Promise.all(monitorPromises); } -export function stopFeishuMonitor(accountId?: string): void { - stopFeishuMonitorState(accountId); +export async function stopFeishuMonitor(accountId?: string): Promise { + await stopFeishuMonitorState(accountId); } diff --git a/extensions/feishu/src/monitor.webhook-e2e.test.ts b/extensions/feishu/src/monitor.webhook-e2e.test.ts index 33035a735f6..0e0d3d7a34a 100644 --- a/extensions/feishu/src/monitor.webhook-e2e.test.ts +++ b/extensions/feishu/src/monitor.webhook-e2e.test.ts @@ -58,8 +58,8 @@ async function postSignedPayload(url: string, payload: Record) }); } -afterEach(() => { - stopFeishuMonitor(); +afterEach(async () => { + await stopFeishuMonitor(); }); describe("Feishu webhook signed-request e2e", () => { diff --git a/extensions/feishu/src/monitor.webhook-security.test.ts b/extensions/feishu/src/monitor.webhook-security.test.ts index 957d874cc3a..405de524f19 100644 --- a/extensions/feishu/src/monitor.webhook-security.test.ts +++ b/extensions/feishu/src/monitor.webhook-security.test.ts @@ -35,9 +35,9 @@ import { stopFeishuMonitor, } from "./monitor.js"; -afterEach(() => { +afterEach(async () => { clearFeishuWebhookRateLimitStateForTest(); - stopFeishuMonitor(); + await stopFeishuMonitor(); }); describe("Feishu webhook security hardening", () => {