/
liquid-g
/
liquid-code
Обзор
Документация
Войти
/
liquid-g
/
liquid-code
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
develop-0.4
src/liquidcode/websocket/adapter.py
67 строк
2 KB
User
ci: настроен Black и flake8 для автоматического форматирования кода
04 июл 2026, 08:14
04 июл 2026, 08:14
4778ed6
Код
Авторство
О чём код?
""" Адаптер для WebSocket-сервера. """ import asyncio import logging try: import websockets.asyncio.server as ws_server from websockets.exceptions import ConnectionClosed except ImportError: raise ImportError( "Для работы WebSocket требуется установить websockets. " "Установите: pip install liquidcode[websocket]" ) from ..kernel import Kernel from .websocket_request import WebSocketRequest from .websocket_response import WebSocketResponse logger = logging.getLogger(__name__) class WebSocketAdapter: """ Адаптер для запуска WebSocket-сервера и маршрутизации сообщений через Kernel. """ def __init__(self, kernel: Kernel): self.kernel = kernel async def _handle_connection(self, websocket) -> None: """ Обрабатывает одно WebSocket-соединение. """ path = websocket.path headers = dict(websocket.request_headers) logger.info(f"WebSocket соединение открыто: {path}") try: async for message in websocket: request = WebSocketRequest( path=path, message=message, websocket=websocket, headers=headers, ) response = await asyncio.to_thread(self.kernel.handle, request) if isinstance(response, WebSocketResponse): await websocket.send(response.get_content()) else: await websocket.send(str(response.get_content())) except ConnectionClosed: logger.info("WebSocket соединение закрыто") except Exception as e: logger.exception(f"Ошибка в WebSocket-соединении: {e}") finally: await websocket.close() async def run(self, host: str = "localhost", port: int = 8765) -> None: """ Запускает WebSocket-сервер. """ logger.info(f"Запуск WebSocket-сервера на {host}:{port}") async with ws_server.serve(self._handle_connection, host, port): await asyncio.Future() # бесконечное ожидание