class Bitstamper::Websocket::Client
Attributes
application_key[RW]
callbacks[RW]
channels[RW]
enable_logging[RW]
socket[RW]
subscriptions[RW]
Public Class Methods
new(application_key: ::Bitstamper.configuration.pusher_app_key, enable_logging: false)
click to toggle source
# File lib/bitstamper/websocket/client.rb, line 7 def initialize(application_key: ::Bitstamper.configuration.pusher_app_key, enable_logging: false) self.socket = nil self.application_key = application_key self.enable_logging = enable_logging self.channels = { live_trades: [], order_book: [], diff_order_book: [], live_orders: [] } self.subscriptions = [] self.callbacks = { live_trades: -> (channel, event, data) { received(channel, event, data) }, order_book: -> (channel, event, data) { received(channel, event, data) }, diff_order_book: -> (channel, event, data) { received(channel, event, data) }, live_orders: { order_created: -> (channel, event, data) { received(channel, event, data) }, order_changed: -> (channel, event, data) { received(channel, event, data) }, order_deleted: -> (channel, event, data) { received(channel, event, data) } } } disable_pusher_logging if !self.enable_logging generate_channels end
Public Instance Methods
disable_pusher_logging()
click to toggle source
# File lib/bitstamper/websocket/client.rb, line 38 def disable_pusher_logging PusherClient.logger = Logger.new(nil) end
generate_channels()
click to toggle source
# File lib/bitstamper/websocket/client.rb, line 42 def generate_channels ::Bitstamper.configuration.products.each do |product| self.channels[:live_trades] << {name: "live_trades_#{product}", product: product, events: ["trade"]} self.channels[:order_book] << {name: "order_book_#{product}", product: product, events: ["data"]} self.channels[:diff_order_book] << {name: "diff_order_book_#{product}", product: product, events: ["data"]} self.channels[:live_orders] << {name: "live_orders_#{product}", product: product, events: ["order_created", "order_changed", "order_deleted"]} end end
loop!()
click to toggle source
# File lib/bitstamper/websocket/client.rb, line 78 def loop! loop do sleep(1) end end
received(channel, event, data)
click to toggle source
Implement your own callback to customize how data is processed
# File lib/bitstamper/websocket/client.rb, line 85 def received(channel, event, data) parsed = case channel[:name] when /^live_trades/i ::Bitstamper::Models::LiveTrade.new(data.symbolize_keys.merge(product: channel[:product])) when /^order_book/i ::Bitstamper::Models::OrderBook.new(data) when /^diff_order_book/i ::Bitstamper::Models::OrderBook.new(data) when /^live_orders/i ::Bitstamper::Models::Order.new(data.merge(event: event)) end pp parsed end
start!(async: true)
click to toggle source
# File lib/bitstamper/websocket/client.rb, line 51 def start!(async: true) self.socket = PusherClient::Socket.new(self.application_key) self.socket.connect(async) end
stop!()
click to toggle source
# File lib/bitstamper/websocket/client.rb, line 56 def stop! self.socket.disconnect end
subscribe!(type, product: nil)
click to toggle source
# File lib/bitstamper/websocket/client.rb, line 60 def subscribe!(type, product: nil) chnls = self.channels.fetch(type, []) chnls = chnls&.select { |channel| channel[:product].to_s == product.to_s } if !product.to_s.empty? && product.to_s != "all" chnls.each do |channel| if !self.subscriptions.include?(channel[:name]) self.socket.subscribe(channel[:name]) self.subscriptions << channel[:name] channel[:events].each do |event| self.socket[channel[:name]].bind(event) do |data| ws_received(channel, event, data) end end end end end
Private Instance Methods
parse(data)
click to toggle source
# File lib/bitstamper/websocket/client.rb, line 118 def parse(data) return data if data.is_a? Hash return JSON.parse(data) rescue => err return data end
ws_received(channel, event, data)
click to toggle source
# File lib/bitstamper/websocket/client.rb, line 101 def ws_received(channel, event, data) data = parse(data) case channel[:name] when /^live_trades/i self.callbacks[:live_trades].call(channel, event, data) when /^order_book/i self.callbacks[:order_book].call(channel, event, data) when /^diff_order_book/i self.callbacks[:diff_order_book].call(channel, event, data) when /^live_orders/i self.callbacks[:live_orders][:order_created].call(channel, event, data) if event == "order_created" self.callbacks[:live_orders][:order_changed].call(channel, event, data) if event == "order_changed" self.callbacks[:live_orders][:order_deleted].call(channel, event, data) if event == "order_deleted" end end