class Kameleoon::RealTime::SseClient
SseClient is used to interpret SSE event stream.
#
def call_close_handler
#
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)
-
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
#
def start @cr_prev = false @data_buffer = [] @event = nil @id = nil @buffer = [] @sse_request.start end