diff options
| author | Bernhard Guillon <Bernhard.Guillon@begu.org> | 2026-07-07 14:33:57 +0200 |
|---|---|---|
| committer | Bernhard Guillon <Bernhard.Guillon@begu.org> | 2026-07-07 14:33:57 +0200 |
| commit | 6feda0632367deaa9caf193e89b74f7affd45021 (patch) | |
| tree | 92dcf022db3a57dc45443c31870600f006c87332 | |
| parent | 52ac49a1ebd712198b66c7662b8542376c156194 (diff) | |
| download | sourcewatch-6feda0632367deaa9caf193e89b74f7affd45021.tar.gz sourcewatch-6feda0632367deaa9caf193e89b74f7affd45021.zip | |
Add heartbeat ping/pong to detect disconnects
Windows client sends ping every 10s.
Linux server responds with pong.
If write fails, client detects disconnect and reconnects.
| -rw-r--r-- | cmd_linux.go | 7 | ||||
| -rw-r--r-- | cmd_windows.go | 21 |
2 files changed, 28 insertions, 0 deletions
diff --git a/cmd_linux.go b/cmd_linux.go index 5d5e10a..4239d1d 100644 --- a/cmd_linux.go +++ b/cmd_linux.go @@ -155,6 +155,13 @@ func handleClient(conn net.Conn, stack *GitignoreStack) { msg.Path, remoteManifest, *dryRun, ) } + + case "ping": + logDebug("ping from client") + pong := &ProtocolMessage{Type: "pong"} + pongData, _ := EncodeMessage(pong) + pongData = append(pongData, '\n') + conn.Write(pongData) } } diff --git a/cmd_windows.go b/cmd_windows.go index 4d7df37..da26684 100644 --- a/cmd_windows.go +++ b/cmd_windows.go @@ -93,6 +93,27 @@ func run() { logInfo("watcher: monitoring for changes ...") + // Heartbeat goroutine to detect disconnects + go func() { + ticker := time.NewTicker(10 * time.Second) + defer ticker.Stop() + for { + select { + case <-ctx.Done(): + return + case <-ticker.C: + msg := &ProtocolMessage{Type: "ping"} + data, _ := EncodeMessage(msg) + data = append(data, '\n') + if _, err := conn.Write(data); err != nil { + logErrorf("heartbeat failed: %v", err) + conn.Close() + return + } + } + } + }() + if !watchLoop(ctx, conn, watcher, manifest, stack) { conn.Close() continue |
