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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: bf7f73f8dc51e7b390cbdfd3d76bd26d74e95261
4
- data.tar.gz: eed9f9840dd7e43cb8c72057bdb9688e49d94bf5
3
+ metadata.gz: 842db51c04bfe53f9a03dee7e7a7dcd1c82d7256
4
+ data.tar.gz: a18fba47f8b819d81f994a2afbe7d2243a459b6b
5
5
  SHA512:
6
- metadata.gz: c5287c09cd3cceb88ca67b98ffe8641ae3f607d8d472a1048762d8318bbad8254a0d299555811a09d0e8ad998a45fa780b3449efed7a708a395f8f1d17f4ab18
7
- data.tar.gz: 82a80a9e331d18d31ada7497e2a9ddde314a4b59874f1487baf95bb73d3ef77fd1766032f3569a692316e414c876cf81a088098ba9cf859f4305dcb8fd95e732
6
+ metadata.gz: 50e91d8a37b80e45563311c0b0e6c5d7ced744388292b9a4e964138f45d392c337b19d3cc128bfc713ad8dd5fe7e13846bace1d7a707257dbac1e2177483c5f5
7
+ data.tar.gz: 8448f3cb3c208674c7f7ebe225b0827d3914a5378064dad0633ac6c6bca6797424039276a4c4839a99921b3aaca0b0c0ca736f972c85c6a604785e052b81c6e3
@@ -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, handler, options = {})
70
- handlers[handler.to_s] = {service_instance: service_instance, options: options}
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
- return unless 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
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
- 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})
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, handler, options = {})
41
- memory_handlers[handler.to_s] = {service_instance: service_instance, options: options}
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
@@ -25,8 +25,8 @@ module Combi
25
25
  end
26
26
  end
27
27
 
28
- def respond_to(service_instance, handler, options = {})
29
- log "registering #{handler}"
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(handler.to_s, queue_options) do |queue|
39
- log "subscribing to queue #{handler.to_s} with options #{queue_options}"
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
- unless service_instance.respond_to?(kind)
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
- return
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) unless response.nil?
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, handler, options = {})
209
- log "registering #{handler}"
210
- handlers[handler.to_s] = {service_instance: service_instance, options: options}
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
 
@@ -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
@@ -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'
@@ -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
- log "------- starting EM reactor"
15
- EM::run do
16
- log "------- reactor started"
17
- block.call unless block.nil?
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?
@@ -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
- @waiters.delete correlation_id
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
 
@@ -1,3 +1,3 @@
1
1
  module Combi
2
- VERSION = '0.0.8'
2
+ VERSION = '0.0.9'
3
3
  end
@@ -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.8
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-25 00:00:00.000000000 Z
12
+ date: 2014-05-30 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: yajl-ruby