grpc_kit 0.1.7 → 0.1.8

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: 5d6fc31fa5c206fbd36425cff44c8d7c53a7089b2de28f0d66b0e7b76ef62844
4
- data.tar.gz: 22143378a2ba5d8c6e8f1beeb11a82e1939ee410b505189ceca6df8244ab576d
3
+ metadata.gz: e7b605bf4f8cf8486b85fbb391296e0e9acb21ca00efc29850271e9890b6a386
4
+ data.tar.gz: cc8597e07c5e467c249dc78a4ad5f02fc811410039e7eadaecfe176ae9dc3b20
5
5
  SHA512:
6
- metadata.gz: 066bee105c96f2a11395bee9d6d3006c7ee58f49dec6f56e2f12a0349a7289541a50634590d67029866f581617d5183e2a6562a0a961a59983b83e485beb0282
7
- data.tar.gz: 91537f22b1e118b1863cb14f82a01f4e22a47a92c94595ec3b3e388fc700378e933d3feae568d1d7ef5ee408875c639fc9a58c82826e6a98faeb319f10eb9ebd
6
+ metadata.gz: fb29d063711fa507ff5d85a6bd9ef7e7fac86ffb4502947ab144feea453a01901ee9fc14c05e0a10a2a10d0b73fbfc1ee4e0dcc58b1c4ccf5ef9b6b974295548
7
+ data.tar.gz: 9e98bb7709c5bdc49683e57d9134877d8ec558feff9d1081a1f49e76afc47969172843f5b4669b8d84f74a826bb58a58372840f8011f82bd7a1bca3b2ec76e58
data/TODO.md CHANGED
@@ -46,7 +46,7 @@
46
46
  - [x] internal
47
47
  - [ ] resouce exhausted (worker is exhausted)
48
48
  - [x] duration parse in header
49
- - [ ] send `grpc-status` along with header frame if possible
49
+ - [x] send `grpc-status` along with header frame if possible
50
50
  - need to support https://nghttp2.org/documentation/nghttp2_submit_response.html, data_prd is not NULL
51
51
  - [x] unimplemented error
52
52
  - [ ] goaway
@@ -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.2.1'
25
+ spec.add_dependency 'ds9', '~> 1.3.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
 
@@ -3,6 +3,7 @@
3
3
  require 'ds9'
4
4
  require 'forwardable'
5
5
  require 'grpc_kit/session/stream'
6
+ require 'grpc_kit/session/send_buffer'
6
7
 
7
8
  module GrpcKit
8
9
  module Session
@@ -26,11 +27,12 @@ module GrpcKit
26
27
  @stop = false
27
28
  end
28
29
 
29
- def send_request(data, headers)
30
+ def send_request(headers)
30
31
  if @draining
31
32
  raise ConnectionClosing, "You can't send new request. becuase this connection will shuting down"
32
33
  end
33
34
 
35
+ data = GrpcKit::Session::SendBuffer.new
34
36
  stream_id = submit_request(headers, data).to_i
35
37
  stream = GrpcKit::Session::Stream.new(stream_id: stream_id, send_data: data)
36
38
  stream.stream_id = stream_id
@@ -4,66 +4,63 @@ require 'grpc_kit/grpc_time'
4
4
 
5
5
  module GrpcKit
6
6
  module Session
7
- Headers = Struct.new(
8
- :metadata,
9
- :path,
10
- :grpc_encoding,
11
- :grpc_status,
12
- :status_message,
13
- :timeout,
14
- :method,
15
- :http_status,
16
- ) do
17
-
7
+ class Headers
18
8
  RESERVED_HEADERS = [
19
- 'content-type',
20
- 'user-agent',
21
- 'grpc-message-type',
22
- 'grpc-encoding',
23
- 'grpc-message',
24
- 'grpc-status',
25
- 'grpc-status-details-bin',
26
- 'grpc-accept-encoding',
27
- 'te'
9
+ ':path', ':status', ':scheme',
10
+ 'content-type', 'grpc-message-type', 'grpc-timeout',
11
+ 'grpc-encoding', 'grpc-message', 'grpc-status',
12
+ 'grpc-status-details-bin', 'grpc-accept-encoding', 'te',
13
+ ':method'
28
14
  ].freeze
29
15
 
30
- IGNORE_HEADERS = [':method', ':scheme'].freeze
31
-
32
16
  METADATA_ACCEPTABLE_HEADER = %w[:authority user-agent].freeze
17
+
33
18
  def initialize
34
- super({}) # set metadata empty hash
19
+ @opts = {}
20
+ @metadata = {}
35
21
  end
36
22
 
37
- def add(key, val)
38
- case key
39
- when ':path'
40
- self.path = val
41
- when ':status'
42
- self.http_status = Integer(val)
43
- when 'content-type'
44
- # self.grpc_encoding = val
45
- when 'grpc-encoding'
46
- self.grpc_encoding = val
47
- when 'grpc-status'
48
- self.grpc_status = val
49
- when 'grpc-timeout'
50
- self.timeout = GrpcTime.new(val)
51
- when 'grpc-message'
52
- self.status_message = val
53
- when 'grpc-status-details-bin'
54
- # TODO
55
- GrpcKit.logger.warn('grpc-status-details-bin is unsupported header now')
56
- else
57
- if IGNORE_HEADERS.include?(key)
58
- return
23
+ def metadata
24
+ @metadata =
25
+ if @metadata.empty?
26
+ @opts.select do |key|
27
+ !key.start_with?(':', 'grpc-') && !RESERVED_HEADERS.include?(key)
28
+ end
29
+ else
30
+ @metadata
59
31
  end
32
+ end
60
33
 
61
- if RESERVED_HEADERS.include?(key) && !METADATA_ACCEPTABLE_HEADER.include?(key)
62
- return
63
- end
34
+ def path
35
+ @opts[':path']
36
+ end
37
+
38
+ def grpc_status
39
+ @opts['grpc-status']
40
+ end
41
+
42
+ def grpc_encoding
43
+ @opts['grpc-encoding']
44
+ end
45
+
46
+ def content_type
47
+ @opts['content-type']
48
+ end
49
+
50
+ def status_message
51
+ @opts['grpc-message']
52
+ end
64
53
 
65
- metadata[key] = val
66
- end
54
+ def timeout
55
+ @timeout ||= @opts['grpc-timeout'] && GrpcTime.new(@opts['grpc-timeout'])
56
+ end
57
+
58
+ def http_status
59
+ @opts[':status']
60
+ end
61
+
62
+ def add(key, val)
63
+ @opts[key] = val
67
64
  end
68
65
  end
69
66
  end
@@ -44,6 +44,10 @@ module GrpcKit
44
44
  false
45
45
  end
46
46
 
47
+ def select(timeout = 1)
48
+ ::IO.select([@io], [@io], [], timeout)
49
+ end
50
+
47
51
  def flush
48
52
  @io.flush
49
53
  end
@@ -0,0 +1,41 @@
1
+ # frozen_string_literal: true
2
+
3
+ module GrpcKit
4
+ module Session
5
+ class RecvBuffer
6
+ def initialize
7
+ @buffer = +''.b
8
+ @end = false
9
+ end
10
+
11
+ def write(data)
12
+ @buffer << data
13
+ end
14
+
15
+ def read(size = nil, last: false)
16
+ return nil if @buffer.empty?
17
+
18
+ end_read if last
19
+
20
+ if size.nil? || @buffer.bytesize < size
21
+ buf = @buffer
22
+ @buffer = ''.b
23
+ buf
24
+ else
25
+ @buffer.freeze
26
+ rbuf = @buffer.byteslice(0, size)
27
+ @buffer = @buffer.byteslice(size, @buffer.bytesize)
28
+ rbuf
29
+ end
30
+ end
31
+
32
+ def end_read?
33
+ @end
34
+ end
35
+
36
+ def end_read
37
+ @end = true
38
+ end
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,53 @@
1
+ # frozen_string_literal: true
2
+
3
+ module GrpcKit
4
+ module Session
5
+ class SendBuffer
6
+ def initialize
7
+ @buffer = ''.b
8
+ @end_write = false
9
+ @deferred_read = false
10
+ end
11
+
12
+ def write(data, last: false)
13
+ end_write if last
14
+ @buffer << data
15
+ end
16
+
17
+ def need_resume?
18
+ @deferred_read
19
+ end
20
+
21
+ def end_write
22
+ @end_write = true
23
+ end
24
+
25
+ def end_write?
26
+ @end_write
27
+ end
28
+
29
+ def read(size = nil)
30
+ if @buffer.empty?
31
+ if end_write?
32
+ @deferred_read = false
33
+ return nil # EOF
34
+ end
35
+
36
+ @deferred_read = true
37
+ return DS9::ERR_DEFERRED
38
+ end
39
+
40
+ if size.nil? || @buffer.bytesize < size
41
+ buf = @buffer
42
+ @buffer = ''.b
43
+ buf
44
+ else
45
+ @buffer.freeze
46
+ rbuf = @buffer.byteslice(0, size)
47
+ @buffer = @buffer.byteslice(size, @buffer.bytesize)
48
+ rbuf
49
+ end
50
+ end
51
+ end
52
+ end
53
+ end
@@ -6,6 +6,7 @@ require 'grpc_kit/session/stream'
6
6
  require 'grpc_kit/session/drain_controller'
7
7
  require 'grpc_kit/stream/server_stream'
8
8
  require 'grpc_kit/transport/server_transport'
9
+ require 'grpc_kit/session/send_buffer'
9
10
 
10
11
  module GrpcKit
11
12
  module Session
@@ -32,7 +33,7 @@ module GrpcKit
32
33
  loop do
33
34
  invoke
34
35
 
35
- if @streams.count == 0
36
+ if @streams.size == 0
36
37
  unless @io.wait_readable
37
38
  shutdown
38
39
  break
@@ -63,11 +64,13 @@ module GrpcKit
63
64
  @drain.call(self)
64
65
  end
65
66
 
66
- if want_read?
67
+ rs, ws = @io.select
68
+
69
+ if !rs.empty? && want_read?
67
70
  do_read
68
71
  end
69
72
 
70
- if want_write?
73
+ if !ws.empty? && want_write?
71
74
  send
72
75
  end
73
76
 
@@ -122,7 +125,7 @@ module GrpcKit
122
125
 
123
126
  stream = @streams[stream_id]
124
127
  data = @streams[stream_id].pending_send_data.read(length)
125
- if data.empty? && stream.end_write?
128
+ if data.nil?
126
129
  submit_trailer(stream_id, stream.trailer_data)
127
130
  # trailer header
128
131
  false
@@ -133,7 +136,7 @@ module GrpcKit
133
136
 
134
137
  # nghttp2_session_callbacks_set_on_frame_recv_callback
135
138
  def on_frame_recv(frame)
136
- GrpcKit.logger.debug("on_frame_recv #{frame}")
139
+ # GrpcKit.logger.debug("on_frame_recv #{frame}") # Too many call
137
140
 
138
141
  case frame
139
142
  when DS9::Frames::Data
@@ -148,9 +151,8 @@ module GrpcKit
148
151
  @inflights << stream
149
152
  end
150
153
  when DS9::Frames::Headers
151
- stream = @streams[frame.stream_id]
152
-
153
154
  if frame.end_stream?
155
+ stream = @streams[frame.stream_id]
154
156
  stream.close_remote
155
157
  end
156
158
  when DS9::Frames::Ping
@@ -170,11 +172,11 @@ module GrpcKit
170
172
 
171
173
  # nghttp2_session_callbacks_set_on_frame_send_callback
172
174
  def on_frame_send(frame)
173
- GrpcKit.logger.debug("on_frame_send #{frame}")
175
+ # GrpcKit.logger.debug("on_frame_send #{frame}") # Too many call
174
176
  case frame
175
177
  when DS9::Frames::Data, DS9::Frames::Headers
176
- stream = @streams[frame.stream_id]
177
178
  if frame.end_stream?
179
+ stream = @streams[frame.stream_id]
178
180
  stream.close_local
179
181
  end
180
182
  end
@@ -197,12 +199,12 @@ module GrpcKit
197
199
  raise "#{stream_id} is already existed"
198
200
  end
199
201
 
200
- @streams[stream_id] = GrpcKit::Session::Stream.new(stream_id: stream_id)
202
+ @streams[stream_id] = GrpcKit::Session::Stream.new(stream_id: stream_id, send_data: GrpcKit::Session::SendBuffer.new)
201
203
  end
202
204
 
203
205
  # nghttp2_session_callbacks_set_on_header_callback
204
206
  def on_header(name, value, frame, _flags)
205
- GrpcKit.logger.debug("#{name} => #{value}")
207
+ # GrpcKit.logger.debug("#{name} => #{value}") # Too many call
206
208
  stream = @streams[frame.stream_id]
207
209
  stream.add_header(name, value)
208
210
  end
@@ -214,7 +216,10 @@ module GrpcKit
214
216
 
215
217
  # nghttp2_session_callbacks_set_on_stream_close_callback
216
218
  def on_stream_close(stream_id, error_code)
217
- GrpcKit.logger.debug("on_stream_close stream_id=#{stream_id}, error_code=#{error_code}")
219
+ if error_code != DS9::NO_ERROR
220
+ GrpcKit.logger.debug("on_stream_close stream_id=#{stream_id}, error_code=#{error_code}")
221
+ end
222
+
218
223
  stream = @streams.delete(stream_id)
219
224
  stream.close if stream
220
225
 
@@ -1,9 +1,10 @@
1
1
  # frozen_string_literal: false
2
2
 
3
3
  require 'forwardable'
4
- require 'grpc_kit/session/buffer'
5
4
  require 'grpc_kit/session/headers'
6
5
  require 'grpc_kit/session/stream_status'
6
+ require 'grpc_kit/session/recv_buffer'
7
+ require 'grpc_kit/session/send_buffer'
7
8
 
8
9
  module GrpcKit
9
10
  module Session
@@ -21,8 +22,8 @@ module GrpcKit
21
22
  @stream_id = stream_id
22
23
  @end_read_stream = false
23
24
  @headers = GrpcKit::Session::Headers.new
24
- @pending_send_data = send_data || GrpcKit::Session::Buffer.new
25
- @pending_recv_data = recv_data || GrpcKit::Session::Buffer.new
25
+ @pending_send_data = send_data || GrpcKit::Session::SendBuffer.new
26
+ @pending_recv_data = recv_data || GrpcKit::Session::RecvBuffer.new
26
27
 
27
28
  @inflight = false
28
29
  @trailer_data = {}
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'grpc_kit/status_codes'
3
+ require 'grpc_kit/errors'
4
4
 
5
5
  module GrpcKit
6
6
  module Stream
@@ -61,8 +61,6 @@ module GrpcKit
61
61
  raise 'compress option is unsupported'
62
62
  end
63
63
 
64
- raise StopIteration if buf.nil?
65
-
66
64
  begin
67
65
  protobuf.decode(buf)
68
66
  rescue ArgumentError => e
@@ -70,19 +68,35 @@ module GrpcKit
70
68
  end
71
69
  end
72
70
 
73
- def each
74
- loop { yield(recv) }
71
+ def each(protobuf)
72
+ loop { yield(recv_msg(protobuf)) }
75
73
  end
76
74
 
77
75
  def send_status(data: nil, status: GrpcKit::StatusCodes::OK, msg: nil, metadata: {})
76
+ t = build_trailers(status, msg, metadata)
78
77
  @transport.write_data(data, last: true) if data
79
- write_trailers(status, msg, metadata)
80
78
 
81
- start_response unless @started
79
+ @transport.end_write
80
+ if @started
81
+ @transport.write_trailers(t)
82
+ elsif data
83
+ @transport.write_trailers(t)
84
+ start_response
85
+ else
86
+ send_headers(trailers: t)
87
+ end
82
88
  end
83
89
 
84
90
  private
85
91
 
92
+ def send_headers(trailers: {})
93
+ h = { ':status' => '200', 'content-type' => 'application/grpc' }
94
+ h['accept-encoding'] = 'identity'
95
+
96
+ @transport.submit_headers(h.merge(trailers))
97
+ @started = true
98
+ end
99
+
86
100
  def start_response(data = nil, metadata: {})
87
101
  h = { ':status' => '200', 'content-type' => 'application/grpc' }
88
102
  h['accept-encoding'] = 'identity'
@@ -92,13 +106,13 @@ module GrpcKit
92
106
  @started = true
93
107
  end
94
108
 
95
- def write_trailers(status, msg, metadata)
109
+ def build_trailers(status, msg, metadata)
96
110
  trailers = { 'grpc-status' => status.to_s }
97
111
  if msg
98
112
  trailers['grpc-message'] = msg
99
113
  end
100
114
 
101
- @transport.write_trailers(trailers.merge(metadata))
115
+ trailers.merge(metadata)
102
116
  end
103
117
  end
104
118
  end
@@ -1,7 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'grpc_kit/transport/packable'
4
- require 'grpc_kit/transport/send_buffer'
5
4
 
6
5
  module GrpcKit
7
6
  module Transport
@@ -12,42 +11,29 @@ module GrpcKit
12
11
  def initialize(session)
13
12
  @session = session
14
13
  @stream = nil # set later
15
- @deferred = false
16
14
  end
17
15
 
18
16
  def start_request(data, header, last: false)
19
- @stream = @session.send_request(GrpcKit::Transport::SendBuffer.new, header)
17
+ @stream = @session.send_request(header)
20
18
  write_data(data, last: last)
21
19
  end
22
20
 
23
21
  def close_and_flush
24
- resume_if_need
25
-
26
22
  @stream.end_write
23
+ send_data
24
+
27
25
  @session.start(@stream.stream_id)
28
26
  @stream.end_read
29
27
  @deferred = false
30
28
  end
31
29
 
32
- def each
33
- loop do
34
- data = recv
35
- return if data.nil?
36
-
37
- yield(data)
38
- end
39
- end
40
-
41
30
  def write_data(buf, last: false)
42
- resume_if_need
43
-
44
31
  write(@stream.pending_send_data, pack(buf), last: last)
45
- @session.run_once
46
- @deferred = true unless last
32
+ send_data
47
33
  end
48
34
 
49
35
  def read_data(last: false)
50
- unpack(read(last: last))
36
+ unpack(recv_data(last: last))
51
37
  end
52
38
 
53
39
  def recv_headers
@@ -57,12 +43,6 @@ module GrpcKit
57
43
 
58
44
  private
59
45
 
60
- def resume_if_need
61
- if !@stream.end_write? && @deferred
62
- @session.resume_data(@stream.stream_id)
63
- end
64
- end
65
-
66
46
  def wait_close
67
47
  # XXX: wait until half close (remote) to get grpc-status
68
48
  until @stream.close_remote?
@@ -74,10 +54,10 @@ module GrpcKit
74
54
  stream.write(buf, last: last)
75
55
  end
76
56
 
77
- def read(last: false)
57
+ def recv_data(last: false)
78
58
  loop do
79
59
  data = @stream.read_recv_data(last: last)
80
- return data unless data.empty?
60
+ return data unless data.nil?
81
61
 
82
62
  if @stream.close_remote?
83
63
  # it do not receive data which we need, it may receive invalid grpc-status
@@ -91,6 +71,14 @@ module GrpcKit
91
71
  @session.run_once
92
72
  end
93
73
  end
74
+
75
+ def send_data
76
+ if @stream.pending_send_data.need_resume?
77
+ @session.resume_data(@stream.stream_id)
78
+ end
79
+
80
+ @session.run_once
81
+ end
94
82
  end
95
83
  end
96
84
  end
@@ -12,15 +12,9 @@ module GrpcKit
12
12
 
13
13
  # @params data [String]
14
14
  def unpack(data)
15
- if data
16
- unpacker.feed(data)
17
- end
18
-
19
- if unpacker.readable?
20
- return unpacker.read
21
- end
15
+ unpacker.feed(data) if data
22
16
 
23
- nil
17
+ unpacker.read
24
18
  end
25
19
 
26
20
  def unpacker
@@ -32,27 +26,25 @@ module GrpcKit
32
26
  METADATA_SIZE = 5
33
27
 
34
28
  def initialize
35
- @i = 0
36
- @data = nil
29
+ @data = +''.b
37
30
  end
38
31
 
39
- def readable?
40
- @data && !@data.empty?
32
+ def data_exist?
33
+ !@data.empty?
41
34
  end
42
35
 
43
36
  def feed(data)
44
- if @data
45
- @data << data
46
- else
47
- @data = data
48
- end
37
+ @data << data
49
38
  end
50
39
 
51
40
  def read
52
- metadata = @data.slice!(0, METADATA_SIZE)
41
+ return nil if @data.empty?
42
+
43
+ d = @data.freeze
44
+ metadata = d.byteslice(0, METADATA_SIZE)
53
45
  c, size = metadata.unpack('CN')
54
- # TODO: more efficient code
55
- data = @data.slice!(0, size)
46
+ data = @data.byteslice(METADATA_SIZE, size)
47
+ @data = @data.byteslice(METADATA_SIZE + size, @data.bytesize)
56
48
  [c != 0, size, data]
57
49
  end
58
50
  end
@@ -14,29 +14,30 @@ module GrpcKit
14
14
  @stream = stream
15
15
  end
16
16
 
17
- def each
18
- loop do
19
- data = recv
20
- return if data.nil?
21
-
22
- yield(data)
23
- end
24
- end
25
-
26
17
  def start_response(headers)
27
18
  @session.submit_response(@stream.stream_id, headers)
19
+ send_data
20
+ end
21
+
22
+ def submit_headers(headers)
23
+ @session.submit_headers(@stream.stream_id, headers)
28
24
  end
29
25
 
30
26
  def write_data(buf, last: false)
31
27
  @stream.write_send_data(pack(buf), last: last)
28
+ send_data(last: last)
32
29
  end
33
30
 
34
31
  def read_data(last: false)
35
- unpack(read(last: last))
32
+ unpack(recv_data(last: last))
36
33
  end
37
34
 
38
35
  def write_trailers(trailer)
39
36
  @stream.write_trailers_data(trailer)
37
+ send_data(last: true)
38
+ end
39
+
40
+ def end_write
40
41
  @stream.end_write
41
42
  end
42
43
 
@@ -46,10 +47,10 @@ module GrpcKit
46
47
 
47
48
  private
48
49
 
49
- def read(last: false)
50
+ def recv_data(last: false)
50
51
  loop do
51
52
  data = @stream.read_recv_data(last: last)
52
- return data unless data.empty?
53
+ return data unless data.nil?
53
54
 
54
55
  if @stream.close_remote?
55
56
  # it do not receive data which we need, it may receive invalid grpc-status
@@ -63,6 +64,16 @@ module GrpcKit
63
64
  @session.run_once
64
65
  end
65
66
  end
67
+
68
+ def send_data(last: false)
69
+ if @stream.pending_send_data.need_resume?
70
+ @session.resume_data(@stream.stream_id)
71
+ end
72
+
73
+ unless last
74
+ @session.run_once
75
+ end
76
+ end
66
77
  end
67
78
  end
68
79
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module GrpcKit
4
- VERSION = '0.1.7'
4
+ VERSION = '0.1.8'
5
5
  end
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.7
4
+ version: 0.1.8
5
5
  platform: ruby
6
6
  authors:
7
7
  - ganmacs
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2018-11-06 00:00:00.000000000 Z
11
+ date: 2018-11-12 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.2.1
19
+ version: 1.3.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.2.1
26
+ version: 1.3.0
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: google-protobuf
29
29
  requirement: !ruby/object:Gem::Requirement
@@ -207,11 +207,12 @@ files:
207
207
  - lib/grpc_kit/rpcs/server_request_response.rb
208
208
  - lib/grpc_kit/rpcs/server_server_streamer.rb
209
209
  - lib/grpc_kit/server.rb
210
- - lib/grpc_kit/session/buffer.rb
211
210
  - lib/grpc_kit/session/client_session.rb
212
211
  - lib/grpc_kit/session/drain_controller.rb
213
212
  - lib/grpc_kit/session/headers.rb
214
213
  - lib/grpc_kit/session/io.rb
214
+ - lib/grpc_kit/session/recv_buffer.rb
215
+ - lib/grpc_kit/session/send_buffer.rb
215
216
  - lib/grpc_kit/session/server_session.rb
216
217
  - lib/grpc_kit/session/stream.rb
217
218
  - lib/grpc_kit/session/stream_status.rb
@@ -220,7 +221,6 @@ files:
220
221
  - lib/grpc_kit/stream/server_stream.rb
221
222
  - lib/grpc_kit/transport/client_transport.rb
222
223
  - lib/grpc_kit/transport/packable.rb
223
- - lib/grpc_kit/transport/send_buffer.rb
224
224
  - lib/grpc_kit/transport/server_transport.rb
225
225
  - lib/grpc_kit/version.rb
226
226
  homepage: https://github.com/ganmacs/grpc_kit
@@ -1,61 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module GrpcKit
4
- module Session
5
- class Buffer
6
- attr_accessor :finish
7
-
8
- def initialize(buffer: nil)
9
- @buffer = buffer
10
- @end_read = false
11
- @end_write = false
12
- @finish = false
13
- end
14
-
15
- def write(data, last: false)
16
- return 0 if data.empty?
17
-
18
- end_write if last
19
-
20
- if @buffer
21
- @buffer << data
22
- else
23
- @buffer = data.dup
24
- end
25
-
26
- data.bytesize
27
- end
28
-
29
- def read(len = nil, last: false)
30
- if @buffer.nil? || @buffer.empty?
31
- return ''
32
- end
33
-
34
- end_read if last
35
-
36
- # TODO: more efficient code
37
- if len
38
- @buffer.slice!(0...len)
39
- else
40
- @buffer.slice!(0..-1)
41
- end
42
- end
43
-
44
- def end_read?
45
- @end_read
46
- end
47
-
48
- def end_write?
49
- @end_write
50
- end
51
-
52
- def end_read
53
- @end_read = true
54
- end
55
-
56
- def end_write
57
- @end_write = true
58
- end
59
- end
60
- end
61
- end
@@ -1,45 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module GrpcKit
4
- module Transport
5
- class SendBuffer
6
- def initialize
7
- @buffer = nil
8
- @end_write = false
9
- end
10
-
11
- def write(data, last: false)
12
- end_write if last
13
-
14
- if @buffer
15
- @buffer << data
16
- else
17
- @buffer = data
18
- end
19
- end
20
-
21
- def end_write
22
- @end_write = true
23
- end
24
-
25
- def end_write?
26
- @end_write
27
- end
28
-
29
- def read(size)
30
- if @buffer.nil?
31
- return false
32
- end
33
-
34
- data = @buffer.slice!(0, size)
35
- if !data.empty?
36
- data
37
- elsif end_write?
38
- nil # EOF
39
- else
40
- false # deferred
41
- end
42
- end
43
- end
44
- end
45
- end