grpc_kit 0.1.1 → 0.1.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 278f9b00d1dd37370eae8a829ec68742bcfdd9f693e9189d3abfd0404d2cb31a
4
- data.tar.gz: 334798bf715bbb1aacab0507457c90a9289c0249c728728e53c7663359318f58
3
+ metadata.gz: db6a319fa0f74330575752eb203e867d4882d869ec12f73643bf11bc3f147c8d
4
+ data.tar.gz: 376c711925c3f8534d7e286ed1bc7015ae711f7d4e2998b89fd8a2a2a2a0daac
5
5
  SHA512:
6
- metadata.gz: 25a7c01b82e0726470147c38be66243226483ddf1dafd6b292201cf4c3da99949dc99a2a298e9166f395b531cf936d279a52789730601e32a416378551f2992a
7
- data.tar.gz: 70fa89ff80eebc5d23bcb0e9b1bec9b3190bba7b2fcb00e7d3eb55f0b1c6ac17a3e9beb4738f69558d740995d45eaccfdd557a44fa02d3ebfdbbf4845d8e9f9c
6
+ metadata.gz: 6fa2789ac0febc6e8dfac1f57d59488d1ab4db39b32c0e529a3fb91240d890abe9021f65db6d539c0d8218dc89204ca284db3b1e302c02d5f2ff785e76d8e9a0
7
+ data.tar.gz: a8d7f9a5446308d2d31fcde7f4de762a262b58a6068ded6b8a60a0787d68001b7f2cd555a7910977ab9c8cf9e8d811cbbb2da76b55aa1d96b26961af3112be75
data/README.md CHANGED
@@ -1,6 +1,8 @@
1
1
  # GrpcKit
2
2
 
3
- A kit for creating gRPC server/client.
3
+ __UNDER DEVELOPMENT__
4
+
5
+ A kit for creating [gRPC](https://grpc.io/) server/client.
4
6
 
5
7
  ## Installation
6
8
 
@@ -24,7 +26,32 @@ $ gem install grpc_kit
24
26
 
25
27
  ## Usage
26
28
 
27
- TODO: Write usage instructions here
29
+ More Details in [examples directory](https://github.com/ganmacs/grpc_kit/tree/master/examples).
30
+
31
+ ##### Server
32
+
33
+ ```ruby
34
+ sock = TCPServer.new(50051)
35
+ server = GrpcKit::Server.new
36
+ server.handle(GreeterServer.new)
37
+
38
+ loop do
39
+ conn = sock.accept
40
+ server.run(conn)
41
+ end
42
+ ```
43
+
44
+ ##### Client
45
+
46
+ ```ruby
47
+ stub = Helloworld::Greeter::Stub.new('localhost', 50051)
48
+ message = stub.say_hello(Helloworld::HelloRequest.new(name: 'your name')).message
49
+ puts message
50
+ ```
51
+
52
+ ## Requirements
53
+
54
+ * [nghttp2](https://nghttp2.org/)
28
55
 
29
56
  ## Development
30
57
 
@@ -17,9 +17,8 @@ sock = TCPServer.new(50051)
17
17
 
18
18
  server = GrpcKit::Server.new
19
19
  server.handle(GreeterServer.new)
20
- server.run
21
20
 
22
21
  loop do
23
22
  conn = sock.accept
24
- server.session_start(conn)
23
+ server.run(conn)
25
24
  end
@@ -110,9 +110,8 @@ end
110
110
 
111
111
  server = GrpcKit::Server.new(**opts)
112
112
  server.handle(Server.new)
113
- server.run
114
113
 
115
114
  loop do
116
115
  conn = sock.accept
117
- server.session_start(conn)
116
+ server.run(conn)
118
117
  end
@@ -22,27 +22,27 @@ module GrpcKit
22
22
  end
23
23
 
24
24
  def request_response(rpc, request, opts = {})
25
- GrpcKit.logger.info('Calling request_respose')
25
+ GrpcKit.logger.debug('Calling request_respose')
26
26
 
27
27
  rpc.config.interceptor.interceptors = @interceptors
28
28
  do_request(rpc, request, opts)
29
29
  end
30
30
 
31
31
  def client_streamer(rpc, opts = {})
32
- GrpcKit.logger.info('Calling client_streamer')
32
+ GrpcKit.logger.debug('Calling client_streamer')
33
33
  rpc.config.interceptor.interceptors = @interceptors
34
34
  do_request(rpc, nil, opts)
35
35
  end
36
36
 
37
37
  def server_streamer(rpc, request, opts = {})
38
- GrpcKit.logger.info('Calling server_streamer')
38
+ GrpcKit.logger.debug('Calling server_streamer')
39
39
  rpc.config.interceptor.interceptors = @interceptors
40
40
  do_request(rpc, request, opts)
41
41
  end
42
42
 
43
43
  def bidi_streamer(rpc, requests, opts = {})
44
44
  rpc.config.interceptor.interceptors = @interceptors
45
- GrpcKit.logger.info('Calling bidi_streamer')
45
+ GrpcKit.logger.debug('Calling bidi_streamer')
46
46
  end
47
47
 
48
48
  private
@@ -9,6 +9,7 @@ module GrpcKit
9
9
  @sessions = []
10
10
  @rpc_descs = {}
11
11
  @interceptors = interceptors
12
+ @mutex = Mutex.new
12
13
  end
13
14
 
14
15
  # @params handler [object]
@@ -22,27 +23,20 @@ module GrpcKit
22
23
  end
23
24
  end
24
25
 
25
- def run
26
- GrpcKit.logger.info("Start grpc_kit v#{GrpcKit::VERSION}")
27
-
28
- @rpc_descs.freeze
29
- end
30
-
31
- def stop
32
- GrpcKit.logger.info('Stop grpc_kit')
33
- @sessions.each(&:stop)
26
+ def run(conn)
27
+ GrpcKit.logger.debug("Run grpc_kit(v#{GrpcKit::VERSION})")
28
+ establish_session(conn) do |s|
29
+ s.submit_settings([])
30
+ s.start
31
+ end
34
32
  end
35
33
 
36
- def session_start(conn)
37
- session = GrpcKit::Session::Server.new(
38
- GrpcKit::Session::IO.new(conn),
39
- self,
40
- )
41
- @sessions << session
34
+ def shutdown
35
+ GrpcKit.logger.debug('Shutdown grpc_kit')
42
36
 
43
- session.submit_settings([])
44
- session.start # blocking
45
- session.finish
37
+ @mutex.synchronize do
38
+ @sessions.each(&:finish)
39
+ end
46
40
  end
47
41
 
48
42
  def dispatch(stream, session)
@@ -53,5 +47,17 @@ module GrpcKit
53
47
 
54
48
  rpc.invoke(stream, session)
55
49
  end
50
+
51
+ private
52
+
53
+ def establish_session(conn)
54
+ session = GrpcKit::Session::Server.new(GrpcKit::Session::IO.new(conn), self)
55
+ begin
56
+ @mutex.synchronize { @sessions << session }
57
+ yield(session)
58
+ ensure
59
+ @mutex.synchronize { @sessions.delete(session) }
60
+ end
61
+ end
56
62
  end
57
63
  end
@@ -39,6 +39,8 @@ module GrpcKit
39
39
 
40
40
  run_once
41
41
  end
42
+ rescue Errno::ECONNRESET, IOError
43
+ finish
42
44
  end
43
45
 
44
46
  def run_once
@@ -17,11 +17,11 @@ module GrpcKit
17
17
  raise "Invalid format: too short #{value}"
18
18
  end
19
19
 
20
- unit = value[(size - 1)..size]
20
+ unit = value.slice!(-1, 1)
21
21
  d = Duration.new(0, 0, 0, 0)
22
- n = Integer(value[0..size])
22
+ n = Integer(value)
23
23
 
24
- case u
24
+ case unit
25
25
  when 'H'
26
26
  d.sec = n * HOUR
27
27
  when 'M'
@@ -35,7 +35,7 @@ module GrpcKit
35
35
  when 'n'
36
36
  d.nsec = n
37
37
  else
38
- raise "Invalid unit `#{u}`: #{unit} "
38
+ raise "Invalid unit `#{unit}`: #{value + unit} "
39
39
  end
40
40
  d
41
41
  end
@@ -45,7 +45,7 @@ module GrpcKit
45
45
  when 'grpc-status'
46
46
  self.grpc_status = val.to_i
47
47
  when 'grpc-timeout'
48
- self.timeout = Duration.decod(v)
48
+ self.timeout = Duration.decode(val)
49
49
  when 'grpc-message'
50
50
  # TODO
51
51
  GrpcKit.logger.warn('grpc-message is unsupported header now')
@@ -36,6 +36,8 @@ module GrpcKit
36
36
  unless IO.select(nil, [io], nil, 1)
37
37
  raise 'timeout writing data'
38
38
  end
39
+ rescue IOError => e
40
+ raise IOError, e # TODO
39
41
  end
40
42
 
41
43
  data = data.byteslice(remain..-1)
@@ -36,6 +36,8 @@ module GrpcKit
36
36
 
37
37
  run_once
38
38
  end
39
+ rescue Errno::ECONNRESET, IOError
40
+ finish
39
41
  end
40
42
 
41
43
  def run_once
@@ -50,10 +52,6 @@ module GrpcKit
50
52
  end
51
53
  end
52
54
 
53
- def stop
54
- @stop = true
55
- end
56
-
57
55
  def finish
58
56
  stop
59
57
  @io.close
@@ -61,6 +59,10 @@ module GrpcKit
61
59
 
62
60
  private
63
61
 
62
+ def stop
63
+ @stop = true
64
+ end
65
+
64
66
  def invoke_handler
65
67
  while (stream = @inflights.pop)
66
68
  @handler.dispatch(stream, self)
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module GrpcKit
4
- VERSION = '0.1.1'
4
+ VERSION = '0.1.2'
5
5
  end
data/lib/grpc_kit.rb CHANGED
@@ -8,7 +8,7 @@ require 'grpc_kit/client'
8
8
 
9
9
  module GrpcKit
10
10
  def self.logger
11
- @logger ||= Logger.new(STDOUT, level: :debug) # TODO: use :info level
11
+ @logger ||= Logger.new(STDOUT, level: :debug)
12
12
  end
13
13
 
14
14
  def self.logger=(logger)
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.1
4
+ version: 0.1.2
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-18 00:00:00.000000000 Z
11
+ date: 2018-10-19 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: ds9