xconn 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (97) hide show
  1. checksums.yaml +7 -0
  2. data/.rspec +3 -0
  3. data/.rubocop.yml +29 -0
  4. data/CHANGELOG.md +5 -0
  5. data/LICENSE +22 -0
  6. data/Makefile +9 -0
  7. data/README.md +2 -0
  8. data/Rakefile +14 -0
  9. data/bin/xconn +79 -0
  10. data/docs/index.md +7 -0
  11. data/docs/installation.md +11 -0
  12. data/example/sample/example.rb +23 -0
  13. data/example/sample/included_app.rb +12 -0
  14. data/lib/tasks/tasks.rake +24 -0
  15. data/lib/wamp/app.rb +39 -0
  16. data/lib/wamp/connection/session.rb +35 -0
  17. data/lib/wamp/connection/stream.rb +68 -0
  18. data/lib/wamp/connection/websocket_client.rb +137 -0
  19. data/lib/wamp/connection/websocket_connection.rb +52 -0
  20. data/lib/wamp/manager/base.rb +41 -0
  21. data/lib/wamp/manager/connection.rb +32 -0
  22. data/lib/wamp/manager/event/abort.rb +21 -0
  23. data/lib/wamp/manager/event/authenticate.rb +14 -0
  24. data/lib/wamp/manager/event/base.rb +41 -0
  25. data/lib/wamp/manager/event/call.rb +40 -0
  26. data/lib/wamp/manager/event/challenge.rb +26 -0
  27. data/lib/wamp/manager/event/error.rb +30 -0
  28. data/lib/wamp/manager/event/event.rb +20 -0
  29. data/lib/wamp/manager/event/goodbye.rb +18 -0
  30. data/lib/wamp/manager/event/hello.rb +38 -0
  31. data/lib/wamp/manager/event/invocation.rb +24 -0
  32. data/lib/wamp/manager/event/publish.rb +22 -0
  33. data/lib/wamp/manager/event/published.rb +13 -0
  34. data/lib/wamp/manager/event/register.rb +30 -0
  35. data/lib/wamp/manager/event/registered.rb +37 -0
  36. data/lib/wamp/manager/event/result.rb +13 -0
  37. data/lib/wamp/manager/event/subscribe.rb +39 -0
  38. data/lib/wamp/manager/event/subscribed.rb +26 -0
  39. data/lib/wamp/manager/event/unregister.rb +19 -0
  40. data/lib/wamp/manager/event/unregistered.rb +13 -0
  41. data/lib/wamp/manager/event/unsubscribe.rb +29 -0
  42. data/lib/wamp/manager/event/unsubscribed.rb +13 -0
  43. data/lib/wamp/manager/event/welcome.rb +21 -0
  44. data/lib/wamp/manager/event/yield.rb +13 -0
  45. data/lib/wamp/manager/event.rb +60 -0
  46. data/lib/wamp/manager/hello_event.rb +263 -0
  47. data/lib/wamp/manager/session.rb +91 -0
  48. data/lib/wamp/manager/subscription.rb +38 -0
  49. data/lib/wamp/manager.rb +12 -0
  50. data/lib/wamp/message_handler/api.rb +67 -0
  51. data/lib/wamp/message_handler/base.rb +65 -0
  52. data/lib/wamp/message_handler/call.rb +14 -0
  53. data/lib/wamp/message_handler/challenge.rb +12 -0
  54. data/lib/wamp/message_handler/error.rb +18 -0
  55. data/lib/wamp/message_handler/event.rb +18 -0
  56. data/lib/wamp/message_handler/goodbye.rb +19 -0
  57. data/lib/wamp/message_handler/hello.rb +18 -0
  58. data/lib/wamp/message_handler/invocation.rb +35 -0
  59. data/lib/wamp/message_handler/publish.rb +14 -0
  60. data/lib/wamp/message_handler/published.rb +18 -0
  61. data/lib/wamp/message_handler/register.rb +14 -0
  62. data/lib/wamp/message_handler/registered.rb +30 -0
  63. data/lib/wamp/message_handler/result.rb +17 -0
  64. data/lib/wamp/message_handler/subscribe.rb +14 -0
  65. data/lib/wamp/message_handler/subscribed.rb +30 -0
  66. data/lib/wamp/message_handler/unregister.rb +14 -0
  67. data/lib/wamp/message_handler/unregistered.rb +32 -0
  68. data/lib/wamp/message_handler/unsubscribe.rb +14 -0
  69. data/lib/wamp/message_handler/unsubscribed.rb +33 -0
  70. data/lib/wamp/message_handler/welcome.rb +12 -0
  71. data/lib/wamp/message_handler.rb +75 -0
  72. data/lib/wamp/router/base.rb +45 -0
  73. data/lib/wamp/router/client.rb +55 -0
  74. data/lib/wamp/router/connection.rb +150 -0
  75. data/lib/wamp/router/realm.rb +92 -0
  76. data/lib/wamp/router/server.rb +83 -0
  77. data/lib/wamp/router.rb +12 -0
  78. data/lib/wamp/serializer/cbor.rb +18 -0
  79. data/lib/wamp/serializer/json.rb +18 -0
  80. data/lib/wamp/serializer/message_pack.rb +18 -0
  81. data/lib/wamp/serializer.rb +5 -0
  82. data/lib/wamp/type/error.rb +24 -0
  83. data/lib/wamp/type/event.rb +16 -0
  84. data/lib/wamp/type/invocation.rb +16 -0
  85. data/lib/wamp/type/publication.rb +14 -0
  86. data/lib/wamp/type/registration.rb +14 -0
  87. data/lib/wamp/type/result.rb +16 -0
  88. data/lib/wamp/type/subscription.rb +14 -0
  89. data/lib/wamp/type/success.rb +8 -0
  90. data/lib/wamp/type.rb +16 -0
  91. data/lib/wamp/version.rb +5 -0
  92. data/lib/wamp.rb +15 -0
  93. data/mkdocs.yml +67 -0
  94. data/sig/wamp/serializer/json.rbs +10 -0
  95. data/sig/wamp.rbs +11 -0
  96. data/wamp.gemspec +40 -0
  97. metadata +223 -0
@@ -0,0 +1,263 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "delegate"
4
+
5
+ module Wamp
6
+ module Manager
7
+ # handles hello event
8
+ class Base < SimpleDelegator
9
+ attr_reader :session
10
+
11
+ def initialize(message, session)
12
+ super(message)
13
+ @session = session
14
+ end
15
+
16
+ def emit_event(message)
17
+ session.emit(emit_event_name, message)
18
+ end
19
+
20
+ def self.instance_from(message, session)
21
+ klass_name = demodulize(message.class.name)
22
+ klass = constantize("Wamp::Manager::#{klass_name}Event")
23
+ klass.new(message, session)
24
+ end
25
+
26
+ def self.demodulize(path)
27
+ path = path.to_s
28
+ if i = path.rindex("::") # rubocop:disable Lint/AssignmentInCondition
29
+ path[(i + 2), path.length]
30
+ else
31
+ path
32
+ end
33
+ end
34
+
35
+ def self.constantize(camel_cased_word)
36
+ Object.const_get(camel_cased_word)
37
+ end
38
+ end
39
+
40
+ # message
41
+ class HelloEvent < Base
42
+ def add_event_listener
43
+ session.transmit(payload)
44
+ end
45
+
46
+ def emit_event_name
47
+ raise RuntimeError
48
+ end
49
+
50
+ def listen_event_name
51
+ :join
52
+ end
53
+ end
54
+
55
+ # Welcome Event
56
+ class WelcomeEvent < Base
57
+ def emit_event_name
58
+ :join
59
+ end
60
+
61
+ def emit_event(_message)
62
+ session.emit(emit_event_name, @session)
63
+ end
64
+ end
65
+
66
+ # Abort Event
67
+ class AbortEvent < Base
68
+ def emit_event_name
69
+ :close
70
+ end
71
+
72
+ def emit_event(message)
73
+ session.emit(emit_event_name, message)
74
+ session.close(1000, message.reason)
75
+ end
76
+ end
77
+
78
+ class GoodbyeEvent < AbortEvent
79
+ end
80
+
81
+ # Error Event
82
+ class ErrorEvent < Base
83
+ def emit_event_name
84
+ "request_#{request_id}"
85
+ end
86
+
87
+ def emit_event(message)
88
+ session.emit(emit_event_name, nil, message)
89
+ end
90
+ end
91
+
92
+ # Subscribe Event
93
+ class SubscribeEvent < Base
94
+ def emit_event_name
95
+ raise RuntimeError
96
+ end
97
+
98
+ def add_event_listener(listener, &block)
99
+ session.on(listen_event_name) do |subscribed, error|
100
+ session.off(listen_event_name)
101
+ block.call(subscribed, error) if block_given?
102
+ manager = SubscribedEvent.new(subscribed, session)
103
+ manager.add_event_listener(listener)
104
+ end
105
+ session.transmit(payload)
106
+ end
107
+
108
+ def listen_event_name
109
+ "request_#{request_id}"
110
+ end
111
+ end
112
+
113
+ # Subscribe Event
114
+ class SubscribedEvent < Base
115
+ def emit_event_name
116
+ "request_#{request_id}"
117
+ end
118
+
119
+ def emit_event(message)
120
+ session.emit(emit_event_name, message)
121
+ end
122
+
123
+ def add_event_listener(listener)
124
+ session.on(listen_event_name, listener)
125
+ end
126
+
127
+ def listen_event_name
128
+ "event_#{subscription_id}"
129
+ end
130
+ end
131
+
132
+ # Event Event
133
+ class EventEvent < Base
134
+ def emit_event_name
135
+ "event_#{subscription_id}"
136
+ end
137
+
138
+ def emit_event(message)
139
+ session.emit(emit_event_name, message)
140
+ end
141
+
142
+ def listen_event_name
143
+ raise NotImplementedError
144
+ end
145
+ end
146
+
147
+ # Publish Event
148
+ class PublishEvent < Base
149
+ def emit_event_name
150
+ raise NotImplementedError
151
+ end
152
+
153
+ def add_event_listener(&block)
154
+ session.transmit(payload)
155
+ return unless block_given?
156
+
157
+ session.on(listen_event_name) do |publication|
158
+ session.off(listen_event_name)
159
+ block.call(publication, nil)
160
+ end
161
+ end
162
+
163
+ def listen_event_name
164
+ "request_#{request_id}"
165
+ end
166
+ end
167
+
168
+ # Published Event
169
+ class PublishedEvent < Base
170
+ def emit_event_name
171
+ "request_#{request_id}"
172
+ end
173
+
174
+ def emit_event(message)
175
+ session.emit(emit_event_name, message)
176
+ end
177
+
178
+ def listen_event_name
179
+ "request_#{request_id}"
180
+ end
181
+ end
182
+
183
+ # Call Message Decorator
184
+ class CallEvent < Base
185
+ def listen_event_name
186
+ "request_#{request_id}"
187
+ end
188
+
189
+ def add_event_listener(&block)
190
+ session.on(listen_event_name) do |result, error|
191
+ session.off(listen_event_name)
192
+ block.call(result, error)
193
+ end
194
+ session.transmit(payload)
195
+ end
196
+ end
197
+
198
+ # Call Result Message Decorator
199
+ class ResultEvent < Base
200
+ def emit_event_name
201
+ "request_#{request_id}"
202
+ end
203
+ end
204
+
205
+ # Unregister Messagae Decorator
206
+ class UnregisterEvent < Base
207
+ def listen_event_name
208
+ "request_#{request_id}"
209
+ end
210
+
211
+ def add_event_listener(&block)
212
+ session.transmit(payload)
213
+ session.on(listen_event_name) do |unregistered, error|
214
+ block&.call(unregistered, error)
215
+ end
216
+ end
217
+ end
218
+
219
+ # Register Message Decorator
220
+ class RegisterEvent < Base
221
+ def listen_event_name
222
+ "request_#{request_id}"
223
+ end
224
+
225
+ def add_event_listener(handler, &block)
226
+ session.transmit(payload)
227
+ session.on(listen_event_name) do |registered, error|
228
+ session.off(listen_event_name)
229
+ manager = RegisteredEvent.new(registered, session)
230
+ manager.add_event_listener(handler)
231
+ block.call(registered, error)
232
+ end
233
+ end
234
+ end
235
+
236
+ # Registered Message Decorator
237
+ class RegisteredEvent < Base
238
+ def emit_event_name
239
+ "request_#{request_id}"
240
+ end
241
+
242
+ # Adding listener for invocation message
243
+ def listen_event_name
244
+ "registration_#{registration_id}"
245
+ end
246
+
247
+ def add_event_listener(handler)
248
+ session.on(listen_event_name) do |invocation|
249
+ result = handler.call(invocation)
250
+ message = Message::Yield.new(invocation.request_id, {}, result)
251
+ session.transmit(message.payload)
252
+ end
253
+ end
254
+ end
255
+
256
+ # Invocation Message Decorator
257
+ class InvocationEvent < Base
258
+ def emit_event_name
259
+ "registration_#{registration_id}"
260
+ end
261
+ end
262
+ end
263
+ end
@@ -0,0 +1,91 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "forwardable"
4
+
5
+ module Wamp
6
+ module Manager
7
+ # handles session
8
+ class Session
9
+ extend Forwardable
10
+
11
+ attr_reader :connection, :session_id
12
+
13
+ def initialize(connection)
14
+ @connection = connection
15
+ end
16
+
17
+ def session_id=(id)
18
+ if session_id
19
+ send_protocol_violation("Received WELCOME message after session was established")
20
+ else
21
+ @session_id = id
22
+ end
23
+ end
24
+
25
+ def send_protocol_violation(text, *args, **kwargs)
26
+ message = Message::Abort.new({ message: text }, "wamp.error.protocol_violation", *args, **kwargs)
27
+ manager = Manager::Event::Abort.new(message, self)
28
+ connection.transmit(message.payload)
29
+ manager.emit_event(message)
30
+ end
31
+
32
+ def subscribe(topic, handler, options = {}, &block)
33
+ message = Message::Subscribe.new(next_request_id, options, topic)
34
+ manager = Manager::Event::Subscribe.new(message, self)
35
+ manager.add_event_listener(handler, &block)
36
+ manager.subscription
37
+ end
38
+
39
+ def unsubscribe(subscription_id, &block)
40
+ message = Message::Unsubscribe.new(next_request_id, subscription_id)
41
+ Subscription.new(message, self, subscription_id).unsubscribe(&block)
42
+ end
43
+
44
+ def publish(topic, options = {}, *args, **kwargs, &block)
45
+ options = options.merge({ acknowledge: true }) if block_given?
46
+ message = Message::Publish.new(next_request_id, options, topic, *args, **kwargs)
47
+ Manager::Event::Publish.new(message, self).add_event_listener(&block)
48
+ end
49
+
50
+ def call(procedure, options = {}, *args, **kwargs, &block)
51
+ message = Message::Call.new(next_request_id, options, procedure, *args, **kwargs)
52
+ Manager::Event::Call.new(message, self).add_event_listener(&block)
53
+ end
54
+
55
+ def register(procedure, handler, options = {}, &block)
56
+ message = Message::Register.new(next_request_id, options, procedure)
57
+ Manager::Event::Register.new(message, self).add_event_listener(handler, &block)
58
+ end
59
+
60
+ def unregister(registration_id, &block)
61
+ message = Message::Unregister.new(next_request_id, registration_id)
62
+ Manager::Event::Unregister.new(message, self).add_event_listener(&block)
63
+ end
64
+
65
+ def on_message(message)
66
+ manager = Manager::Event.resolve(message, self)
67
+ manager.emit_event(message)
68
+ end
69
+
70
+ def create_request_id
71
+ next_request_id
72
+ end
73
+
74
+ private
75
+
76
+ def next_request_id
77
+ @next_request_id = create_request_id_generator unless defined?(@next_request_id)
78
+ @next_request_id.call
79
+ end
80
+
81
+ def create_request_id_generator
82
+ request_id = 0
83
+ -> { request_id += 1 }
84
+ end
85
+
86
+ def_delegators :@connection, :emit, :on, :close, :transmit, :my_listeners, :auth
87
+ def_delegator :auth, :authenticate
88
+ def_delegator :@connection, :remove_all_listeners, :off
89
+ end
90
+ end
91
+ end
@@ -0,0 +1,38 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Wamp
4
+ module Manager
5
+ # User facing subscripiton record
6
+ class Subscription
7
+ attr_accessor :subscription_id
8
+ attr_reader :message, :session
9
+
10
+ def initialize(message, session, subscription_id = nil)
11
+ @message = message
12
+ @session = session
13
+ @subscription_id = subscription_id
14
+ end
15
+
16
+ def subscribed?
17
+ !!subscription_id
18
+ end
19
+
20
+ def unsubscribe(&callback)
21
+ return false unless subscribed?
22
+
23
+ message = Wamp::Message::Unsubscribe.new(next_request_id, subscription_id)
24
+ manager = Wamp::Manager::Event::Unsubscribe.new(message, session)
25
+ manager.add_event_listener(callback)
26
+ end
27
+
28
+ def next_request_id
29
+ case message
30
+ when Wamp::Message::Subscribe
31
+ session.create_request_id
32
+ when Wamp::Message::Unsubscribe
33
+ message.request_id
34
+ end
35
+ end
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,12 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "manager/session"
4
+ require_relative "manager/event"
5
+ require_relative "manager/base"
6
+ require_relative "manager/connection"
7
+
8
+ module Wamp
9
+ # manager
10
+ module Manager
11
+ end
12
+ end
@@ -0,0 +1,67 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "forwardable"
4
+
5
+ module Wamp
6
+ module MessageHandler
7
+ # handles session
8
+ class Api
9
+ extend Forwardable
10
+
11
+ attr_reader :connection, :session_id, :id_gen
12
+
13
+ def initialize(connection)
14
+ @connection = connection
15
+ @id_gen = Wampproto::IdGenerator.new
16
+ end
17
+
18
+ def subscribe(topic, handler, options = {}, &block)
19
+ message = Wampproto::Message::Subscribe.new(next_request_id, options, topic)
20
+ action = MessageHandler::Subscribe.new(message, connection)
21
+ action.send_message(handler, &block)
22
+ end
23
+
24
+ def unsubscribe(subscription_id, &block)
25
+ subscription_id = connection.store[subscription_id] if connection.store.include?(subscription_id)
26
+
27
+ message = Wampproto::Message::Unsubscribe.new(next_request_id, subscription_id.to_i)
28
+ action = MessageHandler::Unsubscribe.new(message, connection)
29
+ action.send_message(&block)
30
+ end
31
+
32
+ def publish(topic, options = {}, *args, **kwargs, &block)
33
+ options = options.merge({ acknowledge: true }) if block_given?
34
+ message = Wampproto::Message::Publish.new(next_request_id, options, topic, *args, **kwargs)
35
+
36
+ action = MessageHandler::Publish.new(message, connection)
37
+ action.send_message(&block)
38
+ end
39
+
40
+ def call(procedure, options = {}, *args, **kwargs, &handler)
41
+ message = Wampproto::Message::Call.new(next_request_id, options, procedure, *args, **kwargs)
42
+
43
+ MessageHandler::Call.new(message, connection).send_message(handler)
44
+ end
45
+
46
+ def register(procedure, handler, options = {}, &block)
47
+ message = Wampproto::Message::Register.new(next_request_id, options, procedure)
48
+ action = MessageHandler::Register.new(message, connection)
49
+ action.send_message(handler, &block)
50
+ end
51
+
52
+ def unregister(registration_id, &block)
53
+ registration_id = connection.store[registration_id] if connection.store.include?(registration_id)
54
+
55
+ message = Wampproto::Message::Unregister.new(next_request_id, registration_id.to_i)
56
+ action = MessageHandler::Unregister.new(message, connection)
57
+ action.send_message(&block)
58
+ end
59
+
60
+ private
61
+
62
+ def next_request_id
63
+ id_gen.next
64
+ end
65
+ end
66
+ end
67
+ end
@@ -0,0 +1,65 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "forwardable"
4
+
5
+ module Wamp
6
+ module MessageHandler
7
+ # Result
8
+ class Base
9
+ extend Forwardable
10
+ attr_reader :message, :connection
11
+
12
+ def initialize(message, connection)
13
+ @message = message
14
+ @connection = connection
15
+ end
16
+
17
+ def handle
18
+ raise NotImplementedError
19
+ end
20
+
21
+ def send_message
22
+ raise NotImplementedError
23
+ end
24
+
25
+ private
26
+
27
+ def stored_data
28
+ @stored_data ||= store.delete(store_key) || {}
29
+ end
30
+
31
+ def store_key
32
+ "#{prefix}_#{identity}"
33
+ end
34
+
35
+ def prefix
36
+ "request"
37
+ end
38
+
39
+ def identity
40
+ message.request_id
41
+ end
42
+
43
+ def deliver_response(response)
44
+ callback = stored_data.fetch(:callback, proc {})
45
+ return unless callback
46
+
47
+ return callback.call(response) unless response.nil?
48
+
49
+ callback.call(message)
50
+ end
51
+
52
+ def validate_received_message
53
+ connection.session.receive_message(message)
54
+ end
55
+
56
+ def send_serialized(message)
57
+ connection.transmit session.send_message(message)
58
+ end
59
+
60
+ def_delegators :@connection, :store, :joiner, :session
61
+ # def_delegator :auth, :authenticate
62
+ # def_delegator :@connection, :remove_all_listeners, :off
63
+ end
64
+ end
65
+ end
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Wamp
4
+ module MessageHandler
5
+ # Call
6
+ class Call < Base
7
+ def send_message(handler)
8
+ store[store_key] = { handler: handler, callback: handler }
9
+
10
+ send_serialized message
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,12 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Wamp
4
+ module MessageHandler
5
+ # Challenge
6
+ class Challenge < Hello
7
+ def handle
8
+ connection.transmit connection.joiner.receive(connection.joiner.serializer.serialize(message))
9
+ end
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Wamp
4
+ module MessageHandler
5
+ # Call handler with error message
6
+ class Error < Base
7
+ def handle
8
+ validate_received_message
9
+
10
+ stored_data[:callback].call(response)
11
+ end
12
+
13
+ def response
14
+ Type::Error.new(uri: message.error, details: message.details)
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Wamp
4
+ module MessageHandler
5
+ # publish event to subscriber
6
+ class Event < Base
7
+ def handle
8
+ validate_received_message
9
+
10
+ store[alt_store_key].fetch(:handler).call(message)
11
+ end
12
+
13
+ def alt_store_key
14
+ "subscription_#{message.subscription_id}"
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Wamp
4
+ module MessageHandler
5
+ # send unregister message
6
+ class Goodbye < Base
7
+ def send_message(&callback)
8
+ store[store_key] = { callback: callback }
9
+
10
+ send_serialized message
11
+ end
12
+
13
+ def handle
14
+ goodbye = Wampproto::Message::Goodbye.new({}, "wamp.close.goodbye_and_out")
15
+ send_serialized goodbye
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Wamp
4
+ module MessageHandler
5
+ # Hello
6
+ class Hello < Base
7
+ def handle
8
+ msg, is_welcome = connection.acceptor.receive(connection.serializer.serialize(message))
9
+ connection.transmit msg
10
+ connection.router.attach_client(connection) if is_welcome
11
+ end
12
+
13
+ def send_message
14
+ connection.transmit connection.joiner.send_hello
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,35 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Wamp
4
+ module MessageHandler
5
+ # Call
6
+ class Invocation < Base
7
+ def handle
8
+ connection.session.receive_message(message)
9
+ data = store.fetch(alt_store_key)
10
+
11
+ send_yield_message data.fetch(:handler)
12
+ end
13
+
14
+ def alt_store_key
15
+ "registration_#{message.registration_id}"
16
+ end
17
+
18
+ def invocation_response
19
+ Type::Invocation.new(args: message.args, kwargs: message.kwargs, details: message.details)
20
+ end
21
+
22
+ private
23
+
24
+ def send_yield_message(handler)
25
+ result = handler.call(invocation_response)
26
+ yield_message = if result.instance_of?(Type::Result)
27
+ Wampproto::Message::Yield.new(message.request_id, result.details, *result.args, **result.kwargs)
28
+ else
29
+ Wampproto::Message::Yield.new(message.request_id, {}, result)
30
+ end
31
+ send_serialized yield_message
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Wamp
4
+ module MessageHandler
5
+ # Publish message
6
+ class Publish < Base
7
+ def send_message(&callback)
8
+ store[store_key] = { callback: callback } if message.options[:acknowledge]
9
+
10
+ send_serialized message
11
+ end
12
+ end
13
+ end
14
+ end