combi 0.0.8 → 0.0.9
Sign up to get free protection for your applications and to get access to all the features.
- 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
|