bitfinex-rb 0.0.3 → 0.0.4

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: 30f018e3da530a1424941a50719b8aa64b719a7a
4
- data.tar.gz: 0cebfb76c4489d260f9177345dc6bada2fd972e7
3
+ metadata.gz: 83b15f4ee0948a7bfa5d093d22db01a31d5b950f
4
+ data.tar.gz: c5ba58927b2ce63f008e2d7ff3b2be183b30777b
5
5
  SHA512:
6
- metadata.gz: 9bb9f05e543f01f8b69e1269af331d020e6a5408545c72926b0dc1550a350ddd06736315f8ca1aa7f267e48dfa80ab1d29a4d53fbe51dab3d46a307905586c33
7
- data.tar.gz: db36a7a68b56eb1c8af63f85d1165a03013daa729f75ac99bf7393f5eb478440c32f056009d79a13dabdab3188257a4414232ac394e30b7e00ca2d385b0b6df7
6
+ metadata.gz: 9814f5265c77c6cdd01392324ef796cea7ab1b2ab33041d9c8e9ba8f79070a8b1a28e18ac7b1d1611dc7844cf544d6d4fffe7ce5ba2fe18e9b97cb74cd43a777
7
+ data.tar.gz: e3224dc050ea43d595f4f25aa7b7c803bc2101c749355e3311eb4726d6ace17c643d50dbf95dc38716c63d6b6e0338772c4b3274cdfb9c50006c8f6ded03546a
@@ -7,6 +7,7 @@ require 'faraday_middleware'
7
7
  require 'bitfinex/configurable'
8
8
  require 'bitfinex/errors'
9
9
  require 'bitfinex/connection'
10
+ require 'bitfinex/websocket_connection'
10
11
  require 'bitfinex/authenticated_rest'
11
12
  require 'bitfinex/ticker'
12
13
  require 'bitfinex/trades'
@@ -1,7 +1,7 @@
1
1
  module Bitfinex
2
2
 
3
- module AccountInfoClient
4
-
3
+ module AccountInfoClient
4
+
5
5
  # Get account information
6
6
  #
7
7
  # @return [Hash] your account information
@@ -11,6 +11,19 @@ module Bitfinex
11
11
  resp = authenticated_post("account_infos")
12
12
  resp.body
13
13
  end
14
+
15
+
16
+ # Call block passing all account related specific messages sent via websocket
17
+ #
18
+ # @param block [Block] The code to be executed when new message is received
19
+ # @example:
20
+ # client.listen_account do |message|
21
+ # puts message.inspect
22
+ # end
23
+ def listen_account(&block)
24
+ raise BlockMissingError unless block_given?
25
+ ws_auth(&block)
26
+ end
14
27
  end
15
28
 
16
29
  end
@@ -1,6 +1,7 @@
1
1
  module Bitfinex
2
2
  class Client
3
3
  include Bitfinex::RestConnection
4
+ include Bitfinex::WebsocketConnection
4
5
  include Bitfinex::AuthenticatedConnection
5
6
  include Bitfinex::TickerClient
6
7
  include Bitfinex::TradesClient
@@ -3,7 +3,7 @@ module Bitfinex
3
3
  def self.included(base)
4
4
  base.extend(ClassMethods)
5
5
  end
6
-
6
+
7
7
  def config
8
8
  self.class.config
9
9
  end
@@ -20,10 +20,12 @@ module Bitfinex
20
20
  end
21
21
 
22
22
  class Configuration
23
- attr_accessor :api_endpoint, :debug, :debug_connection, :secret, :api_key
23
+ attr_accessor :api_endpoint, :debug, :debug_connection, :secret, :api_key, :websocket_api_endpoint
24
24
  def initialize
25
25
  self.api_endpoint = "https://api.bitfinex.com/v1/"
26
+ self.websocket_api_endpoint = "wss://api2.bitfinex.com:3000/ws"
26
27
  self.debug = false
28
+
27
29
  self.debug_connection = false
28
30
  end
29
31
  end
@@ -2,7 +2,7 @@ require 'logger'
2
2
  module Bitfinex
3
3
  # Network Layer for API Rest client
4
4
  module RestConnection
5
- private
5
+ private
6
6
  # Make an HTTP GET request
7
7
  def get(url, options={})
8
8
  rest_connection.get do |req|
@@ -1,7 +1,7 @@
1
1
  module Bitfinex
2
2
  module DepositClient
3
3
  # Return your deposit address to make a new deposit.
4
- #
4
+ #
5
5
  # @param method [string] Method of deposit (methods accepted: “bitcoin”, “litecoin”, “darkcoin”, “mastercoin” (tethers)).
6
6
  # @param wallet_name [string] Wallet to deposit in (accepted: “trading”, “exchange”, “deposit”). Your wallet needs to already exist
7
7
  # @params renew [integer] (optional) Default is 0. If set to 1, will return a new unused deposit address
@@ -11,8 +11,8 @@ module Bitfinex
11
11
  # client.deposit("bitcoin", "exchange")
12
12
  def deposit method, wallet_name, renew=0
13
13
  params = {
14
- method: method,
15
- wallet_name: wallet_name,
14
+ method: method,
15
+ wallet_name: wallet_name,
16
16
  renew: renew
17
17
  }
18
18
 
@@ -2,4 +2,5 @@ module Bitfinex
2
2
  class ClientError < Exception; end
3
3
  class ParamsError < ClientError; end
4
4
  class InvalidAuthKeyError < ClientError; end
5
+ class BlockMissingError < ParamsError; end
5
6
  end
@@ -6,9 +6,9 @@ module Bitfinex
6
6
  # @param currency [string] (optional) Speficy the currency, default "USD"
7
7
  # @param params :limit_bids [int] (optional) Limit the number of funding bids returned. May be 0 in which case the array of bids is empty.
8
8
  # @param params :limit_asks [int] (optional) Limit the number of funding offers returned. May be 0 in which case the array of asks is empty.
9
- # @return [Hash] of :bids and :asks arrays
9
+ # @return [Hash] of :bids and :asks arrays
10
10
  # @example:
11
- # client.funding_book
11
+ # client.funding_book
12
12
  def funding_book(currency="usd", params = {})
13
13
  check_params(params, %i{limit_bids limit_asks})
14
14
  get("lendbook/#{currency}", params).body
@@ -2,7 +2,7 @@ module Bitfinex
2
2
  module HistoricalDataClient
3
3
 
4
4
  # View all of your balance ledger entries.
5
- #
5
+ #
6
6
  # @param currency [string] (optional) Specify the currency, default "USD"
7
7
  # @param params :since [time] (optional) Return only the history after this timestamp.
8
8
  # @param params :until [time] (optional) Return only the history before this timestamp.
@@ -12,13 +12,13 @@ module Bitfinex
12
12
  # @example:
13
13
  # client.history
14
14
  def history(currency="usd", params = {})
15
- check_params(params, %i{since until limit wallet})
15
+ check_params(params, %i{since until limit wallet})
16
16
  params.merge!({currency: currency})
17
- authenticated_post("history", params).body
17
+ authenticated_post("history", params: params).body
18
18
  end
19
19
 
20
20
  # View your past deposits/withdrawals.
21
- #
21
+ #
22
22
  # @param currency [string] (optional) Specify the currency, default "USD"
23
23
  # @param params :method (optional) The method of the deposit/withdrawal (can be “bitcoin”, “litecoin”, “darkcoin”, “wire”)
24
24
  # @param params :since (optional) Return only the history after this timestamp
@@ -30,11 +30,11 @@ module Bitfinex
30
30
  def movements(currency="usd", params = {})
31
31
  check_params(params, %i{method since until limit})
32
32
  params.merge!({currency: currency})
33
- authenticated_post("history/movements", params).body
33
+ authenticated_post("history/movements", params: params).body
34
34
  end
35
35
 
36
36
  # View your past trades.
37
- #
37
+ #
38
38
  # @param symbol The pair traded (BTCUSD, LTCUSD, LTCBTC)
39
39
  # @param params :until [time] (optional) Return only the history before this timestamp.
40
40
  # @param params :timestamp [time] (optional) Trades made before this timestamp won’t be returned
@@ -47,7 +47,7 @@ module Bitfinex
47
47
  def mytrades(symbol, params = {})
48
48
  check_params(params, %i{until limit_trades reverse timestamp})
49
49
  params.merge!({symbol: symbol})
50
- authenticated_post("mytrades", params).body
50
+ authenticated_post("mytrades", params: params).body
51
51
  end
52
52
  end
53
53
  end
@@ -1,9 +1,9 @@
1
1
  module Bitfinex
2
- module LendsClient
2
+ module LendsClient
3
3
 
4
4
  # Get a list of the most recent funding data for the given currency: total amount provided and Flash Return Rate (in % by 365 days) over time.
5
5
  #
6
- # @param currency [string] (optional) Specify the currency, default "USD"
6
+ # @param currency [string] (optional) Specify the currency, default "USD"
7
7
  # @param params :timestamp [time] (optional) Only show data at or after this timestamp
8
8
  # @param params :limit_lends [int] (optional) Limit the amount of funding data returned. Must be > 1, default 50
9
9
  # @return [Array]
@@ -12,15 +12,14 @@ module Bitfinex
12
12
  # @example:
13
13
  # client.new_offer("btc", 10.0, 20, 365, "lend")
14
14
  def new_offer(currency, amount, rate, period, direction)
15
- params = {
15
+ params = {
16
16
  currency: currency,
17
- amount: amount,
18
- rate: rate,
19
- period: period,
17
+ amount: amount.to_s,
18
+ rate: rate.to_s,
19
+ period: period.to_i,
20
20
  direction: direction
21
21
  }
22
-
23
- authenticated_post("offer/new", params).body
22
+ authenticated_post("offer/new", params: params).body
24
23
  end
25
24
 
26
25
  # Cancel an offer
@@ -31,7 +30,7 @@ module Bitfinex
31
30
  # client.cancel_offer(1000)
32
31
  def cancel_offer(offer_id)
33
32
  authenticated_post("offer/cancel", {offer_id: offer_id}).body
34
- end
33
+ end
35
34
 
36
35
  # Get the status of an offer. Is it active? Was it cancelled? To what extent has it been executed? etc.
37
36
  #
@@ -44,7 +43,7 @@ module Bitfinex
44
43
  end
45
44
 
46
45
  # View your funds currently taken (active credits)
47
- #
46
+ #
48
47
  # @return [Array]
49
48
  # @example:
50
49
  # client.credits
@@ -71,7 +70,7 @@ module Bitfinex
71
70
  end
72
71
 
73
72
  # View your funding currently borrowed and not used (available for a new margin position).
74
- #
73
+ #
75
74
  # @return [Array] An array of your active unused margin funds
76
75
  # @example:
77
76
  # client.unused_taken_funds
@@ -80,7 +79,7 @@ module Bitfinex
80
79
  end
81
80
 
82
81
  # View the total of your active funding used in your position(s).
83
- #
82
+ #
84
83
  # @return [Array] An array of your active funding
85
84
  # @example:
86
85
  # client.total_taken_funds
@@ -90,7 +89,7 @@ module Bitfinex
90
89
 
91
90
  # Allow you to close an unused or used taken fund
92
91
  #
93
- # @param swap_id [int] The ID given by `#taken_funds` or `#unused_taken_funds
92
+ # @param swap_id [int] The ID given by `#taken_funds` or `#unused_taken_funds
94
93
  # @return [Hash]
95
94
  # @example:
96
95
  # client.close_funding(1000)
@@ -14,5 +14,22 @@ module Bitfinex
14
14
  check_params(params, %i{limit_bids limit_asks group})
15
15
  get("book/#{symbol}",params).body
16
16
  end
17
+
18
+
19
+ # Get the order book changes using websocket
20
+ #
21
+ # @param pair [string]
22
+ # @param prec [string] Level of price aggregation (P0, P1, P2, P3). The default is P0.
23
+ # @param freq [string] Frequency of updates (F0, F1, F2, F3). F0=realtime / F1=2sec / F2=5sec / F3=10sec
24
+ # @param len [int] Number of price points (“25”, “100”) [default=“25”]
25
+ # @param block [Block] The code to be executed when a new order is submitted
26
+ # @example:
27
+ # client.listen_book do |order|
28
+ # puts order.inspect
29
+ # end
30
+ def listen_book(pair="BTCUSD", prec='P0', freq='F0',len=25, &block)
31
+ raise BlockMissingError unless block_given?
32
+ register_channel pair:pair, channel: 'book', prec: prec, freq: freq, len: len, &block
33
+ end
17
34
  end
18
35
  end
@@ -11,27 +11,28 @@ module Bitfinex
11
11
  # @param params :is_hidden [bool] (optional) true if the order should be hidden. Default is false
12
12
  # @param params :is_postonly [bool] (optional) true if the order should be post only. Default is false. Only relevant for limit orders
13
13
  # @param params :ocoorder [bool] Set an additional STOP OCO order that will be linked with the current order
14
- # @param params :buy_price_oco [decimal] If ocoorder is true, this field represent the price of the OCO stop order to place
14
+ # @param params :buy_price_oco [decimal] If ocoorder is true, this field represent the price of the OCO stop order to place
15
15
  # @return [Hash]
16
16
  # @example:
17
- # client.new_order("usdbtc", 100, "market", "sell", 0)
18
- def new_order(symbol, amount, type, side, price = nil, params = {})
17
+ # client.new_order("usdbtc", 100, "market", "sell", 0)
18
+ def new_order(symbol, amount, type, side, price = nil, params = {})
19
19
  check_params(params, %i{is_hidden is_postonly ocoorder buy_price_oco})
20
20
 
21
21
  params.merge!({
22
- symbol: symbol,
23
- amount: amount,
22
+ symbol: symbol,
23
+ amount: amount.to_s,
24
24
  type: type,
25
25
  side: side,
26
26
  exchange: 'bitfinex',
27
- price: price})
27
+ price: price.to_s
28
+ })
28
29
 
29
30
  authenticated_post("order/new", params: params).body
30
31
  end
31
32
 
32
33
  # Submit several new orders at once
33
34
  #
34
- # @param orders [Array] Array of Hash with the following elements
35
+ # @param orders [Array] Array of Hash with the following elements
35
36
  # @param orders :symbol [string] The name of the symbol
36
37
  # @param orders :amount [decimal] Order size: how much to buy or sell
37
38
  # @param orders :price [decimal] Price to buy or sell at. May omit if a market order
@@ -47,7 +48,7 @@ module Bitfinex
47
48
 
48
49
  # Cancel an order
49
50
  #
50
- # @param ids [Array] or [integer] or nil
51
+ # @param ids [Array] or [integer] or nil
51
52
  # if it's Array it's supposed to specify a list of IDS
52
53
  # if it's an integer it's supposed to be a single ID
53
54
  # if it's not specified it deletes all the orders placed
@@ -56,7 +57,7 @@ module Bitfinex
56
57
  # client.cancel_orders([100,231,400])
57
58
  def cancel_orders(ids=nil)
58
59
  case ids
59
- when Array
60
+ when Array
60
61
  authenticated_post("order/cancel/multi", {order_ids: ids}).body
61
62
  when Numeric
62
63
  authenticated_post("order/cancel", {order_id: ids}).body
@@ -68,27 +69,27 @@ module Bitfinex
68
69
  end
69
70
 
70
71
  # Replace an orders with a new one
71
- #
72
+ #
72
73
  # @param id [int] the ID of the order to replace
73
74
  # @param symbol [string] the name of the symbol
74
75
  # @param amount [decimal] Order size: how much to buy or sell
75
- # @param type [string] Either “market” / “limit” / “stop” / “trailing-stop” / “fill-or-kill” / “exchange market” / “exchange limit” / “exchange stop” / “exchange trailing-stop” / “exchange fill-or-kill”. (type starting by “exchange ” are exchange orders, others are margin trading orders)
76
+ # @param type [string] Either “market” / “limit” / “stop” / “trailing-stop” / “fill-or-kill” / “exchange market” / “exchange limit” / “exchange stop” / “exchange trailing-stop” / “exchange fill-or-kill”. (type starting by “exchange ” are exchange orders, others are margin trading orders)
76
77
  # @param side [string] Either “buy” or “sell”
77
78
  # @param price [decimal] Price to buy or sell at. May omit if a market order
78
79
  # @param is_hidden [bool] (optional) true if the order should be hidden. Default is false
79
80
  # @return [Hash] the order
80
- # @example:
81
+ # @example:
81
82
  # client.replace_order(100,"usdbtc", 10, "market", "buy", 0)
82
83
  def replace_order(id, symbol, amount, type, side, price, is_hidden=false)
83
84
  params = {
84
- order_id: id,
85
- symbol: symbol,
86
- amount: amount,
85
+ order_id: id.to_i,
86
+ symbol: symbol,
87
+ amount: amount.to_s,
87
88
  type: type,
88
89
  side: side,
89
90
  exchange: 'bitfinex',
90
91
  is_hidden: is_hidden,
91
- price: price
92
+ price: price.to_s
92
93
  }
93
94
  authenticated_post("order/cancel/replace", params).body
94
95
  end
@@ -112,6 +113,6 @@ module Bitfinex
112
113
  def orders
113
114
  authenticated_post("orders").body
114
115
  end
115
-
116
+
116
117
  end
117
118
  end
@@ -10,5 +10,18 @@ module Bitfinex
10
10
  def ticker(symbol = "btcusd")
11
11
  get("pubticker/#{symbol}").body
12
12
  end
13
+
14
+ # Call the specified block passing tickers, it uses websocket
15
+ #
16
+ # @param pair [string]
17
+ # @param block [Block] The code to be executed when a new ticker is sent by the server
18
+ # @example:
19
+ # client.listen_ticker do |tick|
20
+ # puts tick.inspect
21
+ # end
22
+ def listen_ticker(pair="BTCUSD", &block)
23
+ raise BlockMissingError unless block_given?
24
+ register_channel pair: pair, channel: "ticker", &block
25
+ end
13
26
  end
14
27
  end
@@ -14,5 +14,18 @@ module Bitfinex
14
14
  get("trades/#{symbol}", params: params).body
15
15
  end
16
16
 
17
+ # Listen to the trades using websocket.
18
+ #
19
+ # @param pair [string]
20
+ # @param block [Block] The code to be executed when a new trade is executed
21
+ # @example:
22
+ # client.listen_trades do |trade|
23
+ # puts trade.inspect
24
+ # end
25
+ def listen_trades(pair="BTCUSD", &block)
26
+ raise BlockMissingError unless block_given?
27
+ register_channel pair:pair, channel: 'trades', &block
28
+ end
29
+
17
30
  end
18
31
  end
@@ -1,3 +1,3 @@
1
1
  module Bitfinex
2
- VERSION = "0.0.3"
2
+ VERSION = "0.0.4"
3
3
  end
@@ -0,0 +1,190 @@
1
+ require 'eventmachine'
2
+ require 'faye/websocket'
3
+ require 'json'
4
+
5
+ module Bitfinex
6
+ module WebsocketConnection
7
+
8
+ def listen!
9
+ subscribe_to_channels
10
+ listen
11
+ ws_client.run!
12
+ end
13
+
14
+ def ws_send(msg)
15
+ ws_client.send msg
16
+ end
17
+
18
+ def ws_close_all
19
+ ws_client.close!
20
+ @ws_open = false
21
+ ws_reset_channels
22
+ end
23
+
24
+ def ws_auth(&block)
25
+ unless @ws_auth
26
+ payload = 'AUTH' + (Time.now.to_f * 10_000).to_i.to_s
27
+ signature = sign(payload)
28
+ add_callback(:auth, &block)
29
+ save_channel_id(:auth, 0)
30
+ ws_safe_send({
31
+ apiKey: config.api_key,
32
+ authSig: sign(payload),
33
+ authPayload: payload,
34
+ event: 'auth'
35
+ })
36
+ @ws_auth = true
37
+ end
38
+ end
39
+
40
+ def ws_unauth
41
+ ws_safe_send({event: 'unauth'})
42
+ end
43
+
44
+ private
45
+
46
+ def ws_reset_channels
47
+ @chan_ids = []
48
+ @ws_registration_messages = []
49
+ @callbacks = {}
50
+ end
51
+
52
+ def ws_client
53
+ @ws_client ||= WSClient.new(url:config.websocket_api_endpoint)
54
+ end
55
+
56
+ def chan_ids
57
+ @chan_ids ||= []
58
+ end
59
+
60
+ def ws_open
61
+ @ws_open ||= false
62
+ end
63
+
64
+ def ws_registration_messages
65
+ @ws_registration_messages ||= []
66
+ end
67
+
68
+ def callbacks
69
+ @callbacks ||= {}
70
+ end
71
+
72
+ def add_callback(channel, &block)
73
+ callbacks[channel] = { block: block, chan_id: nil }
74
+ end
75
+
76
+ def register_authenticated_channel(msg, &block)
77
+ add_callback(fingerprint(msg),&block)
78
+ ws_safe_send(msg.merge(event:'subscribe'))
79
+ end
80
+
81
+ def ws_safe_send(msg)
82
+ if ws_open
83
+ ws_client.send msg
84
+ else
85
+ ws_registration_messages.push msg
86
+ end
87
+ end
88
+
89
+ def register_channel(msg, &block)
90
+ add_callback(fingerprint(msg),&block)
91
+ if ws_open
92
+ ws_client.send msg.merge(event: 'subscribe')
93
+ else
94
+ ws_registration_messages.push msg.merge(event: 'subscribe')
95
+ end
96
+ end
97
+
98
+ def fingerprint(msg)
99
+ msg.reject{|k,v| [:event,'chanId','event'].include?(k) }.
100
+ inject({}){|h, (k,v)| h[k.to_sym]=v.to_s; h}
101
+ end
102
+
103
+ def listen
104
+ ws_client.on(:message) do |rmsg|
105
+ msg = JSON.parse(rmsg)
106
+ if msg.kind_of?(Hash) && msg["event"] == "subscribed"
107
+ save_channel_id(fingerprint(msg), msg["chanId"])
108
+ elsif msg.kind_of?(Array)
109
+ exec_callback_for(msg)
110
+ end
111
+ end
112
+ end
113
+
114
+ def save_channel_id(chan,id)
115
+ callbacks[chan][:chan_id] = id
116
+ chan_ids[id.to_i] = chan
117
+ end
118
+
119
+ def exec_callback_for(msg)
120
+ return if msg[1] == 'hb' #ignore heartbeat
121
+ id = msg[0]
122
+ callbacks[chan_ids[id.to_i]][:block].call(msg)
123
+ end
124
+
125
+ def subscribe_to_channels
126
+ ws_client.on(:open) do
127
+ @ws_open = true
128
+ ws_registration_messages.each do |msg|
129
+ ws_client.send(msg)
130
+ end
131
+ end
132
+ end
133
+
134
+ class WSClient
135
+ def initialize(options = {})
136
+ # set some defaults
137
+ @url = options[:url] || 'ws://dev2.bitfinex.com:3001/ws'
138
+ @reconnect = options[:reconenct] || false
139
+ end
140
+
141
+ def on(msg, &blk)
142
+ ivar = "@#{msg}_cb"
143
+ instance_variable_set(ivar.to_sym, blk)
144
+ end
145
+
146
+ def run!
147
+ if EventMachine.reactor_running?
148
+ connect!
149
+ else
150
+ EM.run { connect! }
151
+ end
152
+ end
153
+
154
+ def stop!
155
+ @ws.close
156
+ end
157
+
158
+ def connect!
159
+ @ws = Faye::WebSocket::Client.new(@url)
160
+ @ws.onopen = method(:ws_opened)
161
+ @ws.onmessage = method(:ws_receive)
162
+ @ws.onclose = method(:ws_closed)
163
+ @ws.onerror = method(:ws_error)
164
+ end
165
+
166
+ def send(msg)
167
+ msg = msg.is_a?(Hash) ? msg.to_json : msg
168
+ @ws.send(msg)
169
+ end
170
+
171
+ private
172
+
173
+ def ws_opened(event)
174
+ @open_cb.call(event) if @open_cb
175
+ end
176
+
177
+ def ws_receive(event)
178
+ @message_cb.call(event.data) if @message_cb
179
+ end
180
+
181
+ def ws_closed(_event)
182
+ EM.stop
183
+ end
184
+
185
+ def ws_error(event)
186
+ fail event
187
+ end
188
+ end
189
+ end
190
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: bitfinex-rb
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.3
4
+ version: 0.0.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Bitfinex
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-03-05 00:00:00.000000000 Z
11
+ date: 2016-03-16 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: faraday
@@ -30,6 +30,26 @@ dependencies:
30
30
  - - ">="
31
31
  - !ruby/object:Gem::Version
32
32
  version: 0.9.2
33
+ - !ruby/object:Gem::Dependency
34
+ name: eventmachine
35
+ requirement: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - "~>"
38
+ - !ruby/object:Gem::Version
39
+ version: '1.0'
40
+ - - ">="
41
+ - !ruby/object:Gem::Version
42
+ version: 1.0.9.1
43
+ type: :runtime
44
+ prerelease: false
45
+ version_requirements: !ruby/object:Gem::Requirement
46
+ requirements:
47
+ - - "~>"
48
+ - !ruby/object:Gem::Version
49
+ version: '1.0'
50
+ - - ">="
51
+ - !ruby/object:Gem::Version
52
+ version: 1.0.9.1
33
53
  - !ruby/object:Gem::Dependency
34
54
  name: faraday-detailed_logger
35
55
  requirement: !ruby/object:Gem::Requirement
@@ -50,6 +70,20 @@ dependencies:
50
70
  - - ">="
51
71
  - !ruby/object:Gem::Version
52
72
  version: 1.0.0
73
+ - !ruby/object:Gem::Dependency
74
+ name: faye-websocket
75
+ requirement: !ruby/object:Gem::Requirement
76
+ requirements:
77
+ - - "~>"
78
+ - !ruby/object:Gem::Version
79
+ version: 0.10.3
80
+ type: :runtime
81
+ prerelease: false
82
+ version_requirements: !ruby/object:Gem::Requirement
83
+ requirements:
84
+ - - "~>"
85
+ - !ruby/object:Gem::Version
86
+ version: 0.10.3
53
87
  - !ruby/object:Gem::Dependency
54
88
  name: json
55
89
  requirement: !ruby/object:Gem::Requirement
@@ -138,8 +172,7 @@ files:
138
172
  - lib/bitfinex/trades.rb
139
173
  - lib/bitfinex/version.rb
140
174
  - lib/bitfinex/wallet.rb
141
- - lib/bitfinex/websocket.rb
142
- - lib/bitfinex/websocket/em_client.rb
175
+ - lib/bitfinex/websocket_connection.rb
143
176
  homepage: https://www.bitfinex.com/
144
177
  licenses:
145
178
  - MIT
@@ -1,64 +0,0 @@
1
- require 'eventmachine'
2
- require 'faye/websocket'
3
- require 'json'
4
-
5
- module Bitfinex
6
- module Websocket
7
-
8
- class EMClient
9
- def initialize(options = {})
10
- # set some defaults
11
- @url = options[:url] || 'wss://api2.bitfinex.com:3000/ws'
12
- @reconnect = options[:reconenct] || false
13
- end
14
-
15
- def on(msg, &blk)
16
- ivar = "@#{msg}_cb"
17
- instance_variable_set(ivar.to_sym, blk)
18
- end
19
-
20
- def run!
21
- if EventMachine.reactor_running?
22
- connect!
23
- else
24
- EM.run { connect! }
25
- end
26
- end
27
-
28
- def stop!
29
- @ws.close
30
- end
31
-
32
- def connect!
33
- @ws = Faye::WebSocket::Client.new(@url)
34
- @ws.onopen = method(:ws_opened)
35
- @ws.onmessage = method(:ws_receive)
36
- @ws.onclose = method(:ws_closed)
37
- @ws.onerror = method(:ws_error)
38
- end
39
-
40
- def send(msg)
41
- msg = msg.is_a?(Hash) ? msg.to_json : msg
42
- @ws.send(msg)
43
- end
44
-
45
- private
46
-
47
- def ws_opened(event)
48
- @open_cb.call(event) if @open_cb
49
- end
50
-
51
- def ws_receive(event)
52
- @message_cb.call(event.data) if @message_cb
53
- end
54
-
55
- def ws_closed(_event)
56
- EM.stop
57
- end
58
-
59
- def ws_error(event)
60
- fail event
61
- end
62
- end
63
- end
64
- end
@@ -1,60 +0,0 @@
1
- module Bitfinex
2
- module Websocket
3
-
4
- class EMClient
5
- def initialize(options = {})
6
- # set some defaults
7
- @url = options[:url] || 'wss://api2.bitfinex.com:3000/ws'
8
- @reconnect = options[:reconenct] || false
9
- end
10
-
11
- def on(msg, &blk)
12
- ivar = "@#{msg}_cb"
13
- instance_variable_set(ivar.to_sym, blk)
14
- end
15
-
16
- def run!
17
- if EventMachine.reactor_running?
18
- connect!
19
- else
20
- EM.run { connect! }
21
- end
22
- end
23
-
24
- def stop!
25
- @ws.close
26
- end
27
-
28
- def connect!
29
- @ws = Faye::WebSocket::Client.new(@url)
30
- @ws.onopen = method(:ws_opened)
31
- @ws.onmessage = method(:ws_receive)
32
- @ws.onclose = method(:ws_closed)
33
- @ws.onerror = method(:ws_error)
34
- end
35
-
36
- def send(msg)
37
- msg = msg.is_a?(Hash) ? msg.to_json : msg
38
- @ws.send(msg)
39
- end
40
-
41
- private
42
-
43
- def ws_opened(event)
44
- @open_cb.call(event) if @open_cb
45
- end
46
-
47
- def ws_receive(event)
48
- @message_cb.call(event.data) if @message_cb
49
- end
50
-
51
- def ws_closed(_event)
52
- EM.stop
53
- end
54
-
55
- def ws_error(event)
56
- fail event
57
- end
58
- end
59
- end
60
- end