Spaces:
Runtime error
Runtime error
| from asyncio import all_tasks, CancelledError, create_task, current_task, gather, get_running_loop, run | |
| from loguru import logger | |
| from signal import SIGINT, SIGTERM | |
| from typing import Callable | |
| from .containers import Container | |
| from .core.logging import setup_logging | |
| async def handle_shutdown_signal(*args) -> None: | |
| logger.info("Received shutdown signal.") | |
| for arg in args: | |
| await arg() | |
| logger.info("Executed shutdown tasks.") | |
| for task in all_tasks(): | |
| if task is not current_task() and not task.done(): | |
| task.cancel() | |
| logger.trace("Cancelled task {}.", task.get_name()) | |
| logger.info("Cancelled all tasks.") | |
| def create_shutdown_signal_handler(*args) -> Callable[[], None]: | |
| def shutdown_signal_handler() -> None: | |
| create_task(handle_shutdown_signal(*args)) | |
| return shutdown_signal_handler | |
| async def main() -> None: | |
| # Setup logging. | |
| setup_logging() | |
| logger.info("Starting application…") | |
| # Set up dependency injection container. | |
| container = Container() | |
| container.wire(packages=["ctp_slack_bot"]) | |
| logger.debug("Created dependency injection container with providers: {}", '; '.join(container.providers)) | |
| # Initialize/instantiate services which should be available from the start. | |
| await container.content_ingestion_service() | |
| await container.question_dispatch_service() | |
| http_server = await container.http_server() | |
| slack_service = await container.slack_service() | |
| task_service = await container.task_service() | |
| logger.debug("Initialized services.") | |
| # Install the shutdown signal handler. | |
| shutdown_signal_handler = create_shutdown_signal_handler(http_server.stop, slack_service.stop, task_service.stop) | |
| loop = get_running_loop() | |
| loop.add_signal_handler(SIGINT, shutdown_signal_handler) | |
| loop.add_signal_handler(SIGTERM, shutdown_signal_handler) | |
| # Start the HTTP server and Slack socket mode handler in the background; clean up resources when shut down. | |
| try: | |
| logger.info("Starting services…") | |
| await gather(http_server.start(), slack_service.start(), task_service.start()) | |
| except CancelledError: | |
| logger.info("Shutting down application…") | |
| finally: | |
| await container.shutdown_resources() | |
| if __name__ == "__main__": | |
| run(main()) | |