grpc_kit 0.1.8 → 0.1.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.
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