fix: quick reconnect after sleep or a network outage - the tunnel notices a dead connection, retries every 5 s at most, the WebSocket returns as soon as the server answers; version 0.1.1

This commit is contained in:
redtea committed 2026-10-15 00:07:32 +03:00
1 parent 5eca9ca215
commit b47e824692
3 files changed
+49 -13

No files matched your search

+8 -6
View File
@@ -26,9 +26,7 @@ func (a *Agent) runTunnel(ctx context.Context, addr string) {
case <-ctx.Done():
return
}
if backoff < 15*time.Second {
backoff *= 2
}
backoff = min(backoff*2, retryCap)
continue
}
backoff = time.Second
@@ -96,8 +94,14 @@ func (t *tunClient) write(f tunnel.Frame) error {
return tunnel.WriteFrame(t.conn, f)
}
// tunnelSilence is how long the tunnel may say nothing before it is taken
// for dead: the server pings every 20 s, so this is three missed pings - a
// connection a NAT forgot while the machine slept, say.
const tunnelSilence = 65 * time.Second
func (t *tunClient) readLoop() error {
for {
_ = t.conn.SetReadDeadline(time.Now().Add(tunnelSilence))
f, err := tunnel.ReadFrame(t.conn)
if err != nil {
t.shutdown()
@@ -207,9 +211,7 @@ func (a *Agent) runUDP(ctx context.Context, addr string) {
case <-ctx.Done():
return
}
if backoff < 15*time.Second {
backoff *= 2
}
backoff = min(backoff*2, retryCap)
continue
}
backoff = time.Second