From 721c27e101d13bbf95592d4c465af5c6de764be1 Mon Sep 17 00:00:00 2001 From: Richard Ramos Date: Fri, 21 Oct 2022 14:42:54 -0400 Subject: [PATCH] fix(rln): attempt to re-subscribe if websocket conn fails --- waku/v2/protocol/rln/web3.go | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/waku/v2/protocol/rln/web3.go b/waku/v2/protocol/rln/web3.go index 06bba8cc..5ea35ca7 100644 --- a/waku/v2/protocol/rln/web3.go +++ b/waku/v2/protocol/rln/web3.go @@ -5,11 +5,13 @@ import ( "crypto/ecdsa" "errors" "math/big" + "time" "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/ethclient" + "github.com/ethereum/go-ethereum/event" "github.com/ethereum/go-ethereum/rpc" "github.com/status-im/go-waku/waku/v2/protocol/rln/contracts" r "github.com/status-im/go-zerokit-rln/rln" @@ -180,14 +182,18 @@ func (rln *WakuRLNRelay) loadOldEvents(rlnContract *contracts.RLN, handler Regis func (rln *WakuRLNRelay) watchNewEvents(rlnContract *contracts.RLN, handler RegistrationEventHandler, log *zap.Logger, doneCh chan struct{}, errCh chan error) { // Watch for new events logSink := make(chan *contracts.RLNMemberRegistered) - subs, err := rlnContract.WatchMemberRegistered(&bind.WatchOpts{Context: rln.ctx, Start: nil}, logSink) - if err != nil { - if err == rpc.ErrNotificationsUnsupported { - err = errors.New("notifications not supported. The node must support websockets") + + subs := event.Resubscribe(2*time.Second, func(ctx context.Context) (event.Subscription, error) { + subs, err := rlnContract.WatchMemberRegistered(&bind.WatchOpts{Context: rln.ctx, Start: nil}, logSink) + if err != nil { + if err == rpc.ErrNotificationsUnsupported { + err = errors.New("notifications not supported. The node must support websockets") + } + errCh <- err + subs.Unsubscribe() } - errCh <- err - return - } + return subs, err + }) defer subs.Unsubscribe() close(doneCh) @@ -195,7 +201,7 @@ func (rln *WakuRLNRelay) watchNewEvents(rlnContract *contracts.RLN, handler Regi for { select { case evt := <-logSink: - err = processLogs(evt, handler) + err := processLogs(evt, handler) if err != nil { rln.log.Error("processing rln log", zap.Error(err)) }