Module: RSMP::SiteProxy::Modules::Status
- Included in:
- RSMP::SiteProxy
- Defined in:
- lib/rsmp/proxy/site/modules/status.rb
Overview
Handles status requests, responses, subscriptions and updates
Instance Method Summary collapse
- #ensure_subscription_path(component_id, code, name) ⇒ Object
- #process_status_response(message) ⇒ Object
- #process_status_update(message) ⇒ Object
- #remove_subscription_item(component_id, code, name) ⇒ Object
-
#request_status(status_list, component: nil, m_id: nil, validate: true) ⇒ Object
Build and send a StatusRequest.
-
#request_status_and_collect(status_list, within:, component: nil, m_id: nil, validate: true) ⇒ Object
Build, send a StatusRequest and collect the StatusResponse.
-
#subscribe_to_status(status_list, component: nil, m_id: nil, validate: true) ⇒ Object
Build and send a StatusSubscribe.
-
#subscribe_to_status_and_collect(status_list, within:, component: nil, m_id: nil, validate: true) ⇒ Object
Build, send a StatusSubscribe and collect the first matching status update.
-
#unsubscribe_from_all(component: nil) ⇒ Object
unsubscribes to all statuses (with all attributes) defined in the used SXL.
- #unsubscribe_to_status(status_list, component: nil, validate: nil) ⇒ Object
- #update_subscription(component_id, subscribe_list) ⇒ Object
Instance Method Details
#ensure_subscription_path(component_id, code, name) ⇒ Object
58 59 60 61 62 |
# File 'lib/rsmp/proxy/site/modules/status.rb', line 58 def ensure_subscription_path(component_id, code, name) @status_subscriptions[component_id] ||= {} @status_subscriptions[component_id][code] ||= {} @status_subscriptions[component_id][code][name] ||= {} end |
#process_status_response(message) ⇒ Object
51 52 53 54 55 56 |
# File 'lib/rsmp/proxy/site/modules/status.rb', line 51 def process_status_response() component = find_component .attribute('cId') component.store_status log "Received #{.type}", message: , level: :log acknowledge end |
#process_status_update(message) ⇒ Object
154 155 156 157 158 159 160 |
# File 'lib/rsmp/proxy/site/modules/status.rb', line 154 def process_status_update() component = find_component .attribute('cId') component.check_repeat_values , @status_subscriptions component.store_status log "Received #{.type}", message: , level: :log acknowledge end |
#remove_subscription_item(component_id, code, name) ⇒ Object
119 120 121 122 123 124 125 |
# File 'lib/rsmp/proxy/site/modules/status.rb', line 119 def remove_subscription_item(component_id, code, name) return unless @status_subscriptions.dig(component_id, code, name) @status_subscriptions[component_id][code].delete name @status_subscriptions[component_id].delete(code) if @status_subscriptions[component_id][code].empty? @status_subscriptions.delete(component_id) if @status_subscriptions[component_id].empty? end |
#request_status(status_list, component: nil, m_id: nil, validate: true) ⇒ Object
Build and send a StatusRequest. Returns { sent: message }.
7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
# File 'lib/rsmp/proxy/site/modules/status.rb', line 7 def request_status(status_list, component: nil, m_id: nil, validate: true) validate_ready 'request status' component ||= main.c_id m_id ||= RSMP::Message.make_m_id list = RSMP::StatusList.new(status_list) # additional items can be used when verifying the response, # but must be removed from the request request_list = list.map { |item| item.slice('sCI', 'n') } = RSMP::StatusRequest.new({ 'cId' => component, 'sS' => request_list, 'mId' => m_id }) , validate: validate { sent: } end |
#request_status_and_collect(status_list, within:, component: nil, m_id: nil, validate: true) ⇒ Object
Build, send a StatusRequest and collect the StatusResponse. Returns the collector. Call .ok! on the result to raise on NotAck or timeout.
30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
# File 'lib/rsmp/proxy/site/modules/status.rb', line 30 def request_status_and_collect(status_list, within:, component: nil, m_id: nil, validate: true) validate_ready 'request status' component ||= main.c_id m_id ||= RSMP::Message.make_m_id list = RSMP::StatusList.new(status_list) # additional items can be used when verifying the response, # but must be removed from the request request_list = list.map { |item| item.slice('sCI', 'n') } = RSMP::StatusRequest.new({ 'cId' => component, 'sS' => request_list, 'mId' => m_id }) collector = StatusCollector.new(self, list.to_a, timeout: within, m_id: m_id) (, collector, validate: validate)[:collector] end |
#subscribe_to_status(status_list, component: nil, m_id: nil, validate: true) ⇒ Object
Build and send a StatusSubscribe. Returns { sent: message }.
75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 |
# File 'lib/rsmp/proxy/site/modules/status.rb', line 75 def subscribe_to_status(status_list, component: nil, m_id: nil, validate: true) validate_ready 'subscribe to status' component ||= main.c_id m_id ||= RSMP::Message.make_m_id list = RSMP::StatusList.new(status_list) subscribe_list = list.map { |item| item.slice('sCI', 'n', 'uRt', 'sOc') } update_subscription(component, subscribe_list) find_component component = RSMP::StatusSubscribe.new({ 'cId' => component, 'sS' => subscribe_list, 'mId' => m_id }) , validate: validate { sent: } end |
#subscribe_to_status_and_collect(status_list, within:, component: nil, m_id: nil, validate: true) ⇒ Object
Build, send a StatusSubscribe and collect the first matching status update. Returns the collector. Call .ok! on the result to raise on NotAck or timeout.
98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 |
# File 'lib/rsmp/proxy/site/modules/status.rb', line 98 def subscribe_to_status_and_collect(status_list, within:, component: nil, m_id: nil, validate: true) validate_ready 'subscribe to status' component ||= main.c_id m_id ||= RSMP::Message.make_m_id list = RSMP::StatusList.new(status_list) subscribe_list = list.map { |item| item.slice('sCI', 'n', 'uRt', 'sOc') } update_subscription(component, subscribe_list) find_component component = RSMP::StatusSubscribe.new({ 'cId' => component, 'sS' => subscribe_list, 'mId' => m_id }) collector = StatusCollector.new(self, list.to_a, timeout: within, m_id: m_id) (, collector, validate: validate)[:collector] end |
#unsubscribe_from_all(component: nil) ⇒ Object
unsubscribes to all statuses (with all attributes) defined in the used SXL
145 146 147 148 149 150 151 152 |
# File 'lib/rsmp/proxy/site/modules/status.rb', line 145 def unsubscribe_from_all(component: nil) component ||= main.c_id catalogue = RSMP::Schema.status_catalogue(@sxl, sxl_version) status_list = catalogue.flat_map do |status_code_id, names| names.map { |name| { 'sCI' => status_code_id.to_s, 'n' => name.to_s } } end unsubscribe_to_status status_list, component: component end |
#unsubscribe_to_status(status_list, component: nil, validate: nil) ⇒ Object
127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 |
# File 'lib/rsmp/proxy/site/modules/status.rb', line 127 def unsubscribe_to_status(status_list, component: nil, validate: nil) validate_ready 'unsubscribe to status' component ||= main.c_id status_list.each do |item| remove_subscription_item(component, item['sCI'], item['n']) end = RSMP::StatusUnsubscribe.new({ 'cId' => component, 'sS' => status_list }) , validate: validate end |
#update_subscription(component_id, subscribe_list) ⇒ Object
64 65 66 67 68 69 70 71 72 |
# File 'lib/rsmp/proxy/site/modules/status.rb', line 64 def update_subscription(component_id, subscribe_list) subscribe_list.each do |item| code = item['sCI'] name = item['n'] sub = ensure_subscription_path(component_id, code, name) sub['uRt'] = item['uRt'] sub['sOc'] = item['sOc'] end end |