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. // Automatically locks and unlocks the client mutex, to ensure that only one goroutine can write at a time. func (c *WebsocketClient) SendMessage(messageType int, data []byte) error { c.Conn.SetPongHandler(func(s string) error { c.LastPong = time.Now() return nil }) c.Conn.SetWriteDeadline(time.Now().Add(TIMEOUT * time.Second)) c.Conn.WriteMessage(websocket.PingMessage, nil) c.Conn.SetWriteDeadline(time.Now().Add(TIMEOUT * time.Second)) return c.Conn.WriteMessage(messageType, data) }