wamp_client 0.1.4 → 0.2.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 +4 -4
- data/README.md +34 -32
- data/lib/wamp/client/auth.rb +0 -27
- data/lib/wamp/client/check.rb +0 -27
- data/lib/wamp/client/connection.rb +40 -113
- data/lib/wamp/client/event.rb +78 -0
- data/lib/wamp/client/manager/base.rb +39 -0
- data/lib/wamp/client/manager/base_multiple.rb +37 -0
- data/lib/wamp/client/manager/establish.rb +168 -0
- data/lib/wamp/client/manager/registration.rb +183 -0
- data/lib/wamp/client/manager/require.rb +3 -0
- data/lib/wamp/client/manager/subscription.rb +55 -0
- data/lib/wamp/client/request/base.rb +125 -0
- data/lib/wamp/client/request/call.rb +111 -0
- data/lib/wamp/client/request/publish.rb +72 -0
- data/lib/wamp/client/request/register.rb +79 -0
- data/lib/wamp/client/request/require.rb +6 -0
- data/lib/wamp/client/request/subscribe.rb +78 -0
- data/lib/wamp/client/request/unregister.rb +71 -0
- data/lib/wamp/client/request/unsubscribe.rb +72 -0
- data/lib/wamp/client/response.rb +136 -0
- data/lib/wamp/client/serializer.rb +0 -29
- data/lib/wamp/client/session.rb +172 -839
- data/lib/wamp/client/transport/base.rb +4 -77
- data/lib/wamp/client/transport/event_machine_base.rb +0 -27
- data/lib/wamp/client/transport/faye_web_socket.rb +4 -31
- data/lib/wamp/client/transport/web_socket_event_machine.rb +3 -30
- data/lib/wamp/client/version.rb +1 -28
- data/lib/wamp/client.rb +1 -28
- data/spec/spec_helper.rb +3 -137
- data/spec/support/faye_web_socket_client_stub.rb +43 -0
- data/spec/support/test_transport.rb +50 -0
- data/spec/support/web_socket_event_machine_client_stub.rb +39 -0
- data/spec/wamp/client/connection_spec.rb +4 -4
- data/spec/wamp/client/session_spec.rb +135 -135
- data/spec/wamp/client/transport_spec.rb +2 -2
- data/wamp_client.gemspec +10 -9
- metadata +59 -38
- data/lib/wamp/client/defer.rb +0 -70
@@ -0,0 +1,168 @@
|
|
1
|
+
require_relative "base"
|
2
|
+
|
3
|
+
module Wamp
|
4
|
+
module Client
|
5
|
+
module Manager
|
6
|
+
|
7
|
+
class Establish < Base
|
8
|
+
attr_accessor :goodbye_sent, :id, :realm
|
9
|
+
|
10
|
+
WAMP_FEATURES = {
|
11
|
+
caller: {
|
12
|
+
features: {
|
13
|
+
caller_identification: true,
|
14
|
+
call_timeout: true,
|
15
|
+
call_canceling: true,
|
16
|
+
progressive_call_results: true
|
17
|
+
}
|
18
|
+
},
|
19
|
+
callee: {
|
20
|
+
features: {
|
21
|
+
caller_identification: true,
|
22
|
+
##call_trustlevels: true,
|
23
|
+
pattern_based_registration: true,
|
24
|
+
shared_registration: true,
|
25
|
+
##call_timeout: true,
|
26
|
+
call_canceling: true,
|
27
|
+
progressive_call_results: true,
|
28
|
+
registration_revocation: true
|
29
|
+
}
|
30
|
+
},
|
31
|
+
publisher: {
|
32
|
+
features: {
|
33
|
+
publisher_identification: true,
|
34
|
+
subscriber_blackwhite_listing: true,
|
35
|
+
publisher_exclusion: true
|
36
|
+
}
|
37
|
+
},
|
38
|
+
subscriber: {
|
39
|
+
features: {
|
40
|
+
publisher_identification: true,
|
41
|
+
##publication_trustlevels: true,
|
42
|
+
pattern_based_subscription: true,
|
43
|
+
subscription_revocation: true
|
44
|
+
##event_history: true,
|
45
|
+
}
|
46
|
+
}
|
47
|
+
}
|
48
|
+
|
49
|
+
# Constructor
|
50
|
+
#
|
51
|
+
def initialize(session, send_message)
|
52
|
+
super session, send_message
|
53
|
+
|
54
|
+
self.id = nil
|
55
|
+
self.realm = nil
|
56
|
+
self.goodbye_sent = false
|
57
|
+
end
|
58
|
+
|
59
|
+
# Returns true if the session is open
|
60
|
+
#
|
61
|
+
def is_open?
|
62
|
+
self.id != nil
|
63
|
+
end
|
64
|
+
|
65
|
+
# Will attempt to join a router
|
66
|
+
#
|
67
|
+
def join(realm)
|
68
|
+
|
69
|
+
# Set the realm
|
70
|
+
self.realm = realm
|
71
|
+
|
72
|
+
# Create the details
|
73
|
+
details = {}
|
74
|
+
details[:roles] = WAMP_FEATURES
|
75
|
+
details[:agent] = "Ruby-Wamp::Client-#{VERSION}"
|
76
|
+
details[:authid] = self.session.options[:authid] if self.session.options[:authid]
|
77
|
+
details[:authmethods] = self.session.options[:authmethods] if self.session.options[:authmethods]
|
78
|
+
|
79
|
+
# Create the message
|
80
|
+
hello = Message::Hello.new(realm, details)
|
81
|
+
|
82
|
+
# Send it
|
83
|
+
send_message(hello)
|
84
|
+
end
|
85
|
+
|
86
|
+
# Leave the session
|
87
|
+
def leave(reason, message)
|
88
|
+
|
89
|
+
# Create the details
|
90
|
+
details = {}
|
91
|
+
details[:message] = message
|
92
|
+
|
93
|
+
# Create the goobdbye message
|
94
|
+
goodbye = Message::Goodbye.new(details, reason)
|
95
|
+
|
96
|
+
# Send it
|
97
|
+
send_message(goodbye)
|
98
|
+
|
99
|
+
# Send it
|
100
|
+
self.goodbye_sent = true
|
101
|
+
end
|
102
|
+
|
103
|
+
# Handles the goodbye message
|
104
|
+
#
|
105
|
+
def goodbye(message)
|
106
|
+
# If we didn't send the goodbye, respond
|
107
|
+
unless self.goodbye_sent
|
108
|
+
goodbye = Message::Goodbye.new({}, 'wamp.error.goodbye_and_out')
|
109
|
+
send_message(goodbye)
|
110
|
+
end
|
111
|
+
|
112
|
+
# Close out session
|
113
|
+
self.id = nil
|
114
|
+
self.realm = nil
|
115
|
+
self.goodbye_sent = false
|
116
|
+
|
117
|
+
# Trigger leave event
|
118
|
+
trigger :leave, message.reason, message.details
|
119
|
+
end
|
120
|
+
|
121
|
+
# Handles the welcome message
|
122
|
+
#
|
123
|
+
def welcome(message)
|
124
|
+
# Get the session ID
|
125
|
+
self.id = message.session
|
126
|
+
|
127
|
+
# Log the message
|
128
|
+
logger.info("#{self.session.class.name} joined session with realm '#{message.details[:realm]}'")
|
129
|
+
|
130
|
+
# Trigger join event
|
131
|
+
trigger :join, message.details
|
132
|
+
end
|
133
|
+
|
134
|
+
# Handles a challenge message
|
135
|
+
#
|
136
|
+
def challenge(message)
|
137
|
+
# Log challenge received
|
138
|
+
logger.debug("#{self.session.class.name} auth challenge '#{message.authmethod}', extra: #{message.extra}")
|
139
|
+
|
140
|
+
# Call the callback if set
|
141
|
+
signature, extra = trigger :challenge, message.authmethod, message.extra
|
142
|
+
|
143
|
+
# Set with initial values
|
144
|
+
signature ||= ''
|
145
|
+
extra ||= {}
|
146
|
+
|
147
|
+
# Create the message
|
148
|
+
authenticate = Message::Authenticate.new(signature, extra)
|
149
|
+
|
150
|
+
# Send it
|
151
|
+
send_message(authenticate)
|
152
|
+
end
|
153
|
+
|
154
|
+
# Handles an abort message
|
155
|
+
#
|
156
|
+
def abort(message)
|
157
|
+
# Log leaving the session
|
158
|
+
logger.info("#{self.session.class.name} left session '#{message.reason}'")
|
159
|
+
|
160
|
+
# Trigger the leave event
|
161
|
+
trigger :leave, message.reason, message.details
|
162
|
+
end
|
163
|
+
|
164
|
+
end
|
165
|
+
|
166
|
+
end
|
167
|
+
end
|
168
|
+
end
|
@@ -0,0 +1,183 @@
|
|
1
|
+
require_relative "base_multiple"
|
2
|
+
require 'wamp/client/response'
|
3
|
+
|
4
|
+
module Wamp
|
5
|
+
module Client
|
6
|
+
module Manager
|
7
|
+
|
8
|
+
class RegistrationObject
|
9
|
+
attr_accessor :procedure, :handler, :i_handler, :options, :session, :id
|
10
|
+
|
11
|
+
def initialize(procedure, handler, options, i_handler, session, id)
|
12
|
+
self.procedure = procedure
|
13
|
+
self.handler = handler
|
14
|
+
self.options = options
|
15
|
+
self.i_handler = i_handler
|
16
|
+
self.session = session
|
17
|
+
self.id = id
|
18
|
+
end
|
19
|
+
|
20
|
+
def unregister
|
21
|
+
self.session.unregister(self)
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
25
|
+
|
26
|
+
class Registration < BaseMultiple
|
27
|
+
attr_reader :defers
|
28
|
+
|
29
|
+
# Constructor
|
30
|
+
#
|
31
|
+
# @param session [Wamp::Client::Session] - The session
|
32
|
+
# @param success [Block] - A block to run when the request was successful
|
33
|
+
def initialize(session, send_message)
|
34
|
+
super session, send_message
|
35
|
+
@defers = {}
|
36
|
+
end
|
37
|
+
|
38
|
+
# Processes an incoming call
|
39
|
+
#
|
40
|
+
# @param message [Message::Event] - The incoming invoke message
|
41
|
+
def invoke(message)
|
42
|
+
|
43
|
+
# Get the arguments
|
44
|
+
registration_id = message.registered_registration
|
45
|
+
request_id = message.request
|
46
|
+
args = message.call_arguments || []
|
47
|
+
kwargs = message.call_argumentskw || {}
|
48
|
+
|
49
|
+
# If we have a registration, execute it
|
50
|
+
registration = self.objects[registration_id]
|
51
|
+
if registration
|
52
|
+
|
53
|
+
# Create the details
|
54
|
+
details = message.details || {}
|
55
|
+
details[:request] = request_id
|
56
|
+
details[:procedure] = registration.procedure
|
57
|
+
details[:session] = self
|
58
|
+
|
59
|
+
handler = registration.handler
|
60
|
+
if handler
|
61
|
+
# Use the invoke wrapper to process the result
|
62
|
+
value = Response.invoke_handler do
|
63
|
+
handler.call(args, kwargs, details)
|
64
|
+
end
|
65
|
+
|
66
|
+
# If a defer was returned, handle accordingly
|
67
|
+
if value.is_a? Response::CallDefer
|
68
|
+
value.request = request_id
|
69
|
+
value.registration = registration_id
|
70
|
+
|
71
|
+
# Store the defer
|
72
|
+
self.defers[request_id] = value
|
73
|
+
|
74
|
+
# On complete, send the result
|
75
|
+
value.on :complete do |defer, result|
|
76
|
+
result = Response::CallResult.ensure(result)
|
77
|
+
self.yield(defer.request, result, {}, true)
|
78
|
+
end
|
79
|
+
|
80
|
+
# On error, send the error
|
81
|
+
value.on :error do |defer, error|
|
82
|
+
error = Response::CallError.ensure(error)
|
83
|
+
self.yield(defer.request, error, {}, true)
|
84
|
+
end
|
85
|
+
|
86
|
+
# For progressive, return the progress
|
87
|
+
if value.is_a? Response::ProgressiveCallDefer
|
88
|
+
value.on :progress do |defer, result|
|
89
|
+
result = Response::CallResult.ensure(result)
|
90
|
+
self.yield(defer.request, result, { progress: true }, true)
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
# Else it was a normal response
|
95
|
+
else
|
96
|
+
self.yield(request_id, value)
|
97
|
+
end
|
98
|
+
end
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
# Processes a yield request
|
103
|
+
#
|
104
|
+
def yield(request_id, result, options={}, check_defer=false)
|
105
|
+
# Prevent responses for defers that have already completed or had an error
|
106
|
+
if check_defer and not self.defers[request_id]
|
107
|
+
return
|
108
|
+
end
|
109
|
+
|
110
|
+
# Wrap the result accordingly
|
111
|
+
result = Response::CallResult.ensure(result, allow_error: true)
|
112
|
+
|
113
|
+
# Send either the error or the response
|
114
|
+
if result.is_a?(Response::CallError)
|
115
|
+
send_error(request_id, result)
|
116
|
+
else
|
117
|
+
yield_msg = Message::Yield.new(request_id, options, result.args, result.kwargs)
|
118
|
+
send_message(yield_msg)
|
119
|
+
end
|
120
|
+
|
121
|
+
# Remove the defer if this was not a progress update
|
122
|
+
if check_defer and not options[:progress]
|
123
|
+
self.defers.delete(request_id)
|
124
|
+
end
|
125
|
+
|
126
|
+
end
|
127
|
+
|
128
|
+
# Call Interrupt Handler
|
129
|
+
#
|
130
|
+
def interrupt(message)
|
131
|
+
|
132
|
+
# Get parameters
|
133
|
+
request_id = message.invocation_request
|
134
|
+
mode = message.options[:mode]
|
135
|
+
|
136
|
+
# Check if we have a pending request
|
137
|
+
defer = self.defers[request_id]
|
138
|
+
if defer
|
139
|
+
registration = self.objects[defer.registration]
|
140
|
+
if registration
|
141
|
+
# If it exists, call the interrupt handler to inform it of the interrupt
|
142
|
+
i_handler = registration.i_handler
|
143
|
+
error = nil
|
144
|
+
if i_handler
|
145
|
+
error = Response.invoke_handler error: true do
|
146
|
+
i_handler.call(request_id, mode)
|
147
|
+
end
|
148
|
+
|
149
|
+
# Add a default reason if none was supplied
|
150
|
+
error.args << "interrupt" if error.args.count == 0
|
151
|
+
end
|
152
|
+
|
153
|
+
# Send the error back to the client
|
154
|
+
send_error(request_id, error)
|
155
|
+
end
|
156
|
+
|
157
|
+
# Delete the defer
|
158
|
+
self.defers.delete(request_id)
|
159
|
+
end
|
160
|
+
|
161
|
+
end
|
162
|
+
|
163
|
+
private
|
164
|
+
|
165
|
+
def send_error(request_id, error)
|
166
|
+
# Make sure the response is an error
|
167
|
+
error = Response::CallError.ensure(error)
|
168
|
+
|
169
|
+
# Create error message
|
170
|
+
error_msg = Message::Error.new(
|
171
|
+
Message::Types::INVOCATION,
|
172
|
+
request_id, {},
|
173
|
+
error.error, error.args, error.kwargs)
|
174
|
+
|
175
|
+
# Send it
|
176
|
+
send_message(error_msg)
|
177
|
+
end
|
178
|
+
|
179
|
+
end
|
180
|
+
|
181
|
+
end
|
182
|
+
end
|
183
|
+
end
|
@@ -0,0 +1,55 @@
|
|
1
|
+
require_relative "base_multiple"
|
2
|
+
|
3
|
+
module Wamp
|
4
|
+
module Client
|
5
|
+
module Manager
|
6
|
+
|
7
|
+
class SubscriptionObject
|
8
|
+
attr_accessor :topic, :handler, :options, :session, :id
|
9
|
+
|
10
|
+
def initialize(topic, handler, options, session, id)
|
11
|
+
self.topic = topic
|
12
|
+
self.handler = handler
|
13
|
+
self.options = options
|
14
|
+
self.session = session
|
15
|
+
self.id = id
|
16
|
+
end
|
17
|
+
|
18
|
+
def unsubscribe
|
19
|
+
self.session.unsubscribe(self)
|
20
|
+
end
|
21
|
+
|
22
|
+
end
|
23
|
+
|
24
|
+
class Subscription < BaseMultiple
|
25
|
+
|
26
|
+
# Processes and incoming event
|
27
|
+
#
|
28
|
+
# @param message [Message::Event] - The incoming event message
|
29
|
+
def event(message)
|
30
|
+
|
31
|
+
# Get the arguments
|
32
|
+
subscription_id = message.subscribed_subscription
|
33
|
+
args = message.publish_arguments || []
|
34
|
+
kwargs = message.publish_argumentskw || {}
|
35
|
+
|
36
|
+
# If we have a subscription, execute it
|
37
|
+
subscription = self.objects[subscription_id]
|
38
|
+
if subscription
|
39
|
+
|
40
|
+
# Create the detials
|
41
|
+
details = message.details || {}
|
42
|
+
details[:publication] = message.published_publication
|
43
|
+
details[:topic] = subscription.topic
|
44
|
+
details[:session] = self.session
|
45
|
+
|
46
|
+
# Call the handler
|
47
|
+
handler = subscription.handler
|
48
|
+
handler.call(args, kwargs, details) if handler
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
@@ -0,0 +1,125 @@
|
|
1
|
+
module Wamp
|
2
|
+
module Client
|
3
|
+
module Request
|
4
|
+
|
5
|
+
class Message::Error
|
6
|
+
def request_id
|
7
|
+
self.request_request
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
# The request base class is used to abstract all of the requests that
|
12
|
+
# will go to the broker/dealer. The model supports a request followed
|
13
|
+
# by a response that is either a "success" or an error
|
14
|
+
class Base
|
15
|
+
attr_reader :requests, :session, :send_message_callback, :on_success
|
16
|
+
|
17
|
+
# Constructor
|
18
|
+
#
|
19
|
+
# @param session [Wamp::Client::Session] - The session
|
20
|
+
# @param send_message [lambda] - A lambda to send the message
|
21
|
+
# @param success [Block] - A block to run when the request was successful
|
22
|
+
def initialize(session, send_message, &on_success)
|
23
|
+
@requests = {}
|
24
|
+
@session = session
|
25
|
+
@send_message_callback = send_message
|
26
|
+
@on_success = on_success
|
27
|
+
end
|
28
|
+
|
29
|
+
# Generates a new ID for the request according to the specification
|
30
|
+
# (Section 5.1.2)
|
31
|
+
#
|
32
|
+
# @param [Int] - A new ID
|
33
|
+
def generate_id
|
34
|
+
rand(0..9007199254740992)
|
35
|
+
end
|
36
|
+
|
37
|
+
# Makes the request to the broker/dealer
|
38
|
+
#
|
39
|
+
# @return [Int] - request_id
|
40
|
+
def request(*args, &callback)
|
41
|
+
|
42
|
+
# Generate an ID
|
43
|
+
request_id = self.generate_id
|
44
|
+
|
45
|
+
# Get the unique lookup/message for the request
|
46
|
+
lookup, message = self.create_request(request_id, *args, &callback)
|
47
|
+
|
48
|
+
# Store in the pending requests
|
49
|
+
self.requests[request_id] = lookup if lookup
|
50
|
+
|
51
|
+
# Send the message
|
52
|
+
send_message(message)
|
53
|
+
|
54
|
+
request_id
|
55
|
+
end
|
56
|
+
|
57
|
+
# Called when the response was a success
|
58
|
+
#
|
59
|
+
def success(message)
|
60
|
+
# Get the request_id
|
61
|
+
request_id = message.request_id
|
62
|
+
|
63
|
+
# Get the lookup
|
64
|
+
lookup = self.requests[request_id]
|
65
|
+
|
66
|
+
# Parse the result
|
67
|
+
callback, result, details, should_keep = self.process_success(message, lookup)
|
68
|
+
|
69
|
+
if callback and details
|
70
|
+
# Add items to details
|
71
|
+
details[:session] = self.session
|
72
|
+
|
73
|
+
# Call the callback
|
74
|
+
callback.call(result, nil, details) if callback
|
75
|
+
end
|
76
|
+
|
77
|
+
# Delete if "should_keep" if false
|
78
|
+
self.requests.delete(request_id) unless should_keep
|
79
|
+
end
|
80
|
+
|
81
|
+
def error(message)
|
82
|
+
# Get the request_id
|
83
|
+
request_id = message.request_id
|
84
|
+
|
85
|
+
# Get the lookup
|
86
|
+
lookup = self.requests.delete(request_id)
|
87
|
+
|
88
|
+
# Parse the result
|
89
|
+
callback, details = self.process_error(message, lookup)
|
90
|
+
|
91
|
+
if callback and details
|
92
|
+
# Add items to details
|
93
|
+
details[:session] = self.session
|
94
|
+
|
95
|
+
# Create the error
|
96
|
+
error = Response::CallError.from_message(message)
|
97
|
+
|
98
|
+
# Call the callback
|
99
|
+
callback.call(nil, error.to_hash, details) if callback
|
100
|
+
end
|
101
|
+
end
|
102
|
+
|
103
|
+
#region Override Methods
|
104
|
+
def create_request(*args)
|
105
|
+
end
|
106
|
+
|
107
|
+
def process_success(message, lookup)
|
108
|
+
end
|
109
|
+
|
110
|
+
def process_error(message, lookup)
|
111
|
+
end
|
112
|
+
#endregion
|
113
|
+
|
114
|
+
private
|
115
|
+
|
116
|
+
# Sends a message
|
117
|
+
#
|
118
|
+
def send_message(message)
|
119
|
+
self.send_message_callback.call(message) if self.send_message_callback
|
120
|
+
end
|
121
|
+
|
122
|
+
end
|
123
|
+
end
|
124
|
+
end
|
125
|
+
end
|
@@ -0,0 +1,111 @@
|
|
1
|
+
require_relative "base"
|
2
|
+
require "wamp/client/message"
|
3
|
+
|
4
|
+
module Wamp
|
5
|
+
module Client
|
6
|
+
module Request
|
7
|
+
|
8
|
+
class Message::Result
|
9
|
+
def request_id
|
10
|
+
self.call_request
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
class CallObject
|
15
|
+
attr_accessor :session, :id
|
16
|
+
|
17
|
+
def initialize(session, id)
|
18
|
+
self.session = session
|
19
|
+
self.id = id
|
20
|
+
end
|
21
|
+
|
22
|
+
def cancel(mode='skip')
|
23
|
+
self.session.cancel(self, mode)
|
24
|
+
end
|
25
|
+
|
26
|
+
end
|
27
|
+
|
28
|
+
class Call < Base
|
29
|
+
|
30
|
+
# Method specific to this request that will cancel it
|
31
|
+
#
|
32
|
+
def cancel(request_id, mode='skip')
|
33
|
+
|
34
|
+
# If the request is still in flight
|
35
|
+
if self.requests[request_id]
|
36
|
+
# Create the message
|
37
|
+
message = Message::Cancel.new(request_id, { mode: mode })
|
38
|
+
|
39
|
+
# Send it
|
40
|
+
send_message(message)
|
41
|
+
end
|
42
|
+
|
43
|
+
end
|
44
|
+
|
45
|
+
def create_request(request_id, procedure, args=nil, kwargs=nil, options={}, &callback)
|
46
|
+
|
47
|
+
# Create the lookup
|
48
|
+
lookup = {p: procedure, a: args, k: kwargs, o: options, c: callback}
|
49
|
+
|
50
|
+
# Create the message
|
51
|
+
message = Message::Call.new(request_id, options, procedure, args, kwargs)
|
52
|
+
|
53
|
+
# Return
|
54
|
+
[lookup, message]
|
55
|
+
end
|
56
|
+
|
57
|
+
def process_success(message, lookup)
|
58
|
+
if lookup
|
59
|
+
# Get the params
|
60
|
+
procedure = lookup[:p]
|
61
|
+
options = lookup[:o] || {}
|
62
|
+
callback = lookup[:c]
|
63
|
+
|
64
|
+
# Create the details
|
65
|
+
details = message.details || {}
|
66
|
+
details[:procedure] = procedure unless details[:procedure]
|
67
|
+
details[:type] = 'call'
|
68
|
+
|
69
|
+
# Set the should keep flag if this is a progress message
|
70
|
+
should_keep = details[:progress]
|
71
|
+
|
72
|
+
# Only return the information if not progress or receive progress is true
|
73
|
+
if not details[:progress] or (details[:progress] and options[:receive_progress])
|
74
|
+
|
75
|
+
# Create the response
|
76
|
+
result = Response::CallResult.from_yield_message(message)
|
77
|
+
|
78
|
+
# Return the values
|
79
|
+
[callback, result.to_hash, details, should_keep]
|
80
|
+
|
81
|
+
else
|
82
|
+
[nil, nil, nil, should_keep]
|
83
|
+
end
|
84
|
+
else
|
85
|
+
[nil, nil, nil]
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
def process_error(message, lookup)
|
90
|
+
if lookup
|
91
|
+
# Get the params
|
92
|
+
procedure = lookup[:p]
|
93
|
+
callback = lookup[:c]
|
94
|
+
|
95
|
+
# Create the details
|
96
|
+
details = message.details || {}
|
97
|
+
details[:procedure] = procedure unless details[:procedure]
|
98
|
+
details[:type] = 'call'
|
99
|
+
|
100
|
+
# Return the values
|
101
|
+
[callback, details]
|
102
|
+
else
|
103
|
+
[nil, nil]
|
104
|
+
end
|
105
|
+
end
|
106
|
+
|
107
|
+
end
|
108
|
+
|
109
|
+
end
|
110
|
+
end
|
111
|
+
end
|