diff --git a/relay/client/client.go b/relay/client/client.go index d63629030..bb2ae5b63 100644 --- a/relay/client/client.go +++ b/relay/client/client.go @@ -19,6 +19,10 @@ const ( serverResponseTimeout = 8 * time.Second ) +var ( + ErrConnAlreadyExists = fmt.Errorf("connection already exists") +) + // Msg carry the payload from the server to the client. With this sturct, the net.Conn can free the buffer. type Msg struct { Payload []byte @@ -157,6 +161,11 @@ func (c *Client) OpenConn(dstPeerID string) (net.Conn, error) { } hashedID, hashedStringID := messages.HashID(dstPeerID) + _, ok := c.conns[hashedStringID] + if ok { + return nil, ErrConnAlreadyExists + } + log.Infof("open connection to peer: %s", hashedStringID) msgChannel := make(chan Msg, 2) conn := NewConn(c, hashedID, hashedStringID, msgChannel) diff --git a/relay/client/dialer/wsnhooyr/ws.go b/relay/client/dialer/wsnhooyr/ws.go index be78cf034..4fe0f0a26 100644 --- a/relay/client/dialer/wsnhooyr/ws.go +++ b/relay/client/dialer/wsnhooyr/ws.go @@ -26,6 +26,7 @@ func Dial(address string) (net.Conn, error) { wsConn, _, err := websocket.Dial(context.Background(), url, opts) if err != nil { + log.Errorf("failed to dial to Relay server '%s': %s", url, err) return nil, err } diff --git a/relay/client/guard.go b/relay/client/guard.go index 12fae4c54..5cea25653 100644 --- a/relay/client/guard.go +++ b/relay/client/guard.go @@ -3,6 +3,8 @@ package client import ( "context" "time" + + log "github.com/sirupsen/logrus" ) var ( @@ -24,13 +26,20 @@ func NewGuard(context context.Context, relayClient *Client) *Guard { } func (g *Guard) OnDisconnected() { - timeout := time.NewTimer(reconnectingTimeout) - defer timeout.Stop() + ticker := time.NewTicker(reconnectingTimeout) + defer ticker.Stop() - select { - case <-timeout.C: - _ = g.relayClient.Connect() - case <-g.ctx.Done(): - return + for { + select { + case <-ticker.C: + err := g.relayClient.Connect() + if err != nil { + log.Errorf("failed to reconnect to relay server: %s", err) + continue + } + return + case <-g.ctx.Done(): + return + } } }