radiator 0.4.0pre3 → 0.4.0pre4

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: b3f2fba4fb406179bfcb988e1d1669615b392569
4
- data.tar.gz: b721efe6e8751fef45eb40a31e1799c3c695378f
3
+ metadata.gz: 0fa87cf414d03f44944ae568a7c96b6c7e268d7c
4
+ data.tar.gz: 14b86e6768d73cc4842497c8b91547e6cd2add46
5
5
  SHA512:
6
- metadata.gz: 439ff52f2860e63571e6be0cdd53431f80ceaf4e8671c6754ab5db47a41a4cf87447a6b23ae8ce69209990e5064651619bdb897e27d75c507e9b107ae8123f98
7
- data.tar.gz: c62becd00245e1478d287bd4a62b013608f0138078626969225947ab4f2322daec363ed54af443d1c5f7b652775e1833bf6a02871af36f269fb8bd3ef9089c54
6
+ metadata.gz: 577386edefce45ef60a51476db9b1f76a44a096ac149cdb61fc992af391420a2c35a40fe797921fb9ddc1a6765895e9eff5d636ad378555d0f550e058dd608c9
7
+ data.tar.gz: 40432819def16218dbc7fa51099791138c4afb1282e7e6c5eb066cee5b0bf4d16245f2e411d4aa5b3de8be73e4a2dedf35343c606d0b3642eb633a566310d0b6
data/.travis.yml CHANGED
@@ -1,9 +1,11 @@
1
1
  language: ruby
2
2
  rvm:
3
+ # You can enable more than one ruby version target at the same time, but doing
4
+ # so will disable code coverage reporting.
3
5
  # - "2.0.0"
4
6
  # - "2.1.5"
5
7
  # - "2.2.1"
6
- - "2.3.0"
8
+ # - "2.3.0"
7
9
  - "2.4.2"
8
10
  # - "2.5.0" # dev
9
11
  env:
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- radiator (0.4.0pre3)
4
+ radiator (0.4.0pre4)
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)
data/README.md CHANGED
@@ -10,6 +10,60 @@
10
10
 
11
11
  Radiator is an API Client for interaction with the STEEM network using Ruby.
12
12
 
13
+ #### Changes in v0.4.0
14
+
15
+ * Gem updates
16
+ * AppBase Support
17
+ * Defaulting to `condenser_api.*` in `Radiator::Api` (see below)
18
+ * Handle/recover from new `AppBase` errors.
19
+ * `Radiator::Stream` now detects if it's stalled and takes action if it has to wait too long for a new block.
20
+ 1. Exponential back-off for stalls so that the node doesn't get slammed.
21
+ 2. Short delays (3 times block production) only result in a warning.
22
+ 3. Long delays (6 times block production) may try to switch to an alternate node.
23
+ * Fixed internal logging bug that would open too many files.
24
+ * This fix also mitigates issues like `SSL Verify` problems (similar to [#12](https://github.com/inertia186/radiator/issues/12))
25
+ * Dropped GOLOS support.
26
+
27
+ **Appbase is now supported.**
28
+
29
+ If you were already using `Radiator::Api` then there is nothing to change. But if you made use of other API classes, like `Radiator::FollowApi`, then the method signatures have changed.
30
+
31
+ **Pre-AppBase:**
32
+
33
+ ```ruby
34
+ api = Radiator::FollowApi.new
35
+
36
+ api.get_followers('inertia', 0, 'blog', 10)
37
+ ```
38
+
39
+ **New Signature:**
40
+
41
+ ```ruby
42
+ api = Radiator::FollowApi.new
43
+
44
+ api.get_followers(account: 'inertia', start: 0, type: 'blog', limit: 10)
45
+ ```
46
+
47
+ *-- or --*
48
+
49
+ **Switch to Condenser API:**
50
+
51
+ The other strategy for using this version of Radiator is to just switch away from classes like `Radiator::FollowApi` over to `Radiator::Api` (also known as `Radiator::CondenserApi`) instead. Then you don't have to update individual method calls.
52
+
53
+ ```ruby
54
+ api = Radiator::Api.new
55
+
56
+ api.get_followers('inertia', 0, 'blog', 10)
57
+ ```
58
+
59
+ **Note about GOLOS**
60
+
61
+ GOLOS is no longer supported in Radiator. If you want to continue to use GOLOS, you'll need to branch from v0.3.15 (pre-appbase) and add WebSockets support because GOLOS completely dropped JSON-RPC over HTTP clients support for some reason
62
+
63
+ Radiator has never and will never use WebSockets due to its server scalability requirements.
64
+
65
+ From a client perspective, WebSockets is *great*. **I have nothing against WebSockets.** So I might get around to it at some point, but GOLOS won't be part of Radiator anymore mainly because GOLOS has no plans to implement AppBase.
66
+
13
67
  #### Changes in v0.3.0
14
68
 
15
69
  * Gem updates
data/Rakefile CHANGED
@@ -34,7 +34,9 @@ task :test_live_broadcast, [:account, :wif, :chain] do |t, args|
34
34
  account_name = args[:account] || 'social'
35
35
  posting_wif = args[:wif] || '5JrvPrQeBBvCRdjv29iDvkwn3EQYZ9jqfAHzrCyUvfbEbRkrYFC'
36
36
  chain = args[:chain] || 'steem'
37
- options = {chain: chain, wif: posting_wif}
37
+ # url = 'https://testnet.steemitdev.com/' # use testnet
38
+ url = nil # use default
39
+ options = {chain: chain, wif: posting_wif, url: url}
38
40
  tx = Radiator::Transaction.new(options)
39
41
  tx.operations << {
40
42
  type: :claim_reward_balance,
@@ -60,7 +62,9 @@ task :test_live_stream, [:chain, :persist] do |t, args|
60
62
  chain = args[:chain] || 'steem'
61
63
  persist = (args[:persist] || 'true') == 'true'
62
64
  last_block_number = 0
63
- options = {chain: chain, persist: persist}
65
+ # url = 'https://testnet.steemitdev.com/'
66
+ url = nil # use default
67
+ options = {chain: chain, persist: persist, url: url}
64
68
  total_ops = 0.0
65
69
  total_vops = 0.0
66
70
  elapsed = 0
@@ -84,11 +88,13 @@ task :test_live_stream, [:chain, :persist] do |t, args|
84
88
  ap error
85
89
  end
86
90
 
87
- vop_size = if vops.nil?
88
- 0
89
- else
90
- vops.size
91
- end
91
+ puts "Problem: vops is nil!" if vops.nil?
92
+
93
+ # Did we reach this point with an unhandled error that wasn't retried?
94
+ # If so, vops might be nil and we might need this error to get handled
95
+ # instead of checking for vops.nil?.
96
+
97
+ vop_size = vops.size
92
98
  total_vops += vop_size
93
99
 
94
100
  vop_ratio = if total_vops > 0
data/lib/radiator/api.rb CHANGED
@@ -429,12 +429,15 @@ module Radiator
429
429
  response = JSON[body]
430
430
 
431
431
  if response['id'] != options[:id]
432
+ debug_payload(options, body) if ENV['DEBUG'] == 'true'
433
+
432
434
  if !!response['id']
433
435
  warning "Unexpected rpc_id (expected: #{options[:id]}, got: #{response['id']}), retrying ...", method_name, true
434
436
  else
435
437
  # The node has broken the jsonrpc spec.
436
438
  warning "Node did not provide jsonrpc id (expected: #{options[:id]}, got: nothing, retrying ...", method_name, true
437
439
  end
440
+
438
441
  if response.keys.include?('error')
439
442
  handle_error(response, options, method_name, tries)
440
443
  end
@@ -835,6 +838,20 @@ module Radiator
835
838
  end
836
839
  end
837
840
 
841
+ def debug_payload(request, response)
842
+ request = JSON.pretty_generate(request)
843
+ response = JSON.parse(response) rescue response
844
+ response = JSON.pretty_generate(response) rescue response
845
+
846
+ puts '=' * 80
847
+ puts "Request:"
848
+ puts request
849
+ puts '=' * 80
850
+ puts "Response:"
851
+ puts response
852
+ puts '=' * 80
853
+ end
854
+
838
855
  def backoff
839
856
  shutdown
840
857
  bump_failover if flappy? || !healthy?(uri)
@@ -87,14 +87,20 @@ module Radiator
87
87
  @api_name = data_call_method['call.params']
88
88
  end
89
89
  else
90
- @error_code = ['code']
91
- @error_message = ['message']
90
+ @error_code = @error['code']
91
+ @error_message = @error['message']
92
92
  @expiry = false
93
93
  @can_retry = false
94
94
  @can_reprepare = false
95
95
  end
96
96
 
97
97
  case @error_code
98
+ when -32603
99
+ if error_match?('Internal Error')
100
+ @expiry = false
101
+ @can_retry = true
102
+ @can_reprepare = true
103
+ end
98
104
  when -32003
99
105
  if error_match?('Unable to acquire database lock')
100
106
  @expiry = false
@@ -148,7 +154,11 @@ module Radiator
148
154
  @can_reprepare = false
149
155
  end
150
156
  rescue => e
151
- ap error_parser_exception: e, original_response: response#, backtrace: e.backtrace
157
+ if ENV['DEBUG'] == 'true'
158
+ ap error_parser_exception: e, original_response: response, backtrace: e.backtrace
159
+ else
160
+ ap error_parser_exception: e, original_response: response
161
+ end
152
162
 
153
163
  @expiry = false
154
164
  @can_retry = false
@@ -161,8 +171,14 @@ module Radiator
161
171
 
162
172
  case @error['code']
163
173
  when -32003
174
+ any_of = [
175
+ 'Internal Error"',
176
+ '_api_plugin not enabled.'
177
+ ]
178
+
164
179
  can_retry = error_match?('Unable to acquire database lock')
165
- can_retry = if !can_retry && error_match?('Internal Error"')
180
+
181
+ if !can_retry && error_match?(any_of)
166
182
  can_retry = true
167
183
  @node_degraded = true
168
184
  else
@@ -177,18 +193,24 @@ module Radiator
177
193
  can_retry
178
194
  end
179
195
 
180
- def error_match?(match)
181
- case match
182
- when String
183
- @error['message'] && @error['message'].include?(match)
184
- when Array
185
- if @error['message']
186
- match.map { |m| @error['message'].include?(m) }.include? true
187
- else
188
- false
196
+ def error_match?(matches)
197
+ matches = [matches].flatten
198
+
199
+ any = matches.map do |match|
200
+ case match
201
+ when String
202
+ @error['message'] && @error['message'].include?(match)
203
+ when Array
204
+ if @error['message']
205
+ match.map { |m| m.include?(match) }.include? true
206
+ else
207
+ false
208
+ end
209
+ else; false
189
210
  end
190
- else; false
191
211
  end
212
+
213
+ any.include?(true)
192
214
  end
193
215
 
194
216
  def to_s
@@ -172,7 +172,8 @@ module Radiator
172
172
 
173
173
  @api.get_block(block_number) do |block, error|
174
174
  if !!error
175
- raise TransactionError, "Unable to prepare transaction.", error
175
+ ap error if ENV['DEBUG'] == 'true'
176
+ raise TransactionError, "Unable to prepare transaction: #{error.message || 'Unknown cause.'}"
176
177
  end
177
178
 
178
179
  if !!block && !!block.previous
@@ -1,4 +1,4 @@
1
1
  module Radiator
2
- VERSION = '0.4.0pre3'
2
+ VERSION = '0.4.0pre4'
3
3
  AGENT_ID = "radiator/#{VERSION}"
4
4
  end
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.0pre3
4
+ version: 0.4.0pre4
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-04-15 00:00:00.000000000 Z
11
+ date: 2018-04-28 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler