class Kameleoon::RealTime::SseClient

SseClient is used to interpret SSE event stream.
#

def call_close_handler

Calls @sse_request@close_handler if it is not nil.
#
def call_close_handler
  @sse_request.call_close_handler
end

def dispatch_event

def dispatch_event
  return unless !@event.nil? || !@data_buffer.empty? # Ignoring empty events
  data = @data_buffer.join("\n")
  message = SseMessage.new(@event, @id, data)
  @event = nil
  @data_buffer.clear
  @message_handler&.call(message)
end

def handle_line(line)

def handle_line(line)
  field, value = parse_line(line)
  return if field.nil?
  case field
  when 'event'
    @event = value
  when 'data'
    @data_buffer << value
  when 'id'
    @id = value
  when 'retry'
    @reconnection_time = value.to_i # This does not affect anything
  end
end

def initialize(sse_request, message_handler)

Parameters:
  • message_handler (Callable[Kameleoon::RealTime::SseMessage] | NilClass) -- Callable object which
  • sse_request (Kameleoon::RealTime::SseRequest) -- Used to access SSE event stream.
def initialize(sse_request, message_handler)
  @sse_request = sse_request
  @message_handler = message_handler
  @cr_prev = nil
  @buffer = nil
  @data_buffer = nil
  @event = nil
  @id = nil
  @reconnection_time = nil
  @sse_request.resp_char_handler = method(:process_char)
end

def parse_line(line)

def parse_line(line)
  colon_index = line.index(':')
  return line, nil if colon_index.nil?
  return nil, nil if colon_index.zero?
  field = line[0, colon_index]
  return field, '' if colon_index + 1 == line.length
  value = if line[colon_index + 1] == ' '
            line[colon_index + 2..]
          else
            line[colon_index + 1..]
          end
  [field, value]
end

def process_char(ch)

def process_char(ch)
  if @cr_prev && (ch == "\n")
    @cr_prev = false
    return
  end
  @cr_prev = ch == "\r"
  if @cr_prev || (ch == "\n")
    line = @buffer.join
    @buffer.clear
    if line.empty?
      dispatch_event
    else
      handle_line(line)
    end
    return
  end
  @buffer << ch
end

def start

Starts SSE connection and stay in the loop until close.
#
def start
  @cr_prev = false
  @data_buffer = []
  @event = nil
  @id = nil
  @buffer = []
  @sse_request.start
end