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