grpc_kit 0.1.14 → 0.2.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.
Files changed (40) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +3 -0
  3. data/README.md +4 -0
  4. data/examples/interceptors/call_stream.rb +18 -0
  5. data/examples/interceptors/client_logging_interceptor.rb +6 -17
  6. data/examples/interceptors/server_logging_interceptor.rb +6 -9
  7. data/examples/routeguide_client.rb +7 -10
  8. data/examples/routeguide_server.rb +4 -6
  9. data/lib/grpc_kit.rb +1 -1
  10. data/lib/grpc_kit/call.rb +45 -0
  11. data/lib/grpc_kit/calls.rb +2 -52
  12. data/lib/grpc_kit/calls/client_bidi_streamer.rb +13 -11
  13. data/lib/grpc_kit/calls/client_client_streamer.rb +5 -15
  14. data/lib/grpc_kit/calls/client_request_response.rb +6 -11
  15. data/lib/grpc_kit/calls/client_server_streamer.rb +7 -14
  16. data/lib/grpc_kit/calls/server_bidi_streamer.rb +11 -10
  17. data/lib/grpc_kit/calls/server_client_streamer.rb +12 -10
  18. data/lib/grpc_kit/calls/server_request_response.rb +6 -10
  19. data/lib/grpc_kit/calls/server_server_streamer.rb +5 -11
  20. data/lib/grpc_kit/errors.rb +17 -17
  21. data/lib/grpc_kit/grpc/dsl.rb +1 -1
  22. data/lib/grpc_kit/grpc/interceptor.rb +8 -8
  23. data/lib/grpc_kit/interceptor_registory.rb +35 -0
  24. data/lib/grpc_kit/interceptors.rb +6 -12
  25. data/lib/grpc_kit/interceptors/client_request_response.rb +6 -9
  26. data/lib/grpc_kit/interceptors/server_request_response.rb +7 -10
  27. data/lib/grpc_kit/rpcs/client_bidi_streamer.rb +1 -1
  28. data/lib/grpc_kit/rpcs/client_client_streamer.rb +1 -1
  29. data/lib/grpc_kit/rpcs/client_request_response.rb +6 -6
  30. data/lib/grpc_kit/rpcs/client_server_streamer.rb +9 -4
  31. data/lib/grpc_kit/rpcs/server_bidi_streamer.rb +5 -1
  32. data/lib/grpc_kit/rpcs/server_client_streamer.rb +7 -3
  33. data/lib/grpc_kit/rpcs/server_request_response.rb +15 -11
  34. data/lib/grpc_kit/rpcs/server_server_streamer.rb +7 -3
  35. data/lib/grpc_kit/session/server_session.rb +1 -1
  36. data/lib/grpc_kit/status_codes.rb +17 -17
  37. data/lib/grpc_kit/stream/client_stream.rb +3 -10
  38. data/lib/grpc_kit/stream/server_stream.rb +0 -5
  39. data/lib/grpc_kit/version.rb +1 -1
  40. metadata +5 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 31ec1c9378ba22652effa01e9aa66474cc3cd1796777d5818556a9edf4994a07
4
- data.tar.gz: 76ad9686c486526f7024d59d86e28d2f5d3c275d60d41adc854ea09c4255af84
3
+ metadata.gz: bb504e4e1ba14e8e0a411336254cd5f7b3b20a39305cc31e506ae4d0d81cd77a
4
+ data.tar.gz: 2595cda7ac23058f72e76e0e8955b70d305c585fe34d63e1bd183d1fc40c104e
5
5
  SHA512:
6
- metadata.gz: 18e6fee2fb90e49fad73264fabe145aa7b1b989aff8d8b8228b8e76b929871e7efb94d5e10aa65b22442a0189821be0eae92b63ef0e38dcdddc0b5e563f62df7
7
- data.tar.gz: 90c5c08f4b147629e5cf6805402426feb48cf3c30c613ecf2914e62c0dae5d4efc179b1630f6ed0aaf8258e2b80772071a55af4c33eeeadf98125c7c47540757
6
+ metadata.gz: f00be6d6aace37b66fa123f50b89903998b6520446369e067dc56afc4342b1d62153f15f631f170fb0aed6b0dba27f0db270d94edd78ad7ccd5f712eb0163b5b
7
+ data.tar.gz: 83671c633699f7a0e49adbfffbf9fe383a7eae57216d7876760b9bbd6114018cf606183420135807406ece0ebbbd6fdb6a5fd251956b5e1cd59adef6c68f4369
@@ -29,6 +29,9 @@ Style/IfUnlessModifier:
29
29
  Style/TrailingCommaInHashLiteral:
30
30
  EnforcedStyleForMultiline: comma
31
31
 
32
+ Style/TrailingCommaInArrayLiteral:
33
+ EnforcedStyleForMultiline: comma
34
+
32
35
  Style/TrailingCommaInArguments:
33
36
  EnforcedStyleForMultiline: comma
34
37
 
data/README.md CHANGED
@@ -59,6 +59,10 @@ puts message
59
59
  $ bundle install
60
60
  ```
61
61
 
62
+ ## Projects using grpc_kit
63
+
64
+ * [griffin](https://github.com/ganmacs/griffin) Multi process gRPC server in Ruby
65
+
62
66
  ## Contributing
63
67
 
64
68
  Bug reports and pull requests are welcome on GitHub at https://github.com/ganmacs/grpc_kit.
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'grpc_kit'
4
+ require 'forwardable'
5
+
6
+ class CallStream < GrpcKit::Call
7
+ extend Forwardable
8
+ delegate %i[send_msg recv] => :@inner
9
+
10
+ # @params call [GrpcKit::Call]
11
+ def initialize(inner)
12
+ @inner = inner
13
+ end
14
+
15
+ def method_missing(name, *args, &block)
16
+ @inner.public_send(name, *args, &block)
17
+ end
18
+ end
@@ -1,6 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'grpc_kit'
4
+ require_relative 'call_stream'
4
5
 
5
6
  class LoggingInterceptor < GRPC::ClientInterceptor
6
7
  def request_response(request: nil, method: nil, **)
@@ -26,28 +27,16 @@ class LoggingInterceptor < GRPC::ClientInterceptor
26
27
  yield(LoggingStream.new(call))
27
28
  end
28
29
 
29
- class LoggingStream
30
- def initialize(stream)
31
- @stream = stream
32
- end
33
-
34
- def send_msg(msg, **opts)
30
+ class LoggingStream < CallStream
31
+ def send_msg(msg)
35
32
  GrpcKit.logger.info("logging interceptor send #{msg.inspect}")
36
- @stream.send_msg(msg, opts)
33
+ super
37
34
  end
38
35
 
39
- def recv(**opt)
40
- @stream.recv(opt).tap do |v|
36
+ def recv
37
+ super.tap do |v|
41
38
  GrpcKit.logger.info("logging interceptor recv #{v.inspect}")
42
39
  end
43
40
  end
44
-
45
- def close_and_recv
46
- @stream.close_and_recv
47
- end
48
-
49
- def close_and_send
50
- @stream.close_and_send
51
- end
52
41
  end
53
42
  end
@@ -1,6 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'grpc_kit'
4
+ require_relative 'call_stream'
4
5
 
5
6
  class LoggingInterceptor < GRPC::ServerInterceptor
6
7
  def request_response(request: nil, call: nil, method: nil)
@@ -26,18 +27,14 @@ class LoggingInterceptor < GRPC::ServerInterceptor
26
27
  yield(LoggingStream.new(call))
27
28
  end
28
29
 
29
- class LoggingStream
30
- def initialize(stream)
31
- @stream = stream
32
- end
33
-
34
- def send_msg(msg, **opt)
30
+ class LoggingStream < CallStream
31
+ def send_msg(msg)
35
32
  GrpcKit.logger.info("logging interceptor send #{msg.inspect}")
36
- @stream.send_msg(msg, opt)
33
+ super
37
34
  end
38
35
 
39
- def recv(**opt)
40
- @stream.recv(**opt).tap do |v|
36
+ def recv
37
+ super.tap do |v|
41
38
  GrpcKit.logger.info("logging interceptor recv #{v.inspect}")
42
39
  end
43
40
  end
@@ -15,7 +15,7 @@ def get_feature(stub)
15
15
  GRPC.logger.info('===== get_feature =====')
16
16
  points = [
17
17
  Routeguide::Point.new(latitude: 409_146_138, longitude: -746_188_906),
18
- Routeguide::Point.new(latitude: 0, longitude: 0)
18
+ Routeguide::Point.new(latitude: 0, longitude: 0),
19
19
  ]
20
20
 
21
21
  points.each do |pt|
@@ -36,9 +36,7 @@ def list_features(stub)
36
36
  )
37
37
 
38
38
  stream = stub.list_features(rect)
39
-
40
- loop do
41
- r = stream.recv
39
+ stream.each do |r|
42
40
  GRPC.logger.info("Found #{r.name} at #{r.location.inspect}")
43
41
  end
44
42
  end
@@ -55,13 +53,13 @@ def record_route(stub, size)
55
53
  size.times do
56
54
  location = features.sample['location']
57
55
  point = Routeguide::Point.new(latitude: location['latitude'], longitude: location['longitude'])
58
- puts "Next point is #{point.inspect}"
56
+ GRPC.logger.info("Next point is #{point.inspect}")
59
57
  stream.send_msg(point)
60
58
  sleep(rand(0..1))
61
59
  end
62
60
 
63
- resp = stream.close_and_recv
64
- puts "summary: #{resp[0].inspect}"
61
+ resp = stream.recv
62
+ GRPC.logger.info("summary: #{resp.inspect}")
65
63
  end
66
64
 
67
65
  ROUTE_CHAT_NOTES = [
@@ -79,9 +77,8 @@ def route_chat(stub)
79
77
  call = stub.route_chat({})
80
78
 
81
79
  t = Thread.new do
82
- loop do
83
- rn = call.recv
84
- GRPC.logger.info("Got message #{rn.message} at point point(#{rn.location.latitude}, #{rn.location.longitude})")
80
+ call.each do |rn|
81
+ GRPC.logger.info("Got message #{rn.message} at point (#{rn.location.latitude}, #{rn.location.longitude})")
85
82
  end
86
83
  end
87
84
 
@@ -20,6 +20,7 @@ class Server < Routeguide::RouteGuide::Service
20
20
  end
21
21
 
22
22
  def get_feature(point, ctx)
23
+ GRPC.logger.info('===== get_feature =====')
23
24
  name = @features.fetch({ 'longitude' => point.longitude, 'latitude' => point.latitude }, '')
24
25
  GRPC.logger.info("Point longitude=#{point.longitude}, latitude=#{point.latitude}, metadata=#{ctx.metadata}")
25
26
  Routeguide::Feature.new(location: point, name: name)
@@ -48,8 +49,7 @@ class Server < Routeguide::RouteGuide::Service
48
49
  start_at = Time.now.to_i
49
50
  last = nil
50
51
 
51
- loop do
52
- point = stream.recv # XXX: raise StopIteration
52
+ stream.each do |point|
53
53
  GRPC.logger.info(point)
54
54
 
55
55
  count += 1
@@ -71,8 +71,8 @@ class Server < Routeguide::RouteGuide::Service
71
71
  end
72
72
 
73
73
  def route_chat(call)
74
- loop do
75
- rn = call.recv
74
+ GRPC.logger.info('===== record_chat =====')
75
+ call.each do |rn|
76
76
  GRPC.logger.info("route_note location=#{rn.location.inspect}, message=#{rn.message}")
77
77
  key = "#{rn.location.latitude} #{rn.location.longitude}"
78
78
  saved_msgs = @route_notes[key]
@@ -115,8 +115,6 @@ class Server < Routeguide::RouteGuide::Service
115
115
  end
116
116
 
117
117
  sock = TCPServer.new(50051)
118
- GrpcKit.logger = Logger.new('hoge', level: :debug)
119
-
120
118
  opts = {}
121
119
 
122
120
  if ENV['GRPC_INTERCEPTOR']
@@ -23,7 +23,7 @@ module GrpcKit
23
23
 
24
24
  # @param level [String] :debug, :info, :warn, :error, :fatal or :unknown
25
25
  # @return [void]
26
- def self.loglevel=(level)
26
+ def loglevel=(level)
27
27
  logger.level = level
28
28
  end
29
29
  end
@@ -0,0 +1,45 @@
1
+ # frozen_string_literal: true
2
+
3
+ module GrpcKit
4
+ class Call
5
+ Name = Struct.new(:name, :receiver)
6
+ Reciver = Struct.new(:class)
7
+ Klass = Struct.new(:service_name)
8
+
9
+ # @return [GrpcKit::Call::Name] gRPC method object
10
+ attr_reader :method
11
+
12
+ # @return [Symbol] gRPC method name
13
+ attr_reader :method_name
14
+
15
+ # @return [String] gRPC service name
16
+ attr_reader :service_name
17
+
18
+ # @return [Hash<String, String>] gRPC metadata
19
+ attr_reader :metadata
20
+
21
+ # @param stream [GrpcKit::Stream::ServerStream|GrpcKit::Stream::ClientStream]
22
+ # @param config [GrpcKit::MethodConfig]
23
+ # @param metadata [Hash<String,String>]
24
+ def initialize(stream:, config:, metadata:, timeout: nil)
25
+ @config = config
26
+ @metadata = metadata
27
+ @method_name = @config.method_name
28
+ @service_name = @config.service_name
29
+ @protobuf = @config.protobuf
30
+ @timeout = timeout
31
+ @stream = stream
32
+
33
+ # for compatible
34
+ klass = Klass.new(@service_name)
35
+ @method ||= Name.new(@method_name, Reciver.new(klass))
36
+ end
37
+
38
+ # @return [Time] deadline of this rpc call
39
+ def deadline
40
+ return @deadline if instance_variable_defined?(:@deadline)
41
+
42
+ @deadline = @timeout && @timeout.to_absolute_time
43
+ end
44
+ end
45
+ end
@@ -2,57 +2,7 @@
2
2
 
3
3
  module GrpcKit
4
4
  module Calls
5
- class Call
6
- Name = Struct.new(:name, :receiver)
7
- Reciver = Struct.new(:class)
8
- Klass = Struct.new(:service_name)
9
-
10
- # @return [GrpcKit::Calls::Call::Name] gRPC method object
11
- attr_reader :method
12
-
13
- # @return [Symbol] gRPC method name
14
- attr_reader :method_name
15
-
16
- # @return [String] gRPC service name
17
- attr_reader :service_name
18
-
19
- # @return [Hash<String, String>] gRPC metadata
20
- attr_reader :metadata
21
-
22
- # @param stream [GrpcKit::Stream::ServerStream|GrpcKit::Stream::ClientStream]
23
- # @param config [GrpcKit::MethodConfig]
24
- # @param metadata [Hash<String,String>]
25
- def initialize(stream:, config:, metadata:, timeout: nil)
26
- @config = config
27
- @metadata = metadata
28
- @method_name = @config.method_name
29
- @service_name = @config.service_name
30
- @protobuf = @config.protobuf
31
- @timeout = timeout
32
- @stream = stream
33
-
34
- # for compatible
35
- klass = Klass.new(@service_name)
36
- @method ||= Name.new(@method_name, Reciver.new(klass))
37
- @restrict = false
38
- end
39
-
40
- # @return [void]
41
- def restrict_mode
42
- @restrict = true
43
- end
44
-
45
- # @return [void]
46
- def normal_mode
47
- @restrict = false
48
- end
49
-
50
- # @return [Time] deadline of this rpc call
51
- def deadline
52
- return @deadline if instance_variable_defined?(:@deadline)
53
-
54
- @deadline = @timeout && @timeout.to_absolute_time
55
- end
56
- end
5
+ module Client; end
6
+ module Server; end
57
7
  end
58
8
  end
@@ -1,10 +1,13 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require 'grpc_kit/call'
3
4
  require 'grpc_kit/calls'
4
5
 
5
6
  module GrpcKit
6
7
  module Calls::Client
7
- class BidiStreamer < GrpcKit::Calls::Call
8
+ class BidiStreamer < GrpcKit::Call
9
+ include Enumerable
10
+
8
11
  alias outgoing_metadata metadata
9
12
 
10
13
  def initialize(*)
@@ -14,17 +17,14 @@ module GrpcKit
14
17
  end
15
18
 
16
19
  # @param data [Object] request message
17
- # @param last [Boolean]
18
20
  # @return [void]
19
- def send_msg(data, last: false)
20
- raise 'No method error' if @restrict
21
-
21
+ def send_msg(data)
22
22
  if @reason
23
23
  raise "Upstream returns an error status: #{@reason}"
24
24
  end
25
25
 
26
26
  @mutex.synchronize do
27
- @stream.send_msg(data, last: last, metadata: outgoing_metadata)
27
+ @stream.send_msg(data, metadata: outgoing_metadata)
28
28
  end
29
29
 
30
30
  @send = true
@@ -32,16 +32,13 @@ module GrpcKit
32
32
 
33
33
  # This method not is expected to be call in the main thread where #send_msg is called
34
34
  #
35
- # @param last [Boolean]
36
35
  # @return [Object] response object
37
- def recv(last: false)
38
- raise 'No method error' if @restrict
39
-
36
+ def recv
40
37
  sleep 0.1 until @send
41
38
 
42
39
  loop do
43
40
  msg = @mutex.synchronize do
44
- @stream.recv_msg(last: last, blocking: false)
41
+ @stream.recv_msg(blocking: false)
45
42
  end
46
43
 
47
44
  unless msg == :wait_readable
@@ -60,6 +57,11 @@ module GrpcKit
60
57
  @stream.close_and_send
61
58
  end
62
59
  end
60
+
61
+ # @yieldparam response [Object] each response object of bidi streaming RPC
62
+ def each
63
+ loop { yield(recv) }
64
+ end
63
65
  end
64
66
  end
65
67
  end
@@ -1,31 +1,21 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require 'grpc_kit/call'
3
4
  require 'grpc_kit/calls'
4
5
 
5
6
  module GrpcKit
6
7
  module Calls::Client
7
- class ClientStreamer < GrpcKit::Calls::Call
8
+ class ClientStreamer < GrpcKit::Call
8
9
  alias outgoing_metadata metadata
9
10
 
10
11
  # @param data [Object] request message
11
- # @param last [Boolean]
12
12
  # @return [void]
13
- def send_msg(data, last: false)
14
- raise 'No method error' if @restrict
15
-
16
- @stream.send_msg(data, last: last, metadata: outgoing_metadata)
13
+ def send_msg(data)
14
+ @stream.send_msg(data, metadata: outgoing_metadata)
17
15
  end
18
16
 
19
- # @param last [Boolean]
20
17
  # @return [Object] response object
21
- def recv(last: false)
22
- raise 'No method error' if @restrict
23
-
24
- @stream.recv_msg(last: last)
25
- end
26
-
27
- # @return [Array<Object>] response objects
28
- def close_and_recv
18
+ def recv
29
19
  @stream.close_and_recv
30
20
  end
31
21
  end
@@ -1,27 +1,22 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require 'grpc_kit/call'
3
4
  require 'grpc_kit/calls'
4
5
 
5
6
  module GrpcKit
6
7
  module Calls::Client
7
- class RequestResponse < GrpcKit::Calls::Call
8
+ class RequestResponse < GrpcKit::Call
8
9
  alias outgoing_metadata metadata
9
10
 
10
11
  # @param data [Object] request message
11
- # @param last [Boolean]
12
12
  # @return [void]
13
- def send_msg(data, last: false)
14
- raise 'No method error' if @restrict
15
-
16
- @stream.send_msg(data, last: last, metadata: outgoing_metadata)
13
+ def send_msg(data)
14
+ @stream.send_msg(data, last: true, metadata: outgoing_metadata)
17
15
  end
18
16
 
19
- # @param last [Boolean]
20
17
  # @return [Object] response object
21
- def recv(last: false)
22
- raise 'No method error' if @restrict
23
-
24
- @stream.recv_msg(last: last)
18
+ def recv
19
+ @stream.recv_msg(last: true)
25
20
  end
26
21
  end
27
22
  end