package models import ( "time" "github.com/gorilla/websocket" ) const TIMEOUT = 10 // Represents a command from the client (start/stop) type ClientCommand struct { Command string `json:"command"` // Command send to the server Password string `json:"password"` // Pomodoro control password Settings PomodoroConfig `json:"settings"` // Pomodoro config } // Represents a single client type WebsocketClient struct { Conn *websocket.Conn LastPong time.Time RealIP string } // Sends a message to the websocket. func (c *WebsocketClient) SendMessage(messageType int, data []byte) error { c.Conn.SetWriteDeadline(time.Now().Add(TIMEOUT * time.Second)) err := c.Conn.WriteMessage(websocket.PingMessage, nil) if err != nil { return err } c.Conn.SetWriteDeadline(time.Now().Add(TIMEOUT * time.Second)) err = c.Conn.WriteMessage(messageType, data) if err != nil { return err } return nil } // Check if websockets last Pong is recent func (c *WebsocketClient) IsStale() bool { return time.Since(c.LastPong) > (TIMEOUT * time.Second) }