class BelliteJsonRpc

@abstract Next level of Bellite server API implementation: Basic operations with server like Bellite.

Public Class Methods

new(cred=false, logging=false) click to toggle source

constructor. @param [String] cred Server credentials @param [Boolean] logging Logging flag

Calls superclass method 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

_invoke(method, params=nil) click to toggle source

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
_newResult(msgId) click to toggle source

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(method, params=nil) click to toggle source

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
_recvJsonRpc(msgList) click to toggle source

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
_sendJsonRpc(method, params=nil, msgId=false) click to toggle source

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
_sendMessage(msg) click to toggle source

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
emit(key, *args) click to toggle source

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
logRecv(msg) click to toggle source

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
logSend(msg) click to toggle source

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
on(key, fn=false) click to toggle source

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
on_auth_failed(msg) click to toggle source

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
on_auth_succeeded(msg) click to toggle source

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
on_connect(cred, f_ready) click to toggle source

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
on_rpc_call(msg) click to toggle source

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
on_rpc_response(msg) click to toggle source

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