grpc_kit 0.1.8 → 0.1.9

Sign up to get free protection for your applications and to get access to all the features.
Files changed (60) hide show
  1. checksums.yaml +4 -4
  2. data/examples/helloworld_client.rb +1 -1
  3. data/examples/routeguide_client.rb +33 -0
  4. data/examples/routeguide_server.rb +17 -0
  5. data/lib/grpc.rb +2 -1
  6. data/lib/grpc_kit.rb +4 -1
  7. data/lib/grpc_kit/calls.rb +17 -3
  8. data/lib/grpc_kit/calls/client_bidi_streamer.rb +63 -0
  9. data/lib/grpc_kit/calls/client_client_streamer.rb +8 -4
  10. data/lib/grpc_kit/calls/client_request_response.rb +7 -4
  11. data/lib/grpc_kit/calls/client_server_streamer.rb +7 -4
  12. data/lib/grpc_kit/calls/server_bidi_streamer.rb +43 -0
  13. data/lib/grpc_kit/calls/server_client_streamer.rb +5 -1
  14. data/lib/grpc_kit/calls/server_request_response.rb +5 -1
  15. data/lib/grpc_kit/calls/server_server_streamer.rb +5 -1
  16. data/lib/grpc_kit/client.rb +22 -4
  17. data/lib/grpc_kit/errors.rb +25 -11
  18. data/lib/grpc_kit/grpc/dsl.rb +17 -2
  19. data/lib/grpc_kit/grpc/generic_service.rb +0 -13
  20. data/lib/grpc_kit/grpc/interceptor.rb +27 -0
  21. data/lib/grpc_kit/grpc/logger.rb +4 -1
  22. data/lib/grpc_kit/grpc_time.rb +3 -1
  23. data/lib/grpc_kit/interceptors.rb +3 -0
  24. data/lib/grpc_kit/interceptors/client_bidi_streamer.rb +20 -0
  25. data/lib/grpc_kit/interceptors/client_client_streamer.rb +3 -0
  26. data/lib/grpc_kit/interceptors/client_request_response.rb +3 -0
  27. data/lib/grpc_kit/interceptors/client_server_streamer.rb +3 -0
  28. data/lib/grpc_kit/interceptors/server_bidi_streamer.rb +17 -0
  29. data/lib/grpc_kit/interceptors/server_client_streamer.rb +2 -0
  30. data/lib/grpc_kit/interceptors/server_request_response.rb +2 -0
  31. data/lib/grpc_kit/interceptors/server_server_streamer.rb +2 -0
  32. data/lib/grpc_kit/protobuffer.rb +8 -0
  33. data/lib/grpc_kit/rpc_desc.rb +21 -4
  34. data/lib/grpc_kit/rpcs.rb +4 -0
  35. data/lib/grpc_kit/rpcs/client_bidi_streamer.rb +20 -1
  36. data/lib/grpc_kit/rpcs/client_client_streamer.rb +5 -0
  37. data/lib/grpc_kit/rpcs/client_request_response.rb +11 -17
  38. data/lib/grpc_kit/rpcs/client_server_streamer.rb +5 -0
  39. data/lib/grpc_kit/rpcs/server_bidi_streamer.rb +17 -0
  40. data/lib/grpc_kit/rpcs/server_client_streamer.rb +3 -0
  41. data/lib/grpc_kit/rpcs/server_request_response.rb +3 -0
  42. data/lib/grpc_kit/rpcs/server_server_streamer.rb +3 -0
  43. data/lib/grpc_kit/server.rb +12 -4
  44. data/lib/grpc_kit/session/client_session.rb +7 -2
  45. data/lib/grpc_kit/session/drain_controller.rb +2 -0
  46. data/lib/grpc_kit/session/headers.rb +11 -0
  47. data/lib/grpc_kit/session/io.rb +9 -0
  48. data/lib/grpc_kit/session/recv_buffer.rb +7 -0
  49. data/lib/grpc_kit/session/send_buffer.rb +8 -0
  50. data/lib/grpc_kit/session/server_session.rb +8 -5
  51. data/lib/grpc_kit/session/stream.rb +17 -3
  52. data/lib/grpc_kit/session/stream_status.rb +7 -1
  53. data/lib/grpc_kit/stream/client_stream.rb +55 -9
  54. data/lib/grpc_kit/stream/server_stream.rb +19 -1
  55. data/lib/grpc_kit/transport/client_transport.rb +39 -3
  56. data/lib/grpc_kit/transport/packable.rb +9 -3
  57. data/lib/grpc_kit/transport/server_transport.rb +15 -2
  58. data/lib/grpc_kit/version.rb +1 -1
  59. metadata +6 -3
  60. data/TODO.md +0 -71
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: e7b605bf4f8cf8486b85fbb391296e0e9acb21ca00efc29850271e9890b6a386
4
- data.tar.gz: cc8597e07c5e467c249dc78a4ad5f02fc811410039e7eadaecfe176ae9dc3b20
3
+ metadata.gz: c0f50bc31421b7a051756b64bc75d4622e1a66932e919fa2a10d7bc915716969
4
+ data.tar.gz: 1e881d306e7c88a6a91da602e2771659fe230c523aedaae96e461621091bec70
5
5
  SHA512:
6
- metadata.gz: fb29d063711fa507ff5d85a6bd9ef7e7fac86ffb4502947ab144feea453a01901ee9fc14c05e0a10a2a10d0b73fbfc1ee4e0dcc58b1c4ccf5ef9b6b974295548
7
- data.tar.gz: 9e98bb7709c5bdc49683e57d9134877d8ec558feff9d1081a1f49e76afc47969172843f5b4669b8d84f74a826bb58a58372840f8011f82bd7a1bca3b2ec76e58
6
+ metadata.gz: 878f6c4a966f9e7af45dc3c57dcb865c93324c21c382439a5b552f67e4dab1ee09f87795af661e39df9cadaf78a20975201fae6af94f2b0b770691369608de55
7
+ data.tar.gz: 2e7332f3177f51efdc4f625755dbd92a5f5cdea063635eea1d6a1a75bc499ea87af57633903e12e6aebf5da5ddef028ddecc818bb71623a85b1d995c59e065a6
@@ -1,4 +1,4 @@
1
- # frozen_string_literal: false
1
+ # frozen_string_literal: true
2
2
 
3
3
  $LOAD_PATH.unshift File.expand_path('./examples/helloworld')
4
4
 
@@ -49,6 +49,8 @@ def list_features(stub)
49
49
  end
50
50
 
51
51
  def record_route(stub, size)
52
+ $logger.info('===== record_route =====')
53
+
52
54
  features = File.open(RESOURCE_PATH) do |f|
53
55
  JSON.parse(f.read)
54
56
  end
@@ -67,6 +69,36 @@ def record_route(stub, size)
67
69
  puts "summary: #{resp[0].inspect}"
68
70
  end
69
71
 
72
+ ROUTE_CHAT_NOTES = [
73
+ Routeguide::RouteNote.new(message: 'First message', location: Routeguide::Point.new(latitude: 0, longitude: 1)),
74
+ Routeguide::RouteNote.new(message: 'Second message', location: Routeguide::Point.new(latitude: 0, longitude: 2)),
75
+ Routeguide::RouteNote.new(message: 'Third message', location: Routeguide::Point.new(latitude: 0, longitude: 3)),
76
+ Routeguide::RouteNote.new(message: 'Fourth message', location: Routeguide::Point.new(latitude: 0, longitude: 1)),
77
+ Routeguide::RouteNote.new(message: 'Fifth message', location: Routeguide::Point.new(latitude: 0, longitude: 2)),
78
+ Routeguide::RouteNote.new(message: 'Sixth message', location: Routeguide::Point.new(latitude: 0, longitude: 3)),
79
+ ].freeze
80
+
81
+ def route_chat(stub)
82
+ $logger.info('===== route_chat =====')
83
+
84
+ call = stub.route_chat({})
85
+
86
+ t = Thread.new do
87
+ loop do
88
+ rn = call.recv
89
+ $logger.info("Got message #{rn.message} at point point(#{rn.location.latitude}, #{rn.location.longitude})")
90
+ end
91
+ end
92
+
93
+ ROUTE_CHAT_NOTES.each do |rcn|
94
+ call.send_msg(rcn)
95
+ sleep 1
96
+ end
97
+
98
+ call.close_and_send
99
+ t.join
100
+ end
101
+
70
102
  opts = {}
71
103
 
72
104
  if ENV['GRPC_INTERCEPTOR']
@@ -82,5 +114,6 @@ stub = Routeguide::RouteGuide::Stub.new(sock, **opts)
82
114
  get_feature(stub)
83
115
  list_features(stub)
84
116
  record_route(stub, 10)
117
+ route_chat(stub)
85
118
 
86
119
  # rubocop:enable Style/GlobalVars
@@ -17,6 +17,8 @@ class Server < Routeguide::RouteGuide::Service
17
17
  features = JSON.parse(f.read)
18
18
  @features = Hash[features.map { |x| [x['location'], x['name']] }]
19
19
  end
20
+
21
+ @route_notes = Hash.new { |h, k| h[k] = [] }
20
22
  end
21
23
 
22
24
  def get_feature(point, ctx)
@@ -70,6 +72,21 @@ class Server < Routeguide::RouteGuide::Service
70
72
  )
71
73
  end
72
74
 
75
+ def route_chat(call)
76
+ loop do
77
+ rn = call.recv
78
+ @logger.info("route_note location=#{rn.location.inspect}, message=#{rn.message}")
79
+ key = "#{rn.location.latitude} #{rn.location.longitude}"
80
+ saved_msgs = @route_notes[key]
81
+ @route_notes[key] << rn.message
82
+
83
+ saved_msgs.each do |m|
84
+ n = Routeguide::RouteNote.new(location: rn.location, message: m)
85
+ call.send_msg(n)
86
+ end
87
+ end
88
+ end
89
+
73
90
  private
74
91
 
75
92
  COORD_FACTOR = 1e7
data/lib/grpc.rb CHANGED
@@ -1,8 +1,9 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- # Compat file for xx_services_pb.rb
3
+ # Compatible file for xx_services_pb.rb and xx_pb.rb which are created by grpc-tools gem
4
4
  require 'grpc_kit'
5
5
  require 'grpc_kit/grpc/generic_service'
6
6
  require 'grpc_kit/grpc/interceptor'
7
+ require 'grpc_kit/grpc/logger'
7
8
 
8
9
  GRPC = GrpcKit::GRPC
data/lib/grpc_kit.rb CHANGED
@@ -8,13 +8,16 @@ require 'grpc_kit/client'
8
8
 
9
9
  module GrpcKit
10
10
  class << self
11
+ # @param value [Logger] Any logger
11
12
  attr_writer :logger
12
13
 
14
+ # @return [Logger]
13
15
  def logger
14
16
  @logger ||= Logger.new(STDOUT, level: ENV['GRPC_KIT_LOGLEVEL'] || :info)
15
17
  end
16
18
 
17
- # @params level [String] :debug, :info, :warn, :error, :fatal or :unknown
19
+ # @param level [String] :debug, :info, :warn, :error, :fatal or :unknown
20
+ # @return [void]
18
21
  def self.loglevel=(level)
19
22
  logger.level = level
20
23
  end
@@ -6,11 +6,22 @@ module GrpcKit
6
6
  Name = Struct.new(:name, :receiver)
7
7
  Reciver = Struct.new(:class)
8
8
  Klass = Struct.new(:service_name)
9
+
10
+ # @return [GrpcKit::Calls::Call::Name] gRPC method object
9
11
  attr_reader :method
10
12
 
11
- # @params stream [GrpcKit::Stream::ServerStream|GrpcKit::Stream::ClientStream]
12
- # @params config [GrpcKit::MethodConfig]
13
- # @params metadata [Hash]
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>]
14
25
  def initialize(stream:, config:, metadata:, timeout: nil)
15
26
  @config = config
16
27
  @metadata = metadata
@@ -26,14 +37,17 @@ module GrpcKit
26
37
  @restrict = false
27
38
  end
28
39
 
40
+ # @return [void]
29
41
  def restrict_mode
30
42
  @restrict = true
31
43
  end
32
44
 
45
+ # @return [void]
33
46
  def normal_mode
34
47
  @restrict = false
35
48
  end
36
49
 
50
+ # @return [Time] deadline of this rpc call
37
51
  def deadline
38
52
  @deadline ||= @timeout.to_absolute_time
39
53
  end
@@ -0,0 +1,63 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'grpc_kit/calls'
4
+
5
+ module GrpcKit
6
+ module Calls::Client
7
+ class BidiStreamer < GrpcKit::Calls::Call
8
+ alias outgoing_metadata metadata
9
+
10
+ def initialize(*)
11
+ super
12
+ @mutex = Mutex.new
13
+ @send = false
14
+ end
15
+
16
+ # @param data [Object] request message
17
+ # @param last [Boolean]
18
+ # @return [void]
19
+ def send_msg(data, last: false)
20
+ raise 'No method error' if @restrict
21
+
22
+ if @reason
23
+ raise "Upstream returns an error status: #{@reason}"
24
+ end
25
+
26
+ @mutex.synchronize do
27
+ @stream.send_msg(data, last: last, metadata: outgoing_metadata)
28
+ end
29
+
30
+ @send = true
31
+ end
32
+
33
+ # This method not is expected to be call in the main thread where #send_msg is called
34
+ #
35
+ # @param last [Boolean]
36
+ # @return [Object] response object
37
+ def recv(last: false)
38
+ raise 'No method error' if @restrict
39
+
40
+ sleep 0.1 until @send
41
+
42
+ loop do
43
+ msg = @mutex.synchronize do
44
+ @stream.recv_msg(last: last, blocking: false)
45
+ end
46
+
47
+ unless msg == :wait_readable
48
+ return msg
49
+ end
50
+ end
51
+ rescue GrpcKit::Errors::BadStatus => e
52
+ @reason = e
53
+ raise e
54
+ end
55
+
56
+ def close_and_send
57
+ @mutex.synchronize do
58
+ @stream.close_and_send
59
+ end
60
+ end
61
+ end
62
+ end
63
+ end
@@ -5,22 +5,26 @@ require 'grpc_kit/calls'
5
5
  module GrpcKit
6
6
  module Calls::Client
7
7
  class ClientStreamer < GrpcKit::Calls::Call
8
- attr_reader :deadline, :service_name, :method_name
9
- attr_reader :metadata
10
8
  alias outgoing_metadata metadata
11
9
 
12
- def send_msg(data, timeout: nil, last: false)
10
+ # @param data [Object] request message
11
+ # @param last [Boolean]
12
+ # @return [void]
13
+ def send_msg(data, last: false)
13
14
  raise 'No method error' if @restrict
14
15
 
15
- @stream.send_msg(data, last: last, timeout: timeout, metadata: outgoing_metadata)
16
+ @stream.send_msg(data, last: last, metadata: outgoing_metadata)
16
17
  end
17
18
 
19
+ # @param last [Boolean]
20
+ # @return [Object] response object
18
21
  def recv(last: false)
19
22
  raise 'No method error' if @restrict
20
23
 
21
24
  @stream.recv_msg(last: last)
22
25
  end
23
26
 
27
+ # @return [Array<Object>] response objects
24
28
  def close_and_recv
25
29
  @stream.close_and_recv
26
30
  end
@@ -5,16 +5,19 @@ require 'grpc_kit/calls'
5
5
  module GrpcKit
6
6
  module Calls::Client
7
7
  class RequestResponse < GrpcKit::Calls::Call
8
- attr_reader :deadline, :service_name, :method_name
9
- attr_reader :metadata
10
8
  alias outgoing_metadata metadata
11
9
 
12
- def send_msg(data, timeout: nil, last: false)
10
+ # @param data [Object] request message
11
+ # @param last [Boolean]
12
+ # @return [void]
13
+ def send_msg(data, last: false)
13
14
  raise 'No method error' if @restrict
14
15
 
15
- @stream.send_msg(data, last: last, timeout: timeout, metadata: outgoing_metadata)
16
+ @stream.send_msg(data, last: last, metadata: outgoing_metadata)
16
17
  end
17
18
 
19
+ # @param last [Boolean]
20
+ # @return [Object] response object
18
21
  def recv(last: false)
19
22
  raise 'No method error' if @restrict
20
23
 
@@ -5,16 +5,19 @@ require 'grpc_kit/calls'
5
5
  module GrpcKit
6
6
  module Calls::Client
7
7
  class ServerStreamer < GrpcKit::Calls::Call
8
- attr_reader :deadline, :service_name, :method_name
9
- attr_reader :metadata
10
8
  alias outgoing_metadata metadata
11
9
 
12
- def send_msg(data, timeout: nil, last: false)
10
+ # @param data [Object] request message
11
+ # @param last [Boolean]
12
+ # @return [void]
13
+ def send_msg(data, last: false)
13
14
  raise 'No method error' if @restrict
14
15
 
15
- @stream.send_msg(data, last: last, timeout: timeout, metadata: outgoing_metadata)
16
+ @stream.send_msg(data, last: last, metadata: outgoing_metadata)
16
17
  end
17
18
 
19
+ # @param last [Boolean]
20
+ # @return [Object] response object
18
21
  def recv(last: false)
19
22
  raise 'No method error' if @restrict
20
23
 
@@ -0,0 +1,43 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'grpc_kit/calls'
4
+
5
+ module GrpcKit
6
+ module Calls::Server
7
+ class BidiStreamer < GrpcKit::Calls::Call
8
+ attr_reader :outgoing_initial_metadata, :outgoing_trailing_metadata
9
+ alias incoming_metadata metadata
10
+
11
+ def initialize(*)
12
+ super
13
+
14
+ @outgoing_initial_metadata = {}
15
+ @outgoing_trailing_metadata = {}
16
+ end
17
+
18
+ # @param data [Object] request message
19
+ # @param last [Boolean]
20
+ # @return [void]
21
+ def send_msg(data, last: false)
22
+ raise 'No method error' if @restrict
23
+
24
+ @stream.send_msg(
25
+ data,
26
+ @protobuf,
27
+ last: last,
28
+ initial_metadata: @outgoing_initial_metadata,
29
+ trailing_metadata: @outgoing_trailing_metadata,
30
+ limit_size: @config.max_send_message_size,
31
+ )
32
+ end
33
+
34
+ # @param last [Boolean]
35
+ # @return [Object] response object
36
+ def recv(last: false)
37
+ raise 'No method error' if @restrict
38
+
39
+ @stream.recv_msg(@protobuf, last: last, limit_size: @config.max_receive_message_size)
40
+ end
41
+ end
42
+ end
43
+ end
@@ -5,7 +5,6 @@ require 'grpc_kit/calls'
5
5
  module GrpcKit
6
6
  module Calls::Server
7
7
  class ClientStreamer < GrpcKit::Calls::Call
8
- attr_reader :deadline, :metadata
9
8
  attr_reader :outgoing_initial_metadata, :outgoing_trailing_metadata
10
9
  alias incoming_metadata metadata
11
10
 
@@ -16,6 +15,9 @@ module GrpcKit
16
15
  @outgoing_trailing_metadata = {}
17
16
  end
18
17
 
18
+ # @param data [Object] request message
19
+ # @param last [Boolean]
20
+ # @return [void]
19
21
  def send_msg(data, last: false)
20
22
  raise 'No method error' if @restrict
21
23
 
@@ -29,6 +31,8 @@ module GrpcKit
29
31
  )
30
32
  end
31
33
 
34
+ # @param last [Boolean]
35
+ # @return [Object] response object
32
36
  def recv(last: false)
33
37
  raise 'No method error' if @restrict
34
38
 
@@ -5,7 +5,6 @@ require 'grpc_kit/calls'
5
5
  module GrpcKit
6
6
  module Calls::Server
7
7
  class RequestResponse < GrpcKit::Calls::Call
8
- attr_reader :deadline, :metadata
9
8
  attr_reader :outgoing_initial_metadata, :outgoing_trailing_metadata
10
9
  alias incoming_metadata metadata
11
10
 
@@ -16,6 +15,9 @@ module GrpcKit
16
15
  @outgoing_trailing_metadata = {}
17
16
  end
18
17
 
18
+ # @param data [Object] request message
19
+ # @param last [Boolean]
20
+ # @return [void]
19
21
  def send_msg(data, last: false)
20
22
  raise 'No method error' if @restrict
21
23
 
@@ -29,6 +31,8 @@ module GrpcKit
29
31
  )
30
32
  end
31
33
 
34
+ # @param last [Boolean]
35
+ # @return [Object] response object
32
36
  def recv(last: false)
33
37
  raise 'No method error' if @restrict
34
38
 
@@ -5,7 +5,6 @@ require 'grpc_kit/calls'
5
5
  module GrpcKit
6
6
  module Calls::Server
7
7
  class ServerStreamer < GrpcKit::Calls::Call
8
- attr_reader :deadline, :metadata
9
8
  attr_reader :outgoing_initial_metadata, :outgoing_trailing_metadata
10
9
  alias incoming_metadata metadata
11
10
 
@@ -16,6 +15,9 @@ module GrpcKit
16
15
  @outgoing_trailing_metadata = {}
17
16
  end
18
17
 
18
+ # @param data [Object] request message
19
+ # @param last [Boolean]
20
+ # @return [void]
19
21
  def send_msg(data, last: false)
20
22
  raise 'No method error' if @restrict
21
23
 
@@ -29,6 +31,8 @@ module GrpcKit
29
31
  )
30
32
  end
31
33
 
34
+ # @param last [Boolean]
35
+ # @return [Object] response object
32
36
  def recv(last: false)
33
37
  raise 'No method error' if @restrict
34
38