This repository has been archived by the owner on Apr 2, 2024. It is now read-only.
generated from mrz1836/go-template
-
-
Notifications
You must be signed in to change notification settings - Fork 6
/
client_options.go
231 lines (203 loc) · 5.66 KB
/
client_options.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
package chainstate
import (
"context"
"time"
zLogger "github.com/mrz1836/go-logger"
"github.com/mrz1836/go-nownodes"
"github.com/mrz1836/go-whatsonchain"
"github.com/newrelic/go-agent/v3/newrelic"
"github.com/tonicpow/go-minercraft"
)
// ClientOps allow functional options to be supplied
// that overwrite default client options.
type ClientOps func(c *clientOptions)
// defaultClientOptions will return an clientOptions struct with the default settings
//
// Useful for starting with the default and then modifying as needed
func defaultClientOptions() *clientOptions {
// Create the default miners
bm, qm := defaultMiners()
// Set the default options
return &clientOptions{
config: &syncConfig{
httpClient: nil,
mAPI: &mAPIConfig{
broadcastMiners: bm,
queryMiners: qm,
},
minercraft: nil,
network: MainNet,
queryTimeout: defaultQueryTimeOut,
whatsOnChain: nil,
},
debug: false,
newRelicEnabled: false,
}
}
// defaultMiners will return the miners for default configuration
func defaultMiners() (broadcastMiners []*Miner, queryMiners []*Miner) {
// Set the broadcast miners
miners, _ := minercraft.DefaultMiners()
// Loop and add (only miners that support ALL TX QUERY)
for index, miner := range miners {
broadcastMiners = append(broadcastMiners, &Miner{
FeeLastChecked: time.Now().UTC(),
FeeUnit: DefaultFee,
Miner: miners[index],
})
// Only miners that support querying
if miner.Name == minercraft.MinerTaal || miner.Name == minercraft.MinerMempool {
// minercraft.MinerGorillaPool, (does not have -t index enabled - 4.25.22)
// minercraft.MinerMatterpool, (does not have -t index enabled - 4.25.22)
queryMiners = append(queryMiners, &Miner{
// FeeLastChecked: time.Now().UTC(),
// FeeUnit: DefaultFee,
Miner: miners[index],
})
}
}
return
}
// getTxnCtx will check for an existing transaction
func (c *clientOptions) getTxnCtx(ctx context.Context) context.Context {
if c.newRelicEnabled {
txn := newrelic.FromContext(ctx)
if txn != nil {
ctx = newrelic.NewContext(ctx, txn)
}
}
return ctx
}
// WithNewRelic will enable the NewRelic wrapper
func WithNewRelic() ClientOps {
return func(c *clientOptions) {
c.newRelicEnabled = true
}
}
// WithDebugging will enable debugging mode
func WithDebugging() ClientOps {
return func(c *clientOptions) {
c.debug = true
}
}
// WithHTTPClient will set a custom HTTP client
func WithHTTPClient(client HTTPInterface) ClientOps {
return func(c *clientOptions) {
if client != nil {
c.config.httpClient = client
}
}
}
// WithMinercraft will set a custom Minercraft client
func WithMinercraft(client minercraft.ClientInterface) ClientOps {
return func(c *clientOptions) {
if client != nil {
c.config.minercraft = client
}
}
}
// WithWhatsOnChain will set a custom WhatsOnChain client
func WithWhatsOnChain(client whatsonchain.ClientInterface) ClientOps {
return func(c *clientOptions) {
if client != nil {
c.config.whatsOnChain = client
}
}
}
// WithNowNodes will set a custom NowNodes client
func WithNowNodes(client nownodes.ClientInterface) ClientOps {
return func(c *clientOptions) {
if client != nil {
c.config.nowNodes = client
}
}
}
// WithNowNodesAPIKey will set a custom NowNodes API key
func WithNowNodesAPIKey(apiKey string) ClientOps {
return func(c *clientOptions) {
if len(apiKey) > 0 {
c.config.nowNodesAPIKey = apiKey
}
}
}
// WithWhatsOnChainAPIKey will set a custom WhatsOnChain API key
func WithWhatsOnChainAPIKey(apiKey string) ClientOps {
return func(c *clientOptions) {
if len(apiKey) > 0 {
c.config.whatsOnChainAPIKey = apiKey
}
}
}
// WithBroadcastMiners will set a list of miners for broadcasting
func WithBroadcastMiners(miners []*Miner) ClientOps {
return func(c *clientOptions) {
if len(miners) > 0 {
c.config.mAPI.broadcastMiners = miners
}
}
}
// WithQueryMiners will set a list of miners for querying transactions
func WithQueryMiners(miners []*Miner) ClientOps {
return func(c *clientOptions) {
if len(miners) > 0 {
c.config.mAPI.queryMiners = miners
}
}
}
// WithQueryTimeout will set a different timeout for transaction querying
func WithQueryTimeout(timeout time.Duration) ClientOps {
return func(c *clientOptions) {
if timeout > 0 {
c.config.queryTimeout = timeout
}
}
}
// WithUserAgent will set the custom user agent
func WithUserAgent(agent string) ClientOps {
return func(c *clientOptions) {
if len(agent) > 0 {
c.userAgent = agent
}
}
}
// WithNetwork will set the network to use
func WithNetwork(network Network) ClientOps {
return func(c *clientOptions) {
if len(network) > 0 {
c.config.network = network
}
}
}
// WithLogger will set a custom logger
func WithLogger(customLogger zLogger.GormLoggerInterface) ClientOps {
return func(c *clientOptions) {
if customLogger != nil {
c.logger = customLogger
}
}
}
// WithMonitoring will create a new monitorConfig interface with the given options
func WithMonitoring(ctx context.Context, monitorOptions *MonitorOptions) ClientOps {
return func(c *clientOptions) {
if monitorOptions != nil {
// Create the default Monitor for monitoring destinations
c.monitor = NewMonitor(ctx, monitorOptions)
}
}
}
// WithMonitoringInterface will set the interface to use for monitoring the blockchain
func WithMonitoringInterface(monitor MonitorService) ClientOps {
return func(c *clientOptions) {
if monitor != nil {
c.monitor = monitor
}
}
}
// WithExcludedProviders will set a list of excluded providers
func WithExcludedProviders(providers []string) ClientOps {
return func(c *clientOptions) {
if len(providers) > 0 {
c.config.excludedProviders = providers
}
}
}