combi 0.0.8 → 0.0.9
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/lib/combi/buses/http.rb +4 -2
- data/lib/combi/buses/in_process.rb +22 -19
- data/lib/combi/buses/queue.rb +18 -18
- data/lib/combi/buses/web_socket.rb +10 -6
- data/lib/combi/helpers.rb +6 -2
- data/lib/combi/queue_service.rb +1 -2
- data/lib/combi/reactor.rb +8 -5
- data/lib/combi/response_store.rb +8 -3
- data/lib/combi/version.rb +1 -1
- data/spec/shared_examples/standard_bus.rb +19 -0
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 842db51c04bfe53f9a03dee7e7a7dcd1c82d7256
|
4
|
+
data.tar.gz: a18fba47f8b819d81f994a2afbe7d2243a459b6b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 50e91d8a37b80e45563311c0b0e6c5d7ced744388292b9a4e964138f45d392c337b19d3cc128bfc713ad8dd5fe7e13846bace1d7a707257dbac1e2177483c5f5
|
7
|
+
data.tar.gz: 8448f3cb3c208674c7f7ebe225b0827d3914a5378064dad0633ac6c6bca6797424039276a4c4839a99921b3aaca0b0c0ca736f972c85c6a604785e052b81c6e3
|
data/lib/combi/buses/http.rb
CHANGED
@@ -60,14 +60,16 @@ module Combi
|
|
60
60
|
response = {error: true, message: e.message}
|
61
61
|
end
|
62
62
|
{result: 'ok', response: response}
|
63
|
+
else
|
64
|
+
{result: 'error', response: {error: true, message: 'unknown action'}}
|
63
65
|
end
|
64
66
|
else
|
65
67
|
{result: 'error', response: {error: true, message: 'unknown service'}}
|
66
68
|
end
|
67
69
|
end
|
68
70
|
|
69
|
-
def respond_to(service_instance,
|
70
|
-
handlers[
|
71
|
+
def respond_to(service_instance, action, options = {})
|
72
|
+
handlers[action.to_s] = {service_instance: service_instance, options: options}
|
71
73
|
end
|
72
74
|
|
73
75
|
def handlers
|
@@ -12,33 +12,36 @@ module Combi
|
|
12
12
|
else
|
13
13
|
service_instance = handler[:service_instance]
|
14
14
|
message = JSON.parse(message.to_json)
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
15
|
+
if service_instance.respond_to?(kind)
|
16
|
+
waiter.timeout(options[:timeout], RuntimeError.new(Timeout::Error))
|
17
|
+
begin
|
18
|
+
Timeout.timeout(options[:timeout]) do
|
19
|
+
response = service_instance.send(kind, message)
|
20
|
+
if response.respond_to? :succeed
|
21
|
+
response.callback do |service_response|
|
22
|
+
waiter.succeed service_response
|
23
|
+
end
|
24
|
+
else
|
25
|
+
waiter.succeed response
|
23
26
|
end
|
24
|
-
else
|
25
|
-
waiter.succeed response
|
26
27
|
end
|
28
|
+
rescue Timeout::Error => e
|
29
|
+
log "ERROR"
|
30
|
+
waiter.fail RuntimeError.new(Timeout::Error)
|
31
|
+
rescue Exception => e
|
32
|
+
log "other ERROR"
|
33
|
+
log e.inspect
|
34
|
+
waiter.fail({'error' => true, 'message' => e.message})
|
27
35
|
end
|
28
|
-
|
29
|
-
|
30
|
-
waiter.fail RuntimeError.new(Timeout::Error)
|
31
|
-
rescue Exception => e
|
32
|
-
log "other ERROR"
|
33
|
-
log e.inspect
|
34
|
-
waiter.fail({'error' => true, 'message' => e.message})
|
36
|
+
else
|
37
|
+
waiter.fail('error' => true, 'message' => 'unknown action')
|
35
38
|
end
|
36
39
|
end
|
37
40
|
waiter
|
38
41
|
end
|
39
42
|
|
40
|
-
def respond_to(service_instance,
|
41
|
-
memory_handlers[
|
43
|
+
def respond_to(service_instance, action, options = {})
|
44
|
+
memory_handlers[action.to_s] = {service_instance: service_instance, options: options}
|
42
45
|
end
|
43
46
|
|
44
47
|
def memory_handlers
|
data/lib/combi/buses/queue.rb
CHANGED
@@ -25,8 +25,8 @@ module Combi
|
|
25
25
|
end
|
26
26
|
end
|
27
27
|
|
28
|
-
def respond_to(service_instance,
|
29
|
-
log "registering #{
|
28
|
+
def respond_to(service_instance, action, options = {})
|
29
|
+
log "registering #{action}"
|
30
30
|
queue_options = {}
|
31
31
|
subscription_options = {}
|
32
32
|
if options[:fast] == true
|
@@ -35,8 +35,8 @@ module Combi
|
|
35
35
|
subscription_options[:ack] = true
|
36
36
|
end
|
37
37
|
queue_service.ready do
|
38
|
-
queue_service.queue(
|
39
|
-
log "subscribing to queue #{
|
38
|
+
queue_service.queue(action.to_s, queue_options) do |queue|
|
39
|
+
log "subscribing to queue #{action.to_s} with options #{queue_options}"
|
40
40
|
queue.subscribe(subscription_options) do |delivery_info, payload|
|
41
41
|
respond service_instance, payload, delivery_info
|
42
42
|
queue_service.acknowledge delivery_info unless options[:fast] == true
|
@@ -46,14 +46,14 @@ module Combi
|
|
46
46
|
end
|
47
47
|
|
48
48
|
def request(name, kind, message, options = {})
|
49
|
-
log "Preparing request: #{name}.#{kind} #{message.inspect}\t|| #{options.inspect}"
|
49
|
+
log "Preparing request: #{name}.#{kind} #{message.inspect[0..500]}\t|| #{options.inspect}"
|
50
50
|
options[:timeout] ||= RPC_DEFAULT_TIMEOUT
|
51
51
|
options[:routing_key] = name.to_s
|
52
52
|
correlation_id = Combi::Correlation.generate
|
53
53
|
options[:correlation_id] = correlation_id
|
54
54
|
waiter = EventedWaiter.wait_for(correlation_id, @response_store, options[:timeout])
|
55
55
|
queue_service.ready do
|
56
|
-
log "Making request: #{name}.#{kind} #{message.inspect}\t|| #{options.inspect}"
|
56
|
+
log "Making request: #{name}.#{kind} #{message.inspect[0..500]}\t|| #{options.inspect[0..500]}"
|
57
57
|
queue_service.call(kind, message, options)
|
58
58
|
end
|
59
59
|
waiter
|
@@ -64,26 +64,26 @@ module Combi
|
|
64
64
|
kind = message['kind']
|
65
65
|
payload = message['payload']
|
66
66
|
options = message['options']
|
67
|
-
|
67
|
+
if service_instance.respond_to?(kind)
|
68
|
+
log "generating response for #{service_instance.class}#{service_instance.actions.inspect}.#{kind} #{payload.inspect[0..500]}"
|
69
|
+
begin
|
70
|
+
response = service_instance.send(kind, payload)
|
71
|
+
rescue Exception => e
|
72
|
+
response = {error: true, message: e.message}
|
73
|
+
end
|
74
|
+
else
|
68
75
|
log "Service instance does not respond to #{kind}: #{service_instance.inspect}"
|
69
|
-
|
76
|
+
response = {error: true, message: 'unknown action'}
|
70
77
|
end
|
71
|
-
log "generating response for #{service_instance.class}#{service_instance.actions.inspect}.#{kind} #{payload.inspect}"
|
72
|
-
begin
|
73
|
-
response = service_instance.send(kind, payload)
|
74
|
-
rescue Exception => e
|
75
|
-
response = {error: true, message: e.message}
|
76
|
-
end
|
77
|
-
|
78
78
|
if response.respond_to? :succeed
|
79
79
|
log "response is deferred"
|
80
80
|
response.callback do |service_response|
|
81
|
-
log "responding with deferred answer: #{service_response.inspect}"
|
81
|
+
log "responding with deferred answer: #{service_response.inspect[0..500]}"
|
82
82
|
queue_service.respond(service_response.to_json, delivery_info)
|
83
83
|
end
|
84
84
|
else
|
85
|
-
log "responding with inmediate answer: #{response.inspect}"
|
86
|
-
queue_service.respond(response.to_json, delivery_info)
|
85
|
+
log "responding with inmediate answer: #{response.inspect[0..500]}"
|
86
|
+
queue_service.respond(response.to_json, delivery_info)
|
87
87
|
end
|
88
88
|
end
|
89
89
|
|
@@ -23,7 +23,7 @@ module Combi
|
|
23
23
|
end
|
24
24
|
|
25
25
|
def on_message(ws, session, raw_message)
|
26
|
-
@bus.log "ON MESSAGE #{raw_message}"
|
26
|
+
@bus.log "ON MESSAGE #{raw_message[0..500]}"
|
27
27
|
message = JSON.parse(raw_message)
|
28
28
|
@bus.on_message(ws, message, session)
|
29
29
|
end
|
@@ -72,7 +72,7 @@ module Combi
|
|
72
72
|
end
|
73
73
|
|
74
74
|
ws.on :message do |event|
|
75
|
-
@bus.log "ON MESSAGE: #{event.data}"
|
75
|
+
@bus.log "ON MESSAGE: #{event.data[0..500]}"
|
76
76
|
message = JSON.parse(event.data)
|
77
77
|
@bus.on_message(ws, message)
|
78
78
|
end
|
@@ -163,7 +163,7 @@ module Combi
|
|
163
163
|
def on_message(ws, message, session = nil)
|
164
164
|
if message['correlation_id'] && message.has_key?('result')
|
165
165
|
@response_store.handle_rpc_response(message)
|
166
|
-
log "Stored message with correlation_id #{message['correlation_id']} - #{message.inspect}"
|
166
|
+
log "Stored message with correlation_id #{message['correlation_id']} - #{message.inspect[0..500]}"
|
167
167
|
return
|
168
168
|
end
|
169
169
|
service_name = message['service']
|
@@ -179,11 +179,14 @@ module Combi
|
|
179
179
|
msg = {result: 'ok', correlation_id: message['correlation_id']}
|
180
180
|
|
181
181
|
if response.respond_to? :succeed
|
182
|
+
log "response is deferred"
|
182
183
|
response.callback do |service_response|
|
184
|
+
log "responding with deferred answer: #{service_response.inspect[0..500]}"
|
183
185
|
msg[:response] = service_response.to_json
|
184
186
|
ws.send(msg.to_json)
|
185
187
|
end
|
186
188
|
else
|
189
|
+
log "responding with inmediate answer: #{response.inspect[0..500]}"
|
187
190
|
msg[:response] = response.to_json
|
188
191
|
ws.send(msg.to_json)
|
189
192
|
end
|
@@ -197,6 +200,7 @@ module Combi
|
|
197
200
|
response = service_instance.send(kind, payload)
|
198
201
|
else
|
199
202
|
log "[WARNING] Service #{service_name}(#{service_instance.class.name}) does not respond to message #{kind}"
|
203
|
+
response = {error: true, message: 'unknown action'}
|
200
204
|
end
|
201
205
|
else
|
202
206
|
log "[WARNING] Service #{service_name} not found"
|
@@ -205,9 +209,9 @@ module Combi
|
|
205
209
|
end
|
206
210
|
end
|
207
211
|
|
208
|
-
def respond_to(service_instance,
|
209
|
-
log "registering #{
|
210
|
-
handlers[
|
212
|
+
def respond_to(service_instance, action, options = {})
|
213
|
+
log "registering #{action}"
|
214
|
+
handlers[action.to_s] = {service_instance: service_instance, options: options}
|
211
215
|
log "handlers: #{handlers.keys.inspect}"
|
212
216
|
end
|
213
217
|
|
data/lib/combi/helpers.rb
CHANGED
@@ -4,13 +4,17 @@ module Combi
|
|
4
4
|
|
5
5
|
def self.wait_for(defer, options = {}, &block)
|
6
6
|
options[:timeout] ||= 2
|
7
|
-
resolved = false
|
8
7
|
waiter_thread = Thread.current
|
9
8
|
defer.callback { |response|
|
10
|
-
resolved = true
|
11
9
|
block.call response
|
12
10
|
waiter_thread.wakeup
|
13
11
|
}
|
12
|
+
defer.errback { |response|
|
13
|
+
log "waiting for result, received an error"
|
14
|
+
log response
|
15
|
+
block.call error: true, message: 'service request error'
|
16
|
+
waiter_thread.wakeup
|
17
|
+
}
|
14
18
|
Timeout::timeout(options[:timeout]) do
|
15
19
|
Thread.stop
|
16
20
|
end
|
data/lib/combi/queue_service.rb
CHANGED
@@ -50,7 +50,6 @@ module Combi
|
|
50
50
|
|
51
51
|
def publish(*args, &block)
|
52
52
|
@exchange.publish *args do
|
53
|
-
log "Sent to network drivers: #{args.inspect}"
|
54
53
|
block.call if block_given?
|
55
54
|
end
|
56
55
|
end
|
@@ -84,7 +83,7 @@ module Combi
|
|
84
83
|
end
|
85
84
|
|
86
85
|
def call(kind, message, options = {})
|
87
|
-
log "sending request #{kind} #{message.inspect} with options #{options.inspect}"
|
86
|
+
log "sending request #{kind} #{message.inspect[0..500]} with options #{options.inspect}"
|
88
87
|
raise "RPC is not enabled or reply_to is not included" if (@rpc_queue.nil? || @rpc_queue.name.nil?) && options[:reply_to].nil?
|
89
88
|
options[:timeout] ||= RPC_DEFAULT_TIMEOUT
|
90
89
|
options[:routing_key] ||= 'rcalls_queue'
|
data/lib/combi/reactor.rb
CHANGED
@@ -11,12 +11,15 @@ module Combi
|
|
11
11
|
log "-EM.start- the reactor is running: #{EM::reactor_running?}"
|
12
12
|
raise "EM did not shut down" if EM::reactor_running?
|
13
13
|
@@reactor_thread = Thread.new do
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
14
|
+
begin
|
15
|
+
log "------- starting EM reactor"
|
16
|
+
EM::run do
|
17
|
+
log "------- reactor started"
|
18
|
+
block.call unless block.nil?
|
19
|
+
end
|
20
|
+
ensure
|
21
|
+
puts "------- reactor stopped"
|
18
22
|
end
|
19
|
-
log "------- reactor stopped"
|
20
23
|
end
|
21
24
|
30.times do
|
22
25
|
sleep 0.1 unless EM::reactor_running?
|
data/lib/combi/response_store.rb
CHANGED
@@ -8,14 +8,19 @@ module Combi
|
|
8
8
|
|
9
9
|
def add_waiter(key, waiter)
|
10
10
|
@waiters[key] = waiter
|
11
|
+
waiter.callback { |r| finish key }
|
12
|
+
waiter.errback { |r| finish key }
|
11
13
|
end
|
12
14
|
|
13
15
|
def handle_rpc_response(response)
|
14
16
|
correlation_id = response['correlation_id']
|
15
17
|
waiter = @waiters[correlation_id]
|
16
18
|
response = response['response']
|
17
|
-
waiter.succeed(JSON.parse response)
|
18
|
-
|
19
|
+
waiter.succeed(JSON.parse response) if waiter.respond_to? :succeed
|
20
|
+
end
|
21
|
+
|
22
|
+
def finish(key)
|
23
|
+
@waiters.delete key
|
19
24
|
end
|
20
25
|
end
|
21
26
|
|
@@ -32,7 +37,7 @@ module Combi
|
|
32
37
|
waiter = new(key, response_store, timeout)
|
33
38
|
response_store.add_waiter(key, waiter)
|
34
39
|
waiter.callback {|r| log "success waiting for #{key}: #{Time.now.to_f - t1.to_f}s" }
|
35
|
-
waiter.errback {|r| log "failed waiting for #{key}: #{Time.now.to_f - t1.to_f}s, #{r.inspect}" }
|
40
|
+
waiter.errback {|r| log "failed waiting for #{key}: #{Time.now.to_f - t1.to_f}s, #{r.inspect[0..500]}" }
|
36
41
|
waiter
|
37
42
|
end
|
38
43
|
|
data/lib/combi/version.rb
CHANGED
@@ -175,4 +175,23 @@ shared_examples_for "standard_bus" do
|
|
175
175
|
end
|
176
176
|
end
|
177
177
|
end
|
178
|
+
|
179
|
+
context 'return an error when requesting an unknown action for the service' do
|
180
|
+
Given(:error_message) { 'unknown action' }
|
181
|
+
When(:service) { provider.add_service echo_service }
|
182
|
+
Then do
|
183
|
+
em do
|
184
|
+
prepare
|
185
|
+
EM.synchrony do
|
186
|
+
begin
|
187
|
+
service_result = EM::Synchrony.sync consumer.request(:echo_this, :do_other, {}, { timeout: 0.1 })
|
188
|
+
service_result['error'].should be_true
|
189
|
+
service_result['message'].should eq error_message
|
190
|
+
done
|
191
|
+
finalize
|
192
|
+
end
|
193
|
+
end
|
194
|
+
end
|
195
|
+
end
|
196
|
+
end
|
178
197
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: combi
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.9
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- German Del Zotto
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2014-05-
|
12
|
+
date: 2014-05-30 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: yajl-ruby
|