From 612d807bc4e997e63791d58b78ad29a9a17a0b7b Mon Sep 17 00:00:00 2001 From: Siarhei Siniak Date: Mon, 14 Jul 2025 11:17:39 +0300 Subject: [PATCH] [+] add websocket clients manager --- .../async_api/fastapi.py | 55 ++++++++++++++++++- 1 file changed, 53 insertions(+), 2 deletions(-) diff --git a/deps/test-task-2025-06-30-v1/python/online/fxreader/pr34/test_task_2025_06_30_v1/async_api/fastapi.py b/deps/test-task-2025-06-30-v1/python/online/fxreader/pr34/test_task_2025_06_30_v1/async_api/fastapi.py index 4c623a7..b8624f3 100644 --- a/deps/test-task-2025-06-30-v1/python/online/fxreader/pr34/test_task_2025_06_30_v1/async_api/fastapi.py +++ b/deps/test-task-2025-06-30-v1/python/online/fxreader/pr34/test_task_2025_06_30_v1/async_api/fastapi.py @@ -1,4 +1,5 @@ import fastapi +import functools import logging import copy import uvicorn @@ -7,18 +8,68 @@ import sys from .settings import Settings as APISettings +from typing import (Any, Optional,) + +logger = logging.getLogger(__name__) + +class WebsocketAPI: + def __init__( + self, + ) -> None: + self.connections : set[ + fastapi.WebSocket, + ] = set() + self.subscriptionss : dict[str, set[fastapi.WebSocket]] = dict() + + async def connect(self, client: fastapi.WebSocket) -> None: + assert not client in self.connections + + await client.accept() + + self.connections.add(client) + + async def on_message( + self, + client: fastapi.WebSocket, + msg: Any + ) -> None: + raise NotImplementedError + + async def disconnect(self, client: fastapi.WebSocket) -> None: + assert client in self.connections + + self.connections.remove(client) + async def websocket_tickers( websocket: fastapi.WebSocket, + websocket_api: WebsocketAPI, ) -> None: - raise NotImplementedError + try: + await websocket_api.connect(websocket) + + while True: + msg = await websocket.receive_text() + await websocket_api.on_message(websocket, msg) + except fastapi.WebSocketDisconnect: + pass + # websocket_api.disconnect(websocket) + except: + logger.exception('') + finally: + await websocket_api.disconnect(websocket) def create_app() -> fastapi.FastAPI: + websocket_api = WebsocketAPI() + app = fastapi.FastAPI() app.websocket( '/tickers/', )( - websocket_tickers, + functools.partial( + websocket_tickers, + websocket_api=websocket_api, + ) ) return app