peatio 0.4.4 → 0.4.5

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 544f2e08a61c0d131a56d773a10f5ca00cc3f48fed002b29d03f12f74cb14408
4
- data.tar.gz: bc924762a87b68999d9f69ffbbfb2244e9e27d93a009f90a3aa1fedc938a8390
3
+ metadata.gz: 8cc7f7dae49e5e34e71138ae6f7c5097516309d421fe9a048d3fffc5aa4c4081
4
+ data.tar.gz: 209f063cd346d27742b57a12a991904cd7c9c320154aab9fb7d50eb9ce45d736
5
5
  SHA512:
6
- metadata.gz: e09bbcd7320c24252e9538b2b89afa1cc52b4b6926eb0ce9889177cba0459d9b89d0183e8b93cac3e7768cb03b24ac32a7cba43b0c771a8e71a6c655835f66c9
7
- data.tar.gz: 0116a1991d8b7db0d1570ca0bb8a2a7849c701380f31d0ceb131ece9287572cfad6b8fb0892782dbe5ae2b39d512ae766d7a5c6eea189ee16f25a713c668163e
6
+ metadata.gz: 9b85df8a9f919dadc29dfaff264555cfecefd1b5477e0161ccf517f1370c1a7a4e6f7b663cdc7b8982b70f937c85bf522f94b887ce30d5ec86710385814f2f37
7
+ data.tar.gz: 0b2081360b0f23ca898dbef3e0a0d3327f9355ff0e2e5de3c45fb45d30ff0da7fc30d6d2885abbe74210cf87b619578b0dccc1606c4f218bad772882df9cd197
@@ -2,6 +2,7 @@ sudo: false
2
2
  language: ruby
3
3
  cache: bundler
4
4
  rvm:
5
+ - 2.5.1
5
6
  - 2.5.3
6
7
  before_install: gem install bundler -v 1.17.1
7
8
  env:
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- peatio (0.4.4)
4
+ peatio (0.4.5)
5
5
  amqp
6
6
  bunny
7
7
  clamp
@@ -19,8 +19,8 @@ GEM
19
19
  eventmachine
20
20
  ast (2.4.0)
21
21
  bump (0.6.1)
22
- bunny (2.12.0)
23
- amq-protocol (~> 2.3, >= 2.3.0)
22
+ bunny (2.11.0)
23
+ amq-protocol (~> 2.3.0)
24
24
  bunny-mock (1.7.0)
25
25
  bunny (>= 1.7)
26
26
  clamp (1.3.0)
@@ -52,7 +52,7 @@ GEM
52
52
  rspec-mocks (~> 3.8.0)
53
53
  rspec-core (3.8.0)
54
54
  rspec-support (~> 3.8.0)
55
- rspec-expectations (3.8.2)
55
+ rspec-expectations (3.8.1)
56
56
  diff-lcs (>= 1.2.0, < 2.0)
57
57
  rspec-support (~> 3.8.0)
58
58
  rspec-mocks (3.8.0)
@@ -61,16 +61,16 @@ GEM
61
61
  rspec-support (3.8.0)
62
62
  rspec_junit_formatter (0.4.1)
63
63
  rspec-core (>= 2, < 4, != 2.12.0)
64
- rubocop (0.60.0)
64
+ rubocop (0.58.2)
65
65
  jaro_winkler (~> 1.5.1)
66
66
  parallel (~> 1.10)
67
67
  parser (>= 2.5, != 2.5.1.1)
68
68
  powerpack (~> 0.1)
69
69
  rainbow (>= 2.2.2, < 4.0)
70
70
  ruby-progressbar (~> 1.7)
71
- unicode-display_width (~> 1.4.0)
72
- rubocop-github (0.12.0)
73
- rubocop (~> 0.59)
71
+ unicode-display_width (~> 1.0, >= 1.0.1)
72
+ rubocop-github (0.10.0)
73
+ rubocop (~> 0.51)
74
74
  ruby-progressbar (1.10.0)
75
75
  simplecov (0.16.1)
76
76
  docile (~> 1.1)
@@ -101,4 +101,4 @@ DEPENDENCIES
101
101
  simplecov-json
102
102
 
103
103
  BUNDLED WITH
104
- 1.17.1
104
+ 1.17.3
@@ -121,7 +121,7 @@ module Peatio::Auth
121
121
 
122
122
  payload
123
123
  rescue JWT::DecodeError => e
124
- raise(Peatio::Auth::Error, "Failed to decode and verify JWT")
124
+ raise(Peatio::Auth::Error, "Failed to decode and verify JWT: #{e.message}")
125
125
  end
126
126
  end
127
127
  end
@@ -1,11 +1,14 @@
1
1
  module Peatio::Injectors
2
2
  class PeatioEvents
3
- attr_accessor :market, :seller_uid, :buyer_uid, :logger
3
+ attr_accessor :market, :market_name, :base_unit, :quote_unit, :seller_uid, :buyer_uid, :logger
4
4
 
5
5
  def run!
6
6
  require "time"
7
7
  @logger = Peatio::Logger.logger
8
8
  @market = "eurusd"
9
+ @market_name = "EUR/USD"
10
+ @base_unit = "eur"
11
+ @quote_unit = "usd"
9
12
  @seller_uid = 21
10
13
  @buyer_uid = 42
11
14
  @messages = create_messages
@@ -32,12 +35,12 @@ module Peatio::Injectors
32
35
 
33
36
  def create_messages
34
37
  [
35
- private_trade,
36
- order_created,
37
- order_canceled,
38
- order_completed,
39
- order_updated,
40
- trade_completed,
38
+ public_tickers,
39
+ public_orderbook,
40
+ private_order,
41
+ private_trade_user1,
42
+ private_trade_user2,
43
+ public_trade,
41
44
  ]
42
45
  end
43
46
 
@@ -52,158 +55,122 @@ module Peatio::Injectors
52
55
  alias :completed_at :updated_at
53
56
  alias :canceled_at :updated_at
54
57
 
55
- def private_trade
58
+ def public_orderbook
56
59
  [
57
- "private",
58
- "debug_user",
59
- "trade",
60
+ "public",
61
+ market,
62
+ "update",
60
63
  {
61
- trade: "some-data",
62
- },
64
+ "asks": [
65
+ ["1020.0","0.005"],
66
+ ["1026.0","0.03"]
67
+ ],
68
+ "bids": [
69
+ ["1000.0","0.25"],
70
+ ["999.0","0.005"],
71
+ ["994.0","0.005"],
72
+ ["1.0","11.0"]
73
+ ]
74
+ }
63
75
  ]
64
76
  end
65
77
 
66
- def order_created
78
+ def public_tickers
67
79
  [
68
80
  "public",
69
- market,
70
- "order_created",
81
+ "global",
82
+ "tickers",
71
83
  {
72
- market: "#{market}",
73
- type: "buy",
74
- trader_uid: buyer_uid,
75
- income_unit: "btc",
76
- income_fee_type: "relative",
77
- income_fee_value: "0.0015",
78
- outcome_unit: "usd",
79
- outcome_fee_type: "relative",
80
- outcome_fee_value: "0.0",
81
- initial_income_amount: "14.0",
82
- current_income_amount: "14.0",
83
- initial_outcome_amount: "0.42",
84
- current_outcome_amount: "0.42",
85
- strategy: "limit",
86
- price: "0.03",
87
- state: "open",
88
- trades_count: 0,
89
- created_at: created_at.iso8601,
90
- },
84
+ market => {
85
+ "name": market_name,
86
+ "base_unit": base_unit,
87
+ "quote_unit": quote_unit,
88
+ "low": "1000.0",
89
+ "high": "10000.0",
90
+ "last": "1000.0",
91
+ "open": 1000.0,
92
+ "volume": "0.0",
93
+ "sell": "1020.0",
94
+ "buy": "1000.0",
95
+ "at": Time.now.to_i
96
+ }
97
+ }
91
98
  ]
92
99
  end
93
100
 
94
- def order_canceled
101
+ def private_order
95
102
  [
96
- "public",
97
- market,
98
- "order_canceled",
103
+ "private",
104
+ "IDABC0000001",
105
+ "order",
99
106
  {
100
- market: "#{market}",
101
- type: "sell",
102
- trader_uid: seller_uid,
103
- income_unit: "usd",
104
- income_fee_type: "relative",
105
- income_fee_value: "0.0015",
106
- outcome_unit: "btc",
107
- outcome_fee_type: "relative",
108
- outcome_fee_value: "0.0",
109
- initial_income_amount: "3.0",
110
- current_income_amount: "3.0",
111
- initial_outcome_amount: "100.0",
112
- current_outcome_amount: "100.0",
113
- strategy: "limit",
114
- price: "0.03",
115
- state: "canceled",
116
- trades_count: 0,
117
- created_at: created_at.iso8601,
118
- canceled_at: canceled_at.iso8601,
119
- },
107
+ "id": 22,
108
+ "at": created_at.to_i,
109
+ "market": market,
110
+ "kind":"bid",
111
+ "price":"1026.0",
112
+ "state":"wait",
113
+ "volume":"0.001",
114
+ "origin_volume":"0.001"
115
+ }
120
116
  ]
121
117
  end
122
118
 
123
- def order_completed
119
+ def private_trade_user1
124
120
  [
125
- "public",
126
- market,
127
- "order_completed", {
128
- market: "#{market}",
129
- type: "sell",
130
- trader_uid: seller_uid,
131
- income_unit: "usd",
132
- income_fee_type: "relative",
133
- income_fee_value: "0.0015",
134
- outcome_unit: "btc",
135
- outcome_fee_type: "relative",
136
- outcome_fee_value: "0.0",
137
- initial_income_amount: "3.0",
138
- current_income_amount: "0.0",
139
- previous_income_amount: "3.0",
140
- initial_outcome_amount: "100.0",
141
- current_outcome_amount: "0.0",
142
- previous_outcome_amount: "100.0",
143
- strategy: "limit",
144
- price: "0.03",
145
- state: "completed",
146
- trades_count: 1,
147
- created_at: created_at.iso8601,
148
- completed_at: completed_at.iso8601,
149
- },
121
+ "private",
122
+ "IDABC0000001",
123
+ "trade",
124
+ {
125
+ "id": 7,
126
+ "kind": "ask",
127
+ "at": created_at.to_i,
128
+ "price": "1020.0",
129
+ "volume": "0.001",
130
+ "ask_id": 15,
131
+ "bid_id": 22,
132
+ "market": market
133
+ }
150
134
  ]
151
135
  end
152
136
 
153
- def order_updated
137
+ def private_trade_user2
154
138
  [
155
- "public",
156
- market,
157
- "order_updated", {
158
- market: "#{market}",
159
- type: "sell",
160
- trader_uid: seller_uid,
161
- income_unit: "usd",
162
- income_fee_type: "relative",
163
- income_fee_value: "0.0015",
164
- outcome_unit: "btc",
165
- outcome_fee_type: "relative",
166
- outcome_fee_value: "0.0",
167
- initial_income_amount: "3.0",
168
- current_income_amount: "2.4",
169
- previous_income_amount: "3.0",
170
- initial_outcome_amount: "100.0",
171
- current_outcome_amount: "80.0",
172
- previous_outcome_amount: "100.0",
173
- strategy: "limit",
174
- price: "0.03",
175
- state: "open",
176
- trades_count: 1,
177
- created_at: created_at.iso8601,
178
- updated_at: updated_at.iso8601,
179
- },
139
+ "private",
140
+ "IDABC0000002",
141
+ "trade",
142
+ {
143
+ "id": 7,
144
+ "kind": "bid",
145
+ "at": created_at.to_i,
146
+ "price": "1020.0",
147
+ "volume": "0.001",
148
+ "ask_id": 15,
149
+ "bid_id": 22,
150
+ "market": market
151
+ }
180
152
  ]
181
153
  end
182
154
 
183
- def trade_completed
155
+ def public_trade
184
156
  [
185
157
  "public",
186
158
  market,
187
- "trade_completed", {
188
- market: "#{market}",
189
- price: "0.03",
190
- buyer_uid: buyer_uid,
191
- buyer_income_unit: "btc",
192
- buyer_income_amount: "14.0",
193
- buyer_income_fee: "0.021",
194
- buyer_outcome_unit: "usd",
195
- buyer_outcome_amount: "0.42",
196
- buyer_outcome_fee: "0.0",
197
- seller_uid: seller_uid,
198
- seller_income_unit: "usd",
199
- seller_income_amount: "0.42",
200
- seller_income_fee: "0.00063",
201
- seller_outcome_unit: "btc",
202
- seller_outcome_amount: "14.0",
203
- seller_outcome_fee: "0.0",
204
- completed_at: completed_at.iso8601,
205
- },
159
+ "trades",
160
+ {
161
+ "trades": [
162
+ {
163
+ "tid": 7,
164
+ "type": "buy",
165
+ "date": created_at.to_i,
166
+ "price": "1020.0",
167
+ "amount":
168
+ "0.001"
169
+ }
170
+ ]
171
+ }
206
172
  ]
207
173
  end
174
+
208
175
  end
209
176
  end
@@ -35,7 +35,7 @@ module Peatio::MQ::Events
35
35
  end
36
36
  end
37
37
 
38
- def initialize(socket, streams)
38
+ def initialize(socket, streams = {})
39
39
  @socket = socket
40
40
  @streams = streams
41
41
 
@@ -108,7 +108,7 @@ module Peatio::MQ::Events
108
108
  if type == "private"
109
109
  Client.user(id) do |client|
110
110
  if client.streams.include?(event)
111
- client.send_payload [event, payload_decoded]
111
+ client.send_payload(event => payload_decoded)
112
112
  end
113
113
  end
114
114
 
@@ -119,7 +119,7 @@ module Peatio::MQ::Events
119
119
 
120
120
  Client.all.each do |handler|
121
121
  if handler.streams.include?(id) or handler.streams.include?(stream)
122
- handler.send_payload [stream, payload_decoded]
122
+ handler.send_payload(stream => payload_decoded)
123
123
  end
124
124
  end
125
125
  end
@@ -4,7 +4,6 @@ module Peatio::Ranger
4
4
  @authenticator = authenticator
5
5
  @socket = socket
6
6
  @logger = logger
7
- @streams = []
8
7
  end
9
8
 
10
9
  def send(method, data)
@@ -13,50 +12,76 @@ module Peatio::Ranger
13
12
  @socket.send payload
14
13
  end
15
14
 
16
- def handle(msg)
15
+ def authenticate(jwt)
16
+ payload = {}
17
17
  authorized = false
18
18
  begin
19
- data = JSON.parse(msg)
20
-
21
- token = data["jwt"]
22
-
23
- payload = @authenticator.authenticate!(token)
24
-
19
+ payload = @authenticator.authenticate!(jwt)
25
20
  authorized = true
26
- rescue JSON::ParserError
27
- rescue => error
21
+ rescue Peatio::Auth::Error => error
28
22
  @logger.error error.message
29
23
  end
24
+ return [authorized, payload]
25
+ end
30
26
 
31
- if !authorized
32
- send :error, message: "Authentication failed."
33
- return
34
- end
35
-
36
- @client.user = payload[:uid]
37
- @client.authorized = true
27
+ def update_streams
28
+ @socket.instance_variable_set(:@connection_handler, @client)
29
+ end
38
30
 
39
- @logger.info "ranger: user #{@client.user} authenticated #{@streams}"
31
+ def subscribe(streams)
32
+ raise "Streams must be an array of strings" unless streams.is_a?(Array)
33
+ streams.each do |stream|
34
+ next if stream.nil?
35
+ @client.streams[stream] = true
36
+ end
37
+ send :success, message: "subscribed", streams: @client.streams.keys
38
+ end
40
39
 
41
- send :success, message: "Authenticated."
40
+ def unsubscribe(streams)
41
+ raise "Streams must be an array of strings" unless streams.is_a?(Array)
42
+ streams.each do |stream|
43
+ next if stream.nil?
44
+ @client.streams.delete(stream)
45
+ end
46
+ send :success, message: "unsubscribed", streams: @client.streams.keys
42
47
  end
43
48
 
44
- def handshake(handshake)
45
- query = URI::decode_www_form(handshake.query_string)
49
+ def handle(msg)
50
+ begin
51
+ data = JSON.parse(msg)
46
52
 
47
- @streams = query.map do |item|
48
- if item.first == "stream"
49
- item.last
53
+ case data["event"]
54
+ when "subscribe"
55
+ subscribe data["streams"]
56
+ when "unsubscribe"
57
+ unsubscribe data["streams"]
50
58
  end
59
+
60
+ rescue JSON::ParserError => error
61
+ @logger.debug { "#{error}, msg: `#{msg}`" }
51
62
  end
63
+ end
52
64
 
53
- @logger.info "ranger: WebSocket connection openned, streams: #{@streams}"
65
+ def handshake(hs)
66
+ @client = Peatio::MQ::Events::Client.new(@socket)
54
67
 
55
- @client = Peatio::MQ::Events::Client.new(
56
- @socket, @streams,
57
- )
68
+ query = URI::decode_www_form(hs.query_string)
69
+ subscribe(query.map {|item| item.last if item.first == "stream"})
70
+ @logger.info "ranger: WebSocket connection openned"
58
71
 
59
- @socket.instance_variable_set(:@connection_handler, @client)
72
+ if hs.headers_downcased.key?("authorization")
73
+ authorized, payload = authenticate(hs.headers["authorization"])
74
+
75
+ if !authorized
76
+ @logger.info "ranger: #{@client.user} authentication failed"
77
+ raise EM::WebSocket::HandshakeError, "Authorization failed"
78
+ else
79
+ @logger.info [authorized, payload].inspect
80
+ @client.user = payload[:uid]
81
+ @client.authorized = true
82
+ @logger.info "ranger: user #{@client.user} authenticated #{@client.streams}"
83
+ end
84
+ end
60
85
  end
61
86
  end
62
87
 
@@ -79,20 +104,24 @@ module Peatio::Ranger
79
104
  EM::WebSocket.start(
80
105
  host: host,
81
106
  port: port,
82
- secure: false,
107
+ secure: false
83
108
  ) do |socket|
84
109
  connection = Connection.new(authenticator, socket, logger)
85
110
 
86
- socket.onopen do |handshake|
87
- connection.handshake(handshake)
111
+ socket.onopen do |hs|
112
+ connection.handshake(hs)
88
113
  end
89
114
 
90
115
  socket.onmessage do |msg|
91
116
  connection.handle(msg)
92
117
  end
93
118
 
119
+ socket.onping do |value|
120
+ logger.info "Received ping: #{value}"
121
+ end
122
+
94
123
  socket.onclose do
95
- logger.info "ranger: WebSocket connection closed"
124
+ logger.info "ranger: websocket connection closed"
96
125
  end
97
126
 
98
127
  socket.onerror do |e|
@@ -1,3 +1,3 @@
1
1
  module Peatio
2
- VERSION = "0.4.4"
2
+ VERSION = "0.4.5"
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: peatio
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.4
4
+ version: 0.4.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Louis B.
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2018-10-27 00:00:00.000000000 Z
12
+ date: 2019-01-25 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: clamp