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
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 278f9b00d1dd37370eae8a829ec68742bcfdd9f693e9189d3abfd0404d2cb31a
|
4
|
+
data.tar.gz: 334798bf715bbb1aacab0507457c90a9289c0249c728728e53c7663359318f58
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 25a7c01b82e0726470147c38be66243226483ddf1dafd6b292201cf4c3da99949dc99a2a298e9166f395b531cf936d279a52789730601e32a416378551f2992a
|
7
|
+
data.tar.gz: 70fa89ff80eebc5d23bcb0e9b1bec9b3190bba7b2fcb00e7d3eb55f0b1c6ac17a3e9beb4738f69558d740995d45eaccfdd557a44fa02d3ebfdbbf4845d8e9f9c
|
data/.rubocop.yml
CHANGED
@@ -35,7 +35,7 @@ Style/TrailingCommaInArguments:
|
|
35
35
|
Style/SafeNavigation:
|
36
36
|
Enabled: false
|
37
37
|
|
38
|
-
|
38
|
+
Naming/PredicateName:
|
39
39
|
NamePrefixBlacklist:
|
40
40
|
- "is_"
|
41
41
|
- "have_"
|
@@ -49,13 +49,23 @@ Style/SignalException:
|
|
49
49
|
Style/SingleLineBlockParams:
|
50
50
|
Enabled: false
|
51
51
|
|
52
|
-
|
52
|
+
Style/NumericLiterals:
|
53
|
+
Enabled: false
|
54
|
+
|
55
|
+
Style/GuardClause:
|
53
56
|
Enabled: false
|
54
57
|
|
55
|
-
|
58
|
+
Style/NumericPredicate:
|
59
|
+
Enabled: false
|
60
|
+
|
61
|
+
Metrics/ParameterLists:
|
62
|
+
CountKeywordArgs: false
|
63
|
+
|
64
|
+
Lint/UnderscorePrefixedVariableName:
|
65
|
+
Enabled: false
|
56
66
|
|
57
67
|
Metrics/AbcSize:
|
58
|
-
Max:
|
68
|
+
Max: 50
|
59
69
|
|
60
70
|
Metrics/CyclomaticComplexity:
|
61
71
|
Max: 10
|
@@ -64,7 +74,13 @@ Metrics/LineLength:
|
|
64
74
|
Max: 160
|
65
75
|
|
66
76
|
Metrics/MethodLength:
|
67
|
-
Max:
|
77
|
+
Max: 40
|
68
78
|
|
69
79
|
Metrics/PerceivedComplexity:
|
70
|
-
Max:
|
80
|
+
Max: 20
|
81
|
+
|
82
|
+
Metrics/ClassLength:
|
83
|
+
Max: 200
|
84
|
+
|
85
|
+
Metrics/BlockLength:
|
86
|
+
Max: 40
|
@@ -0,0 +1,48 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'grpc_kit'
|
4
|
+
|
5
|
+
class LoggingInterceptor < GRPC::ClientInterceptor
|
6
|
+
def request_response(request: nil, method: nil, **)
|
7
|
+
now = Time.now.to_i
|
8
|
+
GrpcKit.logger.info("Started request #{request}, method=#{method.name}, service_name=#{method.receiver.class.service_name}")
|
9
|
+
yield.tap do
|
10
|
+
GrpcKit.logger.info("Elapsed Time: #{Time.now.to_i - now}")
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
def client_streamer(call: nil, method: nil, **)
|
15
|
+
GrpcKit.logger.info("Started request method=#{method.name}, service_name=#{method.receiver.class.service_name}")
|
16
|
+
yield(LoggingStream.new(call))
|
17
|
+
end
|
18
|
+
|
19
|
+
def server_streamer(call: nil, method: nil, **)
|
20
|
+
GrpcKit.logger.info("Started request method=#{method.name}, service_name=#{method.receiver.class.service_name}")
|
21
|
+
yield(LoggingStream.new(call))
|
22
|
+
end
|
23
|
+
|
24
|
+
def bidi_streamer(**)
|
25
|
+
yield
|
26
|
+
end
|
27
|
+
|
28
|
+
class LoggingStream
|
29
|
+
def initialize(stream)
|
30
|
+
@stream = stream
|
31
|
+
end
|
32
|
+
|
33
|
+
def send_msg(msg, **opts)
|
34
|
+
GrpcKit.logger.info("logging interceptor send #{msg}")
|
35
|
+
@stream.send_msg(msg, opts)
|
36
|
+
end
|
37
|
+
|
38
|
+
def recv(**opt)
|
39
|
+
@stream.recv(opt).tap do |v|
|
40
|
+
GrpcKit.logger.info("logging interceptor recv #{v}")
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
def close_and_recv
|
45
|
+
@stream.close_and_recv
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'grpc_kit'
|
4
|
+
|
5
|
+
class LoggingInterceptor < GRPC::ServerInterceptor
|
6
|
+
def request_response(request: nil, call: nil, method: nil)
|
7
|
+
now = Time.now.to_i
|
8
|
+
GrpcKit.logger.info("Started request #{request}, method=#{method.name}, service_name=#{method.receiver.class.service_name}")
|
9
|
+
yield(request, call).tap do
|
10
|
+
GrpcKit.logger.info("Elapsed Time: #{Time.now.to_i - now}")
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
def client_streamer(call: nil, method: nil)
|
15
|
+
GrpcKit.logger.info("Started request method=#{method.name}, service_name=#{method.receiver.class.service_name}")
|
16
|
+
yield(LoggingStream.new(call))
|
17
|
+
end
|
18
|
+
|
19
|
+
def server_streamer(call: nil, method: nil, **)
|
20
|
+
GrpcKit.logger.info("Started request method=#{method.name}, service_name=#{method.receiver.class.service_name}")
|
21
|
+
yield(LoggingStream.new(call))
|
22
|
+
end
|
23
|
+
|
24
|
+
def bidi_streamer(**)
|
25
|
+
yield
|
26
|
+
end
|
27
|
+
|
28
|
+
class LoggingStream
|
29
|
+
def initialize(stream)
|
30
|
+
@stream = stream
|
31
|
+
end
|
32
|
+
|
33
|
+
def send_msg(msg, **opt)
|
34
|
+
GrpcKit.logger.info("logging interceptor send #{msg}")
|
35
|
+
@stream.send_msg(msg, opt)
|
36
|
+
end
|
37
|
+
|
38
|
+
def recv(**opt)
|
39
|
+
@stream.recv(**opt).tap do |v|
|
40
|
+
GrpcKit.logger.info("logging interceptor recv #{v}")
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
@@ -1,23 +1,83 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
# rubocop:disable Style/GlobalVars
|
4
|
+
|
3
5
|
$LOAD_PATH.unshift File.expand_path('./examples/routeguide')
|
4
6
|
|
5
7
|
require 'grpc_kit'
|
6
8
|
require 'pry'
|
9
|
+
require 'json'
|
10
|
+
require 'logger'
|
7
11
|
require 'routeguide_services_pb'
|
8
12
|
|
9
|
-
|
13
|
+
RESOURCE_PATH = './examples/routeguide/routeguide.json'
|
14
|
+
|
15
|
+
$logger = Logger.new(STDOUT)
|
10
16
|
|
11
17
|
def get_feature(stub)
|
18
|
+
$logger.info('===== get_feature =====')
|
12
19
|
points = [
|
13
20
|
Routeguide::Point.new(latitude: 409_146_138, longitude: -746_188_906),
|
14
21
|
Routeguide::Point.new(latitude: 0, longitude: 0)
|
15
22
|
]
|
16
23
|
|
17
24
|
points.each do |pt|
|
18
|
-
feature = stub.get_feature(pt)
|
19
|
-
|
25
|
+
feature = stub.get_feature(pt, metadata: { 'metadata' => 'data1' })
|
26
|
+
if feature.name == ''
|
27
|
+
$logger.info("Found nothing at #{feature.inspect}")
|
28
|
+
else
|
29
|
+
$logger.info("Found '#{feature.name}' at #{feature.location.inspect}")
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
def list_features(stub)
|
35
|
+
$logger.info('===== list_features =====')
|
36
|
+
rect = Routeguide::Rectangle.new(
|
37
|
+
lo: Routeguide::Point.new(latitude: 400_000_000, longitude: -750_000_000),
|
38
|
+
hi: Routeguide::Point.new(latitude: 420_000_000, longitude: -730_000_000),
|
39
|
+
)
|
40
|
+
|
41
|
+
stream = stub.list_features(rect)
|
42
|
+
|
43
|
+
loop do
|
44
|
+
r = stream.recv
|
45
|
+
$logger.info("Found #{r.name} at #{r.location.inspect}")
|
20
46
|
end
|
21
47
|
end
|
22
48
|
|
49
|
+
def record_route(stub, size)
|
50
|
+
features = File.open(RESOURCE_PATH) do |f|
|
51
|
+
JSON.parse(f.read)
|
52
|
+
end
|
53
|
+
|
54
|
+
stream = stub.record_route({})
|
55
|
+
|
56
|
+
size.times do
|
57
|
+
location = features.sample['location']
|
58
|
+
point = Routeguide::Point.new(latitude: location['latitude'], longitude: location['longitude'])
|
59
|
+
puts "Next point is #{point.inspect}"
|
60
|
+
stream.send_msg(point)
|
61
|
+
sleep(rand(0..1))
|
62
|
+
end
|
63
|
+
|
64
|
+
resp = stream.close_and_recv
|
65
|
+
puts "summary: #{resp[0].inspect}"
|
66
|
+
end
|
67
|
+
|
68
|
+
opts = {}
|
69
|
+
|
70
|
+
if ENV['GRPC_INTERCEPTOR']
|
71
|
+
require_relative 'interceptors/client_logging_interceptor'
|
72
|
+
opts[:interceptors] = [LoggingInterceptor.new]
|
73
|
+
elsif ENV['GRPC_TIMEOUT']
|
74
|
+
opts[:timeout] = Integer(ENV['GRPC_TIMEOUT'])
|
75
|
+
end
|
76
|
+
|
77
|
+
stub = Routeguide::RouteGuide::Stub.new('localhost', 50051, **opts)
|
78
|
+
|
23
79
|
get_feature(stub)
|
80
|
+
list_features(stub)
|
81
|
+
record_route(stub, 10)
|
82
|
+
|
83
|
+
# rubocop:enable Style/GlobalVars
|
@@ -6,26 +6,109 @@ require 'grpc_kit'
|
|
6
6
|
require 'pry'
|
7
7
|
require 'json'
|
8
8
|
require 'routeguide_services_pb'
|
9
|
+
require 'logger'
|
9
10
|
|
10
11
|
class Server < Routeguide::RouteGuide::Service
|
11
12
|
RESOURCE_PATH = './examples/routeguide/routeguide.json'
|
12
13
|
|
13
14
|
def initialize
|
15
|
+
@logger = Logger.new(STDOUT)
|
14
16
|
File.open(RESOURCE_PATH) do |f|
|
15
|
-
features = JSON.
|
17
|
+
features = JSON.parse(f.read)
|
16
18
|
@features = Hash[features.map { |x| [x['location'], x['name']] }]
|
17
19
|
end
|
18
20
|
end
|
19
21
|
|
20
|
-
def get_feature(point,
|
22
|
+
def get_feature(point, ctx)
|
21
23
|
name = @features.fetch({ 'longitude' => point.longitude, 'latitude' => point.latitude }, '')
|
24
|
+
@logger.info("Point longitude=#{point.longitude}, latitude=#{point.latitude}, metadata=#{ctx.metadata}")
|
22
25
|
Routeguide::Feature.new(location: point, name: name)
|
23
26
|
end
|
27
|
+
|
28
|
+
def list_features(rect, stream)
|
29
|
+
@logger.info('===== list_features =====')
|
30
|
+
|
31
|
+
@features.each do |location, name|
|
32
|
+
if name.nil? || name == '' || !in_range(location, rect)
|
33
|
+
next
|
34
|
+
end
|
35
|
+
|
36
|
+
pt = Routeguide::Point.new(location)
|
37
|
+
resp = Routeguide::Feature.new(location: pt, name: name)
|
38
|
+
@logger.info(resp)
|
39
|
+
stream.send_msg(resp)
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
def record_route(stream)
|
44
|
+
@logger.info('===== record_route =====')
|
45
|
+
distance = 0
|
46
|
+
count = 0
|
47
|
+
features = 0
|
48
|
+
start_at = Time.now.to_i
|
49
|
+
last = nil
|
50
|
+
|
51
|
+
loop do
|
52
|
+
point = stream.recv # XXX: raise StopIteration
|
53
|
+
@logger.info(point)
|
54
|
+
|
55
|
+
count += 1
|
56
|
+
name = @features.fetch({ 'longitude' => point.longitude, 'latitude' => point.latitude }, '')
|
57
|
+
unless name == ''
|
58
|
+
features += 1
|
59
|
+
end
|
60
|
+
|
61
|
+
last = point
|
62
|
+
distance += calculate_distance(point, last)
|
63
|
+
end
|
64
|
+
|
65
|
+
Routeguide::RouteSummary.new(
|
66
|
+
point_count: count,
|
67
|
+
feature_count: features,
|
68
|
+
distance: distance,
|
69
|
+
elapsed_time: Time.now.to_i - start_at,
|
70
|
+
)
|
71
|
+
end
|
72
|
+
|
73
|
+
private
|
74
|
+
|
75
|
+
COORD_FACTOR = 1e7
|
76
|
+
RADIUS = 637_100
|
77
|
+
|
78
|
+
def calculate_distance(point_a, point_b)
|
79
|
+
lat_a = (point_a.latitude / COORD_FACTOR) * Math::PI / 180
|
80
|
+
lat_b = (point_b.latitude / COORD_FACTOR) * Math::PI / 180
|
81
|
+
lon_a = (point_a.longitude / COORD_FACTOR) * Math::PI / 180
|
82
|
+
lon_b = (point_b.longitude / COORD_FACTOR) * Math::PI / 180
|
83
|
+
|
84
|
+
delta_lat = lat_a - lat_b
|
85
|
+
delta_lon = lon_a - lon_b
|
86
|
+
a = Math.sin(delta_lat / 2)**2 + Math.cos(lat_a) * Math.cos(lat_b) + Math.sin(delta_lon / 2)**2
|
87
|
+
(2 * RADIUS * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a))).to_i
|
88
|
+
end
|
89
|
+
|
90
|
+
def in_range(point, rect)
|
91
|
+
longitudes = [rect.lo.longitude, rect.hi.longitude]
|
92
|
+
left = longitudes.min
|
93
|
+
right = longitudes.max
|
94
|
+
|
95
|
+
latitudes = [rect.lo.latitude, rect.hi.latitude]
|
96
|
+
bottom = latitudes.min
|
97
|
+
top = latitudes.max
|
98
|
+
(point['longitude'] >= left) && (point['longitude'] <= right) && (point['latitude'] >= bottom) && (point['latitude'] <= top)
|
99
|
+
end
|
24
100
|
end
|
25
101
|
|
26
102
|
sock = TCPServer.new(50051)
|
27
103
|
|
28
|
-
|
104
|
+
opts = {}
|
105
|
+
|
106
|
+
if ENV['GRPC_INTERCEPTOR']
|
107
|
+
require_relative 'interceptors/server_logging_interceptor'
|
108
|
+
opts[:interceptors] = [LoggingInterceptor.new]
|
109
|
+
end
|
110
|
+
|
111
|
+
server = GrpcKit::Server.new(**opts)
|
29
112
|
server.handle(Server.new)
|
30
113
|
server.run
|
31
114
|
|
data/grpc_kit.gemspec
CHANGED
@@ -22,7 +22,7 @@ Gem::Specification.new do |spec|
|
|
22
22
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
23
23
|
spec.require_paths = ['lib']
|
24
24
|
|
25
|
-
spec.add_dependency 'ds9', '~> 1.
|
25
|
+
spec.add_dependency 'ds9', '~> 1.2.0'
|
26
26
|
spec.add_dependency 'google-protobuf', '~> 3.6.1'
|
27
27
|
spec.add_dependency 'googleapis-common-protos-types', '~> 1.0.2'
|
28
28
|
|
data/lib/grpc.rb
CHANGED
data/lib/grpc_kit/client.rb
CHANGED
@@ -2,106 +2,58 @@
|
|
2
2
|
|
3
3
|
require 'socket'
|
4
4
|
require 'grpc_kit/session/client'
|
5
|
+
require 'grpc_kit/session/duration'
|
6
|
+
require 'grpc_kit/session/io'
|
7
|
+
require 'grpc_kit/rpcs'
|
5
8
|
|
6
9
|
module GrpcKit
|
7
10
|
class Client
|
8
|
-
def initialize(host, port,
|
11
|
+
def initialize(host, port, interceptors: [], timeout: nil)
|
9
12
|
@host = host
|
10
13
|
@port = port
|
11
14
|
@authority = "#{host}:#{port}"
|
12
|
-
@
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
def handle(handler)
|
17
|
-
klass = handler.class
|
18
|
-
|
19
|
-
klass.rpc_descs.values.each do |rpc_desc|
|
20
|
-
path = rpc_desc.path(klass.service_name)
|
21
|
-
if @rpc_descs[path]
|
22
|
-
raise "Duplicated method registered #{key}, class: #{handler}"
|
23
|
-
end
|
24
|
-
|
25
|
-
@rpc_descs[path] = [rpc_desc, handler]
|
26
|
-
end
|
27
|
-
end
|
28
|
-
|
29
|
-
class RequestResponse
|
30
|
-
attr_writer :session
|
31
|
-
|
32
|
-
def initialize(path, opts = {})
|
33
|
-
@path = path
|
34
|
-
@opts = opts
|
35
|
-
@session = nil
|
36
|
-
@data = ''
|
37
|
-
end
|
38
|
-
|
39
|
-
def invoke(data)
|
40
|
-
@session.submit_settings([])
|
41
|
-
|
42
|
-
stream_id = submit_request(data)
|
43
|
-
@session.start(stream_id)
|
44
|
-
@data
|
45
|
-
end
|
46
|
-
|
47
|
-
def on_data_chunk_recv(stream, data)
|
48
|
-
compressed, length, buf = data.unpack('CNa*')
|
49
|
-
if compressed == 0 # TODO: not
|
50
|
-
if length != buf.size
|
51
|
-
raise 'recived data inconsistent'
|
52
|
-
end
|
53
|
-
|
54
|
-
@data << buf
|
55
|
-
stream.recv2(buf)
|
15
|
+
@interceptors = interceptors
|
16
|
+
@timeout =
|
17
|
+
if timeout
|
18
|
+
GrpcKit::Session::Duration.from_numeric(timeout)
|
56
19
|
else
|
57
|
-
|
20
|
+
nil
|
58
21
|
end
|
59
|
-
end
|
60
|
-
|
61
|
-
private
|
62
|
-
|
63
|
-
def submit_request(data)
|
64
|
-
@session.submit_request(
|
65
|
-
{
|
66
|
-
':method' => 'POST',
|
67
|
-
':scheme' => 'http',
|
68
|
-
':authority' => @opts[:authority],
|
69
|
-
':path' => @path.to_s,
|
70
|
-
'te' => 'trailers',
|
71
|
-
'content-type' => 'application/grpc',
|
72
|
-
'user-agent' => "grpc-ruby/#{GrpcKit::VERSION} (grpc_kit)",
|
73
|
-
'grpc-accept-encoding' => 'identity,deflate,gzip',
|
74
|
-
},
|
75
|
-
data,
|
76
|
-
)
|
77
|
-
end
|
78
22
|
end
|
79
23
|
|
80
|
-
def request_response(
|
24
|
+
def request_response(rpc, request, opts = {})
|
81
25
|
GrpcKit.logger.info('Calling request_respose')
|
82
|
-
sock = TCPSocket.new(@host, @port)
|
83
|
-
|
84
|
-
rr = RequestResponse.new(path, { authority: @authority }.merge(opts))
|
85
|
-
session = GrpcKit::Session::Client.new(@io.new(sock, sock), rr)
|
86
|
-
rr.session = session
|
87
26
|
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
resp = rr.invoke(data)
|
92
|
-
rpc_desc.decode2(resp)
|
27
|
+
rpc.config.interceptor.interceptors = @interceptors
|
28
|
+
do_request(rpc, request, opts)
|
93
29
|
end
|
94
30
|
|
95
|
-
def client_streamer(
|
31
|
+
def client_streamer(rpc, opts = {})
|
96
32
|
GrpcKit.logger.info('Calling client_streamer')
|
33
|
+
rpc.config.interceptor.interceptors = @interceptors
|
34
|
+
do_request(rpc, nil, opts)
|
97
35
|
end
|
98
36
|
|
99
|
-
def server_streamer(
|
37
|
+
def server_streamer(rpc, request, opts = {})
|
100
38
|
GrpcKit.logger.info('Calling server_streamer')
|
39
|
+
rpc.config.interceptor.interceptors = @interceptors
|
40
|
+
do_request(rpc, request, opts)
|
101
41
|
end
|
102
42
|
|
103
|
-
def bidi_streamer(
|
43
|
+
def bidi_streamer(rpc, requests, opts = {})
|
44
|
+
rpc.config.interceptor.interceptors = @interceptors
|
104
45
|
GrpcKit.logger.info('Calling bidi_streamer')
|
105
46
|
end
|
47
|
+
|
48
|
+
private
|
49
|
+
|
50
|
+
def do_request(rpc, request, **opts)
|
51
|
+
sock = TCPSocket.new(@host, @port) # XXX
|
52
|
+
session = GrpcKit::Session::Client.new(GrpcKit::Session::IO.new(sock), rpc)
|
53
|
+
session.submit_settings([])
|
54
|
+
|
55
|
+
default = { timeout: @timeout, authority: @authority }.compact
|
56
|
+
rpc.invoke(session, request, opts.merge(default))
|
57
|
+
end
|
106
58
|
end
|
107
59
|
end
|