package websocket import ( "encoding/json" "time" "github.com/gorilla/websocket" GoTomato "git.smsvc.net/pomodoro/GoTomato/pkg/models" ) var Done = make(chan struct{}) // Receives websocket messages and writes them to a channel. // Closes the channel if websocket closes. func (c *Client) ProcessServerMessages(channel chan<- GoTomato.ServerMessage) { var serverMessage GoTomato.ServerMessage defer close(Done) for { c.Conn.SetReadDeadline(time.Now().Add(10 * time.Second)) _, message, err := c.Conn.ReadMessage() if err != nil { c.LastErr = err // On normal closure exit gracefully if websocket.IsCloseError(err, websocket.CloseNormalClosure) { return } // reset connection and reconnect c.Conn = nil pw := c.Password for !c.Connected() { channel <- serverMessage // send last known ServerMessage to update view time.Sleep(time.Second) *c = Connect(c.Server) } c.Password = pw continue } err = json.Unmarshal(message, &serverMessage) c.LastErr = err channel <- serverMessage } }