Implement heartbeat: clients send heartbeat every 30s; if none arrives within 90s the gateway marks the device offline and expires Redis TTLs. Heartbeats also bump lastSeenAt (throttled).
Acceptance criteria:
- Missing heartbeats → device offline within ~90s
- Heartbeats refresh socket-registry TTLs
- No ghost-online devices after an abrupt disconnect
Implement heartbeat: clients send
heartbeatevery 30s; if none arrives within 90s the gateway marks the device offline and expires Redis TTLs. Heartbeats also bumplastSeenAt(throttled).Acceptance criteria: