Spaces:
Runtime error
Runtime error
| from aiohttp.web import Application, AppRunner, Response, RouteTableDef, TCPSite | |
| from dependency_injector.containers import DeclarativeContainer | |
| from dependency_injector.resources import AsyncResource | |
| from itertools import chain | |
| from loguru import logger | |
| from pydantic import ConfigDict, PrivateAttr | |
| from typing import Self, Sequence | |
| from ctp_slack_bot.controllers.base import ControllerBase, Route | |
| from ctp_slack_bot.core import ApplicationComponentBase, Settings | |
| class HTTPServer(ApplicationComponentBase): | |
| model_config = ConfigDict(frozen=True) | |
| settings: Settings | |
| routes: Sequence[Route] | |
| _app_runner: AppRunner = PrivateAttr() | |
| _site: TCPSite = PrivateAttr() | |
| async def initialize(self: Self) -> None: | |
| app = Application() | |
| for route in self.routes: | |
| app.router.add_route(route.method, route.path, route.handler) | |
| logger.info("Registered HTTP route: {} {}", route.method, route.path) | |
| self._app_runner = AppRunner(app) | |
| await self._app_runner.setup() | |
| self._site = TCPSite(self._app_runner, self.settings.http_host, self.settings.http_port) | |
| async def start(self: Self) -> None: | |
| await self._site.start() | |
| async def stop(self: Self) -> None: | |
| await self._app_runner.cleanup() | |
| def name(self: Self) -> str: | |
| return "http_server" | |
| class HTTPServerResource(AsyncResource): | |
| async def init(self: Self, settings: Settings, controllers: Sequence[ControllerBase]) -> HTTPServer: | |
| routes = tuple(chain.from_iterable(controller.get_routes() | |
| for controller | |
| in controllers)) | |
| http_server = HTTPServer(settings=settings, routes=routes) | |
| await http_server.initialize() | |
| return http_server | |
| async def shutdown(self: Self, http_server: HTTPServer) -> None: | |
| await http_server.stop() | |