class Celluloid::EventSource::EventParser

Constants

MessageEvent

Public Class Methods

new(lines, chunked, on_retry) click to toggle source
# File lib/celluloid/eventsource/event_parser.rb, line 6
def initialize(lines, chunked, on_retry)
  @lines = lines
  @chunked = chunked
  clear_buffers!
  @on_retry = on_retry
end

Public Instance Methods

each() { |event| ... } click to toggle source
# File lib/celluloid/eventsource/event_parser.rb, line 13
def each
  @lines.each do |line|
    if line.strip.empty?
      begin
        event = create_event
        yield event unless event.nil?
      ensure
        clear_buffers!
      end
    else
      parse_line(line)
    end
  end
end

Private Instance Methods

clear_buffers!() click to toggle source
# File lib/celluloid/eventsource/event_parser.rb, line 32
def clear_buffers!
  @id_buffer = ''
  @data_buffer = ''
  @type_buffer = ''
end
create_event() click to toggle source
# File lib/celluloid/eventsource/event_parser.rb, line 51
def create_event
  return nil if @data_buffer.empty?

  @data_buffer.chomp!("\n") if @data_buffer.end_with?("\n")
  event = MessageEvent.new(:message, @data_buffer, @id_buffer)
  event.type = @type_buffer.to_sym unless @type_buffer.empty?
  event
end
parse_line(line) click to toggle source
# File lib/celluloid/eventsource/event_parser.rb, line 38
def parse_line(line)
  case line
    when /^:.*$/
    when /^(\w+): ?(.*)$/
      process_field($1, $2)
    else
      if @chunked && !@data_buffer.empty?
        @data_buffer.rstrip!
        process_field("data", line.rstrip)
      end
  end
end
process_field(field_name, field_value) click to toggle source
# File lib/celluloid/eventsource/event_parser.rb, line 60
def process_field(field_name, field_value)
  case field_name
    when "event"
      @type_buffer = field_value
    when "data"
      @data_buffer << field_value.concat("\n")
    when "id"
      @id_buffer = field_value
    when "retry"
      if /^(?<num>\d+)$/ =~ field_value
        @on_retry.call(num.to_i)
      end
  end
end