grpc_kit 0.1.0 → 0.1.1

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 (46) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +22 -6
  3. data/examples/interceptors/client_logging_interceptor.rb +48 -0
  4. data/examples/interceptors/server_logging_interceptor.rb +44 -0
  5. data/examples/routeguide_client.rb +63 -3
  6. data/examples/routeguide_server.rb +86 -3
  7. data/grpc_kit.gemspec +1 -1
  8. data/lib/grpc.rb +1 -0
  9. data/lib/grpc_kit/client.rb +31 -79
  10. data/lib/grpc_kit/errors.rb +18 -8
  11. data/lib/grpc_kit/grpc/dsl.rb +19 -21
  12. data/lib/grpc_kit/grpc/generic_service.rb +1 -1
  13. data/lib/grpc_kit/grpc/interceptor.rb +57 -0
  14. data/lib/grpc_kit/grpc/logger.rb +17 -0
  15. data/lib/grpc_kit/interceptors.rb +11 -0
  16. data/lib/grpc_kit/interceptors/client_streamer.rb +31 -0
  17. data/lib/grpc_kit/interceptors/request_response.rb +70 -0
  18. data/lib/grpc_kit/interceptors/server_streamer.rb +33 -0
  19. data/lib/grpc_kit/interceptors/streaming.rb +70 -0
  20. data/lib/grpc_kit/method_config.rb +34 -0
  21. data/lib/grpc_kit/protobuffer.rb +20 -0
  22. data/lib/grpc_kit/rpc_desc.rb +103 -27
  23. data/lib/grpc_kit/rpcs.rb +11 -0
  24. data/lib/grpc_kit/rpcs/base.rb +30 -0
  25. data/lib/grpc_kit/rpcs/bidi_streamer.rb +18 -0
  26. data/lib/grpc_kit/rpcs/call.rb +27 -0
  27. data/lib/grpc_kit/rpcs/client_streamer.rb +38 -0
  28. data/lib/grpc_kit/rpcs/request_response.rb +50 -0
  29. data/lib/grpc_kit/rpcs/server_streamer.rb +42 -0
  30. data/lib/grpc_kit/server.rb +19 -38
  31. data/lib/grpc_kit/session/buffer.rb +58 -0
  32. data/lib/grpc_kit/session/client.rb +100 -52
  33. data/lib/grpc_kit/session/duration.rb +96 -0
  34. data/lib/grpc_kit/session/headers.rb +65 -0
  35. data/lib/grpc_kit/session/io.rb +56 -0
  36. data/lib/grpc_kit/session/server.rb +107 -68
  37. data/lib/grpc_kit/session/stream.rb +32 -40
  38. data/lib/grpc_kit/stream.rb +71 -0
  39. data/lib/grpc_kit/streams/client.rb +87 -0
  40. data/lib/grpc_kit/streams/packable.rb +60 -0
  41. data/lib/grpc_kit/streams/send_buffer.rb +48 -0
  42. data/lib/grpc_kit/streams/server.rb +36 -0
  43. data/lib/grpc_kit/streams/stream.rb +58 -0
  44. data/lib/grpc_kit/version.rb +1 -1
  45. metadata +32 -5
  46. data/lib/grpc_kit/io/basic.rb +0 -35
@@ -0,0 +1,60 @@
1
+ # frozen_string_literal: true
2
+
3
+ module GrpcKit
4
+ module Streams
5
+ module Packable
6
+ # @params data [String]
7
+ # @params compress [Boolean]
8
+ def pack(data, compress = false)
9
+ c = compress ? 1 : 0
10
+ [c, data.size, data].pack('CNa*')
11
+ end
12
+
13
+ # @params data [String]
14
+ def unpack(data)
15
+ if data
16
+ unpacker.feed(data)
17
+ end
18
+
19
+ if unpacker.readable?
20
+ return unpacker.read
21
+ end
22
+
23
+ nil
24
+ end
25
+
26
+ def unpacker
27
+ @unpacker ||= GrpcKit::Streams::Packable::Unpacker.new
28
+ end
29
+
30
+ class Unpacker
31
+ # Compressed bytes(1 Byte) + length bytes(4 Bytes)
32
+ METADATA_SIZE = 5
33
+
34
+ def initialize
35
+ @i = 0
36
+ @data = nil
37
+ end
38
+
39
+ def readable?
40
+ @data && !@data.empty?
41
+ end
42
+
43
+ def feed(data)
44
+ if @data
45
+ @data << data
46
+ else
47
+ @data = data
48
+ end
49
+ end
50
+
51
+ def read
52
+ metadata = @data.slice!(0, METADATA_SIZE)
53
+ c, size = metadata.unpack('CN')
54
+ data = @data.slice!(0, size)
55
+ [c != 0, size, data]
56
+ end
57
+ end
58
+ end
59
+ end
60
+ end
@@ -0,0 +1,48 @@
1
+ # frozen_string_literal: true
2
+
3
+ module GrpcKit
4
+ module Streams
5
+ class SendBuffer
6
+ def initialize
7
+ @buffer = nil
8
+ @pos = 0
9
+ @end_write = false
10
+ end
11
+
12
+ def write(data, last: false)
13
+ end_write if last
14
+
15
+ if @buffer
16
+ @buffer << data
17
+ else
18
+ @buffer = data
19
+ end
20
+
21
+ data.size
22
+ end
23
+
24
+ def end_write
25
+ @end_write = true
26
+ end
27
+
28
+ def end_write?
29
+ @end_write
30
+ end
31
+
32
+ def read(size)
33
+ if @buffer.nil?
34
+ return false
35
+ end
36
+
37
+ data = @buffer.slice!(0, size)
38
+ if !data.empty?
39
+ data
40
+ elsif end_write?
41
+ nil # EOF
42
+ else
43
+ false # deferred
44
+ end
45
+ end
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,36 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'forwardable'
4
+
5
+ require 'grpc_kit/stream'
6
+
7
+ module GrpcKit
8
+ module Streams
9
+ class Server
10
+ extend Forwardable
11
+
12
+ delegate %i[each recv] => :@stream
13
+
14
+ def initialize(protobuf:, session:, stream:)
15
+ @protobuf = protobuf
16
+ @session = session
17
+ @stream = GrpcKit::Stream.new(protobuf: @protobuf, session: @session, stream: stream)
18
+ @sent_first_msg = false
19
+ end
20
+
21
+ def send_msg(data, last: false)
22
+ @stream.send(data, last: last)
23
+
24
+ return if @sent_first_msg
25
+
26
+ @session.submit_response(
27
+ @stream.stream_id,
28
+ ':status' => '200',
29
+ 'content-type' => 'application/grpc',
30
+ 'accept-encoding' => 'identity',
31
+ )
32
+ @sent_first_msg = true
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,58 @@
1
+ # frozen_string_literal: true
2
+
3
+ module GrpcKit
4
+ module Streams
5
+ class Stream
6
+ include GrpcKit::Rpcs::Packable
7
+
8
+ def initialize(protobuf:, session:, stream:)
9
+ @protobuf = protobuf
10
+ @session = session
11
+ @stream = stream
12
+ end
13
+
14
+ def send(last: false)
15
+ req = @protobuf.encode(data)
16
+ @stream.write_send_data(pack(req), last: last)
17
+ end
18
+
19
+ def recv(last: false)
20
+ data = unpack(read(last: last))
21
+
22
+ unless data
23
+ raise StopIteration
24
+ end
25
+
26
+ compressed, size, buf = *data
27
+
28
+ unless size == buf.size
29
+ raise "inconsistent data: #{buf}"
30
+ end
31
+
32
+ if compressed
33
+ raise 'compress option is unsupported'
34
+ end
35
+
36
+ @protobuf.decode(buf)
37
+ end
38
+
39
+ private
40
+
41
+ def read(last: false)
42
+ loop do
43
+ data = @stream.read_recv_data(last: last)
44
+ if data.empty?
45
+ if @stream.end_read?
46
+ return nil
47
+ end
48
+
49
+ @session.run_once
50
+ redo
51
+ end
52
+
53
+ return data
54
+ end
55
+ end
56
+ end
57
+ end
58
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module GrpcKit
4
- VERSION = '0.1.0'
4
+ VERSION = '0.1.1'
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.0
4
+ version: 0.1.1
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-08 00:00:00.000000000 Z
11
+ date: 2018-10-18 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: ds9
@@ -16,14 +16,14 @@ dependencies:
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: 1.1.1
19
+ version: 1.2.0
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: 1.1.1
26
+ version: 1.2.0
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: google-protobuf
29
29
  requirement: !ruby/object:Gem::Requirement
@@ -159,6 +159,8 @@ files:
159
159
  - examples/helloworld/helloworld_services_pb.rb
160
160
  - examples/helloworld_client.rb
161
161
  - examples/helloworld_server.rb
162
+ - examples/interceptors/client_logging_interceptor.rb
163
+ - examples/interceptors/server_logging_interceptor.rb
162
164
  - examples/routeguide/routeguide.json
163
165
  - examples/routeguide/routeguide.proto
164
166
  - examples/routeguide/routeguide_pb.rb
@@ -172,14 +174,39 @@ files:
172
174
  - lib/grpc_kit/errors.rb
173
175
  - lib/grpc_kit/grpc/dsl.rb
174
176
  - lib/grpc_kit/grpc/generic_service.rb
177
+ - lib/grpc_kit/grpc/interceptor.rb
178
+ - lib/grpc_kit/grpc/logger.rb
175
179
  - lib/grpc_kit/grpc/stream.rb
176
- - lib/grpc_kit/io/basic.rb
180
+ - lib/grpc_kit/interceptors.rb
181
+ - lib/grpc_kit/interceptors/client_streamer.rb
182
+ - lib/grpc_kit/interceptors/request_response.rb
183
+ - lib/grpc_kit/interceptors/server_streamer.rb
184
+ - lib/grpc_kit/interceptors/streaming.rb
185
+ - lib/grpc_kit/method_config.rb
186
+ - lib/grpc_kit/protobuffer.rb
177
187
  - lib/grpc_kit/rpc_desc.rb
188
+ - lib/grpc_kit/rpcs.rb
189
+ - lib/grpc_kit/rpcs/base.rb
190
+ - lib/grpc_kit/rpcs/bidi_streamer.rb
191
+ - lib/grpc_kit/rpcs/call.rb
192
+ - lib/grpc_kit/rpcs/client_streamer.rb
193
+ - lib/grpc_kit/rpcs/request_response.rb
194
+ - lib/grpc_kit/rpcs/server_streamer.rb
178
195
  - lib/grpc_kit/server.rb
196
+ - lib/grpc_kit/session/buffer.rb
179
197
  - lib/grpc_kit/session/client.rb
198
+ - lib/grpc_kit/session/duration.rb
199
+ - lib/grpc_kit/session/headers.rb
200
+ - lib/grpc_kit/session/io.rb
180
201
  - lib/grpc_kit/session/server.rb
181
202
  - lib/grpc_kit/session/stream.rb
182
203
  - lib/grpc_kit/status_codes.rb
204
+ - lib/grpc_kit/stream.rb
205
+ - lib/grpc_kit/streams/client.rb
206
+ - lib/grpc_kit/streams/packable.rb
207
+ - lib/grpc_kit/streams/send_buffer.rb
208
+ - lib/grpc_kit/streams/server.rb
209
+ - lib/grpc_kit/streams/stream.rb
183
210
  - lib/grpc_kit/version.rb
184
211
  homepage: https://github.com/ganmacs/grpc_kit
185
212
  licenses:
@@ -1,35 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'ds9'
4
-
5
- module GrpcKit
6
- module IO
7
- class Basic
8
- def initialize(reader, writer)
9
- @reader = reader
10
- @writer = writer
11
- end
12
-
13
- def read(length)
14
- data = @reader.read_nonblock(length, nil, exception: false)
15
-
16
- case data
17
- when :wait_readable
18
- DS9::ERR_WOULDBLOCK
19
- when nil
20
- ''
21
- else
22
- data
23
- end
24
- end
25
-
26
- def write(data)
27
- @writer.write(data)
28
- end
29
-
30
- def wait_readable
31
- @reader.wait_writable
32
- end
33
- end
34
- end
35
- end