module Plumbus::Ports

Public Class Methods

attach_port(port) click to toggle source

Attach a port

# File lib/plumbus/ports.rb, line 10
def self.attach_port port
  @@instances << port
  refresh_port_routing_table port
end
detach_all() click to toggle source

def self.detach_port port evict_routing_table_references port @@instances -= [port] Needs to support the sid_to_ports end

# File lib/plumbus/ports.rb, line 36
def self.detach_all
  @@instances.each do |port|
    evict_routing_table_references port
  end
  @@instances = []
  @@sid_to_ports = {}
end
evict_routing_table_references(port) click to toggle source
# File lib/plumbus/ports.rb, line 25
def self.evict_routing_table_references port
  @@routing_table[port.opposite_direction].remove_references! port
  @@routing_table[port.opposite_direction].trim!
end
forward_message(port:, sid:, action:, payload:) click to toggle source
# File lib/plumbus/ports.rb, line 99
def self.forward_message(port:, sid:, action:, payload:)
  if port.direction == :request
    if req_port = response_port_for_request(action: action)
      if ports = @@sid_to_ports[sid]
        ports[1] << req_port
      else
        req_set = Set.new [req_port]
        @@sid_to_ports[sid] = [port, req_set]
      end
      req_port.handle_message sid, action.to_s, payload
    else
      #undeliverable
      port.handle_signal :undeliverable, {sid: sid}
    end
  elsif port.direction == :response
    if res_port = request_port_for_response(sid: sid)
      res_port.handle_message sid, action, payload
    else
      #undeliverable
      port.handle_signal :undeliverable, {sid: sid}
    end
  end
end
instances() click to toggle source
# File lib/plumbus/ports.rb, line 7
def self.instances; @@instances end
refresh_port_routing_table(port) click to toggle source
# File lib/plumbus/ports.rb, line 15
def self.refresh_port_routing_table port
  evict_routing_table_references port

  port.supported_actions.each do |action|
    action = action.to_s
    @@routing_table[port.opposite_direction][action] ||= []
    @@routing_table[port.opposite_direction][action] << port
  end
end
request_port_for_response(sid:) click to toggle source
# File lib/plumbus/ports.rb, line 66
def self.request_port_for_response(sid:)
  return (@@sid_to_ports[sid] || [])[0]
end
response_port_for_request(action:) click to toggle source
# File lib/plumbus/ports.rb, line 62
def self.response_port_for_request(action:)
  return self.response_ports_for_request(action: action).first
end
response_ports_for_request(action:) click to toggle source

This returns the response (destination) ports for a request originating on the request side. I.e. it returns a response port.

# File lib/plumbus/ports.rb, line 57
def self.response_ports_for_request(action:)
  action = action.to_s
  @@routing_table[:request][action] || []
end
signal(port:, name:, info:) click to toggle source
# File lib/plumbus/ports.rb, line 70
def self.signal(port:, name:, info:)
  case name
  when :hangup
    sid = info[:sid]
    if ports = @@sid_to_ports[sid]
      #Get request port (0)
      req_port = ports[0]

      #The request side hungup
      set = ports[1]
      if req_port == port
        set.each do |p|
          p.handle_signal :hangup_notice, {:sid => sid}
        end
        @@sid_to_ports.delete sid
      else
        #Remove ourselves (response) from response set
        set.delete(port)

        #Signal request of termination
        if set.length == 0
          @@sid_to_ports.delete sid
          req_port.handle_signal :hangup_notice, {:sid => sid}
        end
      end
    end
  end
end