Sha256: 319880198abe260fe922d1f023c25ee28020bdd9a3fabd5a8aee91e0d2f84ca0

Contents?: true

Size: 1.8 KB

Versions: 11

Compression:

Stored size: 1.8 KB

Contents

# frozen_string_literal: true

module GrpcKit
  module Session
    class SendBuffer
      def initialize
        @buffer = ''.b
        @end_write = false
        @deferred_read = false
        @mutex = Mutex.new
      end

      # @param data [String]
      # @param last [Boolean]
      # @return [void]
      def write(data, last: false)
        @mutex.synchronize { @buffer << data }
        end_write if last
      end

      # @return [Boolean]
      def need_resume?
        @deferred_read
      end

      def no_resume
        @deferred_read = false
      end

      # @return [void]
      def end_write
        @end_write = true
      end

      # @return [Boolean]
      def end_write?
        @end_write
      end

      def empty?
        @mutex.synchronize { @buffer.empty? }
      end

      # @param size [Integer,nil]
      # @return [nil,DS9::ERR_DEFERRED,String]
      def read(size = nil)
        buf = do_read(size)
        if buf
          @deferred_read = false
          return buf
        end

        if end_write?
          # Call again because #write invokes `@buffer << data` before calling #end_write
          if (buf = do_read(size))
            @deferred_read = false
            return buf
          end

          @deferred_read = false
          return nil # EOF
        end

        @deferred_read = true
        DS9::ERR_DEFERRED
      end

      private

      def do_read(size = nil)
        @mutex.synchronize do
          if @buffer.empty?
            nil
          elsif size.nil? || @buffer.bytesize < size
            buf = @buffer
            @buffer = ''.b
            buf
          else
            @buffer.freeze
            rbuf = @buffer.byteslice(0, size)
            @buffer = @buffer.byteslice(size, @buffer.bytesize)
            rbuf
          end
        end
      end
    end
  end
end

Version data entries

11 entries across 11 versions & 1 rubygems

Version Path
grpc_kit-0.5.0 lib/grpc_kit/session/send_buffer.rb
grpc_kit-0.4.0 lib/grpc_kit/session/send_buffer.rb
grpc_kit-0.3.9 lib/grpc_kit/session/send_buffer.rb
grpc_kit-0.3.8 lib/grpc_kit/session/send_buffer.rb
grpc_kit-0.3.7 lib/grpc_kit/session/send_buffer.rb
grpc_kit-0.3.6 lib/grpc_kit/session/send_buffer.rb
grpc_kit-0.3.5 lib/grpc_kit/session/send_buffer.rb
grpc_kit-0.3.4 lib/grpc_kit/session/send_buffer.rb
grpc_kit-0.3.3 lib/grpc_kit/session/send_buffer.rb
grpc_kit-0.3.2 lib/grpc_kit/session/send_buffer.rb
grpc_kit-0.3.1 lib/grpc_kit/session/send_buffer.rb