homelab_automation/app/services/websocket_service.py

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