from pathlib import Path from fastapi import FastAPI, Response from fastapi.responses import FileResponse from fastapi.staticfiles import StaticFiles import uvicorn ROOT = Path(__file__).resolve().parent DIST = ROOT / "dist" ASSETS = DIST / "assets" INDEX = DIST / "index.html" app = FastAPI() @app.middleware("http") async def add_browser_inference_headers(request, call_next): response = await call_next(request) response.headers.setdefault("Cross-Origin-Opener-Policy", "same-origin") response.headers.setdefault("Cross-Origin-Embedder-Policy", "require-corp") response.headers.setdefault("Cross-Origin-Resource-Policy", "cross-origin") return response @app.get("/healthz") def healthz(): return {"ok": True} @app.get("/favicon.ico", include_in_schema=False) def favicon(): return Response(status_code=204) if ASSETS.exists(): app.mount("/assets", StaticFiles(directory=ASSETS), name="assets") @app.get("/{path:path}", include_in_schema=False) def serve_app(path: str): candidate = DIST / path if path and candidate.is_file(): return FileResponse(candidate) return FileResponse(INDEX) if __name__ == "__main__": uvicorn.run(app, host="0.0.0.0", port=7860)