From e70554c46de5de58872fc599cb615e4efd9bd26d Mon Sep 17 00:00:00 2001 From: ftocal <46001274+ftocal@users.noreply.github.com> Date: Tue, 29 Aug 2023 15:16:52 -0300 Subject: [PATCH] Modify fly and spy to publish and consume vaa via redis pub/sub (#672) --- common/health/redis.go | 15 ++++ fly/cmd/backfiller/notify.go | 10 +-- .../backfiller/txhash_encoding_strategy.go | 4 +- fly/main.go | 52 +++++++++++-- fly/{topic/topic.go => producer/producer.go} | 14 +++- fly/{topic => producer}/vaa_memory.go | 2 +- fly/producer/vaa_redis.go | 32 ++++++++ fly/{topic => producer}/vaa_sns.go | 2 +- fly/storage/repository.go | 10 +-- spy/cmd/main.go | 45 ++++++++--- spy/config/config.go | 15 ++-- spy/go.mod | 20 ++++- spy/go.sum | 76 +++++++++++++++++++ spy/grpc/publishers.go | 4 +- spy/http/infraestructure/controller.go | 35 +++++---- spy/http/infraestructure/model.go | 19 ----- spy/http/infraestructure/repository.go | 46 ----------- spy/http/infraestructure/server.go | 8 +- spy/http/infraestructure/service.go | 38 ---------- .../watcher.go => source/mongo_watcher.go} | 10 +-- spy/source/redis_subscriber.go | 75 ++++++++++++++++++ 21 files changed, 362 insertions(+), 170 deletions(-) create mode 100644 common/health/redis.go rename fly/{topic/topic.go => producer/producer.go} (69%) rename fly/{topic => producer}/vaa_memory.go (96%) create mode 100644 fly/producer/vaa_redis.go rename fly/{topic => producer}/vaa_sns.go (98%) delete mode 100644 spy/http/infraestructure/model.go delete mode 100644 spy/http/infraestructure/repository.go delete mode 100644 spy/http/infraestructure/service.go rename spy/{storage/watcher.go => source/mongo_watcher.go} (87%) create mode 100644 spy/source/redis_subscriber.go diff --git a/common/health/redis.go b/common/health/redis.go new file mode 100644 index 00000000..4f1b57c3 --- /dev/null +++ b/common/health/redis.go @@ -0,0 +1,15 @@ +package health + +import ( + "context" + + "github.com/go-redis/redis/v8" +) + +// Redis does a ping. +func Redis(client *redis.Client) Check { + return func(ctx context.Context) error { + result := client.Ping(ctx) + return result.Err() + } +} diff --git a/fly/cmd/backfiller/notify.go b/fly/cmd/backfiller/notify.go index 494df00e..8395c925 100644 --- a/fly/cmd/backfiller/notify.go +++ b/fly/cmd/backfiller/notify.go @@ -10,7 +10,7 @@ import ( "github.com/wormhole-foundation/wormhole-explorer/common/client/alert" "github.com/wormhole-foundation/wormhole-explorer/common/client/sns" "github.com/wormhole-foundation/wormhole-explorer/fly/internal/metrics" - "github.com/wormhole-foundation/wormhole-explorer/fly/topic" + "github.com/wormhole-foundation/wormhole-explorer/fly/producer" "go.uber.org/zap" ) @@ -48,7 +48,7 @@ func newAwsConfig(ctx context.Context, cfg WorkerConfiguration) (aws.Config, err } // newSNSProducer creates a new SNS producer from the given configuration. -func newSNSProducer(ctx context.Context, cfg WorkerConfiguration, alertClient alert.AlertClient, metricsClient metrics.Metrics, logger *zap.Logger) (*topic.SNSProducer, error) { +func newSNSProducer(ctx context.Context, cfg WorkerConfiguration, alertClient alert.AlertClient, metricsClient metrics.Metrics, logger *zap.Logger) (*producer.SNSProducer, error) { if cfg.AwsSnsURL == "" { return nil, fmt.Errorf("AWS_SNS_URL is required") } @@ -63,13 +63,13 @@ func newSNSProducer(ctx context.Context, cfg WorkerConfiguration, alertClient al return nil, err } - return topic.NewSNSProducer(snsProducer, alertClient, metricsClient, logger), nil + return producer.NewSNSProducer(snsProducer, alertClient, metricsClient, logger), nil } // newVAATopicProducerFunc creates a new VAA topic producer function from the given configuration. -func newVAATopicProducerFunc(ctx context.Context, cfg WorkerConfiguration, alertClient alert.AlertClient, metricsClient metrics.Metrics, logger *zap.Logger) (topic.PushFunc, error) { +func newVAATopicProducerFunc(ctx context.Context, cfg WorkerConfiguration, alertClient alert.AlertClient, metricsClient metrics.Metrics, logger *zap.Logger) (producer.PushFunc, error) { if !cfg.NotifyEnabled { - return func(context.Context, *topic.NotificationEvent) error { + return func(context.Context, *producer.NotificationEvent) error { return nil }, nil } diff --git a/fly/cmd/backfiller/txhash_encoding_strategy.go b/fly/cmd/backfiller/txhash_encoding_strategy.go index 30ab0b99..8b5b9da3 100644 --- a/fly/cmd/backfiller/txhash_encoding_strategy.go +++ b/fly/cmd/backfiller/txhash_encoding_strategy.go @@ -10,8 +10,8 @@ import ( "github.com/wormhole-foundation/wormhole-explorer/common/domain" "github.com/wormhole-foundation/wormhole-explorer/common/logger" "github.com/wormhole-foundation/wormhole-explorer/fly/internal/metrics" + "github.com/wormhole-foundation/wormhole-explorer/fly/producer" "github.com/wormhole-foundation/wormhole-explorer/fly/storage" - "github.com/wormhole-foundation/wormhole-explorer/fly/topic" "github.com/wormhole-foundation/wormhole/sdk/vaa" "go.uber.org/zap" ) @@ -38,7 +38,7 @@ func RunTxHashEncoding(cfg TxHashEncondingConfig) { alert.NewDummyClient(), metrics.NewDummyMetrics(), db.Database, - topic.NewVAAInMemory(logger).Push, + producer.NewVAAInMemory(logger).Push, logger) workerTxHashEncoding(ctx, logger, repository, vaa.ChainID(cfg.ChainID), cfg.PageSize) diff --git a/fly/main.go b/fly/main.go index 8a12e029..9f7f77d1 100644 --- a/fly/main.go +++ b/fly/main.go @@ -30,10 +30,10 @@ import ( "github.com/wormhole-foundation/wormhole-explorer/fly/migration" "github.com/wormhole-foundation/wormhole-explorer/fly/notifier" "github.com/wormhole-foundation/wormhole-explorer/fly/processor" + "github.com/wormhole-foundation/wormhole-explorer/fly/producer" "github.com/wormhole-foundation/wormhole-explorer/fly/queue" "github.com/wormhole-foundation/wormhole-explorer/fly/server" "github.com/wormhole-foundation/wormhole-explorer/fly/storage" - "github.com/wormhole-foundation/wormhole-explorer/fly/topic" "google.golang.org/protobuf/proto" "github.com/certusone/wormhole/node/pkg/common" @@ -137,7 +137,7 @@ func newSQSConsumer(ctx context.Context) (*sqs.Consumer, error) { } // newSNSProducer creates a new SNSProducer. -func newSNSProducer(ctx context.Context, alertClient alert.AlertClient, metricsClient metrics.Metrics, logger *zap.Logger) (*topic.SNSProducer, error) { +func newSNSProducer(ctx context.Context, alertClient alert.AlertClient, metricsClient metrics.Metrics, logger *zap.Logger) (*producer.SNSProducer, error) { snsURL, err := getenv("SNS_URL") if err != nil { return nil, err @@ -153,7 +153,7 @@ func newSNSProducer(ctx context.Context, alertClient alert.AlertClient, metricsC return nil, err } - return topic.NewSNSProducer(snsProducer, alertClient, metricsClient, logger), nil + return producer.NewSNSProducer(snsProducer, alertClient, metricsClient, logger), nil } // TODO refactor to another file/package @@ -215,9 +215,9 @@ func newVAANotifierFunc(isLocal bool, logger *zap.Logger) processor.VAANotifyFun return notifier.NewLastSequenceNotifier(client, redisPrefix).Notify } -func newVAATopicProducerFunc(ctx context.Context, isLocal bool, alertClient alert.AlertClient, metricsClient metrics.Metrics, logger *zap.Logger) (topic.PushFunc, error) { +func newVAATopicProducerFunc(ctx context.Context, isLocal bool, alertClient alert.AlertClient, metricsClient metrics.Metrics, logger *zap.Logger) (producer.PushFunc, error) { if isLocal { - return func(context.Context, *topic.NotificationEvent) error { + return func(context.Context, *producer.NotificationEvent) error { return nil }, nil } @@ -250,6 +250,35 @@ func newMetrics(enviroment string) metrics.Metrics { return metrics.NewPrometheusMetrics(enviroment) } +// Creates a callback to publish VAA messages to a redis pubsub +func newVAARedisProducerFunc(ctx context.Context, isLocal bool, logger *zap.Logger) (producer.PushFunc, error) { + if isLocal { + return func(context.Context, *producer.NotificationEvent) error { + return nil + }, nil + } + + redisUri, err := getenv("REDIS_URI") + if err != nil { + logger.Fatal("could not create vaa notifier ", zap.Error(err)) + } + + redisPrefix, err := getenv("REDIS_PREFIX") + if err != nil { + logger.Fatal("could not create vaa notifier ", zap.Error(err)) + } + + redisChannel, err := getenv("REDIS_VAA_CHANNEL") + if err != nil { + logger.Fatal("could not create vaa notifier ", zap.Error(err)) + } + + channel := fmt.Sprintf("%s:%s", redisPrefix, redisChannel) + logger.Info("using redis producer", zap.String("channel", channel)) + client := redis.NewClient(&redis.Options{Addr: redisUri}) + return producer.NewRedisProducer(client, channel).Push, nil +} + func main() { //TODO: use a configuration structure to obtain the configuration _ = godotenv.Load() @@ -327,7 +356,18 @@ func main() { logger.Fatal("could not create vaa topic producer ", zap.Error(err)) } - repository := storage.NewRepository(alertClient, metrics, db.Database, vaaTopicProducerFunc, logger) + // Creates a callback to publish VAA messages to a redis pubsub + vaaRedisProducerFunc, err := newVAARedisProducerFunc(rootCtx, isLocalFlag, logger) + if err != nil { + logger.Fatal("could not create vaa redis producer ", zap.Error(err)) + } + + // Creates a composite callback to publish VAA messages to a sns topic and a redis pubsub + producerFunc := producer.NewComposite(vaaTopicProducerFunc, vaaRedisProducerFunc) + + // Creates a callback to publish VAA messages to a redis pubsub + + repository := storage.NewRepository(alertClient, metrics, db.Database, producerFunc, logger) // Outbound gossip message queue sendC := make(chan []byte) diff --git a/fly/topic/topic.go b/fly/producer/producer.go similarity index 69% rename from fly/topic/topic.go rename to fly/producer/producer.go index 8ed3cdf2..096c823a 100644 --- a/fly/topic/topic.go +++ b/fly/producer/producer.go @@ -1,4 +1,4 @@ -package topic +package producer import ( "context" @@ -26,3 +26,15 @@ type SignedVaa struct { TxHash string `json:"txHash"` Version int `json:"version"` } + +// NewComposite returns a PushFunc that calls all the given producers. +func NewComposite(producers ...PushFunc) PushFunc { + return func(ctx context.Context, event *NotificationEvent) error { + for _, producer := range producers { + if err := producer(ctx, event); err != nil { + return err + } + } + return nil + } +} diff --git a/fly/topic/vaa_memory.go b/fly/producer/vaa_memory.go similarity index 96% rename from fly/topic/vaa_memory.go rename to fly/producer/vaa_memory.go index 362c8931..05c58f87 100644 --- a/fly/topic/vaa_memory.go +++ b/fly/producer/vaa_memory.go @@ -1,4 +1,4 @@ -package topic +package producer import ( "context" diff --git a/fly/producer/vaa_redis.go b/fly/producer/vaa_redis.go new file mode 100644 index 00000000..ff1e4d73 --- /dev/null +++ b/fly/producer/vaa_redis.go @@ -0,0 +1,32 @@ +package producer + +import ( + "context" + "encoding/json" + + "github.com/go-redis/redis/v8" +) + +// RedisProducer represents a redis producer. +type RedisProducer struct { + client *redis.Client + channel string +} + +// NewRedisProducer returns a PushFunc that pushes NotificationEvent to redis. +func NewRedisProducer(c *redis.Client, channel string) *RedisProducer { + + return &RedisProducer{ + client: c, + channel: channel, + } +} + +// Push pushes a NotificationEvent to redis. +func (p *RedisProducer) Push(ctx context.Context, event *NotificationEvent) error { + body, err := json.Marshal(event) + if err != nil { + return err + } + return p.client.Publish(ctx, p.channel, string(body)).Err() +} diff --git a/fly/topic/vaa_sns.go b/fly/producer/vaa_sns.go similarity index 98% rename from fly/topic/vaa_sns.go rename to fly/producer/vaa_sns.go index 634dec37..c39f8a96 100644 --- a/fly/topic/vaa_sns.go +++ b/fly/producer/vaa_sns.go @@ -1,4 +1,4 @@ -package topic +package producer import ( "context" diff --git a/fly/storage/repository.go b/fly/storage/repository.go index c005f1f8..7177e441 100644 --- a/fly/storage/repository.go +++ b/fly/storage/repository.go @@ -15,7 +15,7 @@ import ( flyAlert "github.com/wormhole-foundation/wormhole-explorer/fly/internal/alert" "github.com/wormhole-foundation/wormhole-explorer/fly/internal/metrics" "github.com/wormhole-foundation/wormhole-explorer/fly/internal/track" - "github.com/wormhole-foundation/wormhole-explorer/fly/topic" + "github.com/wormhole-foundation/wormhole-explorer/fly/producer" "github.com/wormhole-foundation/wormhole/sdk/vaa" "go.mongodb.org/mongo-driver/bson" "go.mongodb.org/mongo-driver/mongo" @@ -29,7 +29,7 @@ type Repository struct { alertClient alert.AlertClient metrics metrics.Metrics db *mongo.Database - afterUpdate topic.PushFunc + afterUpdate producer.PushFunc log *zap.Logger collections struct { vaas *mongo.Collection @@ -44,7 +44,7 @@ type Repository struct { } // TODO wrap repository with a service that filters using redis -func NewRepository(alertService alert.AlertClient, metrics metrics.Metrics, db *mongo.Database, vaaTopicFunc topic.PushFunc, log *zap.Logger) *Repository { +func NewRepository(alertService alert.AlertClient, metrics metrics.Metrics, db *mongo.Database, vaaTopicFunc producer.PushFunc, log *zap.Logger) *Repository { return &Repository{alertService, metrics, db, vaaTopicFunc, log, struct { vaas *mongo.Collection heartbeats *mongo.Collection @@ -121,11 +121,11 @@ func (s *Repository) UpsertVaa(ctx context.Context, v *vaa.VAA, serializedVaa [] s.updateVAACount(v.EmitterChain) // send signedvaa event to topic. - event := &topic.NotificationEvent{ + event := &producer.NotificationEvent{ TrackID: track.GetTrackID(v.MessageID()), Source: "fly", Type: domain.SignedVaaType, - Payload: topic.SignedVaa{ + Payload: producer.SignedVaa{ ID: v.MessageID(), EmitterChain: uint16(v.EmitterChain), EmitterAddr: v.EmitterAddress.String(), diff --git a/spy/cmd/main.go b/spy/cmd/main.go index 61771330..0ebe6a9e 100644 --- a/spy/cmd/main.go +++ b/spy/cmd/main.go @@ -6,15 +6,15 @@ import ( "os" "os/signal" "syscall" - "time" "github.com/certusone/wormhole/node/pkg/supervisor" - "github.com/wormhole-foundation/wormhole-explorer/common/dbutil" + "github.com/go-redis/redis/v8" + "github.com/wormhole-foundation/wormhole-explorer/common/health" "github.com/wormhole-foundation/wormhole-explorer/common/logger" "github.com/wormhole-foundation/wormhole-explorer/spy/config" "github.com/wormhole-foundation/wormhole-explorer/spy/grpc" "github.com/wormhole-foundation/wormhole-explorer/spy/http/infraestructure" - "github.com/wormhole-foundation/wormhole-explorer/spy/storage" + "github.com/wormhole-foundation/wormhole-explorer/spy/source" "go.uber.org/zap" ) @@ -29,6 +29,17 @@ func handleExit() { } } +func newHealthChecks( + ctx context.Context, + client *redis.Client, +) ([]health.Check, error) { + + healthChecks := []health.Check{ + health.Redis(client), + } + return healthChecks, nil +} + func main() { defer handleExit() @@ -69,18 +80,25 @@ func main() { publisher := grpc.NewPublisher(svs, avs, logger) - db, err := dbutil.Connect(rootCtx, logger, config.MongoURI, config.MongoDatabase, false) - if err != nil { - logger.Fatal("failed to connect MongoDB", zap.Error(err)) - } + client := redis.NewClient(&redis.Options{Addr: config.RedisURI}) - watcher := storage.NewWatcher(db.Database, config.MongoDatabase, publisher.Publish, logger) + watcher, err := source.NewRedisSubscriber(rootCtx, client, config.RedisPrefix, config.RedisChannel, publisher.Publish, logger) + if err != nil { + logger.Fatal("failed to create redis subscriber", zap.Error(err)) + } err = watcher.Start(rootCtx) if err != nil { logger.Fatal("failed to watch MongoDB", zap.Error(err)) } - server := infraestructure.NewServer(logger, config.Port, db.Database, config.PprofEnabled) + // get health check functions. + logger.Info("creating health check functions...") + healthChecks, err := newHealthChecks(rootCtx, client) + if err != nil { + logger.Fatal("failed to create health checks", zap.Error(err)) + } + + server := infraestructure.NewServer(logger, config.Port, config.PprofEnabled, healthChecks...) server.Start() logger.Info("Started wormhole-explorer-spy") @@ -101,8 +119,13 @@ func main() { logger.Info("Closing GRPC server ...") grpcServer.Stop() - logger.Info("Closing MongoDB connection...") - db.DisconnectWithTimeout(10 * time.Second) + logger.Info("Closing Redis connection...") + if err := watcher.Close(rootCtx); err != nil { + logger.Error("Error closing watcher", zap.Error(err)) + } + if err := client.Close(); err != nil { + logger.Error("Error closing redis client", zap.Error(err)) + } logger.Info("Closing Http server ...") server.Stop() diff --git a/spy/config/config.go b/spy/config/config.go index 636d0f7f..406a0786 100644 --- a/spy/config/config.go +++ b/spy/config/config.go @@ -9,13 +9,14 @@ import ( // Configuration represents the application configuration with the default values. type Configuration struct { - Env string `env:"ENV,default=development"` - LogLevel string `env:"LOG_LEVEL,default=INFO"` - Port string `env:"PORT,default=8000"` - GrpcAddress string `env:"GRPC_ADDRESS,default=0.0.0.0:6789"` - MongoURI string `env:"MONGODB_URI,required"` - MongoDatabase string `env:"MONGODB_DATABASE,required"` - PprofEnabled bool `env:"PPROF_ENABLED,default=false"` + Env string `env:"ENV,default=development"` + LogLevel string `env:"LOG_LEVEL,default=INFO"` + Port string `env:"PORT,default=8000"` + GrpcAddress string `env:"GRPC_ADDRESS,default=0.0.0.0:6789"` + RedisURI string `env:"REDIS_URI,required"` + RedisPrefix string `env:"REDIS_PREFIX,required"` + RedisChannel string `env:"REDIS_VAA_CHANNEL,required"` + PprofEnabled bool `env:"PPROF_ENABLED,default=false"` } // New creates a configuration with the values from .env file and environment variables. diff --git a/spy/go.mod b/spy/go.mod index 2d6d1abd..55031167 100644 --- a/spy/go.mod +++ b/spy/go.mod @@ -7,7 +7,7 @@ require ( github.com/gofiber/fiber/v2 v2.47.0 github.com/google/uuid v1.3.0 github.com/joho/godotenv v1.4.0 // Configuration environment - github.com/pkg/errors v0.9.1 + github.com/pkg/errors v0.9.1 // indirect github.com/sethvargo/go-envconfig v0.6.0 // Configuration environment github.com/stretchr/testify v1.8.1 // Testing github.com/wormhole-foundation/wormhole/sdk v0.0.0-20230426150516-e695fad0bed8 @@ -16,17 +16,31 @@ require ( google.golang.org/grpc v1.50.1 ) -require github.com/wormhole-foundation/wormhole-explorer/common v0.0.0-00010101000000-000000000000 +require ( + github.com/go-redis/redis/v8 v8.11.5 + github.com/wormhole-foundation/wormhole-explorer/common v0.0.0-00010101000000-000000000000 +) require ( + github.com/algorand/go-algorand-sdk v1.23.0 // indirect + github.com/algorand/go-codec/codec v1.1.8 // indirect github.com/andybalholm/brotli v1.0.5 // indirect + github.com/aws/aws-sdk-go-v2 v1.17.4 // indirect + github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.28 // indirect + github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.22 // indirect + github.com/aws/aws-sdk-go-v2/service/sns v1.20.2 // indirect + github.com/aws/aws-sdk-go-v2/service/sqs v1.20.2 // indirect + github.com/aws/smithy-go v1.13.5 // indirect github.com/benbjohnson/clock v1.3.0 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/btcsuite/btcd/btcec/v2 v2.3.2 // indirect github.com/cenkalti/backoff/v4 v4.1.3 // indirect github.com/cespare/xxhash/v2 v2.1.2 // indirect + github.com/cosmos/btcutil v1.0.5 // indirect github.com/davecgh/go-spew v1.1.1 // indirect github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0 // indirect + github.com/deepmap/oapi-codegen v1.8.2 // indirect + github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect github.com/ethereum/go-ethereum v1.10.21 // indirect github.com/gogo/protobuf v1.3.3 // indirect github.com/golang/protobuf v1.5.2 // indirect @@ -35,6 +49,8 @@ require ( github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 // indirect github.com/grpc-ecosystem/grpc-gateway/v2 v2.5.0 // indirect github.com/holiman/uint256 v1.2.1 // indirect + github.com/influxdata/influxdb-client-go/v2 v2.12.2 // indirect + github.com/influxdata/line-protocol v0.0.0-20210311194329-9aa0e372d097 // indirect github.com/ipfs/go-cid v0.2.0 // indirect github.com/klauspost/compress v1.16.3 // indirect github.com/klauspost/cpuid/v2 v2.1.0 // indirect diff --git a/spy/go.sum b/spy/go.sum index 00d3d4df..ce402664 100644 --- a/spy/go.sum +++ b/spy/go.sum @@ -38,9 +38,26 @@ github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuy github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= +github.com/algorand/go-algorand-sdk v1.23.0 h1:wlEV6OgDVc/sLeF2y41bwNG/Lr8EoMnN87Ur8N2Gyyo= +github.com/algorand/go-algorand-sdk v1.23.0/go.mod h1:7i2peZBcE48kfoxNZnLA+mklKh812jBKvQ+t4bn0KBQ= +github.com/algorand/go-codec v1.1.8/go.mod h1:XhzVs6VVyWMLu6cApb9/192gBjGRVGm5cX5j203Heg4= +github.com/algorand/go-codec/codec v1.1.8 h1:lsFuhcOH2LiEhpBH3BVUUkdevVmwCRyvb7FCAAPeY6U= +github.com/algorand/go-codec/codec v1.1.8/go.mod h1:tQ3zAJ6ijTps6V+wp8KsGDnPC2uhHVC7ANyrtkIY0bA= github.com/andybalholm/brotli v1.0.5 h1:8uQZIdzKmjc/iuPu7O2ioW48L81FgatrcpfFmiq/cCs= github.com/andybalholm/brotli v1.0.5/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= +github.com/aws/aws-sdk-go-v2 v1.17.4 h1:wyC6p9Yfq6V2y98wfDsj6OnNQa4w2BLGCLIxzNhwOGY= +github.com/aws/aws-sdk-go-v2 v1.17.4/go.mod h1:uzbQtefpm44goOPmdKyAlXSNcwlRgF3ePWVW6EtJvvw= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.28 h1:r+XwaCLpIvCKjBIYy/HVZujQS9tsz5ohHG3ZIe0wKoE= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.28/go.mod h1:3lwChorpIM/BhImY/hy+Z6jekmN92cXGPI1QJasVPYY= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.22 h1:7AwGYXDdqRQYsluvKFmWoqpcOQJ4bH634SkYf3FNj/A= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.22/go.mod h1:EqK7gVrIGAHyZItrD1D8B0ilgwMD1GiWAmbU4u/JHNk= +github.com/aws/aws-sdk-go-v2/service/sns v1.20.2 h1:MU/v2qtfGjKexJ09BMqE8pXo9xYMhT13FXjKgFc0cFw= +github.com/aws/aws-sdk-go-v2/service/sns v1.20.2/go.mod h1:VN2n9SOMS1lNbh5YD7o+ho0/rgfifSrK//YYNiVVF5E= +github.com/aws/aws-sdk-go-v2/service/sqs v1.20.2 h1:CSNIo1jiw7KrkdgZjCOnotu6yuB3IybhKLuSQrTLNfo= +github.com/aws/aws-sdk-go-v2/service/sqs v1.20.2/go.mod h1:1ttxGjUHZliCQMpPss1sU5+Ph/5NvdMFRzr96bv8gm0= +github.com/aws/smithy-go v1.13.5 h1:hgz0X/DX0dGqTYpGALqXJoRKRj5oQ7150i5FdTePzO8= +github.com/aws/smithy-go v1.13.5/go.mod h1:Tg+OJXh4MB2R/uN61Ko2f6hTZwB/ZYGOtib8J3gBHzA= github.com/benbjohnson/clock v1.3.0 h1:ip6w0uFQkncKQ979AypyG0ER7mqUSBdKLOgAle/AT8A= github.com/benbjohnson/clock v1.3.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= @@ -65,12 +82,20 @@ github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMn github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= +github.com/cosmos/btcutil v1.0.5 h1:t+ZFcX77LpKtDBhjucvnOH8C2l2ioGsBNEQ3jef8xFk= +github.com/cosmos/btcutil v1.0.5/go.mod h1:IyB7iuqZMJlthe2tkIFL33xPyzbFYP0XVdS8P5lUPis= +github.com/cyberdelia/templates v0.0.0-20141128023046-ca7fffd4298c/go.mod h1:GyV+0YP4qX0UQ7r2MoYZ+AvYDp12OF5yg4q8rGnyNh4= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/decred/dcrd/crypto/blake256 v1.0.0 h1:/8DMNYp9SGi5f0w7uCm6d6M4OU2rGFK09Y2A4Xv7EE0= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0 h1:HbphB4TFFXpv7MNrT52FGrrgVXF1owhMVTHFZIlnvd4= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0/go.mod h1:DZGJHZMqrU4JJqFAWUS2UO1+lbSKsdiOoYi9Zzey7Fc= +github.com/deepmap/oapi-codegen v1.8.2 h1:SegyeYGcdi0jLLrpbCMoJxnUUn8GBXHsvr4rbzjuhfU= +github.com/deepmap/oapi-codegen v1.8.2/go.mod h1:YLgSKSDv/bZQB7N4ws6luhozi3cEdRktEqrX88CvjIw= +github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= +github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78= +github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= @@ -78,7 +103,10 @@ github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.m github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/ethereum/go-ethereum v1.10.21 h1:5lqsEx92ZaZzRyOqBEXux4/UR06m296RGzN3ol3teJY= github.com/ethereum/go-ethereum v1.10.21/go.mod h1:EYFyF19u3ezGLD4RqOkLq+ZCXzYbLoNDdZlMt7kyKFg= +github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= +github.com/getkin/kin-openapi v0.61.0/go.mod h1:7Yn5whZr5kJi6t+kShccXS8ae1APpYTW6yheSwk8Yi4= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= +github.com/go-chi/chi/v5 v5.0.0/go.mod h1:BBug9lr0cqtdAhsu6R4AAdvufI0/XBzAQSsUqJpoZOs= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= @@ -90,6 +118,10 @@ github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9 github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= github.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= +github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= +github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= +github.com/go-redis/redis/v8 v8.11.5 h1:AcZZR7igkdvfVmQTPnu9WE37LRrO/YrBH5zWyjDC0oI= +github.com/go-redis/redis/v8 v8.11.5/go.mod h1:gREzHqY1hg6oD9ngVRbLStwAWKhA0FEgq8Jd4h5lpwo= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/gofiber/fiber/v2 v2.47.0 h1:EN5lHVCc+Pyqh5OEsk8fzRiifgwpbrP0rulQ4iNf3fs= github.com/gofiber/fiber/v2 v2.47.0/go.mod h1:mbFMVN1lQuzziTkkakgtKKdjfsXSw9BKR5lmcNksUoU= @@ -126,6 +158,7 @@ github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiu github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golangci/lint-1 v0.0.0-20181222135242-d2cdd8c08219/go.mod h1:/X8TswGSh1pIozq4ZwCfxS0WA5JGXguxk94ar/4c87Y= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= @@ -139,6 +172,7 @@ github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= @@ -156,6 +190,7 @@ github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= +github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= github.com/grpc-ecosystem/go-grpc-middleware v1.3.0 h1:+9834+KizmvFV7pXQGSXQTsaWhq2GjuNUt0aUU0YBYw= github.com/grpc-ecosystem/go-grpc-middleware v1.3.0/go.mod h1:z0ButlSOZa5vEBq9m2m2hlwIgKw+rp3sdCBRoJY+30Y= github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 h1:Ovs26xHkKqVztRpIrF/92BcuyuQ/YW4NSIpoGtfXNho= @@ -167,8 +202,14 @@ github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ github.com/holiman/uint256 v1.2.1 h1:XRtyuda/zw2l+Bq/38n5XUoEF72aSOu/77Thd9pPp2o= github.com/holiman/uint256 v1.2.1/go.mod h1:y4ga/t+u+Xwd7CpDgZESaRcWy0I7XMlTMA25ApIH5Jw= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= +github.com/influxdata/influxdb-client-go/v2 v2.12.2 h1:uYABKdrEKlYm+++qfKdbgaHKBPmoWR5wpbmj6MBB/2g= +github.com/influxdata/influxdb-client-go/v2 v2.12.2/go.mod h1:YteV91FiQxRdccyJ2cHvj2f/5sq4y4Njqu1fQzsQCOU= +github.com/influxdata/line-protocol v0.0.0-20210311194329-9aa0e372d097 h1:vilfsDSy7TDxedi9gyBkMvAirat/oRcL0lFdJBf6tdM= +github.com/influxdata/line-protocol v0.0.0-20210311194329-9aa0e372d097/go.mod h1:xaLFMmpvUxqXtVkUJfg9QmT88cDaCJ3ZKgdZ78oO8Qo= github.com/ipfs/go-cid v0.2.0 h1:01JTiihFq9en9Vz0lc0VDWvZe/uBonGpzo4THP0vcQ0= github.com/ipfs/go-cid v0.2.0/go.mod h1:P+HXFDF4CVhaVayiEb4wkAy7zBHxBwsJyt0Y5U6MLro= +github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= +github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= github.com/joho/godotenv v1.4.0 h1:3l4+N6zfMWnkbPEXKng2o2/MR5mSwTrBih4ZEkkz1lg= github.com/joho/godotenv v1.4.0/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4= github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= @@ -198,14 +239,25 @@ github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfn github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/labstack/echo/v4 v4.2.1/go.mod h1:AA49e0DZ8kk5jTOOCKNuPR6oTnBS0dYiM4FW1e6jwpg= +github.com/labstack/gommon v0.3.0/go.mod h1:MULnywXg0yavhxWKc+lOruYdAhDwPK9wf0OL7NoOu+k= github.com/libp2p/go-buffer-pool v0.1.0 h1:oK4mSFcQz7cTQIfqbe4MIj9gLW+mnanjyFtc6cdF0Y8= github.com/libp2p/go-buffer-pool v0.1.0/go.mod h1:N+vh8gMqimBzdKkSMVuydVDq+UV5QTWy5HSiZacSbPg= github.com/libp2p/go-libp2p v0.22.0 h1:2Tce0kHOp5zASFKJbNzRElvh0iZwdtG5uZheNW8chIw= github.com/libp2p/go-libp2p v0.22.0/go.mod h1:UDolmweypBSjQb2f7xutPnwZ/fxioLbMBxSjRksxxU4= github.com/libp2p/go-openssl v0.1.0 h1:LBkKEcUv6vtZIQLVTegAil8jbNpJErQ9AnT+bWV+Ooo= github.com/libp2p/go-openssl v0.1.0/go.mod h1:OiOxwPpL3n4xlenjx2h7AwSGaFSC/KZvf6gNdOBQMtc= +github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= +github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= +github.com/matryer/moq v0.0.0-20190312154309-6cfb0558e1bd/go.mod h1:9ELz6aaclSIGnZBoaSLZ3NAl1VTufbOrXBPvtcy6WiQ= +github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= +github.com/mattn/go-colorable v0.1.7/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= +github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= +github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= +github.com/mattn/go-isatty v0.0.9/go.mod h1:YNRxwqDuOph6SZLI9vUUz6OYw3QyUt7WiY2yME+cCiQ= +github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= github.com/mattn/go-isatty v0.0.19 h1:JITubQf0MOLdlGRuRq+jtsDlekdYPia9ZFsB8h/APPA= github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= @@ -243,6 +295,9 @@ github.com/multiformats/go-varint v0.0.6 h1:gk85QWKxh3TazbLxED/NlDVv8+q+ReFJk7Y2 github.com/multiformats/go-varint v0.0.6/go.mod h1:3Ls8CIEsrijN6+B7PbrXRPxHRPuXSrVKRY101jdMZYE= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= +github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= +github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= +github.com/onsi/gomega v1.20.0 h1:8W0cWlwFkflGPLltQvLRB7ZVD5HuP6ng320w2IS245Q= github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= github.com/philhofer/fwd v1.1.1/go.mod h1:gk3iGcWd9+svBvR0sR+KPcfE+RNWozjowpeBVG3ZVNU= github.com/philhofer/fwd v1.1.2 h1:bnDivRJ1EWPjUIRXV5KfORO897HTbpFAQddBdE8t7Gw= @@ -313,6 +368,7 @@ github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/test-go/testify v1.1.4 h1:Tf9lntrKUMHiXQ07qBScBTSA0dhYQlu83hswqelv1iE= github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= github.com/tidwall/pretty v1.2.1 h1:qjsOFOWWQl+N3RsoF5/ssm1pHmJJwhjlSbZ51I6wMl4= github.com/tinylib/msgp v1.1.6/go.mod h1:75BAfg2hauQhs3qedfdDZmWAPcFMAvJE5b9rGOMufyw= @@ -322,6 +378,8 @@ github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6Kllzaw github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= github.com/valyala/fasthttp v1.47.0 h1:y7moDoxYzMooFpT5aHgNgVOQDrS3qlkfiP9mDtGGK9c= github.com/valyala/fasthttp v1.47.0/go.mod h1:k2zXd82h/7UZc3VOdJ2WaUqt1uZ/XpXAfE9i+HBC3lA= +github.com/valyala/fasttemplate v1.0.1/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPUpymEIMZ47gx8= +github.com/valyala/fasttemplate v1.2.1/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ= github.com/valyala/tcplisten v1.0.0 h1:rBHj/Xf+E1tRGZyWIWwJDiRY0zc1Js+CV5DqwacVSA8= github.com/valyala/tcplisten v1.0.0/go.mod h1:T0xQ8SeCZGxckz9qRXTfG43PvQ/mcWh7FwZEA7Ioqkc= github.com/wormhole-foundation/wormhole/sdk v0.0.0-20230426150516-e695fad0bed8 h1:rrOyHd+H9a6Op1iUyZNCaI5v9D1syq8jDAYyX/2Q4L8= @@ -339,6 +397,7 @@ github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9de github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= go.mongodb.org/mongo-driver v1.11.2 h1:+1v2rDQUWNcGW7/7E0Jvdz51V38XXxJfhzbV17aNHCw= go.mongodb.org/mongo-driver v1.11.2/go.mod h1:s7p5vEtfbeR1gYi6pnj3c3/urpbLv2T5Sfd6Rp2HBB8= @@ -364,6 +423,8 @@ golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8U golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.7.0 h1:AvwMYaRytfdeVt3u6mLaxYtErKYjxA2OXjJ1HHq6t3A= @@ -400,6 +461,7 @@ golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzB golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3/go.mod h1:3p9vT2HGsQu2K1YbXdKPJLVgG5VJdoTa1poYQBtP1AY= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/mod v0.7.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -431,9 +493,11 @@ golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81R golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= @@ -467,6 +531,7 @@ golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5h golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -475,11 +540,14 @@ golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -494,6 +562,7 @@ golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200826173525-f9321e4c35a6/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -502,6 +571,7 @@ golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -512,6 +582,7 @@ golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.9.0 h1:KS/R3tvhPqvJvwcKfnBHJwwthS11LRhmM5D59eEXa0s= golang.org/x/sys v0.9.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.3.0/go.mod h1:q750SLmJuPmVoN1blW3UFBPREJfb1KmY3vwxfr+nFDA= @@ -529,6 +600,8 @@ golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20201208040808-7e3f01d25324/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= @@ -573,6 +646,7 @@ golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc golang.org/x/tools v0.0.0-20201022035929-9cf592e881e9/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.10/go.mod h1:Uh6Zz+xoGYZom868N8YTex3t7RhtHDBrE8Gzo9bV56E= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/tools v0.4.0/go.mod h1:UE5sM2OK9E/d67R0ANs2xJizIymRP5gJU295PvKXxjQ= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -670,10 +744,12 @@ gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8 gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/spy/grpc/publishers.go b/spy/grpc/publishers.go index 01d8e450..a5e61494 100644 --- a/spy/grpc/publishers.go +++ b/spy/grpc/publishers.go @@ -1,7 +1,7 @@ package grpc import ( - "github.com/wormhole-foundation/wormhole-explorer/spy/storage" + "github.com/wormhole-foundation/wormhole-explorer/spy/source" "go.uber.org/zap" ) @@ -18,7 +18,7 @@ func NewPublisher(svs *SignedVaaSubscribers, avs *AllVaaSubscribers, logger *zap } // Publish sends a signed VAA that was stored in the storage. -func (p *Publisher) Publish(e *storage.Event) { +func (p *Publisher) Publish(e *source.Event) { if err := p.svs.HandleVAA(e.Vaas); err != nil { p.logger.Error("Failed to publish signed VAA", zap.Error(err)) diff --git a/spy/http/infraestructure/controller.go b/spy/http/infraestructure/controller.go index bffa8169..d61a13f0 100644 --- a/spy/http/infraestructure/controller.go +++ b/spy/http/infraestructure/controller.go @@ -1,19 +1,23 @@ package infraestructure import ( + "fmt" + "github.com/gofiber/fiber/v2" + "github.com/wormhole-foundation/wormhole-explorer/common/health" "go.uber.org/zap" ) +// Controller definition. // Controller definition. type Controller struct { - srv *Service + checks []health.Check logger *zap.Logger } // NewController creates a Controller instance. -func NewController(serv *Service, logger *zap.Logger) *Controller { - return &Controller{srv: serv, logger: logger} +func NewController(checks []health.Check, logger *zap.Logger) *Controller { + return &Controller{checks: checks, logger: logger} } // HealthCheck handler for the endpoint /health. @@ -23,18 +27,21 @@ func (c *Controller) HealthCheck(ctx *fiber.Ctx) error { }{Status: "OK"}) } -// ReadyCheck handler for the endpoint /ready +// ReadyCheck handler for the endpoint /ready. func (c *Controller) ReadyCheck(ctx *fiber.Ctx) error { - ready, err := c.srv.CheckMongoServerStatus(ctx.Context()) - if ready { - return ctx.Status(fiber.StatusOK).JSON(struct { - Ready string `json:"ready"` - }{Ready: "OK"}) + rctx := ctx.Context() + requestID := fmt.Sprintf("%v", rctx.Value("requestid")) + for _, check := range c.checks { + if err := check(rctx); err != nil { + c.logger.Error("Ready check failed", zap.Error(err), zap.String("requestID", requestID)) + return ctx.Status(fiber.StatusInternalServerError).JSON(struct { + Ready string `json:"ready"` + Error string `json:"error"` + }{Ready: "NO", Error: err.Error()}) + } } - - c.logger.Error("Ready check failed", zap.Error(err)) - return ctx.Status(fiber.StatusInternalServerError).JSON(struct { + return ctx.Status(fiber.StatusOK).JSON(struct { Ready string `json:"ready"` - Error string `json:"error"` - }{Ready: "NO", Error: err.Error()}) + }{Ready: "OK"}) + } diff --git a/spy/http/infraestructure/model.go b/spy/http/infraestructure/model.go deleted file mode 100644 index c96ead64..00000000 --- a/spy/http/infraestructure/model.go +++ /dev/null @@ -1,19 +0,0 @@ -package infraestructure - -// MongoStatus represent a mongo server status. -type MongoStatus struct { - Ok int32 `bson:"ok"` - Host string `bson:"host"` - Version string `bson:"version"` - Process string `bson:"process"` - Pid int32 `bson:"pid"` - Uptime int32 `bson:"uptime"` - Connections *MongoConnections `bson:"connections"` -} - -// MongoConnections represents a mongo server connection. -type MongoConnections struct { - Current int32 `bson:"current"` - Available int32 `bson:"available"` - TotalCreated int32 `bson:"totalCreated"` -} diff --git a/spy/http/infraestructure/repository.go b/spy/http/infraestructure/repository.go deleted file mode 100644 index a338a473..00000000 --- a/spy/http/infraestructure/repository.go +++ /dev/null @@ -1,46 +0,0 @@ -package infraestructure - -import ( - "context" - "fmt" - - "github.com/pkg/errors" - "go.mongodb.org/mongo-driver/bson" - "go.mongodb.org/mongo-driver/mongo" - "go.uber.org/zap" -) - -// Repository definition. -type Repository struct { - db *mongo.Database - logger *zap.Logger -} - -// NewRepository create a new Repository. -func NewRepository(db *mongo.Database, logger *zap.Logger) *Repository { - return &Repository{db: db, - logger: logger.With(zap.String("module", "InfraestructureRepository")), - } -} - -// GetMongoStatus get mongo server status -func (r *Repository) GetMongoStatus(ctx context.Context) (*MongoStatus, error) { - command := bson.D{{Key: "serverStatus", Value: 1}} - result := r.db.RunCommand(ctx, command) - if result.Err() != nil { - requestID := fmt.Sprintf("%v", ctx.Value("requestid")) - r.logger.Error("failed execute command mongo serverStatus", - zap.Error(result.Err()), zap.String("requestID", requestID)) - return nil, errors.WithStack(result.Err()) - } - - var mongoStatus MongoStatus - err := result.Decode(&mongoStatus) - if err != nil { - requestID := fmt.Sprintf("%v", ctx.Value("requestid")) - r.logger.Error("failed decoding cursor to *MongoStatus", zap.Error(err), - zap.String("requestID", requestID)) - return nil, errors.WithStack(err) - } - return &mongoStatus, nil -} diff --git a/spy/http/infraestructure/server.go b/spy/http/infraestructure/server.go index 3b929fbd..f4cf94d3 100644 --- a/spy/http/infraestructure/server.go +++ b/spy/http/infraestructure/server.go @@ -3,7 +3,7 @@ package infraestructure import ( "github.com/gofiber/fiber/v2" "github.com/gofiber/fiber/v2/middleware/pprof" - "go.mongodb.org/mongo-driver/mongo" + "github.com/wormhole-foundation/wormhole-explorer/common/health" "go.uber.org/zap" ) @@ -13,10 +13,8 @@ type Server struct { logger *zap.Logger } -func NewServer(logger *zap.Logger, port string, db *mongo.Database, pprofEnabled bool) *Server { - repository := NewRepository(db, logger) - service := NewService(repository, logger) - ctrl := NewController(service, logger) +func NewServer(logger *zap.Logger, port string, pprofEnabled bool, checks ...health.Check) *Server { + ctrl := NewController(checks, logger) app := fiber.New(fiber.Config{DisableStartupMessage: true}) if pprofEnabled { app.Use(pprof.New()) diff --git a/spy/http/infraestructure/service.go b/spy/http/infraestructure/service.go deleted file mode 100644 index 64eecf34..00000000 --- a/spy/http/infraestructure/service.go +++ /dev/null @@ -1,38 +0,0 @@ -package infraestructure - -import ( - "context" - "fmt" - - "go.uber.org/zap" -) - -type Service struct { - repo *Repository - logger *zap.Logger -} - -// NewService create a new governor.Service. -func NewService(dao *Repository, logger *zap.Logger) *Service { - return &Service{repo: dao, logger: logger.With(zap.String("module", "Infraestructureervice"))} -} - -// CheckMongoServerStatus -func (s *Service) CheckMongoServerStatus(ctx context.Context) (bool, error) { - mongoStatus, err := s.repo.GetMongoStatus(ctx) - if err != nil { - return false, err - } - - // check mongo server status - mongoStatusCheck := (mongoStatus.Ok == 1 && mongoStatus.Pid > 0 && mongoStatus.Uptime > 0) - if !mongoStatusCheck { - return false, fmt.Errorf("mongo server not ready (Ok = %v, Pid = %v, Uptime = %v)", mongoStatus.Ok, mongoStatus.Pid, mongoStatus.Uptime) - } - - // check mongo connections - if mongoStatus.Connections.Available <= 0 { - return false, fmt.Errorf("mongo server without available connections (availableConection = %v)", mongoStatus.Connections.Available) - } - return true, nil -} diff --git a/spy/storage/watcher.go b/spy/source/mongo_watcher.go similarity index 87% rename from spy/storage/watcher.go rename to spy/source/mongo_watcher.go index 49d50ef7..323567a5 100644 --- a/spy/storage/watcher.go +++ b/spy/source/mongo_watcher.go @@ -1,4 +1,4 @@ -package storage +package source import ( "context" @@ -10,7 +10,7 @@ import ( ) // Watcher represents a listener of database changes. -type Watcher struct { +type MongoWatcher struct { db *mongo.Database dbName string handler WatcherFunc @@ -47,8 +47,8 @@ const queryTemplate = ` ` // NewWatcher creates a new database event watcher. -func NewWatcher(db *mongo.Database, dbName string, handler WatcherFunc, logger *zap.Logger) *Watcher { - return &Watcher{ +func NewMongoWatcher(db *mongo.Database, dbName string, handler WatcherFunc, logger *zap.Logger) *MongoWatcher { + return &MongoWatcher{ db: db, dbName: dbName, handler: handler, @@ -57,7 +57,7 @@ func NewWatcher(db *mongo.Database, dbName string, handler WatcherFunc, logger * } // Start executes database event consumption. -func (w *Watcher) Start(ctx context.Context) error { +func (w *MongoWatcher) Start(ctx context.Context) error { query := fmt.Sprintf(queryTemplate, w.dbName, w.dbName) var steps []bson.D err := bson.UnmarshalExtJSON([]byte(query), true, &steps) diff --git a/spy/source/redis_subscriber.go b/spy/source/redis_subscriber.go new file mode 100644 index 00000000..d7a24e81 --- /dev/null +++ b/spy/source/redis_subscriber.go @@ -0,0 +1,75 @@ +package source + +import ( + "context" + "encoding/json" + "errors" + "fmt" + + "github.com/go-redis/redis/v8" + "github.com/wormhole-foundation/wormhole-explorer/common/domain" + "go.uber.org/zap" +) + +// RedisSubscriber is a redis subscriber. +type RedisSubscriber struct { + client *redis.Client + pubSub *redis.PubSub + logger *zap.Logger + handler WatcherFunc +} + +// NewRedisSubscriber create a new redis subscriber. +func NewRedisSubscriber(ctx context.Context, redisClient *redis.Client, prefix, channel string, handler WatcherFunc, log *zap.Logger) (*RedisSubscriber, error) { + if redisClient == nil { + return nil, errors.New("redis client is nil") + } + + channel = fmt.Sprintf("%s:%s", prefix, channel) + pubsub := redisClient.Subscribe(ctx, channel) + return &RedisSubscriber{ + client: redisClient, + pubSub: pubsub, + handler: handler, + logger: log}, nil +} + +// Start executes database event consumption. +func (w *RedisSubscriber) Start(ctx context.Context) error { + w.subscribe(ctx) + return nil +} + +// Close closes the redis event consumption. +func (w *RedisSubscriber) Close(ctx context.Context) error { + return w.pubSub.Close() +} + +func (r *RedisSubscriber) subscribe(ctx context.Context) { + ch := r.pubSub.Channel() + go func() { + for msg := range ch { + var notification domain.NotificationEvent + err := json.Unmarshal([]byte(msg.Payload), ¬ification) + if err != nil { + r.logger.Error("Error decoding vaaEvent message from SQSEvent", zap.Error(err)) + continue + } + + switch notification.Type { + case domain.SignedVaaType: + signedVaa, err := domain.GetEventPayload[domain.SignedVaa](¬ification) + if err != nil { + r.logger.Error("Error decoding signedVAA from notification event", zap.String("trackId", notification.TrackID), zap.Error(err)) + continue + } + r.handler(&Event{ + ID: signedVaa.ID, + Vaas: signedVaa.Vaa, + }) + default: + continue + } + } + }() +}