class Plux::Parser

Constants

LAST_MSG
SEPERATOR
STREAM_MAX_LEN
SYSTEM

Public Class Methods

encode(msg) click to toggle source
# File lib/plux/parser.rb, line 52
def self.encode(msg)
  len = msg.length.to_s(SYSTEM)

  msg = "#{len}#{SEPERATOR}#{msg}"
  len = msg.length

  return [msg] if len < STREAM_MAX_LEN

  div, mod = len.divmod(STREAM_MAX_LEN)
  (mod > 0 ? (div + 1) : div).times.map do |start|
    msg[start * STREAM_MAX_LEN, STREAM_MAX_LEN]
  end
end
new() click to toggle source
# File lib/plux/parser.rb, line 9
def initialize
  @broken = ''
end

Public Instance Methods

decode(stream) click to toggle source
# File lib/plux/parser.rb, line 13
def decode(stream)
  stream = @broken.concat(stream)
  result = []

  start = 0
  pending = stream.length

  until start >= pending
    sep_idx = stream.index(SEPERATOR, start)

    unless sep_idx
      len_str = stream[start, pending]
      @broken.clear
      @broken.concat(len_str)
      return result
    end

    len_str = stream[start, sep_idx - start]
    est_len = len_str.to_i(SYSTEM)
    start = sep_idx + 1
    msg = stream[start, est_len]
    act_len = msg.length

    if act_len < est_len
      @broken.clear
      @broken.concat(len_str)
      @broken.concat(SEPERATOR)
      @broken.concat(msg)
      return result
    end

    result << msg
    start += act_len
  end

  @broken.clear
  result
end