import logging import time from dataclasses import dataclass from yuxi.channel.extensions.signal.client import SignalRpcClient logger = logging.getLogger(__name__) @dataclass class SignalProbeResult: ok: bool status: str error: str | None = None elapsed_ms: int = 0 version: str | None = None async def probe_signal(base_url: str, timeout_ms: float = 7500) -> SignalProbeResult: t0 = time.monotonic() client = SignalRpcClient(base_url, timeout=timeout_ms / 1000) try: check_ok = await client.check(timeout_ms=1000) except Exception as e: elapsed = int((time.monotonic() - t0) * 1000) return SignalProbeResult(ok=False, status="error", error=str(e), elapsed_ms=elapsed) if not check_ok: elapsed = int((time.monotonic() - t0) * 1000) return SignalProbeResult( ok=False, status="unreachable", error="Daemon check failed", elapsed_ms=elapsed, ) try: version = await client.version() except Exception as e: elapsed = int((time.monotonic() - t0) * 1000) return SignalProbeResult( ok=True, status="ok", error=f"Version query failed: {e}", elapsed_ms=elapsed, ) elapsed = int((time.monotonic() - t0) * 1000) return SignalProbeResult(ok=True, status="ok", elapsed_ms=elapsed, version=version)