[+] add websocket clients manager

This commit is contained in:
Siarhei Siniak 2025-07-14 11:17:39 +03:00
parent 25d5b34add
commit 612d807bc4

@ -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
async def websocket_tickers(
websocket: fastapi.WebSocket,
) -> None:
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:
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/',
)(
functools.partial(
websocket_tickers,
websocket_api=websocket_api,
)
)
return app