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