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