package websocket import ( "time" "git.smsvc.net/pomodoro/GoTomato/internal/helper" "git.smsvc.net/pomodoro/GoTomato/pkg/models" "github.com/gorilla/websocket" ) func sendPing(client *models.WebsocketClient) bool { client.Conn.SetWriteDeadline(time.Now().Add(SEND_TIMEOUT * time.Second)) err := client.Conn.WriteMessage(websocket.PingMessage, nil) if err != nil { return false } return true } func isStale(client *models.WebsocketClient) bool { return time.Since(client.LastPong) > (STALE_CLIENT_TIMEOUT * time.Second) } // Check and remove stale clients func RemoveStaleClients() { ticker := time.NewTicker(CHECK_INTERVALL * time.Second) defer ticker.Stop() for range ticker.C { mu.Lock() for _, client := range Clients { if !sendPing(client) || isStale(client) { client.Conn.Close() delete(Clients, client.Conn.LocalAddr()) helper.Logger.Info("Removed stale client", "host", client.RealIP, "clients", len(Clients)) } } mu.Unlock() } }