from __future__ import annotations
from typing import Any, Iterable, Literal, Optional, Protocol, TypedDict, Union, runtime_checkable
try:
from net import ( MeshOsDaemonHandle as _RawHandle,
MeshOsDaemonSdk as _RawSdk,
MeshOsSdkError,
meshos_sdk_error_kind,
)
except ImportError as e: raise ImportError(
"MeshOS SDK symbols not present in `net._net`. Rebuild the "
"wheel with `--features meshos`, e.g. `maturin develop "
"--features meshos`."
) from e
LogLevel = Literal["trace", "debug", "info", "warn", "error"]
_CONTROL_POLL_INTERVAL_MS = 10
class DaemonControlShutdown(TypedDict):
kind: Literal["Shutdown"]
grace_period_ms: int
class DaemonControlDrainStart(TypedDict):
kind: Literal["DrainStart"]
grace_period_ms: int
class DaemonControlDrainFinish(TypedDict):
kind: Literal["DrainFinish"]
class DaemonControlBackpressureOn(TypedDict):
kind: Literal["BackpressureOn"]
level: float
class DaemonControlBackpressureOff(TypedDict):
kind: Literal["BackpressureOff"]
class DaemonControlUnknown(TypedDict):
kind: Literal["Unknown"]
DaemonControl = Union[
DaemonControlShutdown,
DaemonControlDrainStart,
DaemonControlDrainFinish,
DaemonControlBackpressureOn,
DaemonControlBackpressureOff,
DaemonControlUnknown,
]
class MaintenanceActive(TypedDict):
kind: Literal["Active"]
class MaintenanceEntering(TypedDict):
kind: Literal["EnteringMaintenance"]
since_ms: int
deadline_remaining_ms: Optional[int]
class MaintenanceSteady(TypedDict):
kind: Literal["Maintenance"]
since_ms: int
class MaintenanceExiting(TypedDict):
kind: Literal["ExitingMaintenance"]
since_ms: int
class MaintenanceDrainFailed(TypedDict):
kind: Literal["DrainFailed"]
since_ms: int
reason: str
class MaintenanceRecovery(TypedDict):
kind: Literal["Recovery"]
since_ms: int
MaintenanceState = Union[
MaintenanceActive,
MaintenanceEntering,
MaintenanceSteady,
MaintenanceExiting,
MaintenanceDrainFailed,
MaintenanceRecovery,
]
PeerHealth = Literal["Healthy", "Degraded", "Unreachable", "Unknown"]
PeerMaintenance = Literal[
"Active",
"EnteringMaintenance",
"Maintenance",
"ExitingMaintenance",
"DrainFailed",
"Recovery",
"Unknown",
]
class PeerSnapshot(TypedDict):
rtt_ms: Optional[int]
health: Optional[PeerHealth]
maintenance: Optional[PeerMaintenance]
cpu_load_1m: Optional[float]
mem_used_bytes: Optional[int]
mem_total_bytes: Optional[int]
disk_used_bytes: Optional[int]
disk_total_bytes: Optional[int]
saturation_trend: Optional[float]
capability_set: list[str]
software_version: Optional[str]
forked_from: Optional[int]
class MetadataView(TypedDict):
node_id: int
daemon_id: int
daemon_name: str
maintenance_state: MaintenanceState
peers: dict[int, PeerSnapshot]
@runtime_checkable
class MeshOsDaemon(Protocol):
name: Any
def process(self, event: dict) -> Optional[Iterable[bytes]]: ...
class MeshOsDaemonSdk:
__slots__ = ("_raw",)
def __init__(self, raw: _RawSdk) -> None:
self._raw = raw
@classmethod
def start(
cls,
config: Optional[dict[str, Any]] = None,
*,
control_capacity: Optional[int] = None,
) -> "MeshOsDaemonSdk":
return cls(_RawSdk.start(config=config, control_capacity=control_capacity))
def register_daemon(
self,
daemon: MeshOsDaemon,
identity: Any,
) -> "MeshOsDaemonHandleWrapper":
handle = self._raw.register_daemon(daemon, identity)
return MeshOsDaemonHandleWrapper(handle)
def dropped_control_events(self) -> int:
return self._raw.dropped_control_events()
def shutdown(self) -> None:
self._raw.shutdown()
def __enter__(self) -> "MeshOsDaemonSdk":
return self
def __exit__(self, exc_type, exc_value, traceback) -> Literal[False]:
try:
self._raw.shutdown()
except MeshOsSdkError as e:
if getattr(e, "kind", None) != "already_shutdown":
raise
return False
def __repr__(self) -> str:
return repr(self._raw)
class MeshOsDaemonHandleWrapper:
__slots__ = ("_raw", "_borrow_lock")
def __init__(self, raw: _RawHandle) -> None:
import threading
self._raw = raw
self._borrow_lock = threading.Lock()
@property
def daemon_id(self) -> int:
return self._raw.daemon_id
@property
def daemon_name(self) -> str:
return self._raw.daemon_name
def metadata(self) -> MetadataView:
return self._raw.metadata()
def refresh_metadata(self) -> MetadataView:
return self._raw.refresh_metadata()
def next_control(self, timeout_ms: Optional[int] = None) -> Optional[DaemonControl]:
with self._borrow_lock:
return self._raw.next_control(timeout_ms=timeout_ms)
def try_next_control(self) -> Optional[DaemonControl]:
with self._borrow_lock:
return self._raw.try_next_control()
async def anext_control(
self, timeout_ms: Optional[int] = None
) -> Optional[DaemonControl]:
import asyncio
poll_ms = _CONTROL_POLL_INTERVAL_MS
ms = 100 if timeout_ms is None else timeout_ms
remaining_ms = ms
while True:
with self._borrow_lock:
ev = self._raw.try_next_control()
if ev is not None:
return ev
if remaining_ms <= 0:
return None
step = min(poll_ms, remaining_ms)
await asyncio.sleep(step / 1000.0)
remaining_ms -= step
def __aiter__(self) -> "MeshOsDaemonHandleWrapper":
return self
async def __anext__(self) -> DaemonControl:
import asyncio
try:
while True:
with self._borrow_lock:
ev = self._raw.try_next_control()
if ev is not None:
return ev
await asyncio.sleep(_CONTROL_POLL_INTERVAL_MS / 1000.0)
except MeshOsSdkError as e:
if getattr(e, "kind", None) == "already_shutdown":
raise StopAsyncIteration from None
raise
def publish_log(self, level: LogLevel, message: str) -> None:
self._raw.publish_log(level, message)
def publish_capabilities(self, caps: Optional[dict[str, Any]] = None) -> None:
self._raw.publish_capabilities(caps=caps)
def graceful_shutdown(self, grace_ms: Optional[int] = None) -> None:
with self._borrow_lock:
self._raw.graceful_shutdown(grace_ms=grace_ms)
def __enter__(self) -> "MeshOsDaemonHandleWrapper":
return self
def __exit__(self, exc_type, exc_value, traceback) -> Literal[False]:
try:
self._raw.graceful_shutdown(grace_ms=None)
except MeshOsSdkError as e:
if getattr(e, "kind", None) != "already_shutdown":
raise
return False
def __repr__(self) -> str:
return repr(self._raw)
__all__ = [
"MeshOsDaemon",
"MeshOsDaemonSdk",
"MeshOsDaemonHandleWrapper",
"MeshOsSdkError",
"meshos_sdk_error_kind",
"DaemonControl",
"DaemonControlShutdown",
"DaemonControlDrainStart",
"DaemonControlDrainFinish",
"DaemonControlBackpressureOn",
"DaemonControlBackpressureOff",
"DaemonControlUnknown",
"MaintenanceState",
"MetadataView",
"PeerSnapshot",
"PeerHealth",
"PeerMaintenance",
"LogLevel",
]