refactor(msteams): use Express listen errors

This commit is contained in:
Peter Steinberger
2026-07-14 11:04:52 +01:00
parent 693d4f8fa3
commit ee472357cb
2 changed files with 10 additions and 31 deletions

View File

@@ -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;
});

View File

@@ -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<void>((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<Server>((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.