grpc_kit 0.1.3 → 0.1.4

Sign up to get free protection for your applications and to get access to all the features.
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
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module GrpcKit
4
- module Streams
4
+ module Transport
5
5
  module Packable
6
6
  # @params data [String]
7
7
  # @params compress [Boolean]
@@ -24,7 +24,7 @@ module GrpcKit
24
24
  end
25
25
 
26
26
  def unpacker
27
- @unpacker ||= GrpcKit::Streams::Packable::Unpacker.new
27
+ @unpacker ||= Unpacker.new
28
28
  end
29
29
 
30
30
  class Unpacker
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module GrpcKit
4
- module Streams
4
+ module Transport
5
5
  class SendBuffer
6
6
  def initialize
7
7
  @buffer = nil
@@ -0,0 +1,96 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'grpc_kit/transport/packable'
4
+ require 'grpc_kit/transport/send_buffer'
5
+
6
+ module GrpcKit
7
+ module Transports
8
+ class ClientTransport
9
+ include GrpcKit::Transport::Packable
10
+
11
+ # @params session [GrpcKit::Session::Server|GrpcKit::Session::Client]
12
+ def initialize(session)
13
+ @session = session
14
+ @stream = nil # set later
15
+ @deferred = false
16
+ end
17
+
18
+ def send_request(data, header, last: false)
19
+ @stream = @session.send_request(GrpcKit::Transport::SendBuffer.new, header)
20
+ write_data(data, last: last)
21
+ end
22
+
23
+ def close_and_flush
24
+ resume_if_need
25
+
26
+ @stream.end_write
27
+ @session.start(@stream.stream_id)
28
+ @stream.end_read
29
+ @deferred = false
30
+ end
31
+
32
+ def each
33
+ loop do
34
+ data = recv
35
+ return if data.nil?
36
+
37
+ yield(data)
38
+ end
39
+ end
40
+
41
+ def write_data(buf, last: false)
42
+ resume_if_need
43
+
44
+ write(@stream.pending_send_data, pack(buf), last: last)
45
+ @session.run_once
46
+ @deferred = true unless last
47
+ end
48
+
49
+ def read_data(last: false)
50
+ unpack(read(last: last))
51
+ end
52
+
53
+ def recv_headers
54
+ wait_close
55
+ @stream.headers
56
+ end
57
+
58
+ private
59
+
60
+ def resume_if_need
61
+ if !@stream.end_write? && @deferred
62
+ @session.resume_data(@stream.stream_id)
63
+ end
64
+ end
65
+
66
+ def wait_close
67
+ # XXX: wait until half close (remote) to get grpc-status
68
+ until @stream.close_remote?
69
+ @session.run_once
70
+ end
71
+ end
72
+
73
+ def write(stream, buf, last: false)
74
+ stream.write(buf, last: last)
75
+ end
76
+
77
+ def read(last: false)
78
+ loop do
79
+ data = @stream.read_recv_data(last: last)
80
+ return data unless data.empty?
81
+
82
+ if @stream.close_remote?
83
+ # it do not receive data which we need, it may receive invalid grpc-status
84
+ unless @stream.end_read?
85
+ return nil
86
+ end
87
+
88
+ return nil
89
+ end
90
+
91
+ @session.run_once
92
+ end
93
+ end
94
+ end
95
+ end
96
+ end
@@ -0,0 +1,68 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'grpc_kit/transport/packable'
4
+
5
+ module GrpcKit
6
+ module Transports
7
+ class ServerTransport
8
+ include GrpcKit::Transport::Packable
9
+
10
+ # @params session [GrpcKit::Sessions::ServerSession]
11
+ # @params stream [GrpcKit::Session::Stream]
12
+ def initialize(session, stream)
13
+ @session = session
14
+ @stream = stream
15
+ end
16
+
17
+ def each
18
+ loop do
19
+ data = recv
20
+ return if data.nil?
21
+
22
+ yield(data)
23
+ end
24
+ end
25
+
26
+ def send_response(headers)
27
+ @session.submit_response(@stream.stream_id, headers)
28
+ end
29
+
30
+ def write_data(buf, last: false)
31
+ @stream.write_send_data(pack(buf), last: last)
32
+ end
33
+
34
+ def read_data(last: false)
35
+ unpack(read(last: last))
36
+ end
37
+
38
+ def write_trailers_data(trailer)
39
+ @stream.write_trailers_data(trailer)
40
+ @stream.end_write
41
+ end
42
+
43
+ def recv_headers
44
+ @stream.headers
45
+ end
46
+
47
+ private
48
+
49
+ def read(last: false)
50
+ loop do
51
+ data = @stream.read_recv_data(last: last)
52
+ return data unless data.empty?
53
+
54
+ if @stream.close_remote?
55
+ # it do not receive data which we need, it may receive invalid grpc-status
56
+ unless @stream.end_read?
57
+ return nil
58
+ end
59
+
60
+ return nil
61
+ end
62
+
63
+ @session.run_once
64
+ end
65
+ end
66
+ end
67
+ end
68
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module GrpcKit
4
- VERSION = '0.1.3'
4
+ VERSION = '0.1.4'
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: grpc_kit
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.3
4
+ version: 0.1.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - ganmacs
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2018-10-26 00:00:00.000000000 Z
11
+ date: 2018-10-30 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: ds9
@@ -172,6 +172,13 @@ files:
172
172
  - grpc_kit.gemspec
173
173
  - lib/grpc.rb
174
174
  - lib/grpc_kit.rb
175
+ - lib/grpc_kit/calls.rb
176
+ - lib/grpc_kit/calls/client_client_streamer.rb
177
+ - lib/grpc_kit/calls/client_request_response.rb
178
+ - lib/grpc_kit/calls/client_server_streamer.rb
179
+ - lib/grpc_kit/calls/server_client_streamer.rb
180
+ - lib/grpc_kit/calls/server_request_response.rb
181
+ - lib/grpc_kit/calls/server_server_streamer.rb
175
182
  - lib/grpc_kit/client.rb
176
183
  - lib/grpc_kit/errors.rb
177
184
  - lib/grpc_kit/grpc/dsl.rb
@@ -179,37 +186,41 @@ files:
179
186
  - lib/grpc_kit/grpc/interceptor.rb
180
187
  - lib/grpc_kit/grpc/logger.rb
181
188
  - lib/grpc_kit/grpc/stream.rb
189
+ - lib/grpc_kit/grpc_time.rb
182
190
  - lib/grpc_kit/interceptors.rb
183
- - lib/grpc_kit/interceptors/client_streamer.rb
184
- - lib/grpc_kit/interceptors/request_response.rb
185
- - lib/grpc_kit/interceptors/server_streamer.rb
186
- - lib/grpc_kit/interceptors/streaming.rb
191
+ - lib/grpc_kit/interceptors/client_client_streamer.rb
192
+ - lib/grpc_kit/interceptors/client_request_response.rb
193
+ - lib/grpc_kit/interceptors/client_server_streamer.rb
194
+ - lib/grpc_kit/interceptors/server_client_streamer.rb
195
+ - lib/grpc_kit/interceptors/server_request_response.rb
196
+ - lib/grpc_kit/interceptors/server_server_streamer.rb
187
197
  - lib/grpc_kit/method_config.rb
188
198
  - lib/grpc_kit/protobuffer.rb
189
199
  - lib/grpc_kit/rpc_desc.rb
190
200
  - lib/grpc_kit/rpcs.rb
191
- - lib/grpc_kit/rpcs/base.rb
192
- - lib/grpc_kit/rpcs/bidi_streamer.rb
193
- - lib/grpc_kit/rpcs/call.rb
194
- - lib/grpc_kit/rpcs/client_streamer.rb
195
- - lib/grpc_kit/rpcs/error.rb
196
- - lib/grpc_kit/rpcs/request_response.rb
197
- - lib/grpc_kit/rpcs/server_streamer.rb
201
+ - lib/grpc_kit/rpcs/client_bidi_streamer.rb
202
+ - lib/grpc_kit/rpcs/client_client_streamer.rb
203
+ - lib/grpc_kit/rpcs/client_request_response.rb
204
+ - lib/grpc_kit/rpcs/client_server_streamer.rb
205
+ - lib/grpc_kit/rpcs/server_bidi_streamer.rb
206
+ - lib/grpc_kit/rpcs/server_client_streamer.rb
207
+ - lib/grpc_kit/rpcs/server_request_response.rb
208
+ - lib/grpc_kit/rpcs/server_server_streamer.rb
198
209
  - lib/grpc_kit/server.rb
199
210
  - lib/grpc_kit/session/buffer.rb
200
- - lib/grpc_kit/session/client.rb
201
- - lib/grpc_kit/session/duration.rb
202
211
  - lib/grpc_kit/session/headers.rb
203
212
  - lib/grpc_kit/session/io.rb
204
- - lib/grpc_kit/session/server.rb
205
213
  - lib/grpc_kit/session/stream.rb
206
214
  - lib/grpc_kit/session/stream_status.rb
215
+ - lib/grpc_kit/sessions/client_session.rb
216
+ - lib/grpc_kit/sessions/server_session.rb
207
217
  - lib/grpc_kit/status_codes.rb
208
- - lib/grpc_kit/stream.rb
209
- - lib/grpc_kit/streams/client.rb
210
- - lib/grpc_kit/streams/packable.rb
211
- - lib/grpc_kit/streams/send_buffer.rb
212
- - lib/grpc_kit/streams/server.rb
218
+ - lib/grpc_kit/streams/client_stream.rb
219
+ - lib/grpc_kit/streams/server_stream.rb
220
+ - lib/grpc_kit/transport/packable.rb
221
+ - lib/grpc_kit/transport/send_buffer.rb
222
+ - lib/grpc_kit/transports/client_transport.rb
223
+ - lib/grpc_kit/transports/server_transport.rb
213
224
  - lib/grpc_kit/version.rb
214
225
  homepage: https://github.com/ganmacs/grpc_kit
215
226
  licenses:
@@ -1,31 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'grpc_kit/interceptors/streaming'
4
-
5
- module GrpcKit
6
- module Interceptors
7
- module Client
8
- class ClientStreamer < Streaming
9
- private
10
-
11
- def invoke(interceptor, call, metadata)
12
- # We don't need a `:requests` parameter but,
13
- # it shuoldn't remove from paramters due to having a compatibility of grpc gem.
14
- interceptor.client_streamer(requests: nil, call: call, method: call.method, metadata: metadata) do
15
- yield(call, metadata)
16
- end
17
- end
18
- end
19
- end
20
-
21
- module Server
22
- class ClientStreamer < Streaming
23
- def invoke(interceptor, call)
24
- interceptor.client_streamer(call: call, method: call.method) do
25
- yield(call)
26
- end
27
- end
28
- end
29
- end
30
- end
31
- end
@@ -1,70 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module GrpcKit
4
- module Interceptors
5
- module Client
6
- class RequestResponse
7
- attr_writer :interceptors
8
-
9
- def initialize
10
- # Cant' get interceptor at definition time...
11
- @interceptors = nil
12
- end
13
-
14
- def intercept(request, call, metadata, &block)
15
- if @interceptors && !@interceptors.empty?
16
- do_intercept(@interceptors.dup, request, call, metadata, &block)
17
- else
18
- yield(request, call, metadata)
19
- end
20
- end
21
-
22
- private
23
-
24
- def do_intercept(interceptors, request, call, metadata)
25
- if interceptors.empty?
26
- return yield(request, call, metadata)
27
- end
28
-
29
- interceptor = interceptors.pop
30
- interceptor.request_response(request: request, call: call, method: call.method, metadata: metadata) do
31
- do_intercept(interceptors, request, call, metadata) do |r, c, m|
32
- yield(r, c, m)
33
- end
34
- end
35
- end
36
- end
37
- end
38
-
39
- module Server
40
- class RequestResponse
41
- def initialize(interceptors)
42
- @interceptors = interceptors
43
- end
44
-
45
- def intercept(request, call, &block)
46
- if @interceptors && !@interceptors.empty?
47
- do_intercept(@interceptors.dup, request, call, &block)
48
- else
49
- yield(request, call)
50
- end
51
- end
52
-
53
- private
54
-
55
- def do_intercept(interceptors, request, call)
56
- if interceptors.empty?
57
- return yield(request, call)
58
- end
59
-
60
- interceptor = interceptors.pop
61
- interceptor.request_response(request: request, call: call, method: call.method) do
62
- do_intercept(interceptors, request, call) do |req, c|
63
- yield(req, c)
64
- end
65
- end
66
- end
67
- end
68
- end
69
- end
70
- end
@@ -1,33 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'grpc_kit/interceptors/streaming'
4
-
5
- module GrpcKit
6
- module Interceptors
7
- module Client
8
- class ServerStreamer < Streaming
9
- private
10
-
11
- def invoke(interceptor, call, metadata)
12
- # We don't need a `:request` parameter but,
13
- # it shuoldn't remove from paramters due to having a compatibility of grpc gem.
14
- interceptor.server_streamer(request: nil, call: call, method: call.method, metadata: metadata) do
15
- yield(call, metadata)
16
- end
17
- end
18
- end
19
- end
20
-
21
- module Server
22
- class ServerStreamer < Streaming
23
- def invoke(interceptor, call)
24
- # We don't need a `:request` parameter but,
25
- # it shuoldn't remove from paramters due to having a compatibility of grpc gem.
26
- interceptor.server_streamer(request: nil, call: call, method: call.method) do
27
- yield(call)
28
- end
29
- end
30
- end
31
- end
32
- end
33
- end
@@ -1,70 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module GrpcKit
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
69
- end
70
- end
@@ -1,30 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'timeout'
4
-
5
- require 'grpc_kit/errors'
6
- require 'grpc_kit/rpcs/call'
7
- require 'grpc_kit/streams/server'
8
- require 'grpc_kit/streams/client'
9
-
10
- module GrpcKit
11
- module Rpcs
12
- module Client
13
- class Base
14
- attr_reader :config
15
- def initialize(config)
16
- @config = config
17
- end
18
- end
19
- end
20
-
21
- module Server
22
- class Base
23
- def initialize(handler, config)
24
- @handler = handler
25
- @config = config
26
- end
27
- end
28
- end
29
- end
30
- end
@@ -1,18 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'grpc_kit/rpcs/base'
4
-
5
- module GrpcKit
6
- module Rpcs
7
- module Client
8
- class BidiStreamer < Base
9
- def invoke(session, data, opts = {}); end
10
- end
11
- end
12
-
13
- module Server
14
- class BidiStreamer < Base
15
- end
16
- end
17
- end
18
- end
@@ -1,27 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'forwardable'
4
-
5
- module GrpcKit
6
- module Rpcs
7
- # compatible for grpc gem
8
- class Call
9
- extend Forwardable
10
-
11
- delegate %i[recv send_msg close_and_recv each].freeze => :@stream
12
-
13
- Name = Struct.new(:name, :receiver)
14
- Reciver = Struct.new(:class)
15
- Klass = Struct.new(:service_name)
16
-
17
- attr_reader :metadata, :method
18
-
19
- def initialize(metadata, method_name, service_name, stream)
20
- @metadata = metadata
21
- klass = Klass.new(service_name)
22
- @method = Name.new(method_name, Reciver.new(klass))
23
- @stream = stream
24
- end
25
- end
26
- end
27
- end
@@ -1,38 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'grpc_kit/rpcs/base'
4
-
5
- module GrpcKit
6
- module Rpcs
7
- module Client
8
- class ClientStreamer < Base
9
- def invoke(session, _request, authority:, metadata: {}, timeout: nil, **opts)
10
- cs = GrpcKit::Streams::Client.new(config: @config, session: session, authority: authority)
11
- call = GrpcKit::Rpcs::Call.new(metadata, @config.method_name, @config.service_name, cs)
12
- @config.interceptor.intercept(call, metadata) do |s|
13
- s
14
- end
15
- end
16
- end
17
- end
18
-
19
- module Server
20
- class ClientStreamer < Base
21
- def invoke(stream, session)
22
- ss = GrpcKit::Streams::Server.new(stream: stream, session: session, config: @config)
23
- call = GrpcKit::Rpcs::Call.new(stream.headers.metadata, @config.method_name, @config.service_name, ss)
24
-
25
- if @config.interceptor
26
- @config.interceptor.intercept(call) do |c|
27
- resp = @handler.send(@config.ruby_style_method_name, c)
28
- c.send_msg(resp, last: true)
29
- end
30
- else
31
- resp = @handler.send(@config.ruby_style_method_name, call)
32
- call.send_msg(resp, last: true)
33
- end
34
- end
35
- end
36
- end
37
- end
38
- end
@@ -1,23 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'grpc_kit/status_codes'
4
-
5
- module GrpcKit
6
- module Rpcs
7
- module Client
8
- class Error
9
- # def invoke(session, request, authority:, error)
10
- # end
11
- end
12
- end
13
-
14
- module Server
15
- class Error
16
- def send_bad_status(stream, session, bad_status)
17
- ss = GrpcKit::Streams::Server.new(stream: stream, protobuf: nil, session: session)
18
- ss.send_status(status: bad_status.code, msg: bad_status.grpc_message)
19
- end
20
- end
21
- end
22
- end
23
- end