54 lines
1.9 KiB
Python
54 lines
1.9 KiB
Python
from __future__ import annotations
|
|
|
|
from fastapi import FastAPI, Response, status
|
|
|
|
from hub_core import __version__
|
|
from hub_core.runtime.config import RuntimeSettings
|
|
from hub_core.runtime.models import HealthResponse, ReadinessResponse
|
|
from hub_core.runtime.ports import create_ports_router
|
|
from hub_core.runtime.store import InMemoryPortStore, PortStore
|
|
from hub_core.runtime.validation import ContractValidator
|
|
|
|
|
|
def create_app(
|
|
*,
|
|
settings: RuntimeSettings | None = None,
|
|
port_store: PortStore | None = None,
|
|
) -> FastAPI:
|
|
resolved_settings = settings or RuntimeSettings.from_env()
|
|
resolved_store = port_store or _create_store(resolved_settings)
|
|
|
|
app = FastAPI(
|
|
title="Hub Core Runtime",
|
|
version=__version__,
|
|
description="HelixForge hub framework and named-port runtime.",
|
|
)
|
|
app.state.settings = resolved_settings
|
|
app.state.port_store = resolved_store
|
|
app.state.contract_validator = ContractValidator()
|
|
|
|
@app.get("/healthz", response_model=HealthResponse, tags=["system"])
|
|
async def healthz() -> HealthResponse:
|
|
return HealthResponse(version=__version__)
|
|
|
|
@app.get("/readyz", response_model=ReadinessResponse, tags=["system"])
|
|
async def readyz(response: Response) -> ReadinessResponse:
|
|
ready = resolved_settings.is_ready(resolved_store.backend_name)
|
|
if not ready:
|
|
response.status_code = status.HTTP_503_SERVICE_UNAVAILABLE
|
|
return ReadinessResponse(
|
|
status="ok" if ready else "degraded",
|
|
checks=resolved_settings.readiness_checks(resolved_store.backend_name),
|
|
)
|
|
|
|
app.include_router(create_ports_router())
|
|
return app
|
|
|
|
|
|
def _create_store(settings: RuntimeSettings) -> PortStore:
|
|
if settings.backend == "memory":
|
|
return InMemoryPortStore()
|
|
raise RuntimeError(f"Unsupported HUB_CORE_BACKEND '{settings.backend}'")
|
|
|
|
|
|
app = create_app()
|