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.
- checksums.yaml +4 -4
- data/.rubocop.yml +22 -6
- data/examples/interceptors/client_logging_interceptor.rb +48 -0
- data/examples/interceptors/server_logging_interceptor.rb +44 -0
- data/examples/routeguide_client.rb +63 -3
- data/examples/routeguide_server.rb +86 -3
- data/grpc_kit.gemspec +1 -1
- data/lib/grpc.rb +1 -0
- data/lib/grpc_kit/client.rb +31 -79
- data/lib/grpc_kit/errors.rb +18 -8
- data/lib/grpc_kit/grpc/dsl.rb +19 -21
- data/lib/grpc_kit/grpc/generic_service.rb +1 -1
- data/lib/grpc_kit/grpc/interceptor.rb +57 -0
- data/lib/grpc_kit/grpc/logger.rb +17 -0
- data/lib/grpc_kit/interceptors.rb +11 -0
- data/lib/grpc_kit/interceptors/client_streamer.rb +31 -0
- data/lib/grpc_kit/interceptors/request_response.rb +70 -0
- data/lib/grpc_kit/interceptors/server_streamer.rb +33 -0
- data/lib/grpc_kit/interceptors/streaming.rb +70 -0
- data/lib/grpc_kit/method_config.rb +34 -0
- data/lib/grpc_kit/protobuffer.rb +20 -0
- data/lib/grpc_kit/rpc_desc.rb +103 -27
- data/lib/grpc_kit/rpcs.rb +11 -0
- data/lib/grpc_kit/rpcs/base.rb +30 -0
- data/lib/grpc_kit/rpcs/bidi_streamer.rb +18 -0
- data/lib/grpc_kit/rpcs/call.rb +27 -0
- data/lib/grpc_kit/rpcs/client_streamer.rb +38 -0
- data/lib/grpc_kit/rpcs/request_response.rb +50 -0
- data/lib/grpc_kit/rpcs/server_streamer.rb +42 -0
- data/lib/grpc_kit/server.rb +19 -38
- data/lib/grpc_kit/session/buffer.rb +58 -0
- data/lib/grpc_kit/session/client.rb +100 -52
- data/lib/grpc_kit/session/duration.rb +96 -0
- data/lib/grpc_kit/session/headers.rb +65 -0
- data/lib/grpc_kit/session/io.rb +56 -0
- data/lib/grpc_kit/session/server.rb +107 -68
- data/lib/grpc_kit/session/stream.rb +32 -40
- data/lib/grpc_kit/stream.rb +71 -0
- data/lib/grpc_kit/streams/client.rb +87 -0
- data/lib/grpc_kit/streams/packable.rb +60 -0
- data/lib/grpc_kit/streams/send_buffer.rb +48 -0
- data/lib/grpc_kit/streams/server.rb +36 -0
- data/lib/grpc_kit/streams/stream.rb +58 -0
- data/lib/grpc_kit/version.rb +1 -1
- metadata +32 -5
- 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
|
data/lib/grpc_kit/version.rb
CHANGED
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.
|
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-
|
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.
|
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.
|
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/
|
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:
|
data/lib/grpc_kit/io/basic.rb
DELETED
@@ -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
|