class RubyNos::Processor

Attributes

agent[RW]
current_message[RW]

Public Class Methods

new(agent) click to toggle source
# File lib/ruby_nos/processor.rb, line 6
def initialize agent
  @agent = agent
end

Public Instance Methods

formatter() click to toggle source
# File lib/ruby_nos/processor.rb, line 10
def formatter
  @formatter ||= Formatter.new
end
process_message(received_message) click to toggle source
# File lib/ruby_nos/processor.rb, line 18
def process_message received_message
  formatted_message = formatter.parse_message(received_message)
  self.current_message = Message.new(formatted_message)

  unless sender_uuid == agent.uuid || !correct_signature?(formatted_message)
    RubyNos.logger.send(:info, "#{self.current_message.type} arrives")
    if agent_receptor? || cloud_receptor?
      processor = message_processor.fetch(current_message.type, nil)
      processor.call if processor
    end
  end
end
signature_generator() click to toggle source
# File lib/ruby_nos/processor.rb, line 14
def signature_generator
  @signature_generator ||= SignatureGenerator.new
end

Private Instance Methods

agent_receptor?() click to toggle source
# File lib/ruby_nos/processor.rb, line 108
def agent_receptor?
  agent.uuid == receptor_uuid
end
cloud_receptor?() click to toggle source
# File lib/ruby_nos/processor.rb, line 112
def cloud_receptor?
  agent.cloud.uuid == receptor_uuid
end
correct_signature?(received_message) click to toggle source
# File lib/ruby_nos/processor.rb, line 62
def correct_signature? received_message
  if received_message[:sg]
    signature = received_message.delete(:sg)
    signature_generator.valid_signature?(received_message.to_s, signature)
  else
    true
  end
end
get_uuid(uuid_param) click to toggle source
# File lib/ruby_nos/processor.rb, line 116
def get_uuid uuid_param
  if uuid_param.start_with?("AGT:", "CLD:")
    uuid = formatter.convert_to_uuid(uuid_param[4..-1])
    if formatter.uuid_format?(uuid)
      uuid
    else
      raise(ArgumentError, 'Argument format is incorrect')
    end
  else
    raise(ArgumentError, 'Argument format is incorrect')
  end
end
message_processor() click to toggle source
# File lib/ruby_nos/processor.rb, line 33
def message_processor
  {
      "PIN" => lambda {process_pin_message},
      "PON" => lambda {process_pon_message},
      "PRS" => lambda {process_presence_message},
      "DSC" => lambda {process_discovery_message},
      "ENQ" => lambda {process_enquiry_message},
      "QNE" => lambda {process_enquiry_answer_message}
  }
end
process_discovery_message() click to toggle source
# File lib/ruby_nos/processor.rb, line 88
def process_discovery_message
  unless agent.cloud.list.is_on_the_list?(sender_uuid)
    update_cloud
  end
  send_response "PRS"
end
process_enquiry_answer_message() click to toggle source
# File lib/ruby_nos/processor.rb, line 100
def process_enquiry_answer_message
  agent.cloud.update(RemoteAgent.new({uuid: sender_uuid, timestamp: self.current_message.timestamp, rest_api: received_api}))
end
process_enquiry_message() click to toggle source
# File lib/ruby_nos/processor.rb, line 95
def process_enquiry_message
  update_cloud
  send_response "QNE"
end
process_pin_message() click to toggle source
# File lib/ruby_nos/processor.rb, line 71
def process_pin_message
  update_cloud
  send_response "PON"
end
process_pon_message() click to toggle source
# File lib/ruby_nos/processor.rb, line 76
def process_pon_message
  update_cloud
end
process_presence_message() click to toggle source
# File lib/ruby_nos/processor.rb, line 80
def process_presence_message
  if self.current_message.data[:present] == 0
    agent.cloud.list.eliminate(sender_uuid)
  else
    update_cloud
  end
end
received_api() click to toggle source
# File lib/ruby_nos/processor.rb, line 52
def received_api
  RestApi.new({name: self.current_message.data[:name]}).tap do |api|
    if self.current_message.data[:apis]
      self.current_message.data[:apis].each do |endpoint|
        api.add_endpoint(endpoint)
      end
    end
  end
end
receptor_uuid() click to toggle source
# File lib/ruby_nos/processor.rb, line 48
def receptor_uuid
  get_uuid(self.current_message.to)
end
send_response(type) click to toggle source
# File lib/ruby_nos/processor.rb, line 129
def send_response type
  agent.send_message({type: type})
end
sender_uuid() click to toggle source
# File lib/ruby_nos/processor.rb, line 44
def sender_uuid
  get_uuid(self.current_message.from)
end
update_cloud() click to toggle source
# File lib/ruby_nos/processor.rb, line 104
def update_cloud
  agent.cloud.update({agent_uuid: sender_uuid, info: self.current_message.data, timestamp: self.current_message.timestamp}) unless agent.cloud.uuid == sender_uuid
end