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