73 lines
1.4 KiB
Go
73 lines
1.4 KiB
Go
package provider
|
|
|
|
import (
|
|
"context"
|
|
"time"
|
|
|
|
"github.com/ethereum-optimism/optimism/op-ufm/pkg/config"
|
|
)
|
|
|
|
type Provider struct {
|
|
name string
|
|
config *config.ProviderConfig
|
|
signerConfig *config.SignerServiceConfig
|
|
walletConfig *config.WalletConfig
|
|
txPool *NetworkTransactionPool
|
|
|
|
cancelFunc context.CancelFunc
|
|
}
|
|
|
|
func New(name string, cfg *config.ProviderConfig,
|
|
signerConfig *config.SignerServiceConfig,
|
|
walletConfig *config.WalletConfig,
|
|
txPool *NetworkTransactionPool) *Provider {
|
|
p := &Provider{
|
|
name: name,
|
|
config: cfg,
|
|
signerConfig: signerConfig,
|
|
walletConfig: walletConfig,
|
|
txPool: txPool,
|
|
}
|
|
return p
|
|
}
|
|
|
|
func (p *Provider) Start(ctx context.Context) {
|
|
providerCtx, cancelFunc := context.WithCancel(ctx)
|
|
p.cancelFunc = cancelFunc
|
|
|
|
schedule(providerCtx, time.Duration(p.config.ReadInterval), p.Heartbeat)
|
|
if !p.config.ReadOnly {
|
|
schedule(providerCtx, time.Duration(p.config.SendInterval), p.RoundTrip)
|
|
}
|
|
}
|
|
|
|
func (p *Provider) Shutdown() {
|
|
if p.cancelFunc != nil {
|
|
p.cancelFunc()
|
|
}
|
|
}
|
|
|
|
func (p *Provider) Name() string {
|
|
return p.name
|
|
}
|
|
|
|
func (p *Provider) URL() string {
|
|
return p.config.URL
|
|
}
|
|
|
|
func schedule(ctx context.Context, interval time.Duration, handler func(ctx context.Context)) {
|
|
go func() {
|
|
for {
|
|
timer := time.NewTimer(interval)
|
|
handler(ctx)
|
|
|
|
select {
|
|
case <-timer.C:
|
|
case <-ctx.Done():
|
|
timer.Stop()
|
|
return
|
|
}
|
|
}
|
|
}()
|
|
}
|