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

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(message)
  component = find_component message.attribute('cId')
  component.store_status message
  log "Received #{message.type}", message: message, level: :log
  acknowledge message
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(message)
  component = find_component message.attribute('cId')
  component.check_repeat_values message, @status_subscriptions
  component.store_status message
  log "Received #{message.type}", message: message, level: :log
  acknowledge message
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') }

  message = RSMP::StatusRequest.new({
                                      'cId' => component,
                                      'sS' => request_list,
                                      'mId' => m_id
                                    })
  apply_nts_message_attributes message
  send_message message, validate: validate
  { sent: message }
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') }

  message = RSMP::StatusRequest.new({
                                      'cId' => component,
                                      'sS' => request_list,
                                      'mId' => m_id
                                    })
  apply_nts_message_attributes message
  collector = StatusCollector.new(self, list.to_a, timeout: within, m_id: m_id)
  send_message_and_collect(message, 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

  message = RSMP::StatusSubscribe.new({
                                        'cId' => component,
                                        'sS' => subscribe_list,
                                        'mId' => m_id
                                      })
  apply_nts_message_attributes message
  send_message message, validate: validate
  { sent: message }
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

  message = RSMP::StatusSubscribe.new({
                                        'cId' => component,
                                        'sS' => subscribe_list,
                                        'mId' => m_id
                                      })
  apply_nts_message_attributes message
  collector = StatusCollector.new(self, list.to_a, timeout: within, m_id: m_id)
  send_message_and_collect(message, 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

  message = RSMP::StatusUnsubscribe.new({
                                          'cId' => component,
                                          'sS' => status_list
                                        })
  apply_nts_message_attributes message
  send_message message, validate: validate
  message
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