diff --git a/extensions/msteams/src/monitor.lifecycle.test.ts b/extensions/msteams/src/monitor.lifecycle.test.ts index 4cec4ebff142..e5fd018b3345 100644 --- a/extensions/msteams/src/monitor.lifecycle.test.ts +++ b/extensions/msteams/src/monitor.lifecycle.test.ts @@ -92,7 +92,7 @@ vi.mock("express", () => { const app = vi.fn() as MockExpressApp; app.use = vi.fn(); app.post = vi.fn(); - app.listen = vi.fn((_port: number) => { + app.listen = vi.fn((_port: number, callback?: (error?: Error) => void) => { const server = new EventEmitter() as FakeServer; server.setTimeout = vi.fn((_msecs: number) => server); server.requestTimeout = 0; @@ -105,10 +105,10 @@ vi.mock("express", () => { }; queueMicrotask(() => { if (expressControl.mode.value === "error") { - server.emit("error", new Error("listen EADDRINUSE")); + callback?.(new Error("listen EADDRINUSE")); return; } - server.emit("listening"); + callback?.(); }); return server; }); diff --git a/extensions/msteams/src/monitor.ts b/extensions/msteams/src/monitor.ts index f9281000207e..a3492fd77d30 100644 --- a/extensions/msteams/src/monitor.ts +++ b/extensions/msteams/src/monitor.ts @@ -1,4 +1,5 @@ // Msteams plugin module implements monitor behavior. +import type { Server } from "node:http"; import type { Request, Response } from "express"; import { DEFAULT_WEBHOOK_MAX_BODY_BYTES, @@ -537,21 +538,13 @@ export async function monitorMSTeamsProvider( await app.initialize(); // Start listening and fail fast if bind/listen fails. - const httpServer = expressApp.listen(port); - await new Promise((resolve, reject) => { - const onListening = () => { - httpServer.off("error", onError); - log.info(`msteams provider started on port ${port}`); - resolve(); - }; - const onError = (err: unknown) => { - httpServer.off("listening", onListening); - log.error("msteams server error", { error: formatUnknownError(err) }); - reject(toLintErrorObject(err, "MSTeams server failed")); - }; - httpServer.once("listening", onListening); - httpServer.once("error", onError); + const httpServer = await new Promise((resolve, reject) => { + const server = expressApp.listen(port, (err) => (err ? reject(err) : resolve(server))); + }).catch((err: unknown) => { + log.error("msteams server error", { error: formatUnknownError(err) }); + throw err; }); + log.info(`msteams provider started on port ${port}`); applyMSTeamsWebhookTimeouts(httpServer); httpServer.on("error", (err) => { @@ -580,20 +573,6 @@ export async function monitorMSTeamsProvider( return { app: expressApp, shutdown }; } -function toLintErrorObject(value: unknown, fallbackMessage: string): Error { - if (value instanceof Error) { - return value; - } - if (typeof value === "string") { - return new Error(value); - } - const error = new Error(fallbackMessage, { cause: value }); - if ((typeof value === "object" && value !== null) || typeof value === "function") { - Object.assign(error, value); - } - return error; -} - /** * Build a minimal ActivityHandler-compatible object that supports * onMessage / onMembersAdded registration and a run() method.