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