from __future__ import annotations import asyncio from contextlib import suppress from datetime import timezone from app.db.session import SessionLocal from app.repositories.audio_repository import AudioRepository from app.ws.router import manager # используем тот же manager, что и в ws/router.py def _iso_z(dt) -> str: return dt.astimezone(timezone.utc).isoformat().replace("+00:00", "Z") async def audio_live_broadcaster(poll_interval_sec: float = 0.05) -> None: """ Poll latest row and broadcast only when a NEW row appears. Throttling per client is handled by manager.broadcast_json(). """ last_time = None while True: try: async with SessionLocal() as db: repo = AudioRepository(db) rows = await repo.latest(1) if rows: row = rows[0] if last_time is None or row.time > last_time: last_time = row.time await manager.broadcast_json( { "time": _iso_z(row.time), "rms_db": float(row.rms_db), "freq_hz": int(row.frequency_hz), } ) except Exception: # не даём таске умереть при временных проблемах БД pass await asyncio.sleep(poll_interval_sec)