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
@@ -1,4 +1,4 @@
1
- # frozen_string_literal: false
1
+ # frozen_string_literal: true
2
2
 
3
3
  require 'grpc_kit/grpc_time'
4
4
  require 'grpc_kit/session/io'
@@ -8,6 +8,10 @@ require 'grpc_kit/transport/client_transport'
8
8
 
9
9
  module GrpcKit
10
10
  class Client
11
+ # @param sock [TCPSocket]
12
+ # @param authority [nil, String]
13
+ # @param interceptors [Array<GrpcKit::GRPC::ClientInterceptor>] list of interceptors
14
+ # @param timeout [nil, Integer, String]
11
15
  def initialize(sock, authority: nil, interceptors: [], timeout: nil)
12
16
  @sock = sock
13
17
  @authority =
@@ -23,31 +27,45 @@ module GrpcKit
23
27
  build_rpcs(interceptors)
24
28
  end
25
29
 
30
+ # @param rpc [GrpcKit::Rpcs::Client::RequestResponse]
31
+ # @param request [Object]
32
+ # @param opts [Hash]
26
33
  def request_response(rpc, request, opts = {})
27
34
  GrpcKit.logger.debug('Calling request_respose')
28
35
  do_request(rpc, request, opts)
29
36
  end
30
37
 
38
+ # @param rpc [GrpcKit::Rpcs::Client::ClientStreamer]
39
+ # @param opts [Hash]
31
40
  def client_streamer(rpc, opts = {})
32
41
  GrpcKit.logger.debug('Calling client_streamer')
33
42
  do_request(rpc, nil, opts)
34
43
  end
35
44
 
45
+ # @param rpc [GrpcKit::Rpcs::Client::ServerStreamer]
46
+ # @param request [Object]
47
+ # @param opts [Hash]
36
48
  def server_streamer(rpc, request, opts = {})
37
49
  GrpcKit.logger.debug('Calling server_streamer')
38
50
  do_request(rpc, request, opts)
39
51
  end
40
52
 
41
- def bidi_streamer(rpc, requests, opts = {})
53
+ # @param rpc [GrpcKit::Rpcs::Client::ServerStreamer]
54
+ # @param _requests [Object] it's for compatibility, no use
55
+ # @param opts [Hash]
56
+ def bidi_streamer(rpc, _requests, opts = {})
42
57
  GrpcKit.logger.debug('Calling bidi_streamer')
58
+ do_request(rpc, nil, opts)
43
59
  end
44
60
 
45
61
  private
46
62
 
47
63
  def do_request(rpc, request, **opts)
48
64
  t = GrpcKit::Transport::ClientTransport.new(session)
49
- cs = GrpcKit::Stream::ClientStream.new(t, rpc.config, authority: @authority, timeout: @timeout)
50
- rpc.invoke(cs, request, opts.merge(timeout: @timeout))
65
+ timeout = (opts[:timeout] && GrpcKit::GrpcTime.new(opts[:timeout])) || @timeout
66
+
67
+ cs = GrpcKit::Stream::ClientStream.new(t, rpc.config, authority: @authority, timeout: timeout)
68
+ rpc.invoke(cs, request, timeout: timeout, **opts)
51
69
  end
52
70
 
53
71
  def session
@@ -6,13 +6,22 @@ module GrpcKit
6
6
  module Errors
7
7
  # https://github.com/grpc/grpc/blob/23b5b1a5a9c7084c5b64d4998ee15af0f77bd589/doc/statuscodes.md
8
8
 
9
+ # @param code [String] GrpcKit::StatusCodes's value
10
+ # @param message [String]
11
+ # @return [GrpcKit::Errors::BadStatus]
9
12
  def self.from_status_code(code, message)
10
13
  CODES.fetch(code).new(message)
11
14
  end
12
15
 
13
16
  class BadStatus < StandardError
14
- attr_reader :code, :reason
17
+ # @return [String]
18
+ attr_reader :code
15
19
 
20
+ # @return [String]
21
+ attr_reader :reason
22
+
23
+ # @param code [String] GrpcKit::StatusCodes's value
24
+ # @param reason [String]
16
25
  def initialize(code, reason)
17
26
  @code = code
18
27
  @reason = reason
@@ -21,32 +30,37 @@ module GrpcKit
21
30
  end
22
31
 
23
32
  class Unknown < BadStatus
24
- def initialize(mesage)
25
- super(GrpcKit::StatusCodes::UNKNOWN, mesage)
33
+ # @param message [String]
34
+ def initialize(message)
35
+ super(GrpcKit::StatusCodes::UNKNOWN, message)
26
36
  end
27
37
  end
28
38
 
29
39
  class DeadlineExceeded < BadStatus
30
- def initialize(mesage)
31
- super(GrpcKit::StatusCodes::DEADLINE_EXCEEDED, mesage)
40
+ # @param message [String]
41
+ def initialize(message)
42
+ super(GrpcKit::StatusCodes::DEADLINE_EXCEEDED, message)
32
43
  end
33
44
  end
34
45
 
35
46
  class Unimplemented < BadStatus
36
- def initialize(mesage)
37
- super(GrpcKit::StatusCodes::UNIMPLEMENTED, mesage)
47
+ # @param message [String]
48
+ def initialize(message)
49
+ super(GrpcKit::StatusCodes::UNIMPLEMENTED, message)
38
50
  end
39
51
  end
40
52
 
41
53
  class ResourceExhausted < BadStatus
42
- def initialize(mesage)
43
- super(GrpcKit::StatusCodes::RESOURCE_EXHAUSTED, mesage)
54
+ # @param message [String]
55
+ def initialize(message)
56
+ super(GrpcKit::StatusCodes::RESOURCE_EXHAUSTED, message)
44
57
  end
45
58
  end
46
59
 
47
60
  class Internal < BadStatus
48
- def initialize(mesage)
49
- super(GrpcKit::StatusCodes::INTERNAL, mesage)
61
+ # @param message [String]
62
+ def initialize(message)
63
+ super(GrpcKit::StatusCodes::INTERNAL, message)
50
64
  end
51
65
  end
52
66
 
@@ -8,13 +8,24 @@ require 'grpc_kit/grpc/stream'
8
8
  module GrpcKit
9
9
  module GRPC
10
10
  module Dsl
11
- attr_writer :service_name, :marshal_class_method, :unmarshal_class_method
11
+ # @param value [String]
12
+ attr_writer :service_name
13
+
14
+ # @param value [Symbol]
15
+ attr_writer :marshal_class_method
16
+
17
+ # @param value [Symbol]
18
+ attr_writer :unmarshal_class_method
12
19
 
13
20
  def inherited(subclass)
14
21
  subclass.rpc_descs.merge!(rpc_descs)
15
22
  subclass.service_name = @service_name
16
23
  end
17
24
 
25
+ # @param name [Symbol] gRPC method name
26
+ # @param marshal [Class, GrpcKit::GRPC::Stream] marshaling object
27
+ # @param unmarshal [Class, GrpcKit::GRPC::Stream] unmarshaling object
28
+ # @return [void]
18
29
  def rpc(name, marshal, unmarshal)
19
30
  if rpc_descs.key?(name)
20
31
  raise "rpc (#{name}) is already defined"
@@ -38,15 +49,18 @@ module GrpcKit
38
49
  )
39
50
  rpc_descs[rpc_desc.path] = rpc_desc
40
51
 
41
- define_method(rpc_desc.ruby_style_name) do |_, _|
52
+ # Should use `*` since each rpc's sigunature is different.
53
+ define_method(rpc_desc.ruby_style_name) do |*|
42
54
  raise GrpcKit::Errors::Unimplemented, "Method not found: #{name}"
43
55
  end
44
56
  end
45
57
 
58
+ # @return [GrpcKit::GRPC::Stream]
46
59
  def stream(cls)
47
60
  GrpcKit::GRPC::Stream.new(cls)
48
61
  end
49
62
 
63
+ # @return [GrpcKit::Client]
50
64
  def rpc_stub_class
51
65
  rpc_descs_ = {}
52
66
  rpc_descs.each_value do |rpc_desc|
@@ -90,6 +104,7 @@ module GrpcKit
90
104
  end
91
105
  end
92
106
 
107
+ # @return [Hash<String,GrpcKit::RpcDesc>]
93
108
  def rpc_descs
94
109
  @rpc_descs ||= {}
95
110
  end
@@ -7,19 +7,6 @@ module GrpcKit
7
7
  module GenericService
8
8
  def self.included(obj)
9
9
  obj.extend(GrpcKit::GRPC::Dsl)
10
-
11
- # return unless obj.service_name.nil?
12
- # if obj.name.nil?
13
- # obj.service_name = 'GenericService'
14
- # else
15
- # modules = obj.name.split('::')
16
- # obj.service_name =
17
- # if modules.length > 2
18
- # modules[modules.length - 2]
19
- # else
20
- # modules.first
21
- # end
22
- # end
23
10
  end
24
11
  end
25
12
  end
@@ -13,18 +13,34 @@ module GrpcKit
13
13
  class ClientInterceptor < Interceptor
14
14
  # rubocop:disable Lint/UnusedMethodArgument
15
15
 
16
+ # @param request [Object,nil] An object which cliet will send
17
+ # @param call [GrpcKit::Calls::Client::RequestResponse,nil]
18
+ # @param metadata [Hash<String,String>,nil]
19
+ # @param method [GrpcKit::Calls::Call::Name,nil]
16
20
  def request_response(request: nil, call: nil, method: nil, metadata: nil)
17
21
  yield
18
22
  end
19
23
 
24
+ # @param requests [Object,nil] comptibility with grpc gem, no use
25
+ # @param call [GrpcKit::Calls::Client::ClientStreamer,nil]
26
+ # @param metadata [Hash<String,String>,nil]
27
+ # @param method [GrpcKit::Calls::Call::Name,nil]
20
28
  def client_streamer(requests: nil, call: nil, method: nil, metadata: nil)
21
29
  yield
22
30
  end
23
31
 
32
+ # @param request [Object,nil] An object which cliet will send
33
+ # @param call [GrpcKit::Calls::Client::ServerStreamer,nil]
34
+ # @param metadata [Hash<String,String>,nil]
35
+ # @param method [GrpcKit::Calls::Call::Name,nil]
24
36
  def server_streamer(request: nil, call: nil, method: nil, metadata: nil)
25
37
  yield
26
38
  end
27
39
 
40
+ # @param requests [Object,nil] comptibility with grpc gem, no use
41
+ # @param call [GrpcKit::Calls::Client::BidiStreamer,nil]
42
+ # @param metadata [Hash<String,String>,nil]
43
+ # @param method [GrpcKit::Calls::Call::Name,nil]
28
44
  def bidi_streamer(requests: nil, call: nil, method: nil, metadata: nil)
29
45
  yield
30
46
  end
@@ -35,18 +51,29 @@ module GrpcKit
35
51
  class ServerInterceptor < Interceptor
36
52
  # rubocop:disable Lint/UnusedMethodArgument
37
53
 
54
+ # @param request [Object] An object which server received
55
+ # @param call [GrpcKit::Calls::Server::RequestResponse,nil]
56
+ # @param method [GrpcKit::Calls::Call::Name,nil]
38
57
  def request_response(request: nil, call: nil, method: nil)
39
58
  yield
40
59
  end
41
60
 
61
+ # @param call [GrpcKit::Calls::Server::ClientStreamer,nil]
62
+ # @param method [GrpcKit::Calls::Call::Name,nil]
42
63
  def client_streamer(call: nil, method: nil)
43
64
  yield
44
65
  end
45
66
 
67
+ # @param request [Object] An object which server received
68
+ # @param call [GrpcKit::Calls::Server::ServerStreamer,nil]
69
+ # @param method [GrpcKit::Calls::Call::Name,nil]
46
70
  def server_streamer(request: nil, call: nil, method: nil)
47
71
  yield
48
72
  end
49
73
 
74
+ # @param requests [Object,nil] comptibility with grpc gem, no use
75
+ # @param call [GrpcKit::Calls::Server::BidiStreamer,nil]
76
+ # @param method [GrpcKit::Calls::Call::Name,nil]
50
77
  def bidi_streamer(requests: nil, call: nil, method: nil)
51
78
  yield
52
79
  end
@@ -1,9 +1,12 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require 'logger'
4
+
3
5
  module GrpcKit
4
6
  module GRPC
5
7
  module DefaultLogger
6
- def self.logger
8
+ # @return [Logger]
9
+ def logger
7
10
  LOGGER
8
11
  end
9
12
 
@@ -4,7 +4,7 @@ module GrpcKit
4
4
  class GrpcTime
5
5
  MAX = 10**9 - 1
6
6
 
7
- # @params value [String|Integer]
7
+ # @param value [String,Integer]
8
8
  def initialize(value)
9
9
  @unit = nil
10
10
  @value = nil
@@ -38,10 +38,12 @@ module GrpcKit
38
38
  end
39
39
  end
40
40
 
41
+ # @return [String]
41
42
  def to_s
42
43
  "#{@value}#{@unit}"
43
44
  end
44
45
 
46
+ # @return [Time]
45
47
  def to_absolute_time
46
48
  case @unit
47
49
  when 'S'
@@ -4,10 +4,12 @@ module GrpcKit
4
4
  module Interceptors
5
5
  module Client
6
6
  class Streaming
7
+ # @param interceptors [Array<GrpcKit::GRPC::ClientInterceptor>]
7
8
  def initialize(interceptors)
8
9
  @interceptors = interceptors
9
10
  end
10
11
 
12
+ # @param metadata [Hash<String,String>]
11
13
  def intercept(call, metadata, &block)
12
14
  if @interceptors && !@interceptors.empty?
13
15
  do_intercept(@interceptors.dup, call, metadata, &block)
@@ -35,6 +37,7 @@ module GrpcKit
35
37
 
36
38
  module Server
37
39
  class Streaming
40
+ # @param interceptors [Array<GrpcKit::GRPC::ServerInterceptor>]
38
41
  def initialize(interceptors)
39
42
  @interceptors = interceptors
40
43
  end
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'grpc_kit/interceptors'
4
+
5
+ module GrpcKit
6
+ module Interceptors::Client
7
+ class BidiStreamer < Streaming
8
+ private
9
+
10
+ # @param interceptor [GrpcKit::GRPC::ClientInterceptor]
11
+ # @param call [GrpcKit::Calls::Client::BidiStreamer]
12
+ # @param metadata [Hash<String,String>]
13
+ def invoke(interceptor, call, metadata)
14
+ interceptor.bidi_streamer(requests: nil, call: call, method: call.method, metadata: metadata) do
15
+ yield(call, metadata)
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
@@ -7,6 +7,9 @@ module GrpcKit
7
7
  class ClientStreamer < Streaming
8
8
  private
9
9
 
10
+ # @param interceptor [GrpcKit::GRPC::ClientInterceptor]
11
+ # @param call [GrpcKit::Calls::Client::ClientStreamer]
12
+ # @param metadata [Hash<String,String>]
10
13
  def invoke(interceptor, call, metadata)
11
14
  # We don't need a `:requests` parameter but,
12
15
  # it shuoldn't remove from paramters due to having a compatibility of grpc gem.
@@ -5,10 +5,13 @@ require 'grpc_kit/interceptors'
5
5
  module GrpcKit
6
6
  module Interceptors::Client
7
7
  class RequestResponse
8
+ # @param interceptors [Array<GrpcKit::GRPC::ClientInterceptor>]
8
9
  def initialize(interceptors)
9
10
  @interceptors = interceptors
10
11
  end
11
12
 
13
+ # @param call [GrpcKit::Calls::Client::RequestResponse]
14
+ # @param metadata [Hash<String,String>]
12
15
  def intercept(request, call, metadata, &block)
13
16
  if @interceptors && !@interceptors.empty?
14
17
  do_intercept(@interceptors.dup, request, call, metadata, &block)
@@ -7,6 +7,9 @@ module GrpcKit
7
7
  class ServerStreamer < Streaming
8
8
  private
9
9
 
10
+ # @param interceptor [GrpcKit::GRPC::ClientInterceptor]
11
+ # @param call [GrpcKit::Calls::Client::ServerStreamer]
12
+ # @param metadata [Hash<String,String>]
10
13
  def invoke(interceptor, call, metadata)
11
14
  # We don't need a `:request` parameter but,
12
15
  # it shuoldn't remove from paramters due to having a compatibility of grpc gem.
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'grpc_kit/interceptors'
4
+
5
+ module GrpcKit
6
+ module Interceptors::Server
7
+ class BidiStreamer < Streaming
8
+ # @param interceptor [GrpcKit::GRPC::ServerInterceptor]
9
+ # @param call [GrpcKit::Calls::Client::BidiStreamer]
10
+ def invoke(interceptor, call)
11
+ interceptor.bidi_streamer(call: call, method: call.method) do
12
+ yield(call)
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
@@ -5,6 +5,8 @@ require 'grpc_kit/interceptors'
5
5
  module GrpcKit
6
6
  module Interceptors::Server
7
7
  class ClientStreamer < Streaming
8
+ # @param interceptor [GrpcKit::GRPC::ServerInterceptor]
9
+ # @param call [GrpcKit::Calls::Client::ClientStreamer]
8
10
  def invoke(interceptor, call)
9
11
  interceptor.client_streamer(call: call, method: call.method) do
10
12
  yield(call)
@@ -5,10 +5,12 @@ require 'grpc_kit/interceptors'
5
5
  module GrpcKit
6
6
  module Interceptors::Server
7
7
  class RequestResponse
8
+ # @param interceptors [Array<GrpcKit::GRPC::ServerInterceptor>]
8
9
  def initialize(interceptors)
9
10
  @interceptors = interceptors
10
11
  end
11
12
 
13
+ # @param call [GrpcKit::Calls::Client::RequestResponse]
12
14
  def intercept(request, call, &block)
13
15
  if @interceptors && !@interceptors.empty?
14
16
  do_intercept(@interceptors.dup, request, call, &block)
@@ -5,6 +5,8 @@ require 'grpc_kit/interceptors'
5
5
  module GrpcKit
6
6
  module Interceptors::Server
7
7
  class ServerStreamer < Streaming
8
+ # @param interceptor [GrpcKit::GRPC::ServerInterceptor]
9
+ # @param call [GrpcKit::Calls::Client::ServerStreamer]
8
10
  def invoke(interceptor, call)
9
11
  # We don't need a `:request` parameter but,
10
12
  # it shuoldn't remove from paramters due to having a compatibility of grpc gem.