package main import ( "log" "time" "github.com/gorilla/websocket" ) type WSConnection struct { url string conn *websocket.Conn errChan chan error ReadChan chan string } func (ws *WSConnection) readMessage() { log.Printf("Reading messages") for { _, message, err := ws.conn.ReadMessage() if err != nil { ws.errChan <- err return } log.Printf("Received: %s", message) ws.ReadChan <- string(message) } } func (ws *WSConnection) writeMessage(message string) { err := ws.conn.WriteMessage(websocket.TextMessage, []byte(message)) if err != nil { log.Printf("Error during message writing: %v", err) ws.errChan <- err return } } func (ws *WSConnection) handleError() { for { err := <-ws.errChan log.Println("Error during message reading:", err) time.Sleep(5 * time.Second) ws.Open() } } func (ws *WSConnection) Open() { log.Printf("Connecting to %s", ws.url) conn, _, err := websocket.DefaultDialer.Dial(ws.url, nil) if err != nil { log.Println("Error during connection:", err) ws.errChan <- err return } log.Printf("Connected") ws.conn = conn ws.errChan = make(chan error) ws.ReadChan = make(chan string, 1024) go ws.readMessage() go ws.handleError() }