Class: AnswerLayer::SSEParser

Inherits:
Object
  • Object
show all
Defined in:
lib/answerlayer/responses/sse_parser.rb

Class Method Summary collapse

Class Method Details

.build_event(type, raw_data) ⇒ Object



35
36
37
38
39
40
41
42
43
# File 'lib/answerlayer/responses/sse_parser.rb', line 35

def self.build_event(type, raw_data)
  data = JSON.parse(raw_data)
  event = StreamEvent.new(type: type, data: data, raw: raw_data)
  raise StreamError.new(data["message"] || data["error"] || "stream error", event: event) if event.error?

  event
rescue JSON::ParserError
  StreamEvent.new(type: type, data: raw_data, raw: raw_data)
end

.parse(stream) ⇒ Object



7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
# File 'lib/answerlayer/responses/sse_parser.rb', line 7

def self.parse(stream)
  events = []
  current_type = "message"
  data_lines = []

  stream.each_line do |line|
    line = line.chomp
    if line.empty?
      events << build_event(current_type, data_lines.join("\n")) unless data_lines.empty?
      current_type = "message"
      data_lines = []
      next
    end

    field, value = line.split(":", 2)
    value = value ? value.sub(/\A /, "") : ""
    case field
    when "event"
      current_type = value
    when "data"
      data_lines << value
    end
  end

  events << build_event(current_type, data_lines.join("\n")) unless data_lines.empty?
  events
end