grpc_kit 0.1.0 → 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
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