Sha256: ac0cb9d76534f68763d029852296ab1e0eadf6d01b015e37f1f283ff428ccd7c

Contents?: true

Size: 1.09 KB

Versions: 2

Compression:

Stored size: 1.09 KB

Contents

module WebSocket
  class Driver

    class StreamReader
      # Try to minimise the number of reallocations done:
      MINIMUM_AUTOMATIC_PRUNE_OFFSET = 128

      def initialize
        @buffer = Driver.encode('', :binary)
        @offset = 0
      end

      def put(buffer)
        return unless buffer and buffer.bytesize > 0
        @buffer << Driver.encode(buffer, :binary)
      end

      # Read bytes from the data:
      def read(length)
        return nil if (@offset + length) > @buffer.bytesize

        chunk = @buffer.byteslice(@offset, length)
        @offset += chunk.bytesize

        prune if @offset > MINIMUM_AUTOMATIC_PRUNE_OFFSET

        return chunk
      end

      def each_byte
        prune

        @buffer.each_byte do |value|
          @offset += 1
          yield value
        end
      end

    private

      def prune
        buffer_size = @buffer.bytesize

        if @offset > buffer_size
          @buffer = Driver.encode('', :binary)
        else
          @buffer = @buffer.byteslice(@offset, buffer_size - @offset)
        end

        @offset = 0
      end
    end

  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
websocket-driver-0.6.0-java lib/websocket/driver/stream_reader.rb
websocket-driver-0.6.0 lib/websocket/driver/stream_reader.rb