Reconnect on any read error
This commit is contained in:
		
							
								
								
									
										44
									
								
								websocket.go
									
									
									
									
									
								
							
							
						
						
									
										44
									
								
								websocket.go
									
									
									
									
									
								
							@@ -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
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user