class Binance::WebSocketBase

Base Websocket

def add_callbacks(cbs)

def add_callbacks(cbs)
  # check allowed callbacks
  raise ArgumentError, 'Only :onopen, :onmessage, :onclose, :onping, :onpong, :onerror allowed' if %i[onopen onmessage onping onpong onerror onclose].union(cbs.keys).size > 6
  onmessage(cbs)
  onerror(cbs)
  onping(cbs)
  onpong(cbs)
  onclose(cbs)
end

def create_connection(url, cbs)

def create_connection(url, cbs)
  @ws_connection = ::WebSocket::EventMachine::Client.connect(uri: url)
  add_callbacks(cbs)
end

def event_callback(cbs, event, data = nil)

def event_callback(cbs, event, data = nil)
  cbs[event].call(data) if cbs.key?(event) && cbs[event].respond_to?(:call)
end

def initialize(options = {})

def initialize(options = {})
  @logger = options[:logger] || Logger.new($stdout)
  @base_url = options[:base_url]
  @ws_connection = nil
end

def onclose(cbs)

def onclose(cbs)
  @ws_connection.onclose do
    @logger.info('Closed from server')
    event_callback(cbs, :onclose)
  end
end

def onerror(cbs)

def onerror(cbs)
  @ws_connection.onerror do |error|
    @logger.error("Error occured: #{error}")
    event_callback(cbs, :onerror, error)
  end
end

def onmessage(cbs)

def onmessage(cbs)
  @ws_connection.onmessage do |msg, type|
    cbs[:onmessage].call(msg, type) if cbs.key?(:onmessage) && cbs[:onmessage].respond_to?(:call)
  end
end

def onopen(cbs)

def onopen(cbs)
  @ws_connection.onopen do
    @logger.debug('connected to server')
    event_callback(cbs, :onopen)
  end
end

def onping(cbs)

def onping(cbs)
  @ws_connection.onping do
    @logger.info('Received ping from server')
    @ws_connection.pong
    @logger.info('Responded pong to server')
    event_callback(cbs, :onping)
  end
end

def onpong(cbs)

def onpong(cbs)
  @ws_connection.onpong do
    @logger.info('Received pong from server')
    event_callback(cbs, :onpong)
  end
end

def subscribe_to(url, cbs)

def subscribe_to(url, cbs)
  create_connection(url, cbs)
end