wangzhibo
2026-08-30 c8515170fd399b4d2dfaebb59128d4674e58915e
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
from threading import Lock
 
from app.models.schemas import DeviceState
 
 
class DeviceStore:
    def __init__(self) -> None:
        self._devices: dict[str, DeviceState] = {}
        self._acks: dict[str, list[dict]] = {}
        self._events: dict[str, list[dict]] = {}
        self._lock = Lock()
 
    def update_state(self, device_id: str, payload: dict, timestamp: int) -> DeviceState:
        with self._lock:
            state = DeviceState(
                device_id=device_id,
                cpu=payload.get("cpu"),
                mem=payload.get("mem"),
                battery=payload.get("battery"),
                net=payload.get("net"),
                mode=payload.get("mode"),
                last_seen=timestamp,
            )
            self._devices[device_id] = state
            return state
 
    def record_ack(self, device_id: str, payload: dict) -> None:
        with self._lock:
            self._acks.setdefault(device_id, []).append(payload)
 
    def record_event(self, device_id: str, payload: dict) -> None:
        with self._lock:
            self._events.setdefault(device_id, []).append(payload)
 
    def get_device(self, device_id: str) -> DeviceState | None:
        return self._devices.get(device_id)
 
    def list_devices(self) -> list[DeviceState]:
        return list(self._devices.values())
 
    def get_acks(self, device_id: str) -> list[dict]:
        return list(self._acks.get(device_id, []))
 
    def get_events(self, device_id: str) -> list[dict]:
        return list(self._events.get(device_id, []))