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
@@ -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.