import anyio from starlette.middleware.base import BaseHTTPMiddleware from starlette.requests import Request from starlette.responses import JSONResponse, Response class TimeoutMiddleware(BaseHTTPMiddleware): def __init__(self, app, timeout_seconds: int): super().__init__(app) self.timeout_seconds = timeout_seconds async def dispatch(self, request: Request, call_next) -> Response: try: with anyio.fail_after(self.timeout_seconds): return await call_next(request) except TimeoutError: return JSONResponse( status_code=504, content={"error": "Request timed out", "details": {"timeout_seconds": self.timeout_seconds}}, )