Module: A2A::Streaming::SseParser

Defined in:
lib/a2a/streaming/sse_parser.rb

Class Method Summary collapse

Class Method Details

.each(io, &block) ⇒ Object

Parses a stream of SSE lines, yielding one Streaming::Response per logical event (blank-line delimited, multi-line data: concatenated).



10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# File 'lib/a2a/streaming/sse_parser.rb', line 10

def self.each(io, &block)
  buffer = +""

  io.each_line do |line|
    line = line.chomp

    if line.empty?
      emit(buffer, &block) unless buffer.empty?
      buffer = +""
    elsif line.start_with?("data:")
      # SSE spec: multiple data: lines are concatenated with U+000A
      buffer << "\n" unless buffer.empty?
      buffer << line.delete_prefix("data:").lstrip
    end
    # skip comment lines (":"), "event:", "id:", "retry:" fields
  end

  emit(buffer, &block) unless buffer.empty?
end