Brings the link's keepalive in line with RL-5 in the relay spec. Until now the downstream relied on its 15-second sync and the 60-second call timeout to notice a dead link.
The downstream sends a WebSocket ping every 30 seconds, so NAT and firewalls keep the connection open.
If two pongs go missing, it drops the link and reconnects.
Reconnect backoff now runs from 1 s up to 60 s (it was 5 s to 120 s).
Missed ping ticks are delayed, not burst, so a long call can't count as missed pongs.
The relay already answered pings, so nothing changes on that side.
Tests: system::relay::relay_link_tests passes; it runs past the first ping. fmt, clippy and the fork checks are clean. No test drops pongs on purpose, because the relay's WebSocket stack answers pings by itself.
Brings the link's keepalive in line with RL-5 in the relay spec. Until now the downstream relied on its 15-second sync and the 60-second call timeout to notice a dead link.
- The downstream sends a WebSocket ping every 30 seconds, so NAT and firewalls keep the connection open.
- If two pongs go missing, it drops the link and reconnects.
- Reconnect backoff now runs from 1 s up to 60 s (it was 5 s to 120 s).
- Missed ping ticks are delayed, not burst, so a long call can't count as missed pongs.
The relay already answered pings, so nothing changes on that side.
Tests: `system::relay::relay_link_tests` passes; it runs past the first ping. fmt, clippy and the fork checks are clean. No test drops pongs on purpose, because the relay's WebSocket stack answers pings by itself.
Matches RL-5: the downstream pings the relay every 30 seconds so NAT and
firewalls keep the link open, and reconnects once two pongs go missing.
Backoff now runs from 1 s up to 60 s.
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Brings the link's keepalive in line with RL-5 in the relay spec. Until now the downstream relied on its 15-second sync and the 60-second call timeout to notice a dead link.
The relay already answered pings, so nothing changes on that side.
Tests:
system::relay::relay_link_testspasses; it runs past the first ping. fmt, clippy and the fork checks are clean. No test drops pongs on purpose, because the relay's WebSocket stack answers pings by itself.