61 lines
1.9 KiB
Python
61 lines
1.9 KiB
Python
"""
|
|
Service WebSocket pour les mises à jour en temps réel.
|
|
"""
|
|
|
|
from typing import List
|
|
from threading import Lock
|
|
|
|
from fastapi import WebSocket
|
|
|
|
|
|
class WebSocketManager:
|
|
"""Gestionnaire des connexions WebSocket."""
|
|
|
|
def __init__(self):
|
|
self.active_connections: List[WebSocket] = []
|
|
self.lock = Lock()
|
|
|
|
async def connect(self, websocket: WebSocket):
|
|
"""Accepte et enregistre une nouvelle connexion WebSocket."""
|
|
await websocket.accept()
|
|
with self.lock:
|
|
self.active_connections.append(websocket)
|
|
|
|
def disconnect(self, websocket: WebSocket):
|
|
"""Déconnecte un client WebSocket."""
|
|
with self.lock:
|
|
if websocket in self.active_connections:
|
|
self.active_connections.remove(websocket)
|
|
|
|
async def broadcast(self, message: dict):
|
|
"""Envoie un message à tous les clients connectés."""
|
|
with self.lock:
|
|
disconnected = []
|
|
for connection in self.active_connections:
|
|
try:
|
|
await connection.send_json(message)
|
|
except Exception:
|
|
disconnected.append(connection)
|
|
|
|
# Nettoyer les connexions déconnectées
|
|
for conn in disconnected:
|
|
if conn in self.active_connections:
|
|
self.active_connections.remove(conn)
|
|
|
|
async def send_to_client(self, websocket: WebSocket, message: dict):
|
|
"""Envoie un message à un client spécifique."""
|
|
try:
|
|
await websocket.send_json(message)
|
|
except Exception:
|
|
self.disconnect(websocket)
|
|
|
|
@property
|
|
def connection_count(self) -> int:
|
|
"""Retourne le nombre de connexions actives."""
|
|
with self.lock:
|
|
return len(self.active_connections)
|
|
|
|
|
|
# Instance singleton du gestionnaire WebSocket
|
|
ws_manager = WebSocketManager()
|