Add configurable adapter selection to app runner
This commit is contained in:
33
youdis.py
33
youdis.py
@@ -1,5 +1,5 @@
|
||||
#!/usr/bin/env python3
|
||||
"""App runner for the standard v2 stack."""
|
||||
"""App runner for FastAPI backend and discord adapter."""
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
@@ -22,6 +22,7 @@ DEFAULT_BACKEND_HOST = os.getenv("YOUDIS_BACKEND_HOST", "127.0.0.1")
|
||||
DEFAULT_BACKEND_PORT = int(os.getenv("YOUDIS_BACKEND_PORT", "8000"))
|
||||
RUN_BACKEND = os.getenv("YOUDIS_RUN_BACKEND", "1") not in {"0", "false", "False"}
|
||||
RUN_DISCORD = os.getenv("YOUDIS_RUN_DISCORD", "1") not in {"0", "false", "False"}
|
||||
ENABLED_ADAPTERS = os.getenv("YOUDIS_ENABLED_ADAPTERS", "discord")
|
||||
BACKEND_HEALTH_TIMEOUT = float(os.getenv("YOUDIS_BACKEND_HEALTH_TIMEOUT", "20"))
|
||||
BACKEND_HEALTH_INTERVAL = float(os.getenv("YOUDIS_BACKEND_HEALTH_INTERVAL", "0.5"))
|
||||
|
||||
@@ -69,6 +70,23 @@ async def start_discord(env: dict[str, str]) -> ManagedProcess:
|
||||
return ManagedProcess(name="discord", process=process)
|
||||
|
||||
|
||||
ADAPTER_STARTERS = {
|
||||
"discord": start_discord,
|
||||
}
|
||||
|
||||
|
||||
def selected_adapters() -> list[str]:
|
||||
requested = [name.strip() for name in ENABLED_ADAPTERS.split(",") if name.strip()]
|
||||
if not RUN_DISCORD:
|
||||
requested = [name for name in requested if name != "discord"]
|
||||
|
||||
unknown = [name for name in requested if name not in ADAPTER_STARTERS]
|
||||
if unknown:
|
||||
raise ValueError(f"unknown adapters requested: {', '.join(sorted(unknown))}")
|
||||
|
||||
return requested
|
||||
|
||||
|
||||
async def wait_for_backend_health(timeout_seconds: float) -> None:
|
||||
deadline = asyncio.get_running_loop().time() + timeout_seconds
|
||||
health_url = f"{backend_url()}/health"
|
||||
@@ -102,9 +120,10 @@ async def stop_process(proc: ManagedProcess) -> None:
|
||||
async def run() -> int:
|
||||
managed: list[ManagedProcess] = []
|
||||
env = build_child_env()
|
||||
adapters = selected_adapters()
|
||||
|
||||
if not RUN_BACKEND and not RUN_DISCORD:
|
||||
print("nothing to start: both YOUDIS_RUN_BACKEND and YOUDIS_RUN_DISCORD are disabled")
|
||||
if not RUN_BACKEND and not adapters:
|
||||
print("nothing to start: backend is disabled and no adapters are enabled")
|
||||
return 1
|
||||
|
||||
try:
|
||||
@@ -115,10 +134,10 @@ async def run() -> int:
|
||||
await wait_for_backend_health(BACKEND_HEALTH_TIMEOUT)
|
||||
print("backend is healthy")
|
||||
|
||||
if RUN_DISCORD:
|
||||
discord = await start_discord(env)
|
||||
managed.append(discord)
|
||||
print("started discord adapter")
|
||||
for adapter_name in adapters:
|
||||
process = await ADAPTER_STARTERS[adapter_name](env)
|
||||
managed.append(process)
|
||||
print(f"started {adapter_name} adapter")
|
||||
|
||||
wait_tasks = [asyncio.create_task(proc.process.wait()) for proc in managed]
|
||||
done, pending = await asyncio.wait(wait_tasks, return_when=asyncio.FIRST_COMPLETED)
|
||||
|
||||
Reference in New Issue
Block a user