radiator 0.4.0pre1 → 0.4.0pre2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/Gemfile.lock +2 -2
- data/Rakefile +3 -3
- data/lib/radiator/api.rb +27 -8
- data/lib/radiator/chain.rb +23 -18
- data/lib/radiator/error_parser.rb +8 -0
- data/lib/radiator/stream.rb +50 -19
- data/lib/radiator/transaction.rb +21 -10
- data/lib/radiator/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ec41122ec4298e304c921f89355e437830c9fd78
|
4
|
+
data.tar.gz: 5aec651358eea83415241b2c6295122951d833c0
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 33e83e99337f5e9146a39e65057bcd88693f9d208fbcef91acba1f0b5d3741fed47a2d98e70110e3a326c3d771bf4b3ec68c5cd9dceb3271c35676d676f46b3c
|
7
|
+
data.tar.gz: 170b5bec982a6f359cbdc64d0d89e7e695e13687c70a54867edd33424190ec216934502631e493e54494b42d395a22a1819b2ce63402df9fa8570f53c234b5e9
|
data/Gemfile.lock
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
radiator (0.4.
|
4
|
+
radiator (0.4.0pre2)
|
5
5
|
awesome_print (~> 1.7, >= 1.7.0)
|
6
6
|
bitcoin-ruby (~> 0.0, >= 0.0.11)
|
7
7
|
ffi (~> 1.9, >= 1.9.18)
|
@@ -16,7 +16,7 @@ GEM
|
|
16
16
|
addressable (2.5.2)
|
17
17
|
public_suffix (>= 2.0.2, < 4.0)
|
18
18
|
awesome_print (1.8.0)
|
19
|
-
bitcoin-ruby (0.0.
|
19
|
+
bitcoin-ruby (0.0.18)
|
20
20
|
connection_pool (2.2.1)
|
21
21
|
crack (0.4.3)
|
22
22
|
safe_yaml (~> 1.0.0)
|
data/Rakefile
CHANGED
@@ -57,14 +57,13 @@ task :test_live_stream, [:chain, :persist] do |t, args|
|
|
57
57
|
chain = args[:chain] || 'steem'
|
58
58
|
persist = (args[:persist] || 'true') == 'true'
|
59
59
|
last_block_number = 0
|
60
|
-
options = {chain: chain, persist: persist}
|
61
|
-
api = Radiator::Api.new(options)
|
60
|
+
options = {chain: chain, persist: persist, url: 'https://api.steemitstage.com'}
|
62
61
|
total_ops = 0.0
|
63
62
|
total_vops = 0.0
|
64
63
|
elapsed = 0
|
65
64
|
count = 0
|
66
65
|
|
67
|
-
Radiator::Stream.new(options).blocks do |b, n|
|
66
|
+
Radiator::Stream.new(options).blocks do |b, n, api|
|
68
67
|
start = Time.now.utc
|
69
68
|
|
70
69
|
if last_block_number == 0
|
@@ -75,6 +74,7 @@ task :test_live_stream, [:chain, :persist] do |t, args|
|
|
75
74
|
o = t.map(&:operations)
|
76
75
|
op_size = o.map(&:size).reduce(0, :+)
|
77
76
|
total_ops += op_size
|
77
|
+
|
78
78
|
api.get_ops_in_block(n, true) do |vops, error|
|
79
79
|
if !!error
|
80
80
|
puts "Error on get_ops_in_block for block #{n}"
|
data/lib/radiator/api.rb
CHANGED
@@ -205,11 +205,25 @@ module Radiator
|
|
205
205
|
@preferred_url = @url.dup
|
206
206
|
@failover_urls = options[:failover_urls]
|
207
207
|
@debug = !!options[:debug]
|
208
|
-
@logger = options[:logger] || Radiator.logger
|
209
|
-
@hashie_logger = options[:hashie_logger] || Logger.new(nil)
|
210
208
|
@max_requests = options[:max_requests] || 30
|
211
209
|
@ssl_verify_mode = options[:ssl_verify_mode] || OpenSSL::SSL::VERIFY_PEER
|
212
210
|
@ssl_version = options[:ssl_version]
|
211
|
+
|
212
|
+
@self_logger = false
|
213
|
+
@logger = if options[:logger].nil?
|
214
|
+
@self_logger = true
|
215
|
+
Radiator.logger
|
216
|
+
else
|
217
|
+
options[:logger]
|
218
|
+
end
|
219
|
+
|
220
|
+
@self_hashie_logger = false
|
221
|
+
@hashie_logger = if options[:hashie_logger].nil?
|
222
|
+
@self_hashie_logger = true
|
223
|
+
Logger.new(nil)
|
224
|
+
else
|
225
|
+
options[:hashie_logger]
|
226
|
+
end
|
213
227
|
|
214
228
|
if @failover_urls.nil?
|
215
229
|
@failover_urls = Api::default_failover_urls(@chain) - [@url]
|
@@ -306,15 +320,19 @@ module Radiator
|
|
306
320
|
@block_api.shutdown if !!@block_api && @block_api != self
|
307
321
|
@block_api = nil
|
308
322
|
|
309
|
-
if
|
310
|
-
if defined?(@logger.
|
311
|
-
|
323
|
+
if @self_logger
|
324
|
+
if !!@logger && defined?(@logger.close)
|
325
|
+
if defined?(@logger.closed?)
|
326
|
+
@logger.close unless @logger.closed?
|
327
|
+
end
|
312
328
|
end
|
313
329
|
end
|
314
330
|
|
315
|
-
if
|
316
|
-
if defined?(@hashie_logger.
|
317
|
-
|
331
|
+
if @self_hashie_logger
|
332
|
+
if !!@hashie_logger && defined?(@hashie_logger.close)
|
333
|
+
if defined?(@hashie_logger.closed?)
|
334
|
+
@hashie_logger.close unless @hashie_logger.closed?
|
335
|
+
end
|
318
336
|
end
|
319
337
|
end
|
320
338
|
end
|
@@ -747,6 +765,7 @@ module Radiator
|
|
747
765
|
@backoff_sleep ||= 0.01
|
748
766
|
|
749
767
|
@backoff_sleep *= 2
|
768
|
+
GC.start
|
750
769
|
sleep @backoff_sleep
|
751
770
|
ensure
|
752
771
|
if !!@backoff_at && Time.now.utc - @backoff_at > 300
|
data/lib/radiator/chain.rb
CHANGED
@@ -35,6 +35,19 @@ module Radiator
|
|
35
35
|
).map(&:to_sym)
|
36
36
|
VALID_OPTIONS.each { |option| attr_accessor option }
|
37
37
|
|
38
|
+
def self.parse_slug(*args)
|
39
|
+
args = [args].flatten
|
40
|
+
|
41
|
+
if args.size == 1
|
42
|
+
case args[0]
|
43
|
+
when String then split_slug(args[0])
|
44
|
+
when Hash then [args[0]['author'], args[0]['permlink']]
|
45
|
+
end
|
46
|
+
else
|
47
|
+
args
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
38
51
|
def initialize(options = {})
|
39
52
|
options = options.dup
|
40
53
|
options.each do |k, v|
|
@@ -98,7 +111,7 @@ module Radiator
|
|
98
111
|
# @param args [String || Array<String>] Slug or author, permlink of comment.
|
99
112
|
# @return [Hash]
|
100
113
|
def find_comment(*args)
|
101
|
-
author, permlink =
|
114
|
+
author, permlink = Chain.parse_slug(args)
|
102
115
|
|
103
116
|
api.get_content(author, permlink) do |comment, err|
|
104
117
|
raise ChainError, ErrorParser.new(err) if !!err
|
@@ -241,6 +254,15 @@ module Radiator
|
|
241
254
|
end
|
242
255
|
end
|
243
256
|
private
|
257
|
+
def self.split_slug(slug)
|
258
|
+
slug = slug.split('@').last
|
259
|
+
author = slug.split('/')[0]
|
260
|
+
permlink = slug.split('/')[1..-1].join('/')
|
261
|
+
permlink = permlink.split('#')[0]
|
262
|
+
|
263
|
+
[author, permlink]
|
264
|
+
end
|
265
|
+
|
244
266
|
def build_options
|
245
267
|
{
|
246
268
|
chain: chain,
|
@@ -262,23 +284,6 @@ module Radiator
|
|
262
284
|
@follow_api ||= FollowApi.new(build_options)
|
263
285
|
end
|
264
286
|
|
265
|
-
def parse_slug(slug)
|
266
|
-
slug = slug.split('@').last
|
267
|
-
author = slug.split('/')[0]
|
268
|
-
[author, slug.split('/')[1..-1].join('/')]
|
269
|
-
end
|
270
|
-
|
271
|
-
def normalize_author_permlink(args)
|
272
|
-
if args.size == 1
|
273
|
-
case args[0]
|
274
|
-
when String then parse_slug(args[0])
|
275
|
-
when Hash then [args[0]['author'], args[0]['permlink']]
|
276
|
-
end
|
277
|
-
else
|
278
|
-
args
|
279
|
-
end
|
280
|
-
end
|
281
|
-
|
282
287
|
def default_max_acepted_payout
|
283
288
|
"1000000.000 #{default_debt_asset}"
|
284
289
|
end
|
@@ -58,6 +58,14 @@ module Radiator
|
|
58
58
|
end
|
59
59
|
|
60
60
|
begin
|
61
|
+
if @error['data'].nil?
|
62
|
+
@expiry = false
|
63
|
+
@can_retry = false
|
64
|
+
@can_reprepare = false
|
65
|
+
|
66
|
+
return
|
67
|
+
end
|
68
|
+
|
61
69
|
@error_code = @error['data']['code']
|
62
70
|
stacks = @error['data']['stack']
|
63
71
|
stack_formats = stacks.map { |s| s['format'] }
|
data/lib/radiator/stream.rb
CHANGED
@@ -21,7 +21,7 @@ module Radiator
|
|
21
21
|
MAX_TIMEOUT = 80
|
22
22
|
|
23
23
|
# @private
|
24
|
-
MAX_BLOCKS_PER_NODE =
|
24
|
+
MAX_BLOCKS_PER_NODE = 10000
|
25
25
|
|
26
26
|
RANGE_BEHIND_WARNING = 400
|
27
27
|
|
@@ -120,7 +120,7 @@ module Radiator
|
|
120
120
|
# @param mode we have the choice between
|
121
121
|
# * :head the last block
|
122
122
|
# * :irreversible the block that is confirmed by 2/3 of all block producers and is thus irreversible!
|
123
|
-
# @param block the block to execute for each result, optional.
|
123
|
+
# @param block the block to execute for each result, optional. Yields: |op, trx_id, block_num, api|
|
124
124
|
# @param options [Hash] additional options
|
125
125
|
# @option options [Boollean] :include_virtual Also stream virtual options. Setting this true will impact performance. Default: false.
|
126
126
|
# @return [Hash]
|
@@ -148,19 +148,28 @@ module Radiator
|
|
148
148
|
end.compact
|
149
149
|
|
150
150
|
if include_virtual && !virtual_ops_collected
|
151
|
-
|
152
|
-
|
153
|
-
|
151
|
+
catch :pop_vops do; begin
|
152
|
+
api.get_ops_in_block(block_number, true) do |vops, error|
|
153
|
+
if !!error
|
154
|
+
standby "Node responded with: #{error.message || 'unknown error'}, retrying ...", {
|
155
|
+
error: error,
|
156
|
+
and: {throw: :pop_vops}
|
157
|
+
}
|
158
|
+
end
|
154
159
|
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
160
|
+
vops.each do |vtx|
|
161
|
+
next unless defined? vtx.op
|
162
|
+
|
163
|
+
t = vtx.op.first.to_sym
|
164
|
+
op = vtx.op.last
|
165
|
+
if type.size == 1 && type.first == t
|
166
|
+
ops << op
|
167
|
+
elsif type.none? || type.include?(t)
|
168
|
+
ops << {t => op}
|
169
|
+
end
|
161
170
|
end
|
162
171
|
end
|
163
|
-
end
|
172
|
+
end; end
|
164
173
|
|
165
174
|
virtual_ops_collected = true
|
166
175
|
end
|
@@ -170,7 +179,7 @@ module Radiator
|
|
170
179
|
return ops unless !!block
|
171
180
|
|
172
181
|
ops.each do |op|
|
173
|
-
yield op, trx_id, block_number
|
182
|
+
yield op, trx_id, block_number, api
|
174
183
|
end
|
175
184
|
end
|
176
185
|
end
|
@@ -186,7 +195,7 @@ module Radiator
|
|
186
195
|
# @param mode we have the choice between
|
187
196
|
# * :head the last block
|
188
197
|
# * :irreversible the block that is confirmed by 2/3 of all block producers and is thus irreversible!
|
189
|
-
# @param block the block to execute for each result, optional.
|
198
|
+
# @param block the block to execute for each result, optional. Yields: |tx, trx_id, api|
|
190
199
|
# @return [Hash]
|
191
200
|
def transactions(start = nil, mode = :irreversible, &block)
|
192
201
|
blocks(start, mode) do |b, block_number|
|
@@ -198,7 +207,7 @@ module Radiator
|
|
198
207
|
b['transaction_ids'][index]
|
199
208
|
end
|
200
209
|
|
201
|
-
yield transaction, trx_id, block_number
|
210
|
+
yield transaction, trx_id, block_number, api
|
202
211
|
end
|
203
212
|
end
|
204
213
|
end
|
@@ -209,13 +218,27 @@ module Radiator
|
|
209
218
|
# stream.blocks do |bk, num|
|
210
219
|
# puts "[#{num}] #{bk.to_json}"
|
211
220
|
# end
|
212
|
-
#
|
221
|
+
#
|
222
|
+
# For convenience and memory management, the api used to poll the current
|
223
|
+
# block data is also available inside the block, e.g.:
|
224
|
+
#
|
225
|
+
# stream = Radiator::Stream.new
|
226
|
+
# stream.blocks do |bk, num, api|
|
227
|
+
# puts "[#{num}] #{bk.to_json}"
|
228
|
+
#
|
229
|
+
# api.get_ops_in_block(num, true) do |vops, error|
|
230
|
+
# puts vops
|
231
|
+
# end
|
232
|
+
# end
|
233
|
+
#
|
234
|
+
# This idiom is useful for very long running scripts.
|
235
|
+
#
|
213
236
|
# @param start starting block
|
214
237
|
# @param mode we have the choice between
|
215
238
|
# * :head the last block
|
216
239
|
# * :irreversible the block that is confirmed by 2/3 of all block producers and is thus irreversible!
|
217
240
|
# @param max_blocks_per_node the number of blocks to read before trying a new node
|
218
|
-
# @param block the block to execute for each result, optional.
|
241
|
+
# @param block the block to execute for each result, optional. Yields: |bk, num, api|
|
219
242
|
# @return [Hash]
|
220
243
|
def blocks(start = nil, mode = :irreversible, max_blocks_per_node = MAX_BLOCKS_PER_NODE, &block)
|
221
244
|
reset_api
|
@@ -229,7 +252,14 @@ module Radiator
|
|
229
252
|
break if stop?
|
230
253
|
|
231
254
|
catch :sequence do; begin
|
232
|
-
head_block = api.get_dynamic_global_properties do |properties|
|
255
|
+
head_block = api.get_dynamic_global_properties do |properties, error|
|
256
|
+
if !!error
|
257
|
+
standby "Node responded with: #{error.message || 'unknown error'}, retrying ...", {
|
258
|
+
error: error,
|
259
|
+
and: {throw: :sequence}
|
260
|
+
}
|
261
|
+
end
|
262
|
+
|
233
263
|
break if stop?
|
234
264
|
|
235
265
|
if properties.head_block_number.nil?
|
@@ -295,7 +325,7 @@ module Radiator
|
|
295
325
|
|
296
326
|
latest_block_number = n
|
297
327
|
return current_block, n if block.nil?
|
298
|
-
yield current_block, n
|
328
|
+
yield current_block, n, api
|
299
329
|
end
|
300
330
|
|
301
331
|
start = head_block + 1
|
@@ -331,6 +361,7 @@ module Radiator
|
|
331
361
|
|
332
362
|
@api = nil
|
333
363
|
@block_api = nil
|
364
|
+
GC.start
|
334
365
|
end
|
335
366
|
|
336
367
|
# @private
|
data/lib/radiator/transaction.rb
CHANGED
@@ -25,13 +25,20 @@ module Radiator
|
|
25
25
|
end
|
26
26
|
end
|
27
27
|
|
28
|
-
@logger = options[:logger] || Radiator.logger
|
29
28
|
@chain ||= :steem
|
30
29
|
@chain = @chain.to_sym
|
31
30
|
@chain_id = chain_id options[:chain_id]
|
32
31
|
@url = options[:url] || url
|
33
32
|
@operations = options[:operations] || []
|
34
|
-
|
33
|
+
|
34
|
+
@self_logger = false
|
35
|
+
@logger = if options[:logger].nil?
|
36
|
+
@self_logger = true
|
37
|
+
Radiator.logger
|
38
|
+
else
|
39
|
+
options[:logger]
|
40
|
+
end
|
41
|
+
|
35
42
|
unless NETWORK_CHAIN_IDS.include? @chain_id
|
36
43
|
warning "Unknown chain id: #{@chain_id}"
|
37
44
|
end
|
@@ -60,7 +67,7 @@ module Radiator
|
|
60
67
|
@api = Api.new(options)
|
61
68
|
@network_broadcast_api = NetworkBroadcastApi.new(options)
|
62
69
|
|
63
|
-
ObjectSpace.define_finalizer(self, self.class.finalize(@api, @network_broadcast_api, @logger))
|
70
|
+
ObjectSpace.define_finalizer(self, self.class.finalize(@api, @network_broadcast_api, @self_logger, @logger))
|
64
71
|
end
|
65
72
|
|
66
73
|
def chain_id(chain_id = nil)
|
@@ -124,9 +131,11 @@ module Radiator
|
|
124
131
|
@api.shutdown if !!@api
|
125
132
|
@network_broadcast_api.shutdown if !!@network_broadcast_api
|
126
133
|
|
127
|
-
if
|
128
|
-
if defined?(@logger.
|
129
|
-
|
134
|
+
if @self_logger
|
135
|
+
if !!@logger && defined?(@logger.close)
|
136
|
+
if defined?(@logger.closed?)
|
137
|
+
@logger.close unless @logger.closed?
|
138
|
+
end
|
130
139
|
end
|
131
140
|
end
|
132
141
|
end
|
@@ -251,7 +260,7 @@ module Radiator
|
|
251
260
|
)
|
252
261
|
end
|
253
262
|
|
254
|
-
def self.finalize(api, network_broadcast_api, logger)
|
263
|
+
def self.finalize(api, network_broadcast_api, self_logger, logger)
|
255
264
|
proc {
|
256
265
|
if !!api && !api.stopped?
|
257
266
|
puts "DESTROY: #{api.inspect}" if ENV['LOG'] == 'TRACE'
|
@@ -266,9 +275,11 @@ module Radiator
|
|
266
275
|
end
|
267
276
|
|
268
277
|
begin
|
269
|
-
if
|
270
|
-
if defined?(logger.
|
271
|
-
|
278
|
+
if self_logger
|
279
|
+
if !!logger && defined?(logger.close)
|
280
|
+
if defined?(logger.closed?)
|
281
|
+
logger.close unless logger.closed?
|
282
|
+
end
|
272
283
|
end
|
273
284
|
end
|
274
285
|
rescue IOError, NoMethodError => _; end
|
data/lib/radiator/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: radiator
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.4.
|
4
|
+
version: 0.4.0pre2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Anthony Martin
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-02-
|
11
|
+
date: 2018-02-21 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|