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 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