From f6fe960534003f9ad1ef4f38cd969b2ee0a67347 Mon Sep 17 00:00:00 2001 From: Joachim Bauch Date: Tue, 27 Feb 2024 16:12:04 +0100 Subject: [PATCH] Reuse backoff waiting code in NATS client. --- natsclient.go | 27 +++++++++++---------------- 1 file changed, 11 insertions(+), 16 deletions(-) diff --git a/natsclient.go b/natsclient.go index 5cc17ba..6a9feb7 100644 --- a/natsclient.go +++ b/natsclient.go @@ -22,6 +22,7 @@ package signaling import ( + "context" "encoding/base64" "fmt" "log" @@ -74,33 +75,27 @@ func NewNatsClient(url string) (NatsClient, error) { return NewLoopbackNatsClient() } + backoff, err := NewExponentialBackoff(initialConnectInterval, maxConnectInterval) + if err != nil { + return nil, err + } + client := &natsClient{} - var err error client.nc, err = nats.Connect(url, nats.ClosedHandler(client.onClosed), nats.DisconnectHandler(client.onDisconnected), nats.ReconnectHandler(client.onReconnected)) - interrupt := make(chan os.Signal, 1) - signal.Notify(interrupt, os.Interrupt) - defer signal.Stop(interrupt) + ctx, stop := signal.NotifyContext(context.Background(), os.Interrupt) + defer stop() - delay := initialConnectInterval - timer := time.NewTimer(delay) // The initial connect must succeed, so we retry in the case of an error. for err != nil { - log.Printf("Could not create connection (%s), will retry in %s", err, delay) - timer.Reset(delay) - select { - case <-interrupt: + log.Printf("Could not create connection (%s), will retry in %s", err, backoff.NextWait()) + backoff.Wait(ctx) + if ctx.Err() != nil { return nil, fmt.Errorf("interrupted") - case <-timer.C: - // Retry connection - delay = delay * 2 - if delay > maxConnectInterval { - delay = maxConnectInterval - } } client.nc, err = nats.Connect(url)