Add state management, WebSocket polling, html.js templating, and refactor pages
- lib/state.py: per-subsystem collectors with versioned state store - daemon/server.py: state refresh on request, batch routing updates - webui/static/hoover/html.js: new html tag template helper via htm.js - webui/static/hoover/websocket.js: real-time state change notifications - webui/static/hoover/vdom.js: VDOM improvements for keyed diff - All frontend pages refactored to use html templates - Add tests for state management and polling - Update docs and AGENTS.md
This commit is contained in:
+17
-1
@@ -1502,4 +1502,20 @@ GET /api/logs/app
|
||||
|
||||
Return recent application log entries as rendered HTML.
|
||||
|
||||
**Response:** HTML fragment of `<div class="log-line">` elements.
|
||||
**Response:** HTML fragment of `<div class="log-line">` elements.
|
||||
|
||||
---
|
||||
|
||||
## WebSocket Protocol
|
||||
|
||||
The daemon exposes a WebSocket at `/ws` (port 9091) for real-time state change notifications. On connect, the server sends:
|
||||
|
||||
```json
|
||||
{"type": "init", "versions": {"firewall": 0, "dnsmasq": 0, ...}}
|
||||
```
|
||||
|
||||
### Message Types
|
||||
|
||||
- **`versions`** — Structural state change. `updated` contains subsystem names whose version counters changed. Triggers full re-fetch.
|
||||
- **`tick`** — Volatile-only change (stats, counters, DHCP IPs). `subsystems` contains affected subsystem names. Triggers lightweight per-subsystem re-fetch.
|
||||
- **`notify`** — Single-topic notification. `topic` is the subsystem name.
|
||||
Reference in New Issue
Block a user