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 { // On normal closure exit gracefully if websocket.IsCloseError(err, websocket.CloseNormalClosure) { return } c.LastErr = err // Try to reconnect on unexpected disconnect for { channel <- serverMessage // send last known ServerMessage to update view time.Sleep(time.Second) // reconnect while preserving password pw := c.Password *c = Connect(c.Server) c.Password = pw if c.Connected() { break } } continue } err = json.Unmarshal(message, &serverMessage) c.LastErr = err channel <- serverMessage } }