2022-11-21 06:18:33 -08:00
|
|
|
package processor
|
|
|
|
|
|
|
|
import (
|
|
|
|
"context"
|
|
|
|
|
2023-06-26 08:47:22 -07:00
|
|
|
"github.com/wormhole-foundation/wormhole-explorer/fly/internal/metrics"
|
2022-11-21 06:18:33 -08:00
|
|
|
"github.com/wormhole-foundation/wormhole-explorer/fly/storage"
|
|
|
|
|
|
|
|
"github.com/wormhole-foundation/wormhole/sdk/vaa"
|
|
|
|
"go.uber.org/zap"
|
|
|
|
)
|
|
|
|
|
|
|
|
// VAAQueueConsumer represents a VAA queue consumer.
|
|
|
|
type VAAQueueConsumer struct {
|
|
|
|
consume VAAQueueConsumeFunc
|
|
|
|
repository *storage.Repository
|
2023-01-05 11:40:24 -08:00
|
|
|
notifyFunc VAANotifyFunc
|
2023-06-26 08:47:22 -07:00
|
|
|
metrics metrics.Metrics
|
2022-11-21 06:18:33 -08:00
|
|
|
logger *zap.Logger
|
|
|
|
}
|
|
|
|
|
|
|
|
// NewVAAQueueConsumer creates a new VAA queue consumer instances.
|
|
|
|
func NewVAAQueueConsumer(
|
|
|
|
consume VAAQueueConsumeFunc,
|
|
|
|
repository *storage.Repository,
|
2023-01-05 11:40:24 -08:00
|
|
|
notifyFunc VAANotifyFunc,
|
2023-06-26 08:47:22 -07:00
|
|
|
metrics metrics.Metrics,
|
2022-11-21 06:18:33 -08:00
|
|
|
logger *zap.Logger) *VAAQueueConsumer {
|
|
|
|
return &VAAQueueConsumer{
|
|
|
|
consume: consume,
|
|
|
|
repository: repository,
|
2023-01-05 11:40:24 -08:00
|
|
|
notifyFunc: notifyFunc,
|
2023-06-26 08:47:22 -07:00
|
|
|
metrics: metrics,
|
2022-11-21 06:18:33 -08:00
|
|
|
logger: logger,
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// Start consumes messages from VAA queue and store those messages in a repository.
|
|
|
|
func (c *VAAQueueConsumer) Start(ctx context.Context) {
|
|
|
|
go func() {
|
2023-02-02 09:51:33 -08:00
|
|
|
for msg := range c.consume(ctx) {
|
|
|
|
v, err := vaa.Unmarshal(msg.Data())
|
|
|
|
if err != nil {
|
|
|
|
c.logger.Error("Error unmarshalling vaa", zap.Error(err))
|
|
|
|
msg.Failed()
|
|
|
|
continue
|
|
|
|
}
|
2022-11-21 06:18:33 -08:00
|
|
|
|
2023-02-02 09:51:33 -08:00
|
|
|
if msg.IsExpired() {
|
|
|
|
c.logger.Warn("Message with vaa expired", zap.String("id", v.MessageID()))
|
|
|
|
msg.Failed()
|
|
|
|
continue
|
|
|
|
}
|
2023-01-05 11:40:24 -08:00
|
|
|
|
2023-06-26 08:47:22 -07:00
|
|
|
c.metrics.IncVaaConsumedFromQueue(v.EmitterChain)
|
|
|
|
|
2023-02-02 09:51:33 -08:00
|
|
|
err = c.repository.UpsertVaa(ctx, v, msg.Data())
|
|
|
|
if err != nil {
|
|
|
|
c.logger.Error("Error inserting vaa in repository",
|
|
|
|
zap.String("id", v.MessageID()),
|
|
|
|
zap.Error(err))
|
|
|
|
msg.Failed()
|
|
|
|
continue
|
|
|
|
}
|
2023-01-05 11:40:24 -08:00
|
|
|
|
2023-02-02 09:51:33 -08:00
|
|
|
err = c.notifyFunc(ctx, v, msg.Data())
|
|
|
|
if err != nil {
|
2023-07-25 11:39:27 -07:00
|
|
|
c.metrics.IncMaxSequenceCacheError(v.EmitterChain)
|
2023-02-02 09:51:33 -08:00
|
|
|
c.logger.Error("Error notifying vaa",
|
|
|
|
zap.String("id", v.MessageID()),
|
|
|
|
zap.Error(err))
|
|
|
|
msg.Failed()
|
|
|
|
continue
|
2022-11-21 06:18:33 -08:00
|
|
|
}
|
2023-02-02 09:51:33 -08:00
|
|
|
|
2023-05-10 11:49:40 -07:00
|
|
|
msg.Done(ctx)
|
2024-02-06 16:00:45 -08:00
|
|
|
c.logger.Info("Vaa saved in repository", zap.String("id", v.MessageID()))
|
2022-11-21 06:18:33 -08:00
|
|
|
}
|
|
|
|
}()
|
|
|
|
}
|