-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathtransport.rb
96 lines (86 loc) · 2.28 KB
/
transport.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
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
require 'wamp_client'
require 'eventmachine'
class Transport
class << self
include Configurable
end
include Configurable
inherit_configuration_from Transport
include EM::Deferrable
alias_method :once_joined, :callback
def initialize
begin
@wamp_client = WampClient::Connection.new configuration.wamp
@wamp_client.on_join { |session, _| succeed session }
rescue Exception => e
abort e
require 'pry'; binding.pry
end
end
def open
@thread = Thread.new { @wamp_client.open }
self
end
def ready?
@deferred_status == :succeeded
end
def uri
configuration.wamp[:uri]
end
def subscribe topic
handler = lambda do |args, kwargs, details|
yield *args, **kwargs
end
once_joined do |session|
session.subscribe topic, handler do |subscription, error, details|
abort error if error
end
end
end
def unsubscribe subscription
once_joined do |session|
session.unsubscribe subscription do |subscription, error, details|
abort error if error
end
end
end
def call rpc, args: nil, kwargs: nil
result = EM::DefaultDeferrable.new
once_joined do |session|
session.call rpc, args, kwargs do |response, error, details|
result.fail error if error
result.succeed response
end
end
result
end
# When `rpc` is invoked, the block given will be called and its result will
# be sent to the caller. If the block returns a `Deferrable`, the transport
# will register itself as a callback to receive an async result.
def register rpc
handler = lambda do |args, kwargs, details|
begin
result = yield *args, **kwargs
rescue => e
$stderr.puts e.message
$stderr.puts e.backtrace
raise e
end
if result.is_a? EM::Deferrable
WampClient::Defer::CallDefer.new.tap do |defer|
result.callback &defer.method(:succeed)
result.errback &defer.method(:fail)
#result.callback { |r| defer.succeed r }
#result.errback { |r| defer.fail r }
end
else
result
end
end
once_joined do |session|
session.register rpc, handler do |registration, error, details|
abort error if error
end
end
end
end