protobuf 3.3.6 → 3.4.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 +7 -0
- data/.rubocop.yml +48 -0
- data/.rubocop_todo.yml +79 -0
- data/.travis.yml +12 -4
- data/Rakefile +14 -11
- data/bin/protoc-gen-ruby +0 -1
- data/bin/rpc_server +1 -0
- data/install-protobuf.sh +8 -0
- data/lib/protobuf.rb +30 -24
- data/lib/protobuf/cli.rb +35 -35
- data/lib/protobuf/code_generator.rb +11 -8
- data/lib/protobuf/decoder.rb +4 -5
- data/lib/protobuf/deprecation.rb +20 -0
- data/lib/protobuf/descriptors/google/protobuf/compiler/plugin.pb.rb +2 -0
- data/lib/protobuf/descriptors/google/protobuf/descriptor.pb.rb +2 -0
- data/lib/protobuf/encoder.rb +9 -4
- data/lib/protobuf/enum.rb +38 -54
- data/lib/protobuf/field.rb +2 -2
- data/lib/protobuf/field/base_field.rb +28 -32
- data/lib/protobuf/field/bool_field.rb +4 -4
- data/lib/protobuf/field/bytes_field.rb +5 -4
- data/lib/protobuf/field/double_field.rb +0 -1
- data/lib/protobuf/field/enum_field.rb +4 -7
- data/lib/protobuf/field/field_array.rb +3 -4
- data/lib/protobuf/field/fixed32_field.rb +1 -1
- data/lib/protobuf/field/fixed64_field.rb +0 -1
- data/lib/protobuf/field/float_field.rb +0 -1
- data/lib/protobuf/field/int32_field.rb +0 -1
- data/lib/protobuf/field/int64_field.rb +0 -1
- data/lib/protobuf/field/integer_field.rb +0 -1
- data/lib/protobuf/field/message_field.rb +2 -3
- data/lib/protobuf/field/sfixed32_field.rb +0 -1
- data/lib/protobuf/field/sfixed64_field.rb +0 -1
- data/lib/protobuf/field/signed_integer_field.rb +0 -1
- data/lib/protobuf/field/sint32_field.rb +0 -1
- data/lib/protobuf/field/sint64_field.rb +0 -1
- data/lib/protobuf/field/string_field.rb +0 -1
- data/lib/protobuf/field/uint32_field.rb +0 -1
- data/lib/protobuf/field/uint64_field.rb +0 -1
- data/lib/protobuf/field/varint_field.rb +0 -1
- data/lib/protobuf/generators/base.rb +1 -2
- data/lib/protobuf/generators/enum_generator.rb +1 -2
- data/lib/protobuf/generators/extension_generator.rb +1 -2
- data/lib/protobuf/generators/field_generator.rb +4 -5
- data/lib/protobuf/generators/file_generator.rb +22 -27
- data/lib/protobuf/generators/group_generator.rb +15 -16
- data/lib/protobuf/generators/message_generator.rb +13 -14
- data/lib/protobuf/generators/printable.rb +9 -10
- data/lib/protobuf/generators/service_generator.rb +1 -2
- data/lib/protobuf/lifecycle.rb +20 -33
- data/lib/protobuf/logging.rb +4 -6
- data/lib/protobuf/message.rb +22 -16
- data/lib/protobuf/message/fields.rb +14 -17
- data/lib/protobuf/message/serialization.rb +6 -5
- data/lib/protobuf/rpc/buffer.rb +10 -12
- data/lib/protobuf/rpc/client.rb +12 -12
- data/lib/protobuf/rpc/connectors/base.rb +4 -3
- data/lib/protobuf/rpc/connectors/common.rb +15 -17
- data/lib/protobuf/rpc/connectors/socket.rb +2 -2
- data/lib/protobuf/rpc/connectors/zmq.rb +118 -108
- data/lib/protobuf/rpc/dynamic_discovery.pb.rb +2 -0
- data/lib/protobuf/rpc/env.rb +12 -12
- data/lib/protobuf/rpc/error.rb +1 -1
- data/lib/protobuf/rpc/error/client_error.rb +4 -4
- data/lib/protobuf/rpc/error/server_error.rb +6 -6
- data/lib/protobuf/rpc/middleware/exception_handler.rb +1 -1
- data/lib/protobuf/rpc/middleware/logger.rb +3 -3
- data/lib/protobuf/rpc/middleware/request_decoder.rb +5 -5
- data/lib/protobuf/rpc/middleware/response_encoder.rb +3 -3
- data/lib/protobuf/rpc/rpc.pb.rb +2 -0
- data/lib/protobuf/rpc/servers/socket/server.rb +75 -65
- data/lib/protobuf/rpc/servers/socket/worker.rb +2 -2
- data/lib/protobuf/rpc/servers/socket_runner.rb +12 -6
- data/lib/protobuf/rpc/servers/zmq/broker.rb +10 -6
- data/lib/protobuf/rpc/servers/zmq/server.rb +20 -26
- data/lib/protobuf/rpc/servers/zmq/util.rb +7 -7
- data/lib/protobuf/rpc/servers/zmq/worker.rb +5 -7
- data/lib/protobuf/rpc/servers/zmq_runner.rb +14 -3
- data/lib/protobuf/rpc/service.rb +15 -15
- data/lib/protobuf/rpc/service_directory.rb +7 -11
- data/lib/protobuf/rpc/service_dispatcher.rb +3 -3
- data/lib/protobuf/rpc/service_filters.rb +27 -28
- data/lib/protobuf/rpc/stat.rb +4 -7
- data/lib/protobuf/socket.rb +0 -1
- data/lib/protobuf/tasks/compile.rake +2 -2
- data/lib/protobuf/version.rb +1 -1
- data/protobuf.gemspec +20 -4
- data/spec/benchmark/tasks.rb +49 -23
- data/spec/bin/protoc-gen-ruby_spec.rb +11 -6
- data/spec/encoding/all_types_spec.rb +91 -77
- data/spec/encoding/extreme_values_spec.rb +0 -0
- data/spec/functional/socket_server_spec.rb +9 -10
- data/spec/functional/zmq_server_spec.rb +21 -19
- data/spec/lib/protobuf/cli_spec.rb +20 -20
- data/spec/lib/protobuf/code_generator_spec.rb +6 -6
- data/spec/lib/protobuf/enum_spec.rb +57 -31
- data/spec/lib/protobuf/field/float_field_spec.rb +2 -2
- data/spec/lib/protobuf/field/int32_field_spec.rb +1 -1
- data/spec/lib/protobuf/field/string_field_spec.rb +7 -8
- data/spec/lib/protobuf/field_spec.rb +3 -6
- data/spec/lib/protobuf/generators/base_spec.rb +6 -6
- data/spec/lib/protobuf/generators/enum_generator_spec.rb +22 -17
- data/spec/lib/protobuf/generators/extension_generator_spec.rb +8 -9
- data/spec/lib/protobuf/generators/field_generator_spec.rb +14 -11
- data/spec/lib/protobuf/generators/file_generator_spec.rb +7 -4
- data/spec/lib/protobuf/generators/service_generator_spec.rb +14 -11
- data/spec/lib/protobuf/lifecycle_spec.rb +9 -4
- data/spec/lib/protobuf/message_spec.rb +63 -35
- data/spec/lib/protobuf/optionable_spec.rb +3 -3
- data/spec/lib/protobuf/rpc/client_spec.rb +2 -2
- data/spec/lib/protobuf/rpc/connector_spec.rb +1 -1
- data/spec/lib/protobuf/rpc/connectors/base_spec.rb +6 -6
- data/spec/lib/protobuf/rpc/connectors/common_spec.rb +26 -18
- data/spec/lib/protobuf/rpc/connectors/socket_spec.rb +4 -4
- data/spec/lib/protobuf/rpc/connectors/zmq_spec.rb +11 -9
- data/spec/lib/protobuf/rpc/middleware/exception_handler_spec.rb +2 -2
- data/spec/lib/protobuf/rpc/middleware/logger_spec.rb +7 -7
- data/spec/lib/protobuf/rpc/middleware/request_decoder_spec.rb +14 -14
- data/spec/lib/protobuf/rpc/middleware/response_encoder_spec.rb +5 -5
- data/spec/lib/protobuf/rpc/servers/socket_server_spec.rb +1 -1
- data/spec/lib/protobuf/rpc/servers/zmq/server_spec.rb +9 -7
- data/spec/lib/protobuf/rpc/servers/zmq/util_spec.rb +9 -9
- data/spec/lib/protobuf/rpc/servers/zmq/worker_spec.rb +2 -2
- data/spec/lib/protobuf/rpc/service_directory_spec.rb +24 -23
- data/spec/lib/protobuf/rpc/service_dispatcher_spec.rb +4 -4
- data/spec/lib/protobuf/rpc/service_filters_spec.rb +84 -51
- data/spec/lib/protobuf/rpc/service_spec.rb +15 -14
- data/spec/lib/protobuf/rpc/stat_spec.rb +1 -1
- data/spec/lib/protobuf_spec.rb +9 -9
- data/spec/spec_helper.rb +7 -19
- data/spec/support/server.rb +29 -59
- data/spec/support/test/defaults.pb.rb +2 -0
- data/spec/support/test/enum.pb.rb +2 -0
- data/spec/support/test/extended.pb.rb +2 -0
- data/spec/support/test/google_unittest_import.pb.rb +2 -0
- data/spec/support/test/google_unittest_import_public.pb.rb +2 -0
- data/spec/support/test/multi_field_extensions.pb.rb +2 -0
- data/spec/support/test/resource.pb.rb +2 -0
- data/spec/support/test/resource_service.rb +17 -20
- metadata +153 -112
- data/lib/protobuf/deprecator.rb +0 -42
@@ -26,7 +26,7 @@ module Protobuf
|
|
26
26
|
|
27
27
|
loop do
|
28
28
|
process_local_queue
|
29
|
-
rc = @poller.poll(
|
29
|
+
rc = @poller.poll(broker_polling_milliseconds)
|
30
30
|
|
31
31
|
# The server was shutdown and no requests are pending
|
32
32
|
break if rc == 0 && !running? && @server.workers.empty?
|
@@ -51,11 +51,15 @@ module Protobuf
|
|
51
51
|
@backend_poll_weight ||= [ENV["PB_ZMQ_SERVER_BACKEND_POLL_WEIGHT"].to_i, 1].max
|
52
52
|
end
|
53
53
|
|
54
|
+
def broker_polling_milliseconds
|
55
|
+
@broker_polling_milliseconds ||= [ENV["PB_ZMQ_BROKER_POLLING_MILLISECONDS"].to_i, 500].max
|
56
|
+
end
|
57
|
+
|
54
58
|
def check_and_process_backend
|
55
59
|
readables_include_backend = @poller.readables.include?(@backend_socket)
|
56
60
|
message_count_read_from_backend = 0
|
57
61
|
|
58
|
-
while readables_include_backend && message_count_read_from_backend < backend_poll_weight
|
62
|
+
while readables_include_backend && message_count_read_from_backend < backend_poll_weight
|
59
63
|
message_count_read_from_backend += 1
|
60
64
|
process_backend
|
61
65
|
@poller.poll_nonblock
|
@@ -67,7 +71,7 @@ module Protobuf
|
|
67
71
|
readables_include_frontend = @poller.readables.include?(@frontend_socket)
|
68
72
|
message_count_read_from_frontend = 0
|
69
73
|
|
70
|
-
while readables_include_frontend && message_count_read_from_frontend < frontend_poll_weight
|
74
|
+
while readables_include_frontend && message_count_read_from_frontend < frontend_poll_weight
|
71
75
|
message_count_read_from_frontend += 1
|
72
76
|
process_frontend
|
73
77
|
break unless local_queue_available? # no need to read frontend just to throw away messages, will prioritize backend when full
|
@@ -121,7 +125,7 @@ module Protobuf
|
|
121
125
|
end
|
122
126
|
|
123
127
|
def process_backend
|
124
|
-
worker,
|
128
|
+
worker, _ignore, *frames = read_from_backend
|
125
129
|
|
126
130
|
@idle_workers << worker
|
127
131
|
|
@@ -141,9 +145,9 @@ module Protobuf
|
|
141
145
|
end
|
142
146
|
else
|
143
147
|
if @idle_workers.empty?
|
144
|
-
local_queue << [address, ::Protobuf::Rpc::Zmq::EMPTY_STRING, message
|
148
|
+
local_queue << [address, ::Protobuf::Rpc::Zmq::EMPTY_STRING, message].concat(frames)
|
145
149
|
else
|
146
|
-
write_to_backend([@idle_workers.shift, ::Protobuf::Rpc::Zmq::EMPTY_STRING].concat([address, ::Protobuf::Rpc::Zmq::EMPTY_STRING, message
|
150
|
+
write_to_backend([@idle_workers.shift, ::Protobuf::Rpc::Zmq::EMPTY_STRING].concat([address, ::Protobuf::Rpc::Zmq::EMPTY_STRING, message]).concat(frames))
|
147
151
|
end
|
148
152
|
end
|
149
153
|
end
|
@@ -62,15 +62,10 @@ module Protobuf
|
|
62
62
|
end
|
63
63
|
|
64
64
|
def beacon_port
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
@beacon_port = port.to_i
|
71
|
-
end
|
72
|
-
|
73
|
-
@beacon_port
|
65
|
+
@beacon_port ||= options.fetch(
|
66
|
+
:beacon_port,
|
67
|
+
::Protobuf::Rpc::ServiceDirectory.port,
|
68
|
+
).to_i
|
74
69
|
end
|
75
70
|
|
76
71
|
def beacon_uri
|
@@ -84,7 +79,7 @@ module Protobuf
|
|
84
79
|
def broadcast_flatline
|
85
80
|
flatline = ::Protobuf::Rpc::DynamicDiscovery::Beacon.new(
|
86
81
|
:beacon_type => ::Protobuf::Rpc::DynamicDiscovery::BeaconType::FLATLINE,
|
87
|
-
:server =>
|
82
|
+
:server => to_proto,
|
88
83
|
)
|
89
84
|
|
90
85
|
@beacon_socket.send(flatline.encode, 0)
|
@@ -95,7 +90,7 @@ module Protobuf
|
|
95
90
|
|
96
91
|
heartbeat = ::Protobuf::Rpc::DynamicDiscovery::Beacon.new(
|
97
92
|
:beacon_type => ::Protobuf::Rpc::DynamicDiscovery::BeaconType::HEARTBEAT,
|
98
|
-
:server =>
|
93
|
+
:server => to_proto,
|
99
94
|
)
|
100
95
|
|
101
96
|
@beacon_socket.send(heartbeat.encode, 0)
|
@@ -129,7 +124,7 @@ module Protobuf
|
|
129
124
|
end
|
130
125
|
|
131
126
|
def inproc?
|
132
|
-
!!
|
127
|
+
!!options[:zmq_inproc]
|
133
128
|
end
|
134
129
|
|
135
130
|
def maintenance_timeout
|
@@ -167,7 +162,7 @@ module Protobuf
|
|
167
162
|
@last_reaping = Time.now.to_i
|
168
163
|
|
169
164
|
@workers.keep_if do |worker|
|
170
|
-
worker.alive?
|
165
|
+
worker.alive? || worker.join && false
|
171
166
|
end
|
172
167
|
end
|
173
168
|
|
@@ -221,10 +216,6 @@ module Protobuf
|
|
221
216
|
@last_reaping = @last_beacon = @timeout = nil
|
222
217
|
end
|
223
218
|
|
224
|
-
def total_workers
|
225
|
-
@total_workers ||= [@options[:threads].to_i, 1].max
|
226
|
-
end
|
227
|
-
|
228
219
|
def timeout
|
229
220
|
if @timeout.nil?
|
230
221
|
@timeout = 0
|
@@ -233,13 +224,17 @@ module Protobuf
|
|
233
224
|
end
|
234
225
|
end
|
235
226
|
|
227
|
+
def total_workers
|
228
|
+
@total_workers ||= [@options[:threads].to_i, 1].max
|
229
|
+
end
|
230
|
+
|
236
231
|
def to_proto
|
237
232
|
@proto ||= ::Protobuf::Rpc::DynamicDiscovery::Server.new(
|
238
233
|
:uuid => uuid,
|
239
234
|
:address => frontend_ip,
|
240
235
|
:port => frontend_port.to_s,
|
241
236
|
:ttl => (beacon_interval * 1.5).ceil,
|
242
|
-
:services => ::Protobuf::Rpc::Service.implemented_services
|
237
|
+
:services => ::Protobuf::Rpc::Service.implemented_services,
|
243
238
|
)
|
244
239
|
end
|
245
240
|
|
@@ -256,14 +251,13 @@ module Protobuf
|
|
256
251
|
start_missing_workers
|
257
252
|
end
|
258
253
|
|
259
|
-
|
260
|
-
if all_workers_busy? && options[:broadcast_busy]
|
261
|
-
broadcast_flatline
|
262
|
-
else
|
263
|
-
broadcast_heartbeat
|
264
|
-
end
|
265
|
-
end
|
254
|
+
next unless broadcast_heartbeat?
|
266
255
|
|
256
|
+
if options[:broadcast_busy] && all_workers_busy?
|
257
|
+
broadcast_flatline
|
258
|
+
else
|
259
|
+
broadcast_heartbeat
|
260
|
+
end
|
267
261
|
end
|
268
262
|
end
|
269
263
|
|
@@ -301,7 +295,7 @@ module Protobuf
|
|
301
295
|
begin
|
302
296
|
::Protobuf::Rpc::Zmq::Worker.new(server).run
|
303
297
|
rescue => e
|
304
|
-
message = "Worker failed: #{e.inspect}\n #{e.backtrace.join(
|
298
|
+
message = "Worker failed: #{e.inspect}\n #{e.backtrace.join($INPUT_RECORD_SEPARATOR)}"
|
305
299
|
$stderr.puts(message)
|
306
300
|
logger.error { message }
|
307
301
|
end
|
@@ -19,13 +19,13 @@ module Protobuf
|
|
19
19
|
end
|
20
20
|
|
21
21
|
def zmq_error_check(return_code, source = nil)
|
22
|
-
|
23
|
-
raise <<-ERROR
|
24
|
-
Last ZMQ API call #{source ? "to #{source}" : ""} failed with "#{::ZMQ::Util.error_string}".
|
22
|
+
return if ::ZMQ::Util.resultcode_ok?(return_code)
|
25
23
|
|
26
|
-
|
27
|
-
|
28
|
-
|
24
|
+
fail <<-ERROR
|
25
|
+
Last ZMQ API call #{source ? "to #{source}" : ''} failed with "#{::ZMQ::Util.error_string}".
|
26
|
+
|
27
|
+
#{caller(1).join($INPUT_RECORD_SEPARATOR)}
|
28
|
+
ERROR
|
29
29
|
end
|
30
30
|
|
31
31
|
def log_signature
|
@@ -38,7 +38,7 @@ module Protobuf
|
|
38
38
|
end
|
39
39
|
|
40
40
|
def resolve_ip(hostname)
|
41
|
-
::Resolv.getaddresses(hostname).
|
41
|
+
::Resolv.getaddresses(hostname).find do |address|
|
42
42
|
address =~ ADDRESS_MATCH
|
43
43
|
end
|
44
44
|
end
|
@@ -46,13 +46,11 @@ module Protobuf
|
|
46
46
|
loop do
|
47
47
|
rc = poller.poll(500)
|
48
48
|
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
if rc > 0
|
49
|
+
if rc == 0 && !running?
|
50
|
+
break # The server was shutdown and no requests are pending
|
51
|
+
elsif rc == -1
|
52
|
+
break # Something went wrong
|
53
|
+
elsif rc > 0
|
56
54
|
::Thread.current[:busy] = true
|
57
55
|
process_request
|
58
56
|
::Thread.current[:busy] = false
|
@@ -1,4 +1,5 @@
|
|
1
1
|
require 'ostruct'
|
2
|
+
require 'thread'
|
2
3
|
|
3
4
|
module Protobuf
|
4
5
|
module Rpc
|
@@ -12,9 +13,8 @@ module Protobuf
|
|
12
13
|
when options.respond_to?(:to_hash) then
|
13
14
|
options.to_hash
|
14
15
|
else
|
15
|
-
|
16
|
+
fail "Cannot parser Zmq Server - server options"
|
16
17
|
end
|
17
|
-
|
18
18
|
end
|
19
19
|
|
20
20
|
def run
|
@@ -36,6 +36,17 @@ module Protobuf
|
|
36
36
|
private
|
37
37
|
|
38
38
|
def register_signals
|
39
|
+
trap(:TRAP) do
|
40
|
+
::Thread.list.each do |thread|
|
41
|
+
logger.info do
|
42
|
+
<<-THREAD_TRACE
|
43
|
+
#{thread.inspect}:
|
44
|
+
#{thread.backtrace.join($INPUT_RECORD_SEPARATOR)}"
|
45
|
+
THREAD_TRACE
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
39
50
|
trap(:TTIN) do
|
40
51
|
@server.add_worker
|
41
52
|
logger.info { "Increased worker size to: #{@server.total_workers}" }
|
@@ -43,7 +54,7 @@ module Protobuf
|
|
43
54
|
|
44
55
|
trap(:TTOU) do
|
45
56
|
logger.info { "Current worker size: #{@server.workers.size}" }
|
46
|
-
logger.info { "Current worker size: #{@server.busy_worker_count}" }
|
57
|
+
logger.info { "Current busy worker size: #{@server.busy_worker_count}" }
|
47
58
|
end
|
48
59
|
end
|
49
60
|
end
|
data/lib/protobuf/rpc/service.rb
CHANGED
@@ -54,19 +54,19 @@ module Protobuf
|
|
54
54
|
# The host location of the service.
|
55
55
|
#
|
56
56
|
def self.host
|
57
|
-
@
|
57
|
+
@host ||= DEFAULT_HOST
|
58
58
|
end
|
59
59
|
|
60
60
|
# The host location setter.
|
61
61
|
#
|
62
|
-
|
63
|
-
|
62
|
+
class << self
|
63
|
+
attr_writer :host
|
64
64
|
end
|
65
65
|
|
66
66
|
# An array of defined service classes that contain implementation
|
67
67
|
# code
|
68
68
|
def self.implemented_services
|
69
|
-
classes = (
|
69
|
+
classes = (subclasses || []).select do |subclass|
|
70
70
|
subclass.rpcs.any? do |(name, _)|
|
71
71
|
subclass.method_defined? name
|
72
72
|
end
|
@@ -88,13 +88,13 @@ module Protobuf
|
|
88
88
|
# The port of the service on the destination server.
|
89
89
|
#
|
90
90
|
def self.port
|
91
|
-
@
|
91
|
+
@port ||= DEFAULT_PORT
|
92
92
|
end
|
93
93
|
|
94
94
|
# The port location setter.
|
95
95
|
#
|
96
|
-
|
97
|
-
|
96
|
+
class << self
|
97
|
+
attr_writer :port
|
98
98
|
end
|
99
99
|
|
100
100
|
# Define an rpc method with the given request and response types.
|
@@ -108,7 +108,7 @@ module Protobuf
|
|
108
108
|
# Hash containing the set of methods defined via `rpc`.
|
109
109
|
#
|
110
110
|
def self.rpcs
|
111
|
-
@
|
111
|
+
@rpcs ||= {}
|
112
112
|
end
|
113
113
|
|
114
114
|
# Check if the given method name is a known rpc endpoint.
|
@@ -126,13 +126,13 @@ module Protobuf
|
|
126
126
|
# is why we wrap the method call).
|
127
127
|
#
|
128
128
|
def callable_rpc_method(method_name)
|
129
|
-
|
129
|
+
-> { run_filters(method_name) }
|
130
130
|
end
|
131
131
|
|
132
132
|
# Response object for this rpc cycle. Not assignable.
|
133
133
|
#
|
134
134
|
def response
|
135
|
-
@
|
135
|
+
@response ||= response_type.new
|
136
136
|
end
|
137
137
|
|
138
138
|
# Convenience method to get back to class method.
|
@@ -147,10 +147,10 @@ module Protobuf
|
|
147
147
|
self.class.rpcs
|
148
148
|
end
|
149
149
|
|
150
|
-
|
150
|
+
private
|
151
151
|
|
152
152
|
def request_type
|
153
|
-
@
|
153
|
+
@request_type ||= env.request_type
|
154
154
|
end
|
155
155
|
|
156
156
|
# Sugar to make an rpc method feel like a controller method.
|
@@ -158,19 +158,19 @@ module Protobuf
|
|
158
158
|
# object returned by the response reader.
|
159
159
|
#
|
160
160
|
def respond_with(candidate)
|
161
|
-
@
|
161
|
+
@response = candidate
|
162
162
|
end
|
163
163
|
alias_method :return_from_whence_you_came, :respond_with
|
164
164
|
|
165
165
|
def response_type
|
166
|
-
@
|
166
|
+
@response_type ||= env.response_type
|
167
167
|
end
|
168
168
|
|
169
169
|
# Automatically fail a service method.
|
170
170
|
#
|
171
171
|
def rpc_failed(message)
|
172
172
|
message = message.message if message.respond_to?(:message)
|
173
|
-
|
173
|
+
fail RpcFailed, message
|
174
174
|
end
|
175
175
|
end
|
176
176
|
|
@@ -17,7 +17,7 @@ module Protobuf
|
|
17
17
|
DEFAULT_PORT = 53000
|
18
18
|
DEFAULT_TIMEOUT = 1
|
19
19
|
|
20
|
-
class Listing <
|
20
|
+
class Listing < SimpleDelegator
|
21
21
|
attr_reader :expires_at
|
22
22
|
|
23
23
|
def initialize(server)
|
@@ -45,13 +45,9 @@ module Protobuf
|
|
45
45
|
end
|
46
46
|
|
47
47
|
def update(server)
|
48
|
-
|
48
|
+
__setobj__(server)
|
49
49
|
@expires_at = Time.now.to_i + ttl
|
50
50
|
end
|
51
|
-
|
52
|
-
def __getobj__
|
53
|
-
@server
|
54
|
-
end
|
55
51
|
end
|
56
52
|
|
57
53
|
# Class Methods
|
@@ -70,11 +66,11 @@ module Protobuf
|
|
70
66
|
|
71
67
|
def self.start
|
72
68
|
yield(self) if block_given?
|
73
|
-
|
69
|
+
instance.start
|
74
70
|
end
|
75
71
|
|
76
72
|
def self.stop
|
77
|
-
|
73
|
+
instance.stop
|
78
74
|
end
|
79
75
|
|
80
76
|
#
|
@@ -117,7 +113,7 @@ module Protobuf
|
|
117
113
|
unless running?
|
118
114
|
init_socket
|
119
115
|
logger.info { sign_message("listening to udp://#{self.class.address}:#{self.class.port}") }
|
120
|
-
@thread = Thread.new {
|
116
|
+
@thread = Thread.new { send(:run) }
|
121
117
|
end
|
122
118
|
|
123
119
|
self
|
@@ -200,11 +196,11 @@ module Protobuf
|
|
200
196
|
end
|
201
197
|
|
202
198
|
def remove_listing(uuid)
|
203
|
-
listing = @listings_by_uuid[uuid]
|
199
|
+
listing = @listings_by_uuid[uuid] || return
|
204
200
|
|
205
201
|
logger.debug { sign_message("Removing listing: #{listing.inspect}") }
|
206
202
|
|
207
|
-
@listings_by_service.
|
203
|
+
@listings_by_service.each_value do |listings|
|
208
204
|
listings.delete(listing)
|
209
205
|
end
|
210
206
|
|
@@ -7,7 +7,7 @@ module Protobuf
|
|
7
7
|
|
8
8
|
attr_reader :env
|
9
9
|
|
10
|
-
def initialize(
|
10
|
+
def initialize(_app)
|
11
11
|
# End of the line...
|
12
12
|
end
|
13
13
|
|
@@ -22,12 +22,12 @@ module Protobuf
|
|
22
22
|
@rpc_service ||= env.rpc_service.new(env)
|
23
23
|
end
|
24
24
|
|
25
|
-
|
25
|
+
private
|
26
26
|
|
27
27
|
# Call the given service method.
|
28
28
|
def dispatch_rpc_request
|
29
29
|
unless rpc_service.respond_to?(method_name)
|
30
|
-
|
30
|
+
fail MethodNotFound, "#{service_name}##{method_name} is not a publicly defined method."
|
31
31
|
end
|
32
32
|
|
33
33
|
rpc_service.callable_rpc_method(method_name).call
|
@@ -24,7 +24,7 @@ module Protobuf
|
|
24
24
|
# whose values are Sets.
|
25
25
|
#
|
26
26
|
def filters
|
27
|
-
@filters ||= Hash.new { |h,k| h[k] = [] }
|
27
|
+
@filters ||= Hash.new { |h, k| h[k] = [] }
|
28
28
|
end
|
29
29
|
|
30
30
|
# Filters hash keyed based on filter type (e.g. :before, :after, :around),
|
@@ -37,7 +37,7 @@ module Protobuf
|
|
37
37
|
def rescue_from(*ex_klasses, &block)
|
38
38
|
options = ex_klasses.last.is_a?(Hash) ? ex_klasses.pop : {}
|
39
39
|
callable = options.delete(:with) { block }
|
40
|
-
|
40
|
+
fail ArgumentError, 'Option :with missing from rescue_from options' if callable.nil?
|
41
41
|
ex_klasses.each { |ex_klass| rescue_filters[ex_klass] = callable }
|
42
42
|
end
|
43
43
|
|
@@ -45,12 +45,12 @@ module Protobuf
|
|
45
45
|
|
46
46
|
def define_filter(type, filter, options = {})
|
47
47
|
return if filter_defined?(type, filter)
|
48
|
-
filters[type] << options.merge(
|
48
|
+
filters[type] << options.merge(:callable => filter)
|
49
49
|
remember_filter(type, filter)
|
50
50
|
end
|
51
51
|
|
52
52
|
def defined_filters
|
53
|
-
@defined_filters ||= Hash.new { |h,k| h[k] = Set.new }
|
53
|
+
@defined_filters ||= Hash.new { |h, k| h[k] = Set.new }
|
54
54
|
end
|
55
55
|
|
56
56
|
# Check to see if the filter has been defined.
|
@@ -66,8 +66,8 @@ module Protobuf
|
|
66
66
|
end
|
67
67
|
|
68
68
|
# Takes a list of actually (or potentially) callable objects.
|
69
|
-
# TODO add support for if/unless
|
70
|
-
# TODO add support for only/except sub-filters
|
69
|
+
# TODO: add support for if/unless
|
70
|
+
# TODO: add support for only/except sub-filters
|
71
71
|
#
|
72
72
|
def set_filters(type, *args)
|
73
73
|
options = args.last.is_a?(Hash) ? args.pop : {}
|
@@ -94,7 +94,7 @@ module Protobuf
|
|
94
94
|
# if the filter should not be invoked, true if invocation should occur.
|
95
95
|
#
|
96
96
|
def invoke_filter?(rpc_method, filter)
|
97
|
-
|
97
|
+
invoke_via_only?(rpc_method, filter) \
|
98
98
|
&& invoke_via_except?(rpc_method, filter) \
|
99
99
|
&& invoke_via_if?(rpc_method, filter) \
|
100
100
|
&& invoke_via_unless?(rpc_method, filter)
|
@@ -108,8 +108,8 @@ module Protobuf
|
|
108
108
|
# Value should be a symbol/string or an array of symbols/strings.
|
109
109
|
#
|
110
110
|
def invoke_via_except?(rpc_method, filter)
|
111
|
-
except = [
|
112
|
-
|
111
|
+
except = [filter.fetch(:except) { [] }].flatten
|
112
|
+
except.empty? || !except.include?(rpc_method)
|
113
113
|
end
|
114
114
|
|
115
115
|
# Invoke the given :if callable (if any) and return its return value.
|
@@ -119,8 +119,8 @@ module Protobuf
|
|
119
119
|
# Value can either be a symbol/string indicating an instance method to call
|
120
120
|
# or an object that responds to `call`.
|
121
121
|
#
|
122
|
-
def invoke_via_if?(
|
123
|
-
if_check = filter.fetch(:if) {
|
122
|
+
def invoke_via_if?(_rpc_method, filter)
|
123
|
+
if_check = filter.fetch(:if) { ->(_service) { return true } }
|
124
124
|
do_invoke = case
|
125
125
|
when if_check.nil? then
|
126
126
|
true
|
@@ -128,7 +128,7 @@ module Protobuf
|
|
128
128
|
call_or_send(if_check)
|
129
129
|
end
|
130
130
|
|
131
|
-
|
131
|
+
do_invoke
|
132
132
|
end
|
133
133
|
|
134
134
|
# If the target rpc endpoint method is listed in the :only option,
|
@@ -138,8 +138,8 @@ module Protobuf
|
|
138
138
|
# Value should be a symbol/string or an array of symbols/strings.
|
139
139
|
#
|
140
140
|
def invoke_via_only?(rpc_method, filter)
|
141
|
-
only = [
|
142
|
-
|
141
|
+
only = [filter.fetch(:only) { [] }].flatten
|
142
|
+
only.empty? || only.include?(rpc_method)
|
143
143
|
end
|
144
144
|
|
145
145
|
# Invoke the given :unless callable (if any) and return the opposite
|
@@ -149,8 +149,8 @@ module Protobuf
|
|
149
149
|
# Value can either be a symbol/string indicating an instance method to call
|
150
150
|
# or an object that responds to `call`.
|
151
151
|
#
|
152
|
-
def invoke_via_unless?(
|
153
|
-
unless_check = filter.fetch(:unless) {
|
152
|
+
def invoke_via_unless?(_rpc_method, filter)
|
153
|
+
unless_check = filter.fetch(:unless) { ->(_service) { return false } }
|
154
154
|
skip_invoke = case
|
155
155
|
when unless_check.nil? then
|
156
156
|
false
|
@@ -158,7 +158,7 @@ module Protobuf
|
|
158
158
|
call_or_send(unless_check)
|
159
159
|
end
|
160
160
|
|
161
|
-
|
161
|
+
!skip_invoke
|
162
162
|
end
|
163
163
|
|
164
164
|
def rescue_filters
|
@@ -176,7 +176,7 @@ module Protobuf
|
|
176
176
|
end
|
177
177
|
end
|
178
178
|
|
179
|
-
|
179
|
+
true
|
180
180
|
end
|
181
181
|
|
182
182
|
# Reverse build a chain of around filters. To implement an around chain,
|
@@ -209,17 +209,16 @@ module Protobuf
|
|
209
209
|
# end
|
210
210
|
#
|
211
211
|
def run_around_filters(rpc_method)
|
212
|
-
final =
|
213
|
-
filters[:around].reverse.
|
212
|
+
final = -> { __send__(rpc_method) }
|
213
|
+
filters[:around].reverse.reduce(final) do |previous, filter|
|
214
214
|
if invoke_filter?(rpc_method, filter)
|
215
|
-
|
215
|
+
-> { call_or_send(filter[:callable], &previous) }
|
216
216
|
else
|
217
217
|
previous
|
218
218
|
end
|
219
|
-
|
219
|
+
end.call
|
220
220
|
end
|
221
221
|
|
222
|
-
|
223
222
|
# Entry method to call each filter type in the appropriate order. This should
|
224
223
|
# be used instead of the other run methods directly.
|
225
224
|
#
|
@@ -240,10 +239,10 @@ module Protobuf
|
|
240
239
|
begin
|
241
240
|
yield
|
242
241
|
rescue *rescue_filters.keys => ex
|
243
|
-
callable = rescue_filters.fetch(ex.class)
|
244
|
-
mapped_klass = rescue_filters.keys.
|
242
|
+
callable = rescue_filters.fetch(ex.class) do
|
243
|
+
mapped_klass = rescue_filters.keys.find { |child_klass| ex.class < child_klass }
|
245
244
|
rescue_filters[mapped_klass]
|
246
|
-
|
245
|
+
end
|
247
246
|
|
248
247
|
call_or_send(callable, ex)
|
249
248
|
end
|
@@ -260,10 +259,10 @@ module Protobuf
|
|
260
259
|
when respond_to?(callable, true) then
|
261
260
|
__send__(callable, *args, &block)
|
262
261
|
else
|
263
|
-
|
262
|
+
fail "Object #{callable} is not callable"
|
264
263
|
end
|
265
264
|
|
266
|
-
|
265
|
+
return_value
|
267
266
|
end
|
268
267
|
|
269
268
|
end
|