diff --git a/common.go b/common.go index a87cb8e..a4727d8 100644 --- a/common.go +++ b/common.go @@ -60,6 +60,7 @@ var ( peerMonitor *peermonitor.PeerMonitor stopHolepunch chan struct{} stopRegister chan struct{} + stopPing chan struct{} olmToken string gerbilServerPubKey string ) @@ -383,3 +384,40 @@ func FindAvailableUDPPort(minPort, maxPort uint16) (uint16, error) { return 0, fmt.Errorf("no available UDP ports found in range %d-%d", minPort, maxPort) } + +func sendPing(olm *websocket.Client) error { + err := olm.SendMessage("olm/ping", map[string]interface{}{ + "timestamp": time.Now().Unix(), + }) + if err != nil { + logger.Error("Failed to send ping message: %v", err) + return err + } + logger.Debug("Sent ping message") + return nil +} + +func keepSendingPing(olm *websocket.Client) { + // Send ping immediately on startup + if err := sendPing(olm); err != nil { + logger.Error("Failed to send initial ping: %v", err) + } else { + logger.Info("Sent initial ping message") + } + + // Set up ticker for one minute intervals + ticker := time.NewTicker(1 * time.Minute) + defer ticker.Stop() + + for { + select { + case <-stopPing: + logger.Info("Stopping ping messages") + return + case <-ticker.C: + if err := sendPing(olm); err != nil { + logger.Error("Failed to send periodic ping: %v", err) + } + } + } +} diff --git a/main.go b/main.go index c94de41..5d0d003 100644 --- a/main.go +++ b/main.go @@ -135,6 +135,7 @@ func main() { stopHolepunch = make(chan struct{}) stopRegister = make(chan struct{}) + stopPing = make(chan struct{}) // if PANGOLIN_ENDPOINT, OLM_ID, and OLM_SECRET are set as environment variables, they will be used as default values endpoint = os.Getenv("PANGOLIN_ENDPOINT") @@ -473,6 +474,7 @@ func main() { logger.Debug("Public key: %s", publicKey) go keepSendingRegistration(olm, publicKey.String()) + go keepSendingPing(olm) logger.Info("Sent registration message") return nil @@ -509,6 +511,13 @@ func main() { close(stopRegister) } + select { + case <-stopPing: + // Channel already closed + default: + close(stopPing) + } + uapi.Close() dev.Close() }