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;