Sha256: 5ac304f8831de28e90b28b37b6a4e3ce72a7a77e2f9623bd0a8c37f982b931f9

Contents?: true

Size: 1.15 KB

Versions: 2

Compression:

Stored size: 1.15 KB

Contents

# frozen_string_literal: true

module GrpcKit
  module Streams
    module Packable
      # @params data [String]
      # @params compress [Boolean]
      def pack(data, compress = false)
        c = compress ? 1 : 0
        [c, data.size, data].pack('CNa*')
      end

      # @params data [String]
      def unpack(data)
        if data
          unpacker.feed(data)
        end

        if unpacker.readable?
          return unpacker.read
        end

        nil
      end

      def unpacker
        @unpacker ||= GrpcKit::Streams::Packable::Unpacker.new
      end

      class Unpacker
        # Compressed bytes(1 Byte) + length bytes(4 Bytes)
        METADATA_SIZE = 5

        def initialize
          @i = 0
          @data = nil
        end

        def readable?
          @data && !@data.empty?
        end

        def feed(data)
          if @data
            @data << data
          else
            @data = data
          end
        end

        def read
          metadata = @data.slice!(0, METADATA_SIZE)
          c, size = metadata.unpack('CN')
          data = @data.slice!(0, size)
          [c != 0, size, data]
        end
      end
    end
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
grpc_kit-0.1.2 lib/grpc_kit/streams/packable.rb
grpc_kit-0.1.1 lib/grpc_kit/streams/packable.rb