| import asyncio |
| import json |
| import logging |
| import time |
| from typing import Dict, List, Set |
| from fastapi import WebSocket |
|
|
| logger = logging.getLogger("friday.state_sync") |
|
|
| class GridStateSync: |
| """Manages real-time state synchronization across the FRIDAY distributed grid.""" |
| def __init__(self): |
| self.active_connections: Set[WebSocket] = set() |
| self.device_stats: Dict[str, dict] = {} |
| |
| async def register_device(self, websocket: WebSocket, device_id: str): |
| await websocket.accept() |
| self.active_connections.add(websocket) |
| self.device_stats[device_id] = { |
| "proximity": 0.0, |
| "last_seen": time.time(), |
| "status": "online" |
| } |
| logger.info(f"Grid: Device '{device_id}' joined the sovereign mesh.") |
| |
| async def unregister_device(self, websocket: WebSocket, device_id: str): |
| self.active_connections.remove(websocket) |
| if device_id in self.device_stats: |
| self.device_stats[device_id]["status"] = "offline" |
| logger.info(f"Grid: Device '{device_id}' left the mesh.") |
|
|
| async def broadcast(self, message: dict): |
| """Broadcasts a message to all connected devices in the grid.""" |
| if not self.active_connections: return |
| |
| payload = json.dumps(message) |
| disconnected = [] |
| |
| for ws in list(self.active_connections): |
| try: |
| await ws.send_text(payload) |
| except Exception: |
| disconnected.append(ws) |
| |
| for ws in disconnected: |
| self.active_connections.remove(ws) |
|
|
| def update_proximity(self, device_id: str, rssi_or_volume: float): |
| """Updates the proximity score for a device to enable Proximity Logic.""" |
| if device_id in self.device_stats: |
| self.device_stats[device_id]["proximity"] = rssi_or_volume |
| self.device_stats[device_id]["last_seen"] = time.time() |
|
|
| def get_best_output_device(self) -> str: |
| """Determines the device closest to the user (Highest Proximity).""" |
| if not self.device_stats: return "core" |
| |
| |
| sorted_devices = sorted( |
| self.device_stats.items(), |
| key=lambda x: (x[1]["proximity"], x[1]["last_seen"]), |
| reverse=True |
| ) |
| return sorted_devices[0][0] if sorted_devices else "core" |
|
|
| |
| grid_sync = GridStateSync() |
|
|