in lib/openai/internal/util.rb [743:778]
def decode_sse(lines)
chain_fused(lines) do |y|
blank = {event: nil, data: nil, id: nil, retry: nil}
current = {}
lines.each do |line|
case line.sub(/\R$/, "")
in ""
next if current.empty?
y << {**blank, **current}
current = {}
in /^:/
next
in /^([^:]+):\s?(.*)$/
field, value = Regexp.last_match.captures
case field
in "event"
current.merge!(event: value)
in "data"
(current[:data] ||= String.new) << (value << "\n")
in "id" unless value.include?("\0")
current.merge!(id: value)
in "retry" if /^\d+$/ =~ value
current.merge!(retry: Integer(value))
else
end
else
end
end
y << {**blank, **current} unless current.empty?
end
end