Class: Nsqrb::Parser

Inherits:
Object
  • Object
show all
Defined in:
lib/nsqrb/parser.rb

Constant Summary collapse

FRAME_TYPES =

Frame types

{
  0 => Frame::Response,
  1 => Frame::Error,
  2 => Frame::Message
}
FRAME_TYPE_SIZE =
4
INFO_SIZE =
8

Instance Method Summary collapse

Constructor Details

#initializeParser

Returns a new instance of Parser.



14
15
16
# File 'lib/nsqrb/parser.rb', line 14

def initialize
  @buffer = []
end

Instance Method Details

#add(bytes) ⇒ Object



18
19
20
21
# File 'lib/nsqrb/parser.rb', line 18

def add(bytes)
  bytes = bytes.split('') if bytes.is_a?(String)
  @buffer += bytes
end

#parseObject

Parse all frames from current buffer



25
26
27
28
29
30
31
32
33
34
35
36
37
38
# 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