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.
- checksums.yaml +7 -0
- data/.rspec +3 -0
- data/.rubocop.yml +29 -0
- data/CHANGELOG.md +5 -0
- data/LICENSE +22 -0
- data/Makefile +9 -0
- data/README.md +2 -0
- data/Rakefile +14 -0
- data/bin/xconn +79 -0
- data/docs/index.md +7 -0
- data/docs/installation.md +11 -0
- data/example/sample/example.rb +23 -0
- data/example/sample/included_app.rb +12 -0
- data/lib/tasks/tasks.rake +24 -0
- data/lib/wamp/app.rb +39 -0
- data/lib/wamp/connection/session.rb +35 -0
- data/lib/wamp/connection/stream.rb +68 -0
- data/lib/wamp/connection/websocket_client.rb +137 -0
- data/lib/wamp/connection/websocket_connection.rb +52 -0
- data/lib/wamp/manager/base.rb +41 -0
- data/lib/wamp/manager/connection.rb +32 -0
- data/lib/wamp/manager/event/abort.rb +21 -0
- data/lib/wamp/manager/event/authenticate.rb +14 -0
- data/lib/wamp/manager/event/base.rb +41 -0
- data/lib/wamp/manager/event/call.rb +40 -0
- data/lib/wamp/manager/event/challenge.rb +26 -0
- data/lib/wamp/manager/event/error.rb +30 -0
- data/lib/wamp/manager/event/event.rb +20 -0
- data/lib/wamp/manager/event/goodbye.rb +18 -0
- data/lib/wamp/manager/event/hello.rb +38 -0
- data/lib/wamp/manager/event/invocation.rb +24 -0
- data/lib/wamp/manager/event/publish.rb +22 -0
- data/lib/wamp/manager/event/published.rb +13 -0
- data/lib/wamp/manager/event/register.rb +30 -0
- data/lib/wamp/manager/event/registered.rb +37 -0
- data/lib/wamp/manager/event/result.rb +13 -0
- data/lib/wamp/manager/event/subscribe.rb +39 -0
- data/lib/wamp/manager/event/subscribed.rb +26 -0
- data/lib/wamp/manager/event/unregister.rb +19 -0
- data/lib/wamp/manager/event/unregistered.rb +13 -0
- data/lib/wamp/manager/event/unsubscribe.rb +29 -0
- data/lib/wamp/manager/event/unsubscribed.rb +13 -0
- data/lib/wamp/manager/event/welcome.rb +21 -0
- data/lib/wamp/manager/event/yield.rb +13 -0
- data/lib/wamp/manager/event.rb +60 -0
- data/lib/wamp/manager/hello_event.rb +263 -0
- data/lib/wamp/manager/session.rb +91 -0
- data/lib/wamp/manager/subscription.rb +38 -0
- data/lib/wamp/manager.rb +12 -0
- data/lib/wamp/message_handler/api.rb +67 -0
- data/lib/wamp/message_handler/base.rb +65 -0
- data/lib/wamp/message_handler/call.rb +14 -0
- data/lib/wamp/message_handler/challenge.rb +12 -0
- data/lib/wamp/message_handler/error.rb +18 -0
- data/lib/wamp/message_handler/event.rb +18 -0
- data/lib/wamp/message_handler/goodbye.rb +19 -0
- data/lib/wamp/message_handler/hello.rb +18 -0
- data/lib/wamp/message_handler/invocation.rb +35 -0
- data/lib/wamp/message_handler/publish.rb +14 -0
- data/lib/wamp/message_handler/published.rb +18 -0
- data/lib/wamp/message_handler/register.rb +14 -0
- data/lib/wamp/message_handler/registered.rb +30 -0
- data/lib/wamp/message_handler/result.rb +17 -0
- data/lib/wamp/message_handler/subscribe.rb +14 -0
- data/lib/wamp/message_handler/subscribed.rb +30 -0
- data/lib/wamp/message_handler/unregister.rb +14 -0
- data/lib/wamp/message_handler/unregistered.rb +32 -0
- data/lib/wamp/message_handler/unsubscribe.rb +14 -0
- data/lib/wamp/message_handler/unsubscribed.rb +33 -0
- data/lib/wamp/message_handler/welcome.rb +12 -0
- data/lib/wamp/message_handler.rb +75 -0
- data/lib/wamp/router/base.rb +45 -0
- data/lib/wamp/router/client.rb +55 -0
- data/lib/wamp/router/connection.rb +150 -0
- data/lib/wamp/router/realm.rb +92 -0
- data/lib/wamp/router/server.rb +83 -0
- data/lib/wamp/router.rb +12 -0
- data/lib/wamp/serializer/cbor.rb +18 -0
- data/lib/wamp/serializer/json.rb +18 -0
- data/lib/wamp/serializer/message_pack.rb +18 -0
- data/lib/wamp/serializer.rb +5 -0
- data/lib/wamp/type/error.rb +24 -0
- data/lib/wamp/type/event.rb +16 -0
- data/lib/wamp/type/invocation.rb +16 -0
- data/lib/wamp/type/publication.rb +14 -0
- data/lib/wamp/type/registration.rb +14 -0
- data/lib/wamp/type/result.rb +16 -0
- data/lib/wamp/type/subscription.rb +14 -0
- data/lib/wamp/type/success.rb +8 -0
- data/lib/wamp/type.rb +16 -0
- data/lib/wamp/version.rb +5 -0
- data/lib/wamp.rb +15 -0
- data/mkdocs.yml +67 -0
- data/sig/wamp/serializer/json.rbs +10 -0
- data/sig/wamp.rbs +11 -0
- data/wamp.gemspec +40 -0
- 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
|
data/lib/wamp/manager.rb
ADDED
|
@@ -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,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
|