class Apiway::Client
Constants
- HANDLERS
Public Class Methods
all() { |client| ... }
click to toggle source
# File lib/apiway/client.rb, line 16 def all @@all ||= [] @@all.each { |client| yield client } if block_given? @@all end
new( ws )
click to toggle source
# File lib/apiway/client.rb, line 41 def initialize( ws ) @ws = ws @ws.onopen { on_connected } @ws.onmessage { |msg| on_message msg } @ws.onclose { on_disconnected } @storage = {} @resources = {} end
on_connected( &block )
click to toggle source
# File lib/apiway/client.rb, line 26 def on_connected( &block ) block_given? ? @@on_connected = block : @@on_connected ||= Proc.new {} end
on_disconnected( &block )
click to toggle source
# File lib/apiway/client.rb, line 34 def on_disconnected( &block ) block_given? ? @@on_disconnected = block : @@on_disconnected ||= Proc.new {} end
on_message( &block )
click to toggle source
# File lib/apiway/client.rb, line 30 def on_message( &block ) block_given? ? @@on_message = block : @@on_message ||= Proc.new {} end
sync_changes( changed_models )
click to toggle source
# File lib/apiway/client.rb, line 22 def sync_changes( changed_models ) all { |client| client.sync_changes changed_models } end
Public Instance Methods
[]( name = nil )
click to toggle source
# File lib/apiway/client.rb, line 50 def []( name = nil ) @storage[ name ] end
[]=( name, value )
click to toggle source
# File lib/apiway/client.rb, line 54 def []=( name, value ) @storage[ name ] = value Thread.current[ :changed_models ].concat Apiway::Model.all value end
sync_changes( changed_models )
click to toggle source
# File lib/apiway/client.rb, line 60 def sync_changes( changed_models ) @resources.values.each { |resource| resource.sync_changes changed_models } end
trigger( *args )
click to toggle source
# File lib/apiway/client.rb, line 64 def trigger( *args ) send_event API::TRIGGER, args: args end
Private Instance Methods
alive( data )
click to toggle source
# File lib/apiway/client.rb, line 137 def alive( data ) send_event API::ALIVE end
call_methods( methods )
click to toggle source
# File lib/apiway/client.rb, line 133 def call_methods( methods ) methods.each { |method, args| send method, *args } end
destroy_resource( data )
click to toggle source
# File lib/apiway/client.rb, line 165 def destroy_resource( data ) @resources.delete data[ :id ] end
failure( result )
click to toggle source
# File lib/apiway/client.rb, line 129 def failure( result ) send_event API::FAILURE, result: result, query_id: @msg[ :data ][ :query_id ] end
on_connected()
click to toggle source
# File lib/apiway/client.rb, line 85 def on_connected processing do self.class.all << self instance_eval &self.class.on_connected end Log.info "Client connected" end
on_disconnected()
click to toggle source
# File lib/apiway/client.rb, line 103 def on_disconnected processing do self.class.all.delete self instance_eval &self.class.on_disconnected end Log.info "Client disconnected" end
on_message( msg )
click to toggle source
# File lib/apiway/client.rb, line 93 def on_message( msg ) @msg = parseMessage( msg ) rescue { event: API::ALIVE, data: nil } Log.debug "New message: \n#{ JSON.pretty_generate( @msg ) }" if Log.debug? processing do instance_exec @msg, &self.class.on_message handler = HANDLERS[ @msg[ :event ] ] or raise EventHandlerNotExists, @msg[ :event ] send handler, @msg[ :data ] end end
parseMessage( msg )
click to toggle source
# File lib/apiway/client.rb, line 111 def parseMessage( msg ) msg = JSON.parse msg, quirks_mode: true msg.keys_to_sym! end
processing() { || ... }
click to toggle source
# File lib/apiway/client.rb, line 71 def processing begin Thread.new { Thread.current[ :changed_models ] = [] Thread.current[ :methods_to_call ] = [] yield self.class.sync_changes Thread.current[ :changed_models ].uniq call_methods Thread.current[ :methods_to_call ] }.join rescue Exception => e Log.error "#{ e.message }\n#{ e.backtrace.join "\n" }" end end
run_controller( data )
click to toggle source
# File lib/apiway/client.rb, line 141 def run_controller( data ) name, action, params = data.values_at :name, :action, :params name = "#{ name }Controller" begin controller = Object.const_get( name ).new action.to_sym, self, params rescue NameError raise ControllerNotExists, name else controller.run end end
send_event( event, data = nil )
click to toggle source
# File lib/apiway/client.rb, line 121 def send_event( event, data = nil ) send_json event: event, data: data end
send_json( msg )
click to toggle source
# File lib/apiway/client.rb, line 116 def send_json( msg ) @ws.send JSON.generate( msg, quirks_mode: true ) Log.debug "Send message: \n#{ JSON.pretty_generate( msg ) }" if Log.debug? end
success( result )
click to toggle source
# File lib/apiway/client.rb, line 125 def success( result ) send_event API::SUCCESS, result: result, query_id: @msg[ :data ][ :query_id ] end
sync_resource( data )
click to toggle source
# File lib/apiway/client.rb, line 153 def sync_resource( data ) id, name, params = data.values_at :id, :name, :params name = "#{ name }Resource" begin @resources[ id ] ||= Object.const_get( name ).new id, self rescue raise ResourceNotExists, name else @resources[ id ].set_params( params ).sync end end