38 lines
1.1 KiB
Python
38 lines
1.1 KiB
Python
import asyncio
|
||
|
||
import httpx
|
||
|
||
from config import load_config
|
||
from docker_manager import DockerManager
|
||
from middleware import ProxyMiddleware
|
||
|
||
|
||
# Single shared HTTP client – reuses TCP connections via connection pooling.
|
||
_http_client = httpx.AsyncClient(timeout=30.0)
|
||
docker_mgr = DockerManager()
|
||
routes = load_config("config.yml")
|
||
|
||
|
||
async def _lifespan(scope, receive, send):
|
||
if scope["type"] != "lifespan":
|
||
return
|
||
task = None
|
||
while True:
|
||
event = await receive()
|
||
if event["type"] == "lifespan.startup":
|
||
task = asyncio.create_task(docker_mgr.idle_watcher())
|
||
await send({"type": "lifespan.startup.complete"})
|
||
elif event["type"] == "lifespan.shutdown":
|
||
if task:
|
||
task.cancel()
|
||
try:
|
||
await task
|
||
except asyncio.CancelledError:
|
||
pass
|
||
await _http_client.aclose()
|
||
await send({"type": "lifespan.shutdown.complete"})
|
||
return
|
||
|
||
|
||
app = ProxyMiddleware(_lifespan, routes=routes, docker=docker_mgr, http_client=_http_client)
|