class GxG::Communications::Bridge

Public Class Methods

new(process=nil, the_url=nil, options=nil) click to toggle source
# File lib/gxg/gxg_communications.rb, line 823
def initialize(process=nil, the_url=nil, options=nil)
    # Note: process (required) is a Service or Application instance only
    unless process.is_a?(::GxG::Services::Service)
        raise ArgumentError, "You MUST provide a Service or Application instance to bind to."
    end
    # Ensure protocol supported
    if the_url.is_a?(::String)
        the_url = ::URI::parse(the_url)
    end
    unless the_url.is_a?(::URI::Generic)
        raise ArgumentError, "You MUST provide a valid URL as a String or URI."
    end
    the_type = ::GxG::BRIDGES_AVAILABLE[(the_url.scheme.to_sym)]
    unless the_type
        raise ArgumentError, "Sorry, #{the_url.scheme.to_sym.inspect} is not a supported protocol."
    end
    # Variables
    @process = process
    @url = the_url
    @adapter = the_type.new(self, @url, options)
    @uuid = ::GxG::uuid_generate.to_sym
    @interface = {}
    self.on(:interface, "Available Commands") do
        self.interface()
    end
    self
end

Public Instance Methods

call_event(operation_envelope=nil) click to toggle source
# File lib/gxg/gxg_communications.rb, line 869
def call_event(operation_envelope=nil)
  result = nil
  if operation_envelope.is_a?(::Hash)
    the_event = operation_envelope.keys[0]
    if the_event
      data = operation_envelope[(the_event)]
      if @interface[(the_event)]
        begin
          result = {:result => @interface[(the_event)][:procedure].call(@process, self, data)}
        rescue Exception => the_error
          log_error({:error => the_error, :parameters => {:data => data}})
          result = {:result => nil, :error => the_error.to_s}
        end
      else
        result = {:result => nil, :error => "Command #{the_event.inspect} Not Found"}
      end
    end
  end
  result
end
interface() click to toggle source
# File lib/gxg/gxg_communications.rb, line 890
def interface()
  result = {}
  @interface.each_pair do |the_event, the_record|
    result[(the_event)] = the_record[:description]
  end
  result
end
on(the_event, description=nil, &block) click to toggle source

Command Interface

# File lib/gxg/gxg_communications.rb, line 855
def on(the_event, description=nil, &block)
  unless the_event.is_a?(::Symbol)
    raise ArgumentError, "You must specify an event listener with a unique Symbol."
  end
  unless block.respond_to?(:call)
    raise ArgumentError, "You must provide an event code block to execute."
  end
  unless description
    description = "{ '#{the_event.to_s}': '(your_data_payload)' }"
  end
  @interface[(the_event)] = {:description => description, :procedure => block}
  true
end
reply(the_channel_uuid=nil, reply_body=nil, address=nil) click to toggle source
# File lib/gxg/gxg_communications.rb, line 947
def reply(the_channel_uuid=nil, reply_body=nil, address=nil)
    result = {:result => false}
    if ::GxG::valid_uuid?(the_channel_uuid) && reply_body.is_a?(::GxG::Events::Message) && address
        @adapter.send_message(the_channel_uuid, reply_body, address)
        result[:result] = true
    end
    result
end
request(the_channel_uuid=nil, request_body=nil, address=nil, options={}) click to toggle source

Request/Reply Support

# File lib/gxg/gxg_communications.rb, line 908
def request(the_channel_uuid=nil, request_body=nil, address=nil, options={})
    result = nil
    #
    if ::GxG::valid_uuid?(the_channel_uuid) && request_body.is_a?(::GxG::Events::Message) && address
        payload = nil
        context = ::GxG::uuid_generate
        if address.to_s.valid_jid?
            # Point-to-Point Request
            payload = new_message({:sender => @adapter.jid().to_s, :body => request_body})
            payload[:context] = context.to_s
            if payload
                @adapter.send_message(the_channel_uuid, payload, address)
                the_reply_list = @adapter.get_messages_by_context(the_channel_uuid, context)
                if options.is_a?(::Hash)
                    if options[:timeout].is_a?(::Numeric)
                        timeout = Time.now.to_f + options[:timeout].to_f
                    else
                        timeout = Time.now.to_f + 30.0
                    end
                else
                    timeout = Time.now.to_f + 30.0
                end
                until the_reply_list.size > 0 do
                    the_reply_list = @adapter.get_messages_by_context(the_channel_uuid, context)
                    sleep 0.5
                    if Time.now.to_f >= timeout
                        break
                    end
                end
                if the_reply_list.size > 0
                    result = the_reply_list[0]
                end
            end
        end
    end
    #
    result
end
respond_to_event?(the_event=nil) click to toggle source
# File lib/gxg/gxg_communications.rb, line 898
def respond_to_event?(the_event=nil)
  result = false
  if the_event.is_a?(::Symbol)
    if @interface[(the_event)]
      result = true
    end
  end
  result
end
uuid() click to toggle source
# File lib/gxg/gxg_communications.rb, line 851
def uuid()
    @uuid
end