aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBernhard Guillon <Bernhard.Guillon@begu.org>2026-07-07 14:33:57 +0200
committerBernhard Guillon <Bernhard.Guillon@begu.org>2026-07-07 14:33:57 +0200
commit6feda0632367deaa9caf193e89b74f7affd45021 (patch)
tree92dcf022db3a57dc45443c31870600f006c87332
parent52ac49a1ebd712198b66c7662b8542376c156194 (diff)
downloadsourcewatch-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.go7
-rw-r--r--cmd_windows.go21
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