class DRbQS::Worker::Serialize::Unpacker

Public Class Methods

new() click to toggle source
# File lib/drbqs/worker/serialize.rb, line 7
def initialize
  @chunk = ''
  @next_size = nil
end

Public Instance Methods

each() { |obj| ... } click to toggle source
# File lib/drbqs/worker/serialize.rb, line 37
def each(&block)
  if block_given?
    while ary = next_object
      sym, obj = ary
      yield(obj)
    end
  else
    to_enum(:each)
  end
end
feed(data) click to toggle source
# File lib/drbqs/worker/serialize.rb, line 12
def feed(data)
  @chunk << data
end
feed_each(data, &block) click to toggle source
# File lib/drbqs/worker/serialize.rb, line 48
def feed_each(data, &block)
  feed(data)
  each(&block)
end

Private Instance Methods

next_object() click to toggle source
# File lib/drbqs/worker/serialize.rb, line 16
def next_object
  unless @next_size
    if @chunk.bytesize >= HEADER_BYTE_SIZE
      @chunk.force_encoding('BINARY')
      @next_size = @chunk[0, HEADER_BYTE_SIZE].unpack('N')[0]
      @chunk = @chunk[HEADER_BYTE_SIZE..-1]
    else
      return nil
    end
  end
  if @next_size && @chunk.bytesize >= @next_size
    data = @chunk[0, @next_size]
    @chunk = @chunk[@next_size..-1]
    @next_size = nil
    [:loaded, Marshal.load(data)]
  else
    nil
  end
end