class BelliteJsonRpc
@abstract Next level of Bellite
server API implementation: Basic operations with server like Bellite
.
Public Class Methods
constructor. @param [String] cred Server credentials @param [Boolean] logging Logging flag
BelliteJsonRpcApi::new
# File lib/bellite.rb, line 233 def initialize(cred=false, logging=false) @_resultMap = {} @_evtTypeMap = {} @_nextMsgId = 100 super(cred) @logging = logging end
Public Instance Methods
Calls JSON-RPC method @param [String] method Method to call @param [Hash,Array,String,Float,Fixnum] params parameters for method @return [Promise]
# File lib/bellite.rb, line 253 def _invoke(method, params=nil) msgId = @_nextMsgId @_nextMsgId += 1 res = _newResult(msgId) if not _sendJsonRpc(method, params, msgId) res.reject('Bellite client not connected') end return res.promise end
returns new Promise
object, attached to msgId @param [Fixnum] msgId id of message for this result @return [Promise]
# File lib/bellite.rb, line 266 def _newResult(msgId) res = deferred() @_resultMap[msgId] = res return res end
Notify JSON-RPC server by method call, but skip response @param [String] method Method to call @param [Hash,Array,String,Float,Fixnum] params parameters for method @return [Boolean] true if sent
# File lib/bellite.rb, line 245 def _notify(method, params=nil) return _sendJsonRpc(method, params) end
Receives JSON-RPC response or call from JSON-RPC Server @param [Array<String>] msgList Array of messages from Server
# File lib/bellite.rb, line 314 def _recvJsonRpc(msgList) msgList.each do |msg| begin msg = JSON.parse(msg) isCall = msg.has_key?("method") rescue next end logRecv(msg) begin if isCall on_rpc_call(msg) else on_rpc_response(msg) end end end end
Sends JSON-RPC call to server @param [String] method Method to call @param [Hash,Array,String,Float,Fixnum] params parameters for method @param [Fixnum] msgId Message Id. If default, it uses internal autoincrement counter @return [Boolean] True if sent
# File lib/bellite.rb, line 277 def _sendJsonRpc(method, params=nil, msgId=false) msg = {"jsonrpc" => "2.0", "method" => method} if params msg['params'] = params end if msgId msg['id'] = msgId end logSend(msg) return _sendMessage(JSON.fast_generate(msg)) end
Sends JSON-RPC string to server @param [String] msg JSON-encoded JSON-RPC call to send @return [Boolean] True if sent
# File lib/bellite.rb, line 292 def _sendMessage(msg) raise NotImplementedError('Subclass Responsibility') end
Calls event handler when event occured @param [String] key Event name like ‘ready` @param [Hash,Array,Float,String,Fixnum] *args Argument to pass to event handler(s).
# File lib/bellite.rb, line 406 def emit(key, *args) if @_evtTypeMap.has_key? key @_evtTypeMap[key].each do |fn| begin fn.call(self, *args) rescue puts "EMIT exception" end end end end
Puts received packets to STDOUT @param [String] msg Same as for _sendMessage
# File lib/bellite.rb, line 306 def logRecv(msg) if @logging puts "recv ==> " + JSON.fast_generate(msg) end end
Puts send packets to STDOUT @param [String] msg Same as for _sendMessage
# File lib/bellite.rb, line 298 def logSend(msg) if @logging puts "send ==> " + JSON.fast_generate(msg) end end
Adds any event handler @param [String] key Event name like ‘ready` @param [Proc] fn Function to bind on event @return [Proc] Your event handler or bindEvent method to bind your handler later if you skip fn
# File lib/bellite.rb, line 391 def on(key, fn=false) bindEvent = lambda do |fn| (@_evtTypeMap[key]||=[]) << fn return fn end if not fn return bindEvent else return bindEvent.call(fn) end end
Called when auth is failed
Emits 'auth' event handlers with fail flag
@param [String] msg Message from JSON-RPC server
# File lib/bellite.rb, line 379 def on_auth_failed(msg) emit('auth', false, msg) end
Called when auth is successfully ended
Emits 'auth' and 'ready' event handlers
@param [String] msg Message from JSON-RPC server
# File lib/bellite.rb, line 371 def on_auth_succeeded(msg) emit('auth', true, msg) emit('ready') end
Called on connect to remote JSON-RPC server. @param [Hash] cred Server credentials: port, host, token and original ‘credentials` string @param [Future] f_ready Ready future instance
# File lib/bellite.rb, line 362 def on_connect(cred, f_ready) auth(cred['token']) \ .then(f_ready.method(:resolve), f_ready.method(:reject)) \ .then(method(:on_auth_succeeded), method(:on_auth_failed)) end
Called on JSON-RPC call FROM server. @param [String] msg Server response with call
# File lib/bellite.rb, line 335 def on_rpc_call(msg) if msg['method'] == 'event' args = msg['params'] emit(args['evtType'], args) end end
Called on JSON-RPC response (not call) from Server @param [String] msg Server respon with data
# File lib/bellite.rb, line 344 def on_rpc_response(msg) tgt = @_resultMap.delete msg['id'] if tgt == nil return end if msg.has_key?('error') tgt.reject(msg['error']) elsif msg['result'][0] tgt.reject(msg['result']) else tgt.resolve(msg['result']) end end