Reconnect on any read error

This commit is contained in:
Elara 2023-01-24 13:19:22 -08:00
parent c0aced05f0
commit 014be78baa
1 changed files with 20 additions and 24 deletions

View File

@ -8,7 +8,6 @@ import (
"net/http" "net/http"
"net/url" "net/url"
"reflect" "reflect"
"strings"
"time" "time"
"github.com/cenkalti/backoff/v4" "github.com/cenkalti/backoff/v4"
@ -58,28 +57,25 @@ func NewWebSocket(baseURL string) (*WSClient, error) {
if err != nil { if err != nil {
out.errCh <- err out.errCh <- err
// gorilla/websocket eats the error type, so I have to check conn.Close()
// the string itself err = backoff.RetryNotify(
if strings.HasSuffix(err.Error(), "connection timed out") { func() error {
err = backoff.RetryNotify( conn, _, err = keepaliveDialer().Dial(u.JoinPath("ws").String(), nil)
func() error { if err != nil {
conn, _, err = keepaliveDialer().Dial(u.JoinPath("ws").String(), nil) out.errCh <- err
if err != nil { return err
out.errCh <- err }
return err out.conn = conn
} out.recHandler(out)
out.conn = conn return nil
out.recHandler(out) },
return nil backoff.NewExponentialBackOff(),
}, func(err error, d time.Duration) {
backoff.NewExponentialBackOff(), out.errCh <- fmt.Errorf("reconnect backoff (%s): %w", d, err)
func(err error, d time.Duration) { },
out.errCh <- fmt.Errorf("reconnect backoff (%s): %w", d, err) )
}, if err != nil {
) out.errCh <- err
if err != nil {
out.errCh <- err
}
} }
continue continue
@ -201,7 +197,7 @@ func keepaliveDialer() *websocket.Dialer {
return nil, err return nil, err
} }
err = conn.SetKeepAlivePeriod(time.Second) err = conn.SetKeepAlivePeriod(10 * time.Second)
if err != nil { if err != nil {
return nil, err return nil, err
} }