grpc_kit 0.1.3 → 0.1.4

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 (59) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +0 -1
  3. data/TODO.md +1 -1
  4. data/examples/helloworld_client.rb +5 -1
  5. data/examples/routeguide_client.rb +5 -2
  6. data/lib/grpc_kit/calls/client_client_streamer.rb +29 -0
  7. data/lib/grpc_kit/calls/client_request_response.rb +25 -0
  8. data/lib/grpc_kit/calls/client_server_streamer.rb +29 -0
  9. data/lib/grpc_kit/calls/server_client_streamer.rb +32 -0
  10. data/lib/grpc_kit/calls/server_request_response.rb +32 -0
  11. data/lib/grpc_kit/calls/server_server_streamer.rb +32 -0
  12. data/lib/grpc_kit/calls.rb +39 -0
  13. data/lib/grpc_kit/client.rb +17 -17
  14. data/lib/grpc_kit/grpc_time.rb +100 -0
  15. data/lib/grpc_kit/interceptors/client_client_streamer.rb +19 -0
  16. data/lib/grpc_kit/interceptors/client_request_response.rb +39 -0
  17. data/lib/grpc_kit/interceptors/client_server_streamer.rb +19 -0
  18. data/lib/grpc_kit/interceptors/server_client_streamer.rb +15 -0
  19. data/lib/grpc_kit/interceptors/server_request_response.rb +36 -0
  20. data/lib/grpc_kit/interceptors/server_server_streamer.rb +17 -0
  21. data/lib/grpc_kit/interceptors.rb +64 -5
  22. data/lib/grpc_kit/rpc_desc.rb +18 -2
  23. data/lib/grpc_kit/rpcs/client_bidi_streamer.rb +11 -0
  24. data/lib/grpc_kit/rpcs/client_client_streamer.rb +23 -0
  25. data/lib/grpc_kit/rpcs/client_request_response.rb +31 -0
  26. data/lib/grpc_kit/rpcs/client_server_streamer.rb +19 -0
  27. data/lib/grpc_kit/rpcs/server_bidi_streamer.rb +10 -0
  28. data/lib/grpc_kit/rpcs/server_client_streamer.rb +24 -0
  29. data/lib/grpc_kit/rpcs/server_request_response.rb +26 -0
  30. data/lib/grpc_kit/rpcs/server_server_streamer.rb +26 -0
  31. data/lib/grpc_kit/rpcs.rb +21 -5
  32. data/lib/grpc_kit/server.rb +16 -7
  33. data/lib/grpc_kit/session/headers.rb +2 -2
  34. data/lib/grpc_kit/session/stream.rb +5 -0
  35. data/lib/grpc_kit/{session/client.rb → sessions/client_session.rb} +5 -6
  36. data/lib/grpc_kit/{session/server.rb → sessions/server_session.rb} +21 -8
  37. data/lib/grpc_kit/streams/client_stream.rb +146 -0
  38. data/lib/grpc_kit/streams/server_stream.rb +105 -0
  39. data/lib/grpc_kit/{streams → transport}/packable.rb +2 -2
  40. data/lib/grpc_kit/{streams → transport}/send_buffer.rb +1 -1
  41. data/lib/grpc_kit/transports/client_transport.rb +96 -0
  42. data/lib/grpc_kit/transports/server_transport.rb +68 -0
  43. data/lib/grpc_kit/version.rb +1 -1
  44. metadata +32 -21
  45. data/lib/grpc_kit/interceptors/client_streamer.rb +0 -31
  46. data/lib/grpc_kit/interceptors/request_response.rb +0 -70
  47. data/lib/grpc_kit/interceptors/server_streamer.rb +0 -33
  48. data/lib/grpc_kit/interceptors/streaming.rb +0 -70
  49. data/lib/grpc_kit/rpcs/base.rb +0 -30
  50. data/lib/grpc_kit/rpcs/bidi_streamer.rb +0 -18
  51. data/lib/grpc_kit/rpcs/call.rb +0 -27
  52. data/lib/grpc_kit/rpcs/client_streamer.rb +0 -38
  53. data/lib/grpc_kit/rpcs/error.rb +0 -23
  54. data/lib/grpc_kit/rpcs/request_response.rb +0 -64
  55. data/lib/grpc_kit/rpcs/server_streamer.rb +0 -42
  56. data/lib/grpc_kit/session/duration.rb +0 -97
  57. data/lib/grpc_kit/stream.rb +0 -120
  58. data/lib/grpc_kit/streams/client.rb +0 -113
  59. data/lib/grpc_kit/streams/server.rb +0 -54
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 287f67b56117d3821a209c4be0892d6a9b7327fae3f7db509427afd2b53ef01b
4
- data.tar.gz: f2e75960649d6f0c76fa6aae4d6370e0a7d4285d7154ca5bd1a640b5a1d458f0
3
+ metadata.gz: 7415d182781136999b2e1630ef9dff77a61196225b4207e9d9535a2b566fceee
4
+ data.tar.gz: 9836c54ed198740c4a75e90b957a641528b06333a30314c03441b9dce35f8731
5
5
  SHA512:
6
- metadata.gz: ccf9c72baa32cdecfe2d1fe8e7b1126ebb9c7e6604eef084d59ec478b34ad565912f8ebf648dadecf2cd4208441abe9cdfc31781a3f7460d542de395ee98e596
7
- data.tar.gz: 5dbd7080945c3d1d47f4b19c488eb36a2cf60e71a28803344fc8f81d4054d42fa0cbe93929260d2e1709dd7f213c015188b8d209e34763de63a36d49b93f3e18
6
+ metadata.gz: '083b685dd4f7966156a1ac41eab594ace1664c813105e1204c521ce85e727945170ef1c701097ee6f93467407b13d08ea649d6da5f86af54ebd60ca1e373336e'
7
+ data.tar.gz: 505029bdcbfb035cb41b10ed845cec6ce27eae2ff350a27f49cb8a3b2cb4afeca92b8e5b9a7bc70e7dc0e2e8bde9d88591cc8899a871d81d2665c5c8141a1d14
data/.travis.yml CHANGED
@@ -32,7 +32,6 @@ rvm:
32
32
  - ruby-head
33
33
  - 2.5.3
34
34
  - 2.4.5
35
- - 2.3.8
36
35
  before_install:
37
36
  - bin/nghttp2
38
37
  - export LD_LIBRARY_PATH=$HOME/lib:$LD_LIBRARY_PATH
data/TODO.md CHANGED
@@ -45,7 +45,7 @@
45
45
  - [x] resouce exhausted (body size is to large)
46
46
  - [x] internal
47
47
  - [ ] resouce exhausted (worker is exhausted)
48
- - [ ] duration parse in header
48
+ - [x] duration parse in header
49
49
  - [ ] send `grpc-status` along with header frame if possible
50
50
  - need to support https://nghttp2.org/documentation/nghttp2_submit_response.html, data_prd is not NULL
51
51
  - [x] unimplemented error
@@ -7,6 +7,10 @@ require 'socket'
7
7
  require 'pry'
8
8
  require 'helloworld_services_pb'
9
9
 
10
- stub = Helloworld::Greeter::Stub.new('localhost', 50051)
10
+ HOST = 'localhost'
11
+ PORT = 50051
12
+
13
+ sock = TCPSocket.new(HOST, PORT)
14
+ stub = Helloworld::Greeter::Stub.new(sock)
11
15
  message = stub.say_hello(Helloworld::HelloRequest.new(name: 'ganmacs')).message
12
16
  p message
@@ -11,6 +11,8 @@ require 'logger'
11
11
  require 'routeguide_services_pb'
12
12
 
13
13
  RESOURCE_PATH = './examples/routeguide/routeguide.json'
14
+ HOST = 'localhost'
15
+ PORT = 50051
14
16
 
15
17
  $logger = Logger.new(STDOUT)
16
18
 
@@ -22,7 +24,7 @@ def get_feature(stub)
22
24
  ]
23
25
 
24
26
  points.each do |pt|
25
- feature = stub.get_feature(pt, metadata: { 'metadata' => 'data1' })
27
+ feature = stub.get_feature(pt)
26
28
  if feature.name == ''
27
29
  $logger.info("Found nothing at #{feature.inspect}")
28
30
  else
@@ -74,7 +76,8 @@ elsif ENV['GRPC_TIMEOUT']
74
76
  opts[:timeout] = Integer(ENV['GRPC_TIMEOUT'])
75
77
  end
76
78
 
77
- stub = Routeguide::RouteGuide::Stub.new('localhost', 50051, **opts)
79
+ sock = TCPSocket.new(HOST, PORT)
80
+ stub = Routeguide::RouteGuide::Stub.new(sock, **opts)
78
81
 
79
82
  get_feature(stub)
80
83
  list_features(stub)
@@ -0,0 +1,29 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'grpc_kit/calls'
4
+
5
+ module GrpcKit
6
+ module Calls::Client
7
+ class ClientStreamer < GrpcKit::Calls::Call
8
+ attr_reader :deadline, :service_name, :method_name
9
+ attr_reader :metadata
10
+ alias outgoing_metadata metadata
11
+
12
+ def send_msg(data, timeout: nil, metadata: {}, last: false)
13
+ raise 'No method error' if @restrict
14
+
15
+ @stream.send_msg(data, last: last, timeout: timeout, metadata: metadata)
16
+ end
17
+
18
+ def recv(last: false)
19
+ raise 'No method error' if @restrict
20
+
21
+ @stream.recv_msg(last: last)
22
+ end
23
+
24
+ def close_and_recv
25
+ @stream.close_and_recv
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,25 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'grpc_kit/calls'
4
+
5
+ module GrpcKit
6
+ module Calls::Client
7
+ class RequestResponse < GrpcKit::Calls::Call
8
+ attr_reader :deadline, :service_name, :method_name
9
+ attr_reader :metadata
10
+ alias outgoing_metadata metadata
11
+
12
+ def send_msg(data, timeout: nil, metadata: {}, last: false)
13
+ raise 'No method error' if @restrict
14
+
15
+ @stream.send_msg(data, last: last, timeout: timeout, metadata: metadata)
16
+ end
17
+
18
+ def recv(last: false)
19
+ raise 'No method error' if @restrict
20
+
21
+ @stream.recv_msg(last: last)
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,29 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'grpc_kit/calls'
4
+
5
+ module GrpcKit
6
+ module Calls::Client
7
+ class ServerStreamer < GrpcKit::Calls::Call
8
+ attr_reader :deadline, :service_name, :method_name
9
+ attr_reader :metadata
10
+ alias outgoing_metadata metadata
11
+
12
+ def send_msg(data, timeout: nil, metadata: {}, last: false)
13
+ raise 'No method error' if @restrict
14
+
15
+ @stream.send_msg(data, last: last, timeout: timeout, metadata: metadata)
16
+ end
17
+
18
+ def recv(last: false)
19
+ raise 'No method error' if @restrict
20
+
21
+ @stream.recv_msg(last: last)
22
+ end
23
+
24
+ def each
25
+ # TODO
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,32 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'grpc_kit/calls'
4
+
5
+ module GrpcKit
6
+ module Calls::Server
7
+ class ClientStreamer < GrpcKit::Calls::Call
8
+ attr_reader :deadline, :metadata
9
+ attr_reader :outgoing_initial_metadata, :outgoing_trailing_metadata
10
+ alias incoming_metadata metadata
11
+
12
+ def initialize(*)
13
+ super
14
+
15
+ @outgoing_initial_metadata = {}
16
+ @outgoing_trailing_metadata = {}
17
+ end
18
+
19
+ def send_msg(data, last: false)
20
+ raise 'No method error' if @restrict
21
+
22
+ @stream.send_msg(data, @protobuf, last: last, limit_size: @config.max_send_message_size)
23
+ end
24
+
25
+ def recv(last: false)
26
+ raise 'No method error' if @restrict
27
+
28
+ @stream.recv_msg(@protobuf, last: last, limit_size: @config.max_receive_message_size)
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,32 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'grpc_kit/calls'
4
+
5
+ module GrpcKit
6
+ module Calls::Server
7
+ class RequestResponse < GrpcKit::Calls::Call
8
+ attr_reader :deadline, :metadata
9
+ attr_reader :outgoing_initial_metadata, :outgoing_trailing_metadata
10
+ alias incoming_metadata metadata
11
+
12
+ def initialize(*)
13
+ super
14
+
15
+ @outgoing_initial_metadata = {}
16
+ @outgoing_trailing_metadata = {}
17
+ end
18
+
19
+ def send_msg(data, last: false)
20
+ raise 'No method error' if @restrict
21
+
22
+ @stream.send_msg(data, @protobuf, last: last, limit_size: @config.max_send_message_size)
23
+ end
24
+
25
+ def recv(last: false)
26
+ raise 'No method error' if @restrict
27
+
28
+ @stream.recv_msg(@protobuf, last: last, limit_size: @config.max_receive_message_size)
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,32 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'grpc_kit/calls'
4
+
5
+ module GrpcKit
6
+ module Calls::Server
7
+ class ServerStreamer < GrpcKit::Calls::Call
8
+ attr_reader :deadline, :metadata
9
+ attr_reader :outgoing_initial_metadata, :outgoing_trailing_metadata
10
+ alias incoming_metadata metadata
11
+
12
+ def initialize(*)
13
+ super
14
+
15
+ @outgoing_initial_metadata = {}
16
+ @outgoing_trailing_metadata = {}
17
+ end
18
+
19
+ def send_msg(data, last: false)
20
+ raise 'No method error' if @restrict
21
+
22
+ @stream.send_msg(data, @protobuf, last: last, limit_size: @config.max_send_message_size)
23
+ end
24
+
25
+ def recv(last: false)
26
+ raise 'No method error' if @restrict
27
+
28
+ @stream.recv_msg(@protobuf, last: last, limit_size: @config.max_receive_message_size)
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,39 @@
1
+ # frozen_string_literal: true
2
+
3
+ module GrpcKit
4
+ module Calls
5
+ class Call
6
+ Name = Struct.new(:name, :receiver)
7
+ Reciver = Struct.new(:class)
8
+ Klass = Struct.new(:service_name)
9
+ attr_reader :method
10
+
11
+ def initialize(stream:, config:, metadata:, timeout: nil)
12
+ @config = config
13
+ @metadata = metadata
14
+ @method_name = @config.method_name
15
+ @service_name = @config.service_name
16
+ @protobuf = @config.protobuf
17
+ @timeout = timeout
18
+ @stream = stream
19
+
20
+ # for compatible
21
+ klass = Klass.new(@service_name)
22
+ @method ||= Name.new(@method_name, Reciver.new(klass))
23
+ @restrict = false
24
+ end
25
+
26
+ def restrict_mode
27
+ @restrict = true
28
+ end
29
+
30
+ def normal_mode
31
+ @restrict = false
32
+ end
33
+
34
+ def deadline
35
+ @deadline ||= @timeout.to_absolute_time
36
+ end
37
+ end
38
+ end
39
+ end
@@ -1,24 +1,24 @@
1
1
  # frozen_string_literal: false
2
2
 
3
- require 'socket'
4
- require 'grpc_kit/session/client'
5
- require 'grpc_kit/session/duration'
3
+ require 'grpc_kit/grpc_time'
6
4
  require 'grpc_kit/session/io'
7
- require 'grpc_kit/rpcs'
5
+ require 'grpc_kit/sessions/client_session'
6
+ require 'grpc_kit/streams/client_stream'
7
+ require 'grpc_kit/transports/client_transport'
8
8
 
9
9
  module GrpcKit
10
10
  class Client
11
- def initialize(host, port, interceptors: [], timeout: nil)
12
- @host = host
13
- @port = port
14
- @authority = "#{host}:#{port}"
15
- @interceptors = interceptors
16
- @timeout =
17
- if timeout
18
- GrpcKit::Session::Duration.from_numeric(timeout)
11
+ def initialize(sock, authority: nil, interceptors: [], timeout: nil)
12
+ @sock = sock
13
+ @authority =
14
+ if authority
15
+ authority
19
16
  else
20
- nil
17
+ addr = sock.addr
18
+ "#{addr[3]}:#{addr[1]}"
21
19
  end
20
+ @interceptors = interceptors
21
+ @timeout = timeout && GrpcKit::GrpcTime.new(timeout)
22
22
  end
23
23
 
24
24
  def request_response(rpc, request, opts = {})
@@ -48,12 +48,12 @@ module GrpcKit
48
48
  private
49
49
 
50
50
  def do_request(rpc, request, **opts)
51
- sock = TCPSocket.new(@host, @port) # XXX
52
- session = GrpcKit::Session::Client.new(GrpcKit::Session::IO.new(sock), rpc)
51
+ session = GrpcKit::Sessions::ClientSession.new(GrpcKit::Session::IO.new(@sock))
53
52
  session.submit_settings([])
54
53
 
55
- default = { timeout: @timeout, authority: @authority }.compact
56
- rpc.invoke(session, request, opts.merge(default))
54
+ t = GrpcKit::Transports::ClientTransport.new(session)
55
+ cs = GrpcKit::Streams::ClientStream.new(t, rpc.config, authority: @authority, timeout: @timeout)
56
+ rpc.invoke(cs, request, opts.merge(timeout: @timeout))
57
57
  end
58
58
  end
59
59
  end
@@ -0,0 +1,100 @@
1
+ # frozen_string_literal: true
2
+
3
+ module GrpcKit
4
+ class GrpcTime
5
+ MAX = 10**9-1
6
+
7
+ # @params value [String|Integer]
8
+ def initialize(value)
9
+ @unit = nil
10
+ @value = nil
11
+
12
+ if value.is_a?(String)
13
+ from_string(value)
14
+ elsif value.is_a?(Integer)
15
+ from_integer(value)
16
+ else
17
+ raise ArgumentError, "unsupported value: #{value}, class=#{value.class}"
18
+ end
19
+ end
20
+
21
+ # @return [Float]
22
+ def to_f
23
+ case @unit
24
+ when 'S'
25
+ @value * 1.0
26
+ when 'H'
27
+ @value * 60 * 60.0
28
+ when 'M'
29
+ @value * 60.0
30
+ when 'm'
31
+ @value * 10**-3
32
+ when 'u'
33
+ @value * 10**-6
34
+ when 'n'
35
+ @value * 10**-9
36
+ else
37
+ raise 'This case would never happen'
38
+ end
39
+ end
40
+
41
+ def to_s
42
+ "#{@value}#{@unit}"
43
+ end
44
+
45
+ def to_absolute_time
46
+ case @unit
47
+ when 'S'
48
+ Time.now + @value
49
+ when 'H'
50
+ Time.now + @value * 60 * 60
51
+ when 'M'
52
+ Time.now + @value * 60
53
+ when 'm'
54
+ t = Time.now
55
+ Time.at(t.to_i, (t.nsec * (10**-3)) + (@value * 10**3))
56
+ when 'u'
57
+ t = Time.now
58
+ Time.at(t.to_i, (t.nsec * (10**-3)) + @value)
59
+ when 'n'
60
+ t = Time.now
61
+ Time.at(t.to_i, (t.nsec * (10**-3)) + (@value * 10**-3))
62
+ else
63
+ raise 'This case would never happen'
64
+ end
65
+ end
66
+
67
+ private
68
+
69
+ def from_integer(value)
70
+ if value < 0
71
+ @value = MAX
72
+ else
73
+ @value = value
74
+ end
75
+
76
+ @unit = 'S'
77
+ end
78
+
79
+ def from_string(value)
80
+ size = value.size
81
+ if size < 2
82
+ raise ArgumentError, "Invalid format: too short #{value}"
83
+ end
84
+
85
+ if size > 9
86
+ raise ArgumentError, "Invalid format: too long #{value}"
87
+ end
88
+
89
+ unit = value.byteslice(-1, 1)
90
+ value = Integer(value.byteslice(0, size - 1))
91
+ case unit
92
+ when 'H', 'M', 'S', 'm', 'u', 'n'
93
+ @value = value
94
+ @unit = unit
95
+ else
96
+ raise ArgumentError, "Invalid unit `#{unit}`: #{value}"
97
+ end
98
+ end
99
+ end
100
+ end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'grpc_kit/interceptors'
4
+
5
+ module GrpcKit
6
+ module Interceptors::Client
7
+ class ClientStreamer < Streaming
8
+ private
9
+
10
+ def invoke(interceptor, call, metadata)
11
+ # We don't need a `:requests` parameter but,
12
+ # it shuoldn't remove from paramters due to having a compatibility of grpc gem.
13
+ interceptor.client_streamer(requests: nil, call: call, method: call.method, metadata: metadata) do
14
+ yield(call, metadata)
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,39 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'grpc_kit/interceptors'
4
+
5
+ module GrpcKit
6
+ module Interceptors::Client
7
+ class RequestResponse
8
+ attr_writer :interceptors
9
+
10
+ def initialize
11
+ # Cant' get interceptor at definition time...
12
+ @interceptors = nil
13
+ end
14
+
15
+ def intercept(request, call, metadata, &block)
16
+ if @interceptors && !@interceptors.empty?
17
+ do_intercept(@interceptors.dup, request, call, metadata, &block)
18
+ else
19
+ yield(request, call, metadata)
20
+ end
21
+ end
22
+
23
+ private
24
+
25
+ def do_intercept(interceptors, request, call, metadata)
26
+ if interceptors.empty?
27
+ return yield(request, call, metadata)
28
+ end
29
+
30
+ interceptor = interceptors.pop
31
+ interceptor.request_response(request: request, call: call, method: call.method, metadata: metadata) do
32
+ do_intercept(interceptors, request, call, metadata) do |r, c, m|
33
+ yield(r, c, m)
34
+ end
35
+ end
36
+ end
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'grpc_kit/interceptors'
4
+
5
+ module GrpcKit
6
+ module Interceptors::Client
7
+ class ServerStreamer < Streaming
8
+ private
9
+
10
+ def invoke(interceptor, call, metadata)
11
+ # We don't need a `:request` parameter but,
12
+ # it shuoldn't remove from paramters due to having a compatibility of grpc gem.
13
+ interceptor.server_streamer(request: nil, call: call, method: call.method, metadata: metadata) do
14
+ yield(call, metadata)
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'grpc_kit/interceptors'
4
+
5
+ module GrpcKit
6
+ module Interceptors::Server
7
+ class ClientStreamer < Streaming
8
+ def invoke(interceptor, call)
9
+ interceptor.client_streamer(call: call, method: call.method) do
10
+ yield(call)
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,36 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'grpc_kit/interceptors'
4
+
5
+ module GrpcKit
6
+ module Interceptors::Server
7
+ class RequestResponse
8
+ def initialize(interceptors)
9
+ @interceptors = interceptors
10
+ end
11
+
12
+ def intercept(request, call, &block)
13
+ if @interceptors && !@interceptors.empty?
14
+ do_intercept(@interceptors.dup, request, call, &block)
15
+ else
16
+ yield(request, call)
17
+ end
18
+ end
19
+
20
+ private
21
+
22
+ def do_intercept(interceptors, request, call)
23
+ if interceptors.empty?
24
+ return yield(request, call)
25
+ end
26
+
27
+ interceptor = interceptors.pop
28
+ interceptor.request_response(request: request, call: call, method: call.method) do
29
+ do_intercept(interceptors, request, call) do |req, c|
30
+ yield(req, c)
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
@@ -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 ServerStreamer < Streaming
8
+ def invoke(interceptor, call)
9
+ # We don't need a `:request` parameter but,
10
+ # it shuoldn't remove from paramters due to having a compatibility of grpc gem.
11
+ interceptor.server_streamer(request: nil, call: call, method: call.method) do
12
+ yield(call)
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
@@ -1,11 +1,70 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'grpc_kit/interceptors/request_response'
4
- require 'grpc_kit/interceptors/server_streamer'
5
- require 'grpc_kit/interceptors/client_streamer'
6
- # TODO: bidi
7
-
8
3
  module GrpcKit
9
4
  module Interceptors
5
+ module Client
6
+ class Streaming
7
+ attr_writer :interceptors
8
+
9
+ def initialize
10
+ # Cant' get interceptor at definition time...
11
+ @interceptors = nil
12
+ end
13
+
14
+ def intercept(call, metadata, &block)
15
+ if @interceptors && !@interceptors.empty?
16
+ do_intercept(@interceptors.dup, call, metadata, &block)
17
+ else
18
+ yield(call, metadata)
19
+ end
20
+ end
21
+
22
+ private
23
+
24
+ def do_intercept(interceptors, call, metadata)
25
+ if interceptors.empty?
26
+ return yield(call, metadata)
27
+ end
28
+
29
+ interceptor = interceptors.pop
30
+ invoke(interceptor, call, metadata) do |inter_call, meta|
31
+ do_intercept(interceptors, inter_call, meta) do |c, m|
32
+ yield(c, m)
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
38
+
39
+ module Server
40
+ class Streaming
41
+ def initialize(interceptors)
42
+ @interceptors = interceptors
43
+ end
44
+
45
+ def intercept(call, &block)
46
+ if @interceptors && !@interceptors.empty?
47
+ do_intercept(@interceptors.dup, call, &block)
48
+ else
49
+ yield(call)
50
+ end
51
+ end
52
+
53
+ private
54
+
55
+ def do_intercept(interceptors, call)
56
+ if interceptors.empty?
57
+ return yield(call)
58
+ end
59
+
60
+ interceptor = interceptors.pop
61
+ invoke(interceptor, call) do |inter_call|
62
+ do_intercept(interceptors, inter_call) do |c|
63
+ yield(c)
64
+ end
65
+ end
66
+ end
67
+ end
68
+ end
10
69
  end
11
70
  end