Files
config_manager/src/config_manager/v2/management/bridges.py
T

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()