class Nsqrb::Parser

Constants

FRAME_TYPES

Frame types

FRAME_TYPE_SIZE
INFO_SIZE

Public Class Methods

new() click to toggle source
# File lib/nsqrb/parser.rb, line 14
def initialize
  @buffer = []
end

Public Instance Methods

add(bytes) click to toggle source
# File lib/nsqrb/parser.rb, line 18
def add(bytes)
  bytes = bytes.split('') if bytes.is_a?(String)
  @buffer += bytes
end
parse() click to toggle source

Parse all frames from current buffer @return Array [Frame]

# File lib/nsqrb/parser.rb, line 25
def parse
  frames = []
  loop do
    break if @buffer.length < INFO_SIZE
    size, type = @buffer[0, INFO_SIZE].join.unpack('l>l>')
    frame = { size: size - FRAME_TYPE_SIZE, type: type.to_i }

    break if @buffer.length < frame[:size] + INFO_SIZE
    frame[:data] = @buffer[INFO_SIZE, frame[:size]].join
    frames << build_frame(frame)
    @buffer.shift(INFO_SIZE + frame[:size])
  end
  frames
end

Private Instance Methods

build_frame(frame) click to toggle source
# File lib/nsqrb/parser.rb, line 42
def build_frame(frame)
  raise "Unknown frame type: #{frame[:type]}" unless FRAME_TYPES.has_key?(frame[:type])
  FRAME_TYPES[frame[:type]].new frame
end