class NemWebsocketClient::Client

Public Class Methods

new(url,port) click to toggle source
# File lib/nem_websocket_client/client.rb, line 26
def initialize(url,port)
  host = url
  port = port
  path = "/w/messages/"
  server = format("%0#{3}d", SecureRandom.random_number(10**3))
  strings = [('a'..'z'), ('0'..'5')].map { |i| i.to_a }.flatten
  session = (0...8).map { strings[rand(strings.length)] }.join
  @endpoint = host + ":" + port.to_s + path + server.to_s + "/" +session + "/websocket/"
  @is_connected = false
  @sub_id_count = 0
end

Public Instance Methods

close() click to toggle source
# File lib/nem_websocket_client/client.rb, line 119
def close
  @ws.close
end
closed(&fun) click to toggle source
# File lib/nem_websocket_client/client.rb, line 50
def closed(&fun)
  @ws.closed_func = fun
end
connect() click to toggle source
# File lib/nem_websocket_client/client.rb, line 123
  def connect
    @ws = WebSocket::Client::Simple.connect(@endpoint)
    ws_init
    @ws.on :error do |e|
      errors_func.call(e)
    end
    
    @ws.on :close do |e|
      closed_func.call(e)
    end

    @ws.on :open do
      connect_header = {"accept-version":"1.1,1.0","heart-beat":"10000,10000"}
      stomp_connect = '["' + StompParser::Frame.new("CONNECT", connect_header,"").to_str + '"]'
      send(stomp_connect)
    end

    @ws.on :message do |msg|
      if msg.data[0] == "o"

      end

      if msg.data[0] == "h"
        heartbeat_func.call unless heartbeat_func.nil?
      end
      if msg.data[0] == "a"
        data = msg.data
        data.slice!(0,data.index("[")+2)
        data.slice!(data.rindex("]")-1,data.length)
        data.gsub!("\\n","\n")
        data.gsub!("\\r","\r")
        data.gsub!("\\/","\/")
        data.gsub!("\\u0000","\u0000")
        data.gsub!("\\\"","\"")
        parser = StompParser::Parser.new(1024 * 100)
        parser.parse(data) do |frame|
        if frame.command == "CONNECTED" 
          connected_func.call unless connected_func.nil?
          @is_connected = true
          unless subscribe_stomps.empty?
            subscribe_stomps.each do |stomp|
              send(stomp)
            end
          end
          unless send_stomps.empty?
            send_stomps.each do |stomp|
              send(stomp)
            end
          end
        end
        if frame.command == "MESSAGE"
          result = JSON.parse(frame.body)
          destination = frame.headers["destination"]
          address_match = destination.match(/\w{40}/)
          address = address_match.to_s
          destination.slice!(address) unless address.nil?
          case destination
          when @@block_path
            subscribe_block_func.call(result)
          when @@block_height_path
            subscribe_block_height_func.call(result) 
          when @@unconfirmed_transaction_path
            subscribe_unconfirmed_transaction_func[address].call(result,address) 
          when @@recenttransactions_path
            subscribe_recenttransactions_func[address].call(result,address) 
          when @@account_path
            subscribe_account_func[address].call(result,address) 
          when @@owned_namespace_path
            subscribe_owned_namespace_func[address].call(result,address) 
          when @@owned_mosaic_path
            subscribe_owned_mosaic_func[address].call(result,address) 
          when @@owned_mosaic_definition_path
            subscribe_owned_mosaic_definition_func[address].call(result,address) 
          when @@transaction_path
            subscribe_owned_mosaic_func[address].call(result,address) 
          end
        end
      end
    end
  end
end
connected(&fun) click to toggle source
# File lib/nem_websocket_client/client.rb, line 38
def connected(&fun)
  @ws.connected_func = fun
end
errors(&fun) click to toggle source
# File lib/nem_websocket_client/client.rb, line 46
def errors(&fun)
  @ws.errors_func = fun
end
heartbeat(&fun) click to toggle source
# File lib/nem_websocket_client/client.rb, line 42
def heartbeat(&fun)
  @ws.heartbeat_func = fun
end
request_account(address) click to toggle source
# File lib/nem_websocket_client/client.rb, line 99
def request_account(address)
  send_send_stomp(@@send_account_path,address)
end
request_owned_mosaic(address) click to toggle source
# File lib/nem_websocket_client/client.rb, line 107
def request_owned_mosaic(address)
  send_send_stomp(@@send_owned_mosaic_path,address)
end
request_owned_mosaic_definition(address) click to toggle source
# File lib/nem_websocket_client/client.rb, line 111
def request_owned_mosaic_definition(address)
  send_send_stomp(@@send_owned_mosaic_definition_path,address)
end
request_owned_namespace(address) click to toggle source
# File lib/nem_websocket_client/client.rb, line 103
def request_owned_namespace(address)
  send_send_stomp(@@send_owned_namespace_path,address)
end
request_recenttransactions(address) click to toggle source
# File lib/nem_websocket_client/client.rb, line 115
def request_recenttransactions(address)
  send_send_stomp(@@send_recenttransactions_path,address)
end
subscribe_account(address,&fun) click to toggle source
# File lib/nem_websocket_client/client.rb, line 94
def subscribe_account(address,&fun)
  @ws.subscribe_account_func[address] = fun
  send_subscribe_stomp(@@account_path + address)
end
subscribe_block(&fun) click to toggle source
# File lib/nem_websocket_client/client.rb, line 54
def subscribe_block(&fun)
  @ws.subscribe_block_func = fun
  send_subscribe_stomp(@@block_path)
end
subscribe_block_height(&fun) click to toggle source
# File lib/nem_websocket_client/client.rb, line 59
def subscribe_block_height(&fun)
  @ws.subscribe_block_height_func = fun
  send_subscribe_stomp(@@block_height_path)
end
subscribe_owned_mosaic(address,&fun) click to toggle source
# File lib/nem_websocket_client/client.rb, line 69
def subscribe_owned_mosaic(address,&fun)
  @ws.subscribe_owned_mosaic_func[address] = fun
  send_subscribe_stomp(@@owned_mosaic_path + address)
end
subscribe_owned_mosaic_definition(address,&fun) click to toggle source
# File lib/nem_websocket_client/client.rb, line 74
def subscribe_owned_mosaic_definition(address,&fun)
  @ws.subscribe_owned_mosaic_definition_func[address] = fun
  send_subscribe_stomp(@@owned_mosaic_definition_path + address)
end
subscribe_owned_namespace(address,&fun) click to toggle source
# File lib/nem_websocket_client/client.rb, line 64
def subscribe_owned_namespace(address,&fun)
  @ws.subscribe_owned_namespace_func[address] = fun
  send_subscribe_stomp(@@owned_namespace_path + address)
end
subscribe_recenttransactions(address,&fun) click to toggle source
# File lib/nem_websocket_client/client.rb, line 89
def subscribe_recenttransactions(address,&fun)
  @ws.subscribe_recenttransactions_func[address] = fun
  send_subscribe_stomp(@@recenttransactions_path + address)
end
subscribe_transaction(address,&fun) click to toggle source
# File lib/nem_websocket_client/client.rb, line 79
def subscribe_transaction(address,&fun)
  @ws.subscribe_transaction_func[address] = fun
  send_subscribe_stomp(@@transaction_path + address)
end
subscribe_unconfirmed_transaction(address,&fun) click to toggle source
# File lib/nem_websocket_client/client.rb, line 84
def subscribe_unconfirmed_transaction(address,&fun)
  @ws.subscribe_unconfirmed_transaction_func[address] = fun
  send_subscribe_stomp(@@unconfirmed_transaction_path + address)
end

Private Instance Methods

generate_send_stomp(path,address) click to toggle source
# File lib/nem_websocket_client/client.rb, line 245
def generate_send_stomp(path,address)
  header = {"destination":path}
  stomp = '["' + StompParser::Frame.new("SEND", header, "{'account':'#{address}'}").to_str + '"]'
  return stomp
end
generate_sub_id() click to toggle source
# File lib/nem_websocket_client/client.rb, line 233
def generate_sub_id
  sub_id = "sub-" + @sub_id_count.to_s
  @sub_id_count += 1
  return sub_id
end
generate_subscribe_stomp(path) click to toggle source
# File lib/nem_websocket_client/client.rb, line 239
def generate_subscribe_stomp(path)
  header = {"id":generate_sub_id,"destination":path}
  stomp = '["' + StompParser::Frame.new("SUBSCRIBE", header, "").to_str + '"]'
  return stomp
end
send_send_stomp(path,address) click to toggle source
# File lib/nem_websocket_client/client.rb, line 268
def send_send_stomp(path,address)
  stomp = generate_send_stomp(path,address)
  send_stomp(stomp)
end
send_stomp(stomp) click to toggle source
# File lib/nem_websocket_client/client.rb, line 251
def send_stomp(stomp)
  if @is_connected 
    @ws.send(stomp)
  else
    if stomp.include?("SUBSCRIBE")
      @ws.subscribe_stomps.push(stomp)
    elsif stomp.include?("SEND")
      @ws.send_stomps.push(stomp)
    end
  end
end
send_subscribe_stomp(path) click to toggle source
# File lib/nem_websocket_client/client.rb, line 263
def send_subscribe_stomp(path)
  stomp = generate_subscribe_stomp(path)
  send_stomp(stomp)
end
ws_init() click to toggle source
# File lib/nem_websocket_client/client.rb, line 206
def ws_init
  @ws.singleton_class.class_eval{ attr_accessor :connected_func }
  @ws.singleton_class.class_eval{ attr_accessor :subscribe_block_func }
  @ws.singleton_class.class_eval{ attr_accessor :heartbeat_func }
  @ws.singleton_class.class_eval{ attr_accessor :subscribe_block_height_func }
  @ws.singleton_class.class_eval{ attr_accessor :subscribe_owned_namespace_func }
  @ws.singleton_class.class_eval{ attr_accessor :subscribe_owned_mosaic_func }
  @ws.singleton_class.class_eval{ attr_accessor :subscribe_owned_mosaic_definition_func }
  @ws.singleton_class.class_eval{ attr_accessor :subscribe_transaction_func }
  @ws.singleton_class.class_eval{ attr_accessor :subscribe_unconfirmed_transaction_func }
  @ws.singleton_class.class_eval{ attr_accessor :subscribe_recenttransactions_func }
  @ws.singleton_class.class_eval{ attr_accessor :subscribe_account_func }
  @ws.singleton_class.class_eval{ attr_accessor :errors_func }
  @ws.singleton_class.class_eval{ attr_accessor :closed_func }
  @ws.singleton_class.class_eval{ attr_accessor :subscribe_stomps }
  @ws.singleton_class.class_eval{ attr_accessor :send_stomps }
  @ws.subscribe_stomps = []
  @ws.send_stomps = []
  @ws.subscribe_owned_namespace_func = {}
  @ws.subscribe_owned_mosaic_func = {}
  @ws.subscribe_owned_mosaic_definition_func = {}
  @ws.subscribe_transaction_func = {}
  @ws.subscribe_unconfirmed_transaction_func = {}
  @ws.subscribe_recenttransactions_func = {}
  @ws.subscribe_account_func = {}
end