Files
pangolin/server/middlewares/requestTimeout.ts
2025-12-09 10:56:14 -05:00

38 lines
1.1 KiB
TypeScript

import { Request, Response, NextFunction } from "express";
import logger from "@server/logger";
import createHttpError from "http-errors";
import HttpCode from "@server/types/HttpCode";
export function requestTimeoutMiddleware(timeoutMs: number = 30000) {
return (req: Request, res: Response, next: NextFunction) => {
// Set a timeout for the request
const timeout = setTimeout(() => {
if (!res.headersSent) {
logger.error(
`Request timeout: ${req.method} ${req.url} from ${req.ip}`
);
return next(
createHttpError(
HttpCode.REQUEST_TIMEOUT,
"Request timeout - operation took too long to complete"
)
);
}
}, timeoutMs);
// Clear timeout when response finishes
res.on("finish", () => {
clearTimeout(timeout);
});
// Clear timeout when response closes
res.on("close", () => {
clearTimeout(timeout);
});
next();
};
}
export default requestTimeoutMiddleware;