eth-tracker/internal/syncer/realtime.go

41 lines
1012 B
Go

package syncer
import (
"context"
"time"
"github.com/celo-org/celo-blockchain/core/types"
"github.com/celo-org/celo-blockchain/event"
)
const (
resubscribeInterval = 5 * time.Second
)
func (s *Syncer) StartRealtimeSyncer(ctx context.Context) error {
newHeadersReceiver := make(chan *types.Header, 1)
sub := event.ResubscribeErr(resubscribeInterval, func(ctx context.Context, err error) (event.Subscription, error) {
if err != nil {
s.logg.Error("realtime syncer resubscribe error", "error", err)
}
return s.ethClient.SubscribeNewHead(ctx, newHeadersReceiver)
})
defer sub.Unsubscribe()
for {
select {
case <-ctx.Done():
s.logg.Info("realtime syncer shutting down")
return nil
case header := <-newHeadersReceiver:
blockNumber := header.Number.Uint64()
block, err := s.chain.GetBlock(context.Background(), blockNumber)
if err != nil {
s.logg.Error("realtime block fetcher error", "block", blockNumber, "error", err)
}
s.blocksQueue.PushFront(block)
}
}
}