-
Notifications
You must be signed in to change notification settings - Fork 15
/
event_parser.rb
65 lines (54 loc) · 1.74 KB
/
event_parser.rb
1
2
3
4
5
6
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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
# frozen_string_literal: false
module SplitIoClient
module SSE
module EventSource
class EventParser
BAD_REQUEST_CODE = 400
def initialize(config)
@config = config
end
def parse(raw_event)
type = nil
events = []
buffer = read_partial_data(raw_event)
buffer.each do |d|
splited_data = d.split(':')
case splited_data[0]
when 'event'
type = splited_data[1].strip
when 'data'
data = parse_event_data(d, type)
events << StreamData.new(type, data[:client_id], data[:data], data[:channel]) unless type.nil? || data[:data].nil?
end
end
events
rescue StandardError => e
@config.logger.debug("Error during parsing a event: #{e.inspect}")
[]
end
def first_event(raw_data)
raw_data.split("\n")[0].split(' ')[1].to_i
rescue StandardError => e
@config.logger.debug("Error parsing first event: #{e.inspect}")
BAD_REQUEST_CODE
end
private
def parse_event_data(data, type)
data_value = data.sub('data:', '')
event_data = JSON.parse(data_value.strip)
client_id = event_data['clientId']&.strip
channel = event_data['channel']&.strip
parsed_data = JSON.parse(event_data['data']) unless type == 'error'
parsed_data = event_data if type == 'error'
{ client_id: client_id, channel: channel, data: parsed_data }
end
def read_partial_data(data)
buffer = ''
buffer << data
buffer.chomp!
buffer.split("\n")
end
end
end
end
end