62 lines
2.3 KiB
Python
62 lines
2.3 KiB
Python
"""Адаптеры, связывающие жизненный цикл менеджера с HTTP API и каналами управления.
|
|
|
|
ManagementApiBridge отдаёт start/stop в HTTP; ControlChannelBridge — start/stop/status в Telegram и др."""
|
|
from __future__ import annotations
|
|
|
|
import asyncio
|
|
from collections.abc import Awaitable, Callable
|
|
|
|
from ..types import LifecycleState
|
|
|
|
|
|
class ManagementApiBridge:
|
|
"""Предоставляет start/stop жизненного цикла как async-колбэки для ManagementServer (/actions/start, /actions/stop)."""
|
|
|
|
def __init__(
|
|
self,
|
|
start_fn: Callable[[], Awaitable[None]],
|
|
stop_fn: Callable[[], Awaitable[None]],
|
|
):
|
|
self._start_fn = start_fn
|
|
self._stop_fn = stop_fn
|
|
|
|
async def on_start(self) -> str:
|
|
"""Выполнить start и вернуть сообщение для HTTP-ответа."""
|
|
await self._start_fn()
|
|
return "start completed"
|
|
|
|
async def on_stop(self) -> str:
|
|
"""Выполнить stop и вернуть сообщение для HTTP-ответа."""
|
|
await self._stop_fn()
|
|
return "stop completed"
|
|
|
|
|
|
class ControlChannelBridge:
|
|
"""Предоставляет halt и status как обработчики start/stop/status для ControlChannel (например Telegram)."""
|
|
|
|
def __init__(
|
|
self,
|
|
halt: asyncio.Event,
|
|
get_state: Callable[[], LifecycleState],
|
|
get_status: Callable[[], Awaitable[str]],
|
|
):
|
|
self._halt = halt
|
|
self._get_state = get_state
|
|
self._get_status = get_status
|
|
|
|
async def on_start(self) -> str:
|
|
"""Обработать внешний start: сбросить halt; идемпотентно при уже running."""
|
|
if self._get_state() == LifecycleState.RUNNING:
|
|
return "already running"
|
|
self._halt.clear()
|
|
return "start signal accepted"
|
|
|
|
async def on_stop(self) -> str:
|
|
"""Обработать внешний stop: установить halt."""
|
|
self._halt.set()
|
|
return "stop signal accepted"
|
|
|
|
async def on_status(self) -> str:
|
|
"""Вернуть текущий текст статуса."""
|
|
return await self._get_status()
|