package websocket import ( "time" "github.com/gorilla/websocket" "git.smsvc.net/pomodoro/GoTomato/pkg/models" ) const TIMEOUT = 10 // Checks if the websockets last Pong is recent func isStale(client *models.WebsocketClient) bool { return time.Since(client.LastPong) > (TIMEOUT * time.Second) } func sendPing(client *models.WebsocketClient) bool { client.Conn.SetWriteDeadline(time.Now().Add(TIMEOUT * time.Second)) err := client.Conn.WriteMessage(websocket.PingMessage, nil) if err != nil { return false } return true } // Check and remove stale clients func RemoveStaleClients() { ticker := time.NewTicker(30 * time.Second) defer ticker.Stop() for range ticker.C { mu.Lock() for _, client := range Clients { // send ping and check for last pong if !sendPing(client) || isStale(client) { client.Conn.Close() delete(Clients, client.Conn.LocalAddr()) } } mu.Unlock() } }