Module: Plumbus::Ports
- Defined in:
- lib/plumbus/ports.rb
Constant Summary collapse
- @@instances =
Instances######################################################### Holds instances
[]
- @@routing_table =
Routing########################################################### Holds routing table which maps from
{ :request => {}, :response => {}, }
- @@sid_to_ports =
Maps a sid into one request port and potentionally many response ports via [request, Set<response0, response1…>]
{}
Class Method Summary collapse
-
.attach_port(port) ⇒ Object
Attach a port.
-
.detach_all ⇒ Object
end.
- .evict_routing_table_references(port) ⇒ Object
- .forward_message(port:, sid:, action:, payload:) ⇒ Object
- .instances ⇒ Object
- .refresh_port_routing_table(port) ⇒ Object
- .request_port_for_response(sid:) ⇒ Object
- .response_port_for_request(action:) ⇒ Object
-
.response_ports_for_request(action:) ⇒ Object
This returns the response (destination) ports for a request originating on the request side.
- .signal(port:, name:, info:) ⇒ Object
Class Method Details
.attach_port(port) ⇒ Object
Attach a port
10 11 12 13 |
# File 'lib/plumbus/ports.rb', line 10 def self.attach_port port @@instances << port refresh_port_routing_table port end |
.detach_all ⇒ Object
end
36 37 38 39 40 41 42 |
# 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) ⇒ Object
25 26 27 28 |
# 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:) ⇒ Object
99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 |
# File 'lib/plumbus/ports.rb', line 99 def self.(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. 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. sid, action, payload else #undeliverable port.handle_signal :undeliverable, {sid: sid} end end end |
.instances ⇒ Object
7 |
# File 'lib/plumbus/ports.rb', line 7 def self.instances; @@instances end |
.refresh_port_routing_table(port) ⇒ Object
15 16 17 18 19 20 21 22 23 |
# 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:) ⇒ Object
66 67 68 |
# 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:) ⇒ Object
62 63 64 |
# 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:) ⇒ Object
This returns the response (destination) ports for a request originating on the request side. I.e. it returns a response port.
57 58 59 60 |
# 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:) ⇒ Object
70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 |
# 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 |