3.8 KiB
3.8 KiB
Relay Events IndexedDB Plan
Goal
Store relay debug history in IndexedDB so www/relays.html can render event history from persistent storage (including startup events) without depending on replay payloads from worker RPC.
Current State
- Relay history is captured in-memory in
relayEventLog. - Relay table data is fetched through
getRelayData(). - UI keeps in-memory
relayEventHistoryand appends live events fromndkRelayEvent. - Startup events can be missed by late listeners.
Proposed Architecture
1) SharedWorker owns event writes
- Add dedicated DB:
relay-events. - Add store:
eventswith keyPathid(autoIncrement). - Add indexes:
relayUrl(non-unique)timestamp(non-unique)- optional compound
relayUrl_timestampfor efficient per-relay sorted reads.
- Update
logRelayEvent()to persist every event (connect/disconnect/error/auth/authed/notice/reconnect-error/netDebug send/recv/message). - Keep write path fire-and-forget to avoid blocking network handling.
2) Retention and pruning
- Retention target: ~200 newest events per relay.
- Prune on interval (e.g., every 30–60 seconds) or opportunistically after N writes.
- Prune strategy:
- Read events for relay ordered by timestamp descending.
- Delete rows beyond retention threshold.
- Optional global cap safety (e.g., 20k rows) if needed.
3) relays page reads directly from IndexedDB
In www/relays.html:
- Add local DB helpers to open/query
relay-events. - On page init:
- Load selected relay history from IndexedDB into
relayEventHistory. - Render immediately.
- Load selected relay history from IndexedDB into
- On relay row selection:
- Re-query IndexedDB for that relay and re-render.
- Keep existing live listener
window.addEventListener('ndkRelayEvent', ...)for real-time updates between polls.
4) Simplify UI dedupe path
In www/relays.html:
- Remove
lastRelayErrorSeensynthetic injection path from relay table refresh. - Let history be solely from:
- IndexedDB persisted records
- real-time live stream appends
5) Worker RPC contract changes
getRelayDataremains relay status/type/connection summary endpoint.- It should not carry full event history payload once IndexedDB is authoritative source for history UI.
Implementation Steps
- Add IndexedDB schema/helpers in
www/ndk-worker.js. - Wire all event emission points through updated
logRelayEvent(). - Add pruning scheduler in worker.
- Add IndexedDB read helpers in
www/relays.html. - Load selected relay history from IndexedDB at startup + selection change.
- Remove table-refresh-driven error injection (
lastRelayErrorSeen) in UI. - Validate startup failures appear after page reload/tab reopen.
Validation Checklist
- Startup connect errors appear for selected relay after opening
www/relays.htmllate. - Switching relay rows immediately shows historical events from DB.
- Live events append in near-real-time.
- Reads/writes counters continue updating.
- DB does not grow unbounded (retention respected).
Risks and Mitigations
- Extra I/O from high event volume: use fire-and-forget writes + pruning cadence.
- Race between DB read and live append: merge by timestamp/id and dedupe in UI.
- Schema migration conflicts: isolate into dedicated DB name to avoid existing cache adapters.
Out of Scope
- Cross-device sync of debug logs.
- Encrypting relay debug event history.
- Export UI for event log files.