ld-celluloid-eventsource 0.10.0 → 0.11.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/ld-celluloid-eventsource.gemspec +1 -1
- data/lib/celluloid/eventsource.rb +131 -132
- data/lib/celluloid/eventsource/event_parser.rb +76 -0
- data/lib/celluloid/eventsource/version.rb +1 -1
- data/spec/celluloid/eventsource/event_parser_spec.rb +97 -0
- data/spec/celluloid/eventsource_spec.rb +5 -5
- metadata +8 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d2311a2b7704096d17f374aac47e599e87c69541
|
4
|
+
data.tar.gz: 03e6a782b9ae04bfc6f52da8958baa8344755a75
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 10e03560e84e12a05124523bbc0580dd4c72baaa67f59fb42c9747b7fbd485371a1d40a858f1627bc8ecba632e6e8742af0eee2b32f92c37dc9e0e507c689b28
|
7
|
+
data.tar.gz: 2bd535c2616ca1189558078d658e69ccafd05f68cc5286fc9298a07c5a14142bf9d2d8938952a569d032d4d5d8be373127176b251e89c060b72a4e2fe785d0f0
|
@@ -20,7 +20,7 @@ Gem::Specification.new do |spec|
|
|
20
20
|
|
21
21
|
spec.add_dependency 'celluloid-io', '~> 0.17.3'
|
22
22
|
spec.add_dependency 'celluloid', '~> 0.18.0.pre'
|
23
|
-
spec.add_dependency 'nio4r', '
|
23
|
+
spec.add_dependency 'nio4r', '>= 1.1'
|
24
24
|
spec.add_dependency 'http_parser.rb', '~> 0.6.0'
|
25
25
|
|
26
26
|
spec.add_development_dependency 'atomic', '~> 1.1'
|
@@ -1,6 +1,7 @@
|
|
1
1
|
require 'celluloid/current'
|
2
2
|
require 'celluloid/eventsource/version'
|
3
3
|
require 'celluloid/io'
|
4
|
+
require 'celluloid/eventsource/event_parser'
|
4
5
|
require 'celluloid/eventsource/response_parser'
|
5
6
|
require 'uri'
|
6
7
|
require 'base64'
|
@@ -8,8 +9,15 @@ require 'base64'
|
|
8
9
|
module Celluloid
|
9
10
|
class EventSource
|
10
11
|
include Celluloid::IO
|
12
|
+
include Celluloid::Internals::Logger
|
11
13
|
Celluloid.boot
|
12
14
|
|
15
|
+
class UnexpectedContentType < StandardError
|
16
|
+
end
|
17
|
+
|
18
|
+
class ReadTimeout < StandardError
|
19
|
+
end
|
20
|
+
|
13
21
|
attr_reader :url, :with_credentials
|
14
22
|
attr_reader :ready_state
|
15
23
|
|
@@ -17,14 +25,28 @@ module Celluloid
|
|
17
25
|
OPEN = 1
|
18
26
|
CLOSED = 2
|
19
27
|
|
28
|
+
MAX_RECONNECT_TIME = 30
|
29
|
+
|
20
30
|
execute_block_on_receiver :initialize
|
21
31
|
|
32
|
+
#
|
33
|
+
# Constructor for an EventSource.
|
34
|
+
#
|
35
|
+
# @param uri [String] the event stream URI
|
36
|
+
# @param opts [Hash] the configuration options
|
37
|
+
# @option opts [Hash] :headers Headers to send with the request
|
38
|
+
# @option opts [Float] :read_timeout Timeout (in seconds) after which to restart the connection if
|
39
|
+
# the server has sent no data
|
40
|
+
# @option opts [Float] :reconnect_delay Initial delay (in seconds) between connection attempts; this will
|
41
|
+
# be increased exponentially if there are repeated failures
|
42
|
+
#
|
22
43
|
def initialize(uri, options = {})
|
23
44
|
self.url = uri
|
24
45
|
options = options.dup
|
25
46
|
@ready_state = CONNECTING
|
26
47
|
@with_credentials = options.delete(:with_credentials) { false }
|
27
48
|
@headers = default_request_headers.merge(options.fetch(:headers, {}))
|
49
|
+
@read_timeout = options.fetch(:read_timeout, 0).to_i
|
28
50
|
proxy = ENV['HTTP_PROXY'] || ENV['http_proxy'] || options[:proxy]
|
29
51
|
if proxy
|
30
52
|
proxyUri = URI(proxy)
|
@@ -33,15 +55,8 @@ module Celluloid
|
|
33
55
|
end
|
34
56
|
end
|
35
57
|
|
36
|
-
@
|
37
|
-
@last_event_id_buffer = ""
|
38
|
-
@data_buffer = ""
|
39
|
-
|
40
|
-
@last_event_id = String.new
|
41
|
-
|
42
|
-
@reconnect_timeout = 1
|
58
|
+
@reconnect_timeout = options.fetch(:reconnect_delay, 1)
|
43
59
|
@on = { open: ->{}, message: ->(_) {}, error: ->(_) {} }
|
44
|
-
@parser = ResponseParser.new
|
45
60
|
|
46
61
|
@chunked = false
|
47
62
|
|
@@ -66,11 +81,13 @@ module Celluloid
|
|
66
81
|
while !closed?
|
67
82
|
begin
|
68
83
|
establish_connection
|
69
|
-
|
70
|
-
rescue
|
71
|
-
#
|
84
|
+
process_stream
|
85
|
+
rescue UnexpectedContentType
|
86
|
+
raise # Let these flow to the top
|
87
|
+
rescue StandardError => e
|
88
|
+
info "Reconnecting after exception: #{e}"
|
89
|
+
# Just reconnect on runtime errors
|
72
90
|
end
|
73
|
-
sleep @reconnect_timeout
|
74
91
|
end
|
75
92
|
end
|
76
93
|
|
@@ -97,54 +114,79 @@ module Celluloid
|
|
97
114
|
|
98
115
|
private
|
99
116
|
|
100
|
-
MessageEvent = Struct.new(:type, :data, :last_event_id)
|
101
|
-
|
102
117
|
def ssl?
|
103
118
|
url.scheme == 'https'
|
104
119
|
end
|
105
120
|
|
106
121
|
def establish_connection
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
@socket.write(connect_string)
|
112
|
-
@socket.flush
|
113
|
-
while (line = @socket.readline.chomp) != '' do @parser << line end
|
122
|
+
parser = ResponseParser.new
|
123
|
+
reconnect_attempts = 0
|
124
|
+
reconnect_jitter_rand = Random.new
|
114
125
|
|
115
|
-
|
116
|
-
|
117
|
-
|
126
|
+
loop do
|
127
|
+
begin
|
128
|
+
if @proxy
|
129
|
+
sock = ::TCPSocket.new(@proxy.host, @proxy.port)
|
130
|
+
@socket = Celluloid::IO::TCPSocket.new(sock)
|
131
|
+
|
132
|
+
@socket.write(connect_string)
|
133
|
+
@socket.flush
|
134
|
+
while (line = readline_with_timeout(@socket).chomp) != '' do parser << line end
|
135
|
+
|
136
|
+
unless parser.status_code == 200
|
137
|
+
@on[:error].call({status_code: parser.status_code, body: parser.chunk})
|
138
|
+
return
|
139
|
+
end
|
140
|
+
else
|
141
|
+
sock = ::TCPSocket.new(@url.host, @url.port)
|
142
|
+
@socket = Celluloid::IO::TCPSocket.new(sock)
|
143
|
+
end
|
144
|
+
|
145
|
+
if ssl?
|
146
|
+
@socket = Celluloid::IO::SSLSocket.new(@socket)
|
147
|
+
@socket.connect
|
148
|
+
end
|
149
|
+
|
150
|
+
@socket.write(request_string)
|
151
|
+
@socket.flush()
|
152
|
+
|
153
|
+
until parser.headers?
|
154
|
+
parser << readline_with_timeout(@socket)
|
155
|
+
end
|
156
|
+
|
157
|
+
if parser.status_code != 200
|
158
|
+
until @socket.eof?
|
159
|
+
parser << readline_with_timeout(@socket)
|
160
|
+
end
|
161
|
+
# If the server returns a non-200, we don't want to close-- we just want to
|
162
|
+
# report an error
|
163
|
+
# close
|
164
|
+
@on[:error].call({status_code: parser.status_code, body: parser.chunk})
|
165
|
+
elsif parser.headers['Content-Type'] && parser.headers['Content-Type'].include?("text/event-stream")
|
166
|
+
@chunked = !parser.headers["Transfer-Encoding"].nil? && parser.headers["Transfer-Encoding"].include?("chunked")
|
167
|
+
@ready_state = OPEN
|
168
|
+
@on[:open].call
|
169
|
+
return # Success, don't retry
|
170
|
+
else
|
171
|
+
close
|
172
|
+
info "Invalid Content-Type #{parser.headers['Content-Type']}"
|
173
|
+
@on[:error].call({status_code: parser.status_code, body: "Invalid Content-Type #{parser.headers['Content-Type']}. Expected text/event-stream"})
|
174
|
+
raise UnexpectedContentType
|
175
|
+
end
|
176
|
+
|
177
|
+
rescue UnexpectedContentType
|
178
|
+
raise # Let these flow to the top
|
179
|
+
|
180
|
+
rescue StandardError => e
|
181
|
+
warn "Waiting to try again after exception while connecting: #{e}"
|
182
|
+
# Just try again after a delay for any other exceptions
|
118
183
|
end
|
119
|
-
else
|
120
|
-
sock = ::TCPSocket.new(@url.host, @url.port)
|
121
|
-
@socket = Celluloid::IO::TCPSocket.new(sock)
|
122
|
-
end
|
123
184
|
|
124
|
-
|
125
|
-
|
126
|
-
|
185
|
+
base_sleep_time = ([@reconnect_timeout * (2 ** reconnect_attempts), MAX_RECONNECT_TIME].min).to_f
|
186
|
+
sleep_time = (base_sleep_time / 2) + reconnect_jitter_rand.rand(base_sleep_time / 2)
|
187
|
+
sleep sleep_time
|
188
|
+
reconnect_attempts += 1
|
127
189
|
end
|
128
|
-
|
129
|
-
@socket.write(request_string)
|
130
|
-
@socket.flush()
|
131
|
-
|
132
|
-
until @parser.headers?
|
133
|
-
@parser << @socket.readline
|
134
|
-
end
|
135
|
-
|
136
|
-
if @parser.status_code != 200
|
137
|
-
until @socket.eof?
|
138
|
-
@parser << @socket.readline
|
139
|
-
end
|
140
|
-
# If the server returns a non-200, we don't want to close-- we just want to
|
141
|
-
# report an error
|
142
|
-
# close
|
143
|
-
@on[:error].call({status_code: @parser.status_code, body: @parser.chunk})
|
144
|
-
return
|
145
|
-
end
|
146
|
-
|
147
|
-
handle_headers(@parser.headers)
|
148
190
|
end
|
149
191
|
|
150
192
|
def default_request_headers
|
@@ -155,100 +197,59 @@ module Celluloid
|
|
155
197
|
}
|
156
198
|
end
|
157
199
|
|
158
|
-
def clear_buffers!
|
159
|
-
@data_buffer = ""
|
160
|
-
@event_type_buffer = ""
|
161
|
-
end
|
162
|
-
|
163
|
-
def dispatch_event(event)
|
164
|
-
unless closed?
|
165
|
-
@on[event.type] && @on[event.type].call(event)
|
166
|
-
end
|
167
|
-
end
|
168
|
-
|
169
200
|
def chunked?
|
170
201
|
@chunked
|
171
202
|
end
|
172
203
|
|
173
|
-
def
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
end
|
184
|
-
end
|
185
|
-
|
186
|
-
def handle_chunked_stream
|
187
|
-
chunk_header = @socket.readline
|
188
|
-
bytes_to_read = chunk_header.to_i(16)
|
189
|
-
bytes_read = 0
|
190
|
-
while bytes_read < bytes_to_read do
|
191
|
-
line = @socket.readline
|
192
|
-
bytes_read += line.size
|
193
|
-
|
194
|
-
line.strip.empty? ? process_event : parse_line(line)
|
195
|
-
end
|
196
|
-
|
197
|
-
if !line.nil? && line.strip.empty?
|
198
|
-
process_event
|
204
|
+
def read_chunked_lines(socket)
|
205
|
+
Enumerator.new do |lines|
|
206
|
+
chunk_header = readline_with_timeout(socket)
|
207
|
+
bytes_to_read = chunk_header.to_i(16)
|
208
|
+
bytes_read = 0
|
209
|
+
while bytes_read < bytes_to_read do
|
210
|
+
line = readline_with_timeout(@socket)
|
211
|
+
bytes_read += line.size
|
212
|
+
lines << line
|
213
|
+
end
|
199
214
|
end
|
200
215
|
end
|
201
216
|
|
202
|
-
def
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
|
208
|
-
|
209
|
-
|
210
|
-
|
217
|
+
def read_lines
|
218
|
+
Enumerator.new do |lines|
|
219
|
+
loop do
|
220
|
+
break if closed?
|
221
|
+
if chunked?
|
222
|
+
for line in read_chunked_lines(@socket) do
|
223
|
+
break if closed?
|
224
|
+
lines << line
|
225
|
+
end
|
226
|
+
else
|
227
|
+
lines << readline_with_timeout(@socket)
|
228
|
+
end
|
211
229
|
end
|
212
230
|
end
|
213
231
|
end
|
214
232
|
|
215
|
-
def
|
216
|
-
@
|
217
|
-
|
218
|
-
|
219
|
-
|
220
|
-
@data_buffer.chomp!("\n") if @data_buffer.end_with?("\n")
|
221
|
-
event = MessageEvent.new(:message, @data_buffer, @last_event_id)
|
222
|
-
event.type = @event_type_buffer.to_sym unless @event_type_buffer.empty?
|
223
|
-
|
224
|
-
dispatch_event(event)
|
225
|
-
ensure
|
226
|
-
clear_buffers!
|
227
|
-
end
|
228
|
-
|
229
|
-
def process_field(field_name, field_value)
|
230
|
-
case field_name
|
231
|
-
when "event"
|
232
|
-
@event_type_buffer = field_value
|
233
|
-
when "data"
|
234
|
-
@data_buffer << field_value.concat("\n")
|
235
|
-
when "id"
|
236
|
-
@last_event_id_buffer = field_value
|
237
|
-
when "retry"
|
238
|
-
if /^(?<num>\d+)$/ =~ field_value
|
239
|
-
@reconnect_timeout = num.to_i
|
240
|
-
end
|
233
|
+
def process_stream
|
234
|
+
parser = EventParser.new(read_lines, @chunked,->(timeout) { @read_timeout = timeout })
|
235
|
+
parser.each do |event|
|
236
|
+
@on[event.type] && @on[event.type].call(event)
|
237
|
+
@last_event_id = event.id
|
241
238
|
end
|
242
239
|
end
|
243
240
|
|
244
|
-
def
|
245
|
-
if
|
246
|
-
|
247
|
-
|
248
|
-
|
241
|
+
def readline_with_timeout(socket)
|
242
|
+
if @read_timeout > 0
|
243
|
+
begin
|
244
|
+
timeout(@read_timeout) do
|
245
|
+
socket.readline
|
246
|
+
end
|
247
|
+
rescue Celluloid::TaskTimeout
|
248
|
+
@on[:error].call({body: "Read timeout, will attempt reconnection"})
|
249
|
+
raise ReadTimeout
|
250
|
+
end
|
249
251
|
else
|
250
|
-
|
251
|
-
@on[:error].call({status_code: @parser.status_code, body: "Invalid Content-Type #{headers['Content-Type']}. Expected text/event-stream"})
|
252
|
+
return socket.readline
|
252
253
|
end
|
253
254
|
end
|
254
255
|
|
@@ -267,7 +268,5 @@ module Celluloid
|
|
267
268
|
end
|
268
269
|
req << "\r\n"
|
269
270
|
end
|
270
|
-
|
271
271
|
end
|
272
|
-
|
273
272
|
end
|
@@ -0,0 +1,76 @@
|
|
1
|
+
module Celluloid
|
2
|
+
class EventSource
|
3
|
+
class EventParser
|
4
|
+
include Enumerable
|
5
|
+
|
6
|
+
def initialize(lines, chunked, on_retry)
|
7
|
+
@lines = lines
|
8
|
+
@chunked = chunked
|
9
|
+
clear_buffers!
|
10
|
+
@on_retry = on_retry
|
11
|
+
end
|
12
|
+
|
13
|
+
def each
|
14
|
+
@lines.each do |line|
|
15
|
+
if line.strip.empty?
|
16
|
+
begin
|
17
|
+
event = create_event
|
18
|
+
yield event unless event.nil?
|
19
|
+
ensure
|
20
|
+
clear_buffers!
|
21
|
+
end
|
22
|
+
else
|
23
|
+
parse_line(line)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
private
|
29
|
+
|
30
|
+
MessageEvent = Struct.new(:type, :data, :id)
|
31
|
+
|
32
|
+
def clear_buffers!
|
33
|
+
@id_buffer = ''
|
34
|
+
@data_buffer = ''
|
35
|
+
@type_buffer = ''
|
36
|
+
end
|
37
|
+
|
38
|
+
def parse_line(line)
|
39
|
+
case line
|
40
|
+
when /^:.*$/
|
41
|
+
when /^(\w+): ?(.*)$/
|
42
|
+
process_field($1, $2)
|
43
|
+
else
|
44
|
+
if @chunked && !@data_buffer.empty?
|
45
|
+
@data_buffer.rstrip!
|
46
|
+
process_field("data", line.rstrip)
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
def create_event
|
52
|
+
return nil if @data_buffer.empty?
|
53
|
+
|
54
|
+
@data_buffer.chomp!("\n") if @data_buffer.end_with?("\n")
|
55
|
+
event = MessageEvent.new(:message, @data_buffer, @id_buffer)
|
56
|
+
event.type = @type_buffer.to_sym unless @type_buffer.empty?
|
57
|
+
event
|
58
|
+
end
|
59
|
+
|
60
|
+
def process_field(field_name, field_value)
|
61
|
+
case field_name
|
62
|
+
when "event"
|
63
|
+
@type_buffer = field_value
|
64
|
+
when "data"
|
65
|
+
@data_buffer << field_value.concat("\n")
|
66
|
+
when "id"
|
67
|
+
@id_buffer = field_value
|
68
|
+
when "retry"
|
69
|
+
if /^(?<num>\d+)$/ =~ field_value
|
70
|
+
@on_retry.call(num.to_i)
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
@@ -0,0 +1,97 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
RSpec.describe Celluloid::EventSource::EventParser do
|
4
|
+
it 'converts lines to events' do
|
5
|
+
lines = <<LINES
|
6
|
+
id: 123
|
7
|
+
event: my-event
|
8
|
+
data: my-data
|
9
|
+
|
10
|
+
LINES
|
11
|
+
events = Celluloid::EventSource::EventParser.new(lines.lines, false, ->(r) {}).to_a
|
12
|
+
expect(events.length).to eq 1
|
13
|
+
expect(events[0].id).to eq '123'
|
14
|
+
expect(events[0].type).to eq 'my-event'.to_sym
|
15
|
+
expect(events[0].data).to eq 'my-data'
|
16
|
+
end
|
17
|
+
|
18
|
+
it 'ignores comments' do
|
19
|
+
lines = <<LINES
|
20
|
+
: comment
|
21
|
+
id: 123
|
22
|
+
event: my-event
|
23
|
+
data: my-data
|
24
|
+
|
25
|
+
|
26
|
+
LINES
|
27
|
+
events = Celluloid::EventSource::EventParser.new(lines.lines, false, ->(r) {}).to_a
|
28
|
+
expect(events.length).to eq 1
|
29
|
+
expect(events[0].id).to eq '123'
|
30
|
+
end
|
31
|
+
|
32
|
+
it 'resets values after each event' do
|
33
|
+
lines = <<LINES
|
34
|
+
id: 123
|
35
|
+
event: my-event
|
36
|
+
data: my-data
|
37
|
+
|
38
|
+
event: my-event2
|
39
|
+
data: my-data2
|
40
|
+
|
41
|
+
LINES
|
42
|
+
events = Celluloid::EventSource::EventParser.new(lines.lines, false, ->(r) {}).to_a
|
43
|
+
expect(events.length).to eq 2
|
44
|
+
expect(events[0].id).to eq '123'
|
45
|
+
expect(events[0].type).to eq 'my-event'.to_sym
|
46
|
+
expect(events[0].data).to eq 'my-data'
|
47
|
+
expect(events[1].id).to eq ''
|
48
|
+
expect(events[1].type).to eq 'my-event2'.to_sym
|
49
|
+
expect(events[1].data).to eq 'my-data2'
|
50
|
+
end
|
51
|
+
|
52
|
+
it 'sets the default event type to message' do
|
53
|
+
lines = <<LINES
|
54
|
+
data: my-data
|
55
|
+
|
56
|
+
LINES
|
57
|
+
events = Celluloid::EventSource::EventParser.new(lines.lines, false, ->(r) {}).to_a
|
58
|
+
expect(events.length).to eq 1
|
59
|
+
expect(events[0].id).to eq ''
|
60
|
+
expect(events[0].type).to eq :message
|
61
|
+
expect(events[0].data).to eq 'my-data'
|
62
|
+
end
|
63
|
+
|
64
|
+
it 'does not generate events unless data is provided' do
|
65
|
+
lines = <<LINES
|
66
|
+
event: my-event
|
67
|
+
|
68
|
+
LINES
|
69
|
+
events = Celluloid::EventSource::EventParser.new(lines.lines, false, ->(r) {}).to_a
|
70
|
+
expect(events.length).to eq 0
|
71
|
+
end
|
72
|
+
|
73
|
+
it 'extends data with unprefixed lines as data in chunked mode' do
|
74
|
+
lines = <<LINES
|
75
|
+
data:
|
76
|
+
my-data
|
77
|
+
|
78
|
+
LINES
|
79
|
+
events = Celluloid::EventSource::EventParser.new(lines.lines, true, ->(r) {}).to_a
|
80
|
+
expect(events.length).to eq 1
|
81
|
+
expect(events[0].id).to eq ''
|
82
|
+
expect(events[0].type).to eq :message
|
83
|
+
expect(events[0].data).to eq 'my-data'
|
84
|
+
end
|
85
|
+
|
86
|
+
it 'reports retry updates to the provided function' do
|
87
|
+
lines = <<LINES
|
88
|
+
retry: 123
|
89
|
+
LINES
|
90
|
+
received_retry_args = []
|
91
|
+
set_retry = lambda { |r| received_retry_args << r }
|
92
|
+
events = Celluloid::EventSource::EventParser.new(lines.lines, true, set_retry).to_a
|
93
|
+
expect(received_retry_args).to eq [123]
|
94
|
+
expect(events.length).to eq 0
|
95
|
+
end
|
96
|
+
|
97
|
+
end
|
@@ -105,7 +105,7 @@ RSpec.describe Celluloid::EventSource do
|
|
105
105
|
|
106
106
|
Celluloid::EventSource.new(dummy.endpoint) do |conn|
|
107
107
|
conn.on_message do |message|
|
108
|
-
if '3' == message.
|
108
|
+
if '3' == message.id
|
109
109
|
future.signal(value_class.new({ msg: message, state: conn.ready_state }))
|
110
110
|
conn.close
|
111
111
|
end
|
@@ -113,9 +113,9 @@ RSpec.describe Celluloid::EventSource do
|
|
113
113
|
end
|
114
114
|
|
115
115
|
payload = future.value
|
116
|
-
expect(payload[:msg]).to be_a(Celluloid::EventSource::MessageEvent)
|
116
|
+
expect(payload[:msg]).to be_a(Celluloid::EventSource::EventParser::MessageEvent)
|
117
117
|
expect(payload[:msg].type).to eq(:message)
|
118
|
-
expect(payload[:msg].
|
118
|
+
expect(payload[:msg].id).to eq('3')
|
119
119
|
expect(payload[:state]).to eq(Celluloid::EventSource::OPEN)
|
120
120
|
end
|
121
121
|
|
@@ -189,9 +189,9 @@ RSpec.describe Celluloid::EventSource do
|
|
189
189
|
end
|
190
190
|
|
191
191
|
payload = future.value
|
192
|
-
expect(payload[:msg]).to be_a(Celluloid::EventSource::MessageEvent)
|
192
|
+
expect(payload[:msg]).to be_a(Celluloid::EventSource::EventParser::MessageEvent)
|
193
193
|
expect(payload[:msg].type).to eq(custom)
|
194
|
-
expect(payload[:msg].
|
194
|
+
expect(payload[:msg].id).to eq('1')
|
195
195
|
expect(payload[:state]).to eq(Celluloid::EventSource::OPEN)
|
196
196
|
end
|
197
197
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ld-celluloid-eventsource
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.11.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- LaunchDarkly
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-
|
11
|
+
date: 2017-11-15 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: celluloid-io
|
@@ -42,14 +42,14 @@ dependencies:
|
|
42
42
|
name: nio4r
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
|
-
- - "
|
45
|
+
- - ">="
|
46
46
|
- !ruby/object:Gem::Version
|
47
47
|
version: '1.1'
|
48
48
|
type: :runtime
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
|
-
- - "
|
52
|
+
- - ">="
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: '1.1'
|
55
55
|
- !ruby/object:Gem::Dependency
|
@@ -154,9 +154,11 @@ files:
|
|
154
154
|
- Rakefile
|
155
155
|
- ld-celluloid-eventsource.gemspec
|
156
156
|
- lib/celluloid/eventsource.rb
|
157
|
+
- lib/celluloid/eventsource/event_parser.rb
|
157
158
|
- lib/celluloid/eventsource/response_parser.rb
|
158
159
|
- lib/celluloid/eventsource/version.rb
|
159
160
|
- log/.gitignore
|
161
|
+
- spec/celluloid/eventsource/event_parser_spec.rb
|
160
162
|
- spec/celluloid/eventsource/response_parser_spec.rb
|
161
163
|
- spec/celluloid/eventsource_spec.rb
|
162
164
|
- spec/spec_helper.rb
|
@@ -182,11 +184,12 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
182
184
|
version: '0'
|
183
185
|
requirements: []
|
184
186
|
rubyforge_project:
|
185
|
-
rubygems_version: 2.6.
|
187
|
+
rubygems_version: 2.6.14
|
186
188
|
signing_key:
|
187
189
|
specification_version: 4
|
188
190
|
summary: ld-celluloid-eventsource is a gem to consume SSE streaming API.
|
189
191
|
test_files:
|
192
|
+
- spec/celluloid/eventsource/event_parser_spec.rb
|
190
193
|
- spec/celluloid/eventsource/response_parser_spec.rb
|
191
194
|
- spec/celluloid/eventsource_spec.rb
|
192
195
|
- spec/spec_helper.rb
|