grpc_kit 0.1.8 → 0.1.9
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/examples/helloworld_client.rb +1 -1
- data/examples/routeguide_client.rb +33 -0
- data/examples/routeguide_server.rb +17 -0
- data/lib/grpc.rb +2 -1
- data/lib/grpc_kit.rb +4 -1
- data/lib/grpc_kit/calls.rb +17 -3
- data/lib/grpc_kit/calls/client_bidi_streamer.rb +63 -0
- data/lib/grpc_kit/calls/client_client_streamer.rb +8 -4
- data/lib/grpc_kit/calls/client_request_response.rb +7 -4
- data/lib/grpc_kit/calls/client_server_streamer.rb +7 -4
- data/lib/grpc_kit/calls/server_bidi_streamer.rb +43 -0
- data/lib/grpc_kit/calls/server_client_streamer.rb +5 -1
- data/lib/grpc_kit/calls/server_request_response.rb +5 -1
- data/lib/grpc_kit/calls/server_server_streamer.rb +5 -1
- data/lib/grpc_kit/client.rb +22 -4
- data/lib/grpc_kit/errors.rb +25 -11
- data/lib/grpc_kit/grpc/dsl.rb +17 -2
- data/lib/grpc_kit/grpc/generic_service.rb +0 -13
- data/lib/grpc_kit/grpc/interceptor.rb +27 -0
- data/lib/grpc_kit/grpc/logger.rb +4 -1
- data/lib/grpc_kit/grpc_time.rb +3 -1
- data/lib/grpc_kit/interceptors.rb +3 -0
- data/lib/grpc_kit/interceptors/client_bidi_streamer.rb +20 -0
- data/lib/grpc_kit/interceptors/client_client_streamer.rb +3 -0
- data/lib/grpc_kit/interceptors/client_request_response.rb +3 -0
- data/lib/grpc_kit/interceptors/client_server_streamer.rb +3 -0
- data/lib/grpc_kit/interceptors/server_bidi_streamer.rb +17 -0
- data/lib/grpc_kit/interceptors/server_client_streamer.rb +2 -0
- data/lib/grpc_kit/interceptors/server_request_response.rb +2 -0
- data/lib/grpc_kit/interceptors/server_server_streamer.rb +2 -0
- data/lib/grpc_kit/protobuffer.rb +8 -0
- data/lib/grpc_kit/rpc_desc.rb +21 -4
- data/lib/grpc_kit/rpcs.rb +4 -0
- data/lib/grpc_kit/rpcs/client_bidi_streamer.rb +20 -1
- data/lib/grpc_kit/rpcs/client_client_streamer.rb +5 -0
- data/lib/grpc_kit/rpcs/client_request_response.rb +11 -17
- data/lib/grpc_kit/rpcs/client_server_streamer.rb +5 -0
- data/lib/grpc_kit/rpcs/server_bidi_streamer.rb +17 -0
- data/lib/grpc_kit/rpcs/server_client_streamer.rb +3 -0
- data/lib/grpc_kit/rpcs/server_request_response.rb +3 -0
- data/lib/grpc_kit/rpcs/server_server_streamer.rb +3 -0
- data/lib/grpc_kit/server.rb +12 -4
- data/lib/grpc_kit/session/client_session.rb +7 -2
- data/lib/grpc_kit/session/drain_controller.rb +2 -0
- data/lib/grpc_kit/session/headers.rb +11 -0
- data/lib/grpc_kit/session/io.rb +9 -0
- data/lib/grpc_kit/session/recv_buffer.rb +7 -0
- data/lib/grpc_kit/session/send_buffer.rb +8 -0
- data/lib/grpc_kit/session/server_session.rb +8 -5
- data/lib/grpc_kit/session/stream.rb +17 -3
- data/lib/grpc_kit/session/stream_status.rb +7 -1
- data/lib/grpc_kit/stream/client_stream.rb +55 -9
- data/lib/grpc_kit/stream/server_stream.rb +19 -1
- data/lib/grpc_kit/transport/client_transport.rb +39 -3
- data/lib/grpc_kit/transport/packable.rb +9 -3
- data/lib/grpc_kit/transport/server_transport.rb +15 -2
- data/lib/grpc_kit/version.rb +1 -1
- metadata +6 -3
- data/TODO.md +0 -71
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c0f50bc31421b7a051756b64bc75d4622e1a66932e919fa2a10d7bc915716969
|
4
|
+
data.tar.gz: 1e881d306e7c88a6a91da602e2771659fe230c523aedaae96e461621091bec70
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 878f6c4a966f9e7af45dc3c57dcb865c93324c21c382439a5b552f67e4dab1ee09f87795af661e39df9cadaf78a20975201fae6af94f2b0b770691369608de55
|
7
|
+
data.tar.gz: 2e7332f3177f51efdc4f625755dbd92a5f5cdea063635eea1d6a1a75bc499ea87af57633903e12e6aebf5da5ddef028ddecc818bb71623a85b1d995c59e065a6
|
@@ -49,6 +49,8 @@ def list_features(stub)
|
|
49
49
|
end
|
50
50
|
|
51
51
|
def record_route(stub, size)
|
52
|
+
$logger.info('===== record_route =====')
|
53
|
+
|
52
54
|
features = File.open(RESOURCE_PATH) do |f|
|
53
55
|
JSON.parse(f.read)
|
54
56
|
end
|
@@ -67,6 +69,36 @@ def record_route(stub, size)
|
|
67
69
|
puts "summary: #{resp[0].inspect}"
|
68
70
|
end
|
69
71
|
|
72
|
+
ROUTE_CHAT_NOTES = [
|
73
|
+
Routeguide::RouteNote.new(message: 'First message', location: Routeguide::Point.new(latitude: 0, longitude: 1)),
|
74
|
+
Routeguide::RouteNote.new(message: 'Second message', location: Routeguide::Point.new(latitude: 0, longitude: 2)),
|
75
|
+
Routeguide::RouteNote.new(message: 'Third message', location: Routeguide::Point.new(latitude: 0, longitude: 3)),
|
76
|
+
Routeguide::RouteNote.new(message: 'Fourth message', location: Routeguide::Point.new(latitude: 0, longitude: 1)),
|
77
|
+
Routeguide::RouteNote.new(message: 'Fifth message', location: Routeguide::Point.new(latitude: 0, longitude: 2)),
|
78
|
+
Routeguide::RouteNote.new(message: 'Sixth message', location: Routeguide::Point.new(latitude: 0, longitude: 3)),
|
79
|
+
].freeze
|
80
|
+
|
81
|
+
def route_chat(stub)
|
82
|
+
$logger.info('===== route_chat =====')
|
83
|
+
|
84
|
+
call = stub.route_chat({})
|
85
|
+
|
86
|
+
t = Thread.new do
|
87
|
+
loop do
|
88
|
+
rn = call.recv
|
89
|
+
$logger.info("Got message #{rn.message} at point point(#{rn.location.latitude}, #{rn.location.longitude})")
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
ROUTE_CHAT_NOTES.each do |rcn|
|
94
|
+
call.send_msg(rcn)
|
95
|
+
sleep 1
|
96
|
+
end
|
97
|
+
|
98
|
+
call.close_and_send
|
99
|
+
t.join
|
100
|
+
end
|
101
|
+
|
70
102
|
opts = {}
|
71
103
|
|
72
104
|
if ENV['GRPC_INTERCEPTOR']
|
@@ -82,5 +114,6 @@ stub = Routeguide::RouteGuide::Stub.new(sock, **opts)
|
|
82
114
|
get_feature(stub)
|
83
115
|
list_features(stub)
|
84
116
|
record_route(stub, 10)
|
117
|
+
route_chat(stub)
|
85
118
|
|
86
119
|
# rubocop:enable Style/GlobalVars
|
@@ -17,6 +17,8 @@ class Server < Routeguide::RouteGuide::Service
|
|
17
17
|
features = JSON.parse(f.read)
|
18
18
|
@features = Hash[features.map { |x| [x['location'], x['name']] }]
|
19
19
|
end
|
20
|
+
|
21
|
+
@route_notes = Hash.new { |h, k| h[k] = [] }
|
20
22
|
end
|
21
23
|
|
22
24
|
def get_feature(point, ctx)
|
@@ -70,6 +72,21 @@ class Server < Routeguide::RouteGuide::Service
|
|
70
72
|
)
|
71
73
|
end
|
72
74
|
|
75
|
+
def route_chat(call)
|
76
|
+
loop do
|
77
|
+
rn = call.recv
|
78
|
+
@logger.info("route_note location=#{rn.location.inspect}, message=#{rn.message}")
|
79
|
+
key = "#{rn.location.latitude} #{rn.location.longitude}"
|
80
|
+
saved_msgs = @route_notes[key]
|
81
|
+
@route_notes[key] << rn.message
|
82
|
+
|
83
|
+
saved_msgs.each do |m|
|
84
|
+
n = Routeguide::RouteNote.new(location: rn.location, message: m)
|
85
|
+
call.send_msg(n)
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
73
90
|
private
|
74
91
|
|
75
92
|
COORD_FACTOR = 1e7
|
data/lib/grpc.rb
CHANGED
@@ -1,8 +1,9 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
#
|
3
|
+
# Compatible file for xx_services_pb.rb and xx_pb.rb which are created by grpc-tools gem
|
4
4
|
require 'grpc_kit'
|
5
5
|
require 'grpc_kit/grpc/generic_service'
|
6
6
|
require 'grpc_kit/grpc/interceptor'
|
7
|
+
require 'grpc_kit/grpc/logger'
|
7
8
|
|
8
9
|
GRPC = GrpcKit::GRPC
|
data/lib/grpc_kit.rb
CHANGED
@@ -8,13 +8,16 @@ require 'grpc_kit/client'
|
|
8
8
|
|
9
9
|
module GrpcKit
|
10
10
|
class << self
|
11
|
+
# @param value [Logger] Any logger
|
11
12
|
attr_writer :logger
|
12
13
|
|
14
|
+
# @return [Logger]
|
13
15
|
def logger
|
14
16
|
@logger ||= Logger.new(STDOUT, level: ENV['GRPC_KIT_LOGLEVEL'] || :info)
|
15
17
|
end
|
16
18
|
|
17
|
-
# @
|
19
|
+
# @param level [String] :debug, :info, :warn, :error, :fatal or :unknown
|
20
|
+
# @return [void]
|
18
21
|
def self.loglevel=(level)
|
19
22
|
logger.level = level
|
20
23
|
end
|
data/lib/grpc_kit/calls.rb
CHANGED
@@ -6,11 +6,22 @@ module GrpcKit
|
|
6
6
|
Name = Struct.new(:name, :receiver)
|
7
7
|
Reciver = Struct.new(:class)
|
8
8
|
Klass = Struct.new(:service_name)
|
9
|
+
|
10
|
+
# @return [GrpcKit::Calls::Call::Name] gRPC method object
|
9
11
|
attr_reader :method
|
10
12
|
|
11
|
-
# @
|
12
|
-
|
13
|
-
|
13
|
+
# @return [Symbol] gRPC method name
|
14
|
+
attr_reader :method_name
|
15
|
+
|
16
|
+
# @return [String] gRPC service name
|
17
|
+
attr_reader :service_name
|
18
|
+
|
19
|
+
# @return [Hash<String, String>] gRPC metadata
|
20
|
+
attr_reader :metadata
|
21
|
+
|
22
|
+
# @param stream [GrpcKit::Stream::ServerStream|GrpcKit::Stream::ClientStream]
|
23
|
+
# @param config [GrpcKit::MethodConfig]
|
24
|
+
# @param metadata [Hash<String,String>]
|
14
25
|
def initialize(stream:, config:, metadata:, timeout: nil)
|
15
26
|
@config = config
|
16
27
|
@metadata = metadata
|
@@ -26,14 +37,17 @@ module GrpcKit
|
|
26
37
|
@restrict = false
|
27
38
|
end
|
28
39
|
|
40
|
+
# @return [void]
|
29
41
|
def restrict_mode
|
30
42
|
@restrict = true
|
31
43
|
end
|
32
44
|
|
45
|
+
# @return [void]
|
33
46
|
def normal_mode
|
34
47
|
@restrict = false
|
35
48
|
end
|
36
49
|
|
50
|
+
# @return [Time] deadline of this rpc call
|
37
51
|
def deadline
|
38
52
|
@deadline ||= @timeout.to_absolute_time
|
39
53
|
end
|
@@ -0,0 +1,63 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'grpc_kit/calls'
|
4
|
+
|
5
|
+
module GrpcKit
|
6
|
+
module Calls::Client
|
7
|
+
class BidiStreamer < GrpcKit::Calls::Call
|
8
|
+
alias outgoing_metadata metadata
|
9
|
+
|
10
|
+
def initialize(*)
|
11
|
+
super
|
12
|
+
@mutex = Mutex.new
|
13
|
+
@send = false
|
14
|
+
end
|
15
|
+
|
16
|
+
# @param data [Object] request message
|
17
|
+
# @param last [Boolean]
|
18
|
+
# @return [void]
|
19
|
+
def send_msg(data, last: false)
|
20
|
+
raise 'No method error' if @restrict
|
21
|
+
|
22
|
+
if @reason
|
23
|
+
raise "Upstream returns an error status: #{@reason}"
|
24
|
+
end
|
25
|
+
|
26
|
+
@mutex.synchronize do
|
27
|
+
@stream.send_msg(data, last: last, metadata: outgoing_metadata)
|
28
|
+
end
|
29
|
+
|
30
|
+
@send = true
|
31
|
+
end
|
32
|
+
|
33
|
+
# This method not is expected to be call in the main thread where #send_msg is called
|
34
|
+
#
|
35
|
+
# @param last [Boolean]
|
36
|
+
# @return [Object] response object
|
37
|
+
def recv(last: false)
|
38
|
+
raise 'No method error' if @restrict
|
39
|
+
|
40
|
+
sleep 0.1 until @send
|
41
|
+
|
42
|
+
loop do
|
43
|
+
msg = @mutex.synchronize do
|
44
|
+
@stream.recv_msg(last: last, blocking: false)
|
45
|
+
end
|
46
|
+
|
47
|
+
unless msg == :wait_readable
|
48
|
+
return msg
|
49
|
+
end
|
50
|
+
end
|
51
|
+
rescue GrpcKit::Errors::BadStatus => e
|
52
|
+
@reason = e
|
53
|
+
raise e
|
54
|
+
end
|
55
|
+
|
56
|
+
def close_and_send
|
57
|
+
@mutex.synchronize do
|
58
|
+
@stream.close_and_send
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
@@ -5,22 +5,26 @@ require 'grpc_kit/calls'
|
|
5
5
|
module GrpcKit
|
6
6
|
module Calls::Client
|
7
7
|
class ClientStreamer < GrpcKit::Calls::Call
|
8
|
-
attr_reader :deadline, :service_name, :method_name
|
9
|
-
attr_reader :metadata
|
10
8
|
alias outgoing_metadata metadata
|
11
9
|
|
12
|
-
|
10
|
+
# @param data [Object] request message
|
11
|
+
# @param last [Boolean]
|
12
|
+
# @return [void]
|
13
|
+
def send_msg(data, last: false)
|
13
14
|
raise 'No method error' if @restrict
|
14
15
|
|
15
|
-
@stream.send_msg(data, last: last,
|
16
|
+
@stream.send_msg(data, last: last, metadata: outgoing_metadata)
|
16
17
|
end
|
17
18
|
|
19
|
+
# @param last [Boolean]
|
20
|
+
# @return [Object] response object
|
18
21
|
def recv(last: false)
|
19
22
|
raise 'No method error' if @restrict
|
20
23
|
|
21
24
|
@stream.recv_msg(last: last)
|
22
25
|
end
|
23
26
|
|
27
|
+
# @return [Array<Object>] response objects
|
24
28
|
def close_and_recv
|
25
29
|
@stream.close_and_recv
|
26
30
|
end
|
@@ -5,16 +5,19 @@ require 'grpc_kit/calls'
|
|
5
5
|
module GrpcKit
|
6
6
|
module Calls::Client
|
7
7
|
class RequestResponse < GrpcKit::Calls::Call
|
8
|
-
attr_reader :deadline, :service_name, :method_name
|
9
|
-
attr_reader :metadata
|
10
8
|
alias outgoing_metadata metadata
|
11
9
|
|
12
|
-
|
10
|
+
# @param data [Object] request message
|
11
|
+
# @param last [Boolean]
|
12
|
+
# @return [void]
|
13
|
+
def send_msg(data, last: false)
|
13
14
|
raise 'No method error' if @restrict
|
14
15
|
|
15
|
-
@stream.send_msg(data, last: last,
|
16
|
+
@stream.send_msg(data, last: last, metadata: outgoing_metadata)
|
16
17
|
end
|
17
18
|
|
19
|
+
# @param last [Boolean]
|
20
|
+
# @return [Object] response object
|
18
21
|
def recv(last: false)
|
19
22
|
raise 'No method error' if @restrict
|
20
23
|
|
@@ -5,16 +5,19 @@ require 'grpc_kit/calls'
|
|
5
5
|
module GrpcKit
|
6
6
|
module Calls::Client
|
7
7
|
class ServerStreamer < GrpcKit::Calls::Call
|
8
|
-
attr_reader :deadline, :service_name, :method_name
|
9
|
-
attr_reader :metadata
|
10
8
|
alias outgoing_metadata metadata
|
11
9
|
|
12
|
-
|
10
|
+
# @param data [Object] request message
|
11
|
+
# @param last [Boolean]
|
12
|
+
# @return [void]
|
13
|
+
def send_msg(data, last: false)
|
13
14
|
raise 'No method error' if @restrict
|
14
15
|
|
15
|
-
@stream.send_msg(data, last: last,
|
16
|
+
@stream.send_msg(data, last: last, metadata: outgoing_metadata)
|
16
17
|
end
|
17
18
|
|
19
|
+
# @param last [Boolean]
|
20
|
+
# @return [Object] response object
|
18
21
|
def recv(last: false)
|
19
22
|
raise 'No method error' if @restrict
|
20
23
|
|
@@ -0,0 +1,43 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'grpc_kit/calls'
|
4
|
+
|
5
|
+
module GrpcKit
|
6
|
+
module Calls::Server
|
7
|
+
class BidiStreamer < GrpcKit::Calls::Call
|
8
|
+
attr_reader :outgoing_initial_metadata, :outgoing_trailing_metadata
|
9
|
+
alias incoming_metadata metadata
|
10
|
+
|
11
|
+
def initialize(*)
|
12
|
+
super
|
13
|
+
|
14
|
+
@outgoing_initial_metadata = {}
|
15
|
+
@outgoing_trailing_metadata = {}
|
16
|
+
end
|
17
|
+
|
18
|
+
# @param data [Object] request message
|
19
|
+
# @param last [Boolean]
|
20
|
+
# @return [void]
|
21
|
+
def send_msg(data, last: false)
|
22
|
+
raise 'No method error' if @restrict
|
23
|
+
|
24
|
+
@stream.send_msg(
|
25
|
+
data,
|
26
|
+
@protobuf,
|
27
|
+
last: last,
|
28
|
+
initial_metadata: @outgoing_initial_metadata,
|
29
|
+
trailing_metadata: @outgoing_trailing_metadata,
|
30
|
+
limit_size: @config.max_send_message_size,
|
31
|
+
)
|
32
|
+
end
|
33
|
+
|
34
|
+
# @param last [Boolean]
|
35
|
+
# @return [Object] response object
|
36
|
+
def recv(last: false)
|
37
|
+
raise 'No method error' if @restrict
|
38
|
+
|
39
|
+
@stream.recv_msg(@protobuf, last: last, limit_size: @config.max_receive_message_size)
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
@@ -5,7 +5,6 @@ require 'grpc_kit/calls'
|
|
5
5
|
module GrpcKit
|
6
6
|
module Calls::Server
|
7
7
|
class ClientStreamer < GrpcKit::Calls::Call
|
8
|
-
attr_reader :deadline, :metadata
|
9
8
|
attr_reader :outgoing_initial_metadata, :outgoing_trailing_metadata
|
10
9
|
alias incoming_metadata metadata
|
11
10
|
|
@@ -16,6 +15,9 @@ module GrpcKit
|
|
16
15
|
@outgoing_trailing_metadata = {}
|
17
16
|
end
|
18
17
|
|
18
|
+
# @param data [Object] request message
|
19
|
+
# @param last [Boolean]
|
20
|
+
# @return [void]
|
19
21
|
def send_msg(data, last: false)
|
20
22
|
raise 'No method error' if @restrict
|
21
23
|
|
@@ -29,6 +31,8 @@ module GrpcKit
|
|
29
31
|
)
|
30
32
|
end
|
31
33
|
|
34
|
+
# @param last [Boolean]
|
35
|
+
# @return [Object] response object
|
32
36
|
def recv(last: false)
|
33
37
|
raise 'No method error' if @restrict
|
34
38
|
|
@@ -5,7 +5,6 @@ require 'grpc_kit/calls'
|
|
5
5
|
module GrpcKit
|
6
6
|
module Calls::Server
|
7
7
|
class RequestResponse < GrpcKit::Calls::Call
|
8
|
-
attr_reader :deadline, :metadata
|
9
8
|
attr_reader :outgoing_initial_metadata, :outgoing_trailing_metadata
|
10
9
|
alias incoming_metadata metadata
|
11
10
|
|
@@ -16,6 +15,9 @@ module GrpcKit
|
|
16
15
|
@outgoing_trailing_metadata = {}
|
17
16
|
end
|
18
17
|
|
18
|
+
# @param data [Object] request message
|
19
|
+
# @param last [Boolean]
|
20
|
+
# @return [void]
|
19
21
|
def send_msg(data, last: false)
|
20
22
|
raise 'No method error' if @restrict
|
21
23
|
|
@@ -29,6 +31,8 @@ module GrpcKit
|
|
29
31
|
)
|
30
32
|
end
|
31
33
|
|
34
|
+
# @param last [Boolean]
|
35
|
+
# @return [Object] response object
|
32
36
|
def recv(last: false)
|
33
37
|
raise 'No method error' if @restrict
|
34
38
|
|
@@ -5,7 +5,6 @@ require 'grpc_kit/calls'
|
|
5
5
|
module GrpcKit
|
6
6
|
module Calls::Server
|
7
7
|
class ServerStreamer < GrpcKit::Calls::Call
|
8
|
-
attr_reader :deadline, :metadata
|
9
8
|
attr_reader :outgoing_initial_metadata, :outgoing_trailing_metadata
|
10
9
|
alias incoming_metadata metadata
|
11
10
|
|
@@ -16,6 +15,9 @@ module GrpcKit
|
|
16
15
|
@outgoing_trailing_metadata = {}
|
17
16
|
end
|
18
17
|
|
18
|
+
# @param data [Object] request message
|
19
|
+
# @param last [Boolean]
|
20
|
+
# @return [void]
|
19
21
|
def send_msg(data, last: false)
|
20
22
|
raise 'No method error' if @restrict
|
21
23
|
|
@@ -29,6 +31,8 @@ module GrpcKit
|
|
29
31
|
)
|
30
32
|
end
|
31
33
|
|
34
|
+
# @param last [Boolean]
|
35
|
+
# @return [Object] response object
|
32
36
|
def recv(last: false)
|
33
37
|
raise 'No method error' if @restrict
|
34
38
|
|