sse-rails-engine 1.2.2 → 1.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +32 -0
- data/lib/sse-rails-engine.rb +1 -0
- data/lib/sse_rails_engine/connection.rb +36 -0
- data/lib/sse_rails_engine/manager.rb +12 -23
- data/lib/sse_rails_engine/version.rb +1 -1
- data/test/dummy/log/test.log +419 -0
- data/test/lib/sse_rails_engine/manager_test.rb +43 -17
- metadata +7 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0bab1f8bb9471deacf8e724b2763a6f21c20f350
|
4
|
+
data.tar.gz: ea78faac1bb777ce07993f90043358edd9b1a57d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4d67d7f168f7d0cbd71ecf18f4311e48c56e5c0c7fa1e7303076321da994e0049a2a2472be12d15a31d395309119a032a061b88cbb91a55c2787535ff69bc518
|
7
|
+
data.tar.gz: f9a240475088861184a371d25441371f4a35bc7c606222bae0ddac50027746556f9661ce9f21fc5ca4008200f8471912d9e0a3a69a527aa3f0c90f0f5b72343d
|
data/README.md
CHANGED
@@ -47,6 +47,38 @@ Then you can send an event from anywhere in your app:
|
|
47
47
|
SseRailsEngine.send_event('test', { foo: 'bar' })
|
48
48
|
```
|
49
49
|
|
50
|
+
# Channels
|
51
|
+
|
52
|
+
It supports the idea of channels so that if pages don't need to receive certain events, then you won't waste
|
53
|
+
the bandwidth or processing on the server:
|
54
|
+
|
55
|
+
Clientside:
|
56
|
+
```
|
57
|
+
$(document).ready(function () {
|
58
|
+
var source = new EventSource('/sse?channels=foo,bar,baz');
|
59
|
+
|
60
|
+
source.addEventListener('other', function(e) {
|
61
|
+
// Will never be called
|
62
|
+
}, true);
|
63
|
+
|
64
|
+
source.addEventListener('foo', function(e) {
|
65
|
+
// Do stuff
|
66
|
+
}, true);
|
67
|
+
});
|
68
|
+
|
69
|
+
```
|
70
|
+
Serverside:
|
71
|
+
```
|
72
|
+
SseRailsEngine.send_event('foo', '') # Sent to the client
|
73
|
+
SseRailsEngine.send_event('other', '') # Won't be sent to the client
|
74
|
+
```
|
75
|
+
|
76
|
+
# Notes
|
77
|
+
|
78
|
+
## Nginx
|
79
|
+
You may need to configure nginx to not buffer or cache SSE connections:
|
80
|
+
http://stackoverflow.com/questions/13672743/eventsource-server-sent-events-through-nginx
|
81
|
+
|
50
82
|
# License
|
51
83
|
|
52
84
|
MIT - Have at it! :)
|
data/lib/sse-rails-engine.rb
CHANGED
@@ -0,0 +1,36 @@
|
|
1
|
+
module SseRailsEngine
|
2
|
+
class Connection
|
3
|
+
attr_accessor :stream
|
4
|
+
|
5
|
+
SSE_HEADER = ["HTTP/1.1 200 OK\r\n",
|
6
|
+
"Content-Type: text/event-stream\r\n",
|
7
|
+
"Cache-Control: no-cache, no-store\r\n",
|
8
|
+
"Connection: close\r\n",
|
9
|
+
"\r\n"].join.freeze
|
10
|
+
|
11
|
+
def initialize(io, env)
|
12
|
+
@socket = io
|
13
|
+
@socket.write SSE_HEADER
|
14
|
+
@socket.flush
|
15
|
+
@stream = ActionController::Live::SSE.new(io)
|
16
|
+
@channels = requested_channels(env)
|
17
|
+
end
|
18
|
+
|
19
|
+
def write(name, data)
|
20
|
+
return if filtered?(name)
|
21
|
+
@stream.write(data, event: name)
|
22
|
+
@socket.flush
|
23
|
+
end
|
24
|
+
|
25
|
+
private
|
26
|
+
|
27
|
+
def filtered?(channel)
|
28
|
+
return false if @channels.empty? || channel == Manager::HEARTBEAT_EVENT
|
29
|
+
!@channels.include? channel
|
30
|
+
end
|
31
|
+
|
32
|
+
def requested_channels(env)
|
33
|
+
Rack::Utils.parse_query(env['QUERY_STRING']).fetch('channels', []).split(',').flatten
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -16,11 +16,7 @@ module SseRailsEngine
|
|
16
16
|
|
17
17
|
attr_reader :connections, :heartbeat_thread
|
18
18
|
|
19
|
-
|
20
|
-
"Content-Type: text/event-stream\r\n",
|
21
|
-
"Cache-Control: no-cache, no-store\r\n",
|
22
|
-
"Connection: close\r\n",
|
23
|
-
"\r\n"].join.freeze
|
19
|
+
HEARTBEAT_EVENT = 'heartbeat'
|
24
20
|
|
25
21
|
def initialize
|
26
22
|
@mutex = Mutex.new
|
@@ -33,41 +29,34 @@ module SseRailsEngine
|
|
33
29
|
env['rack.hijack'].call
|
34
30
|
socket = env['rack.hijack_io']
|
35
31
|
# Perform full hijack of socket (http://old.blog.phusion.nl/2013/01/23/the-new-rack-socket-hijacking-api/)
|
36
|
-
|
32
|
+
open_connection(socket, env)
|
37
33
|
else
|
38
34
|
fail RackHijackUnsupported, 'This Rack server does not support hijacking, ensure you are using >= v1.5 of Rack'
|
39
35
|
end
|
40
36
|
end
|
41
37
|
|
42
|
-
|
43
|
-
def send_event(name, data)
|
38
|
+
def send_event(name, data = '')
|
44
39
|
@mutex.synchronize do
|
45
|
-
@connections.dup.each do |stream,
|
40
|
+
@connections.dup.each do |stream, connection|
|
46
41
|
begin
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
Rails.logger.debug "SSE Client disconnected: #{stream}"
|
51
|
-
close_connection(stream)
|
52
|
-
rescue => ex
|
53
|
-
Rails.logger.error "Failed to send event to SSE: #{stream} (#{name}, #{data} - #{ex.message} (#{ex.class}"
|
42
|
+
connection.write(name, data)
|
43
|
+
rescue IOError, Errno::EPIPE, Errno::ETIMEDOUT => ex
|
44
|
+
Rails.logger.debug "SSE Client disconnected: #{stream} - #{ex.message}"
|
54
45
|
close_connection(stream)
|
55
46
|
end
|
56
47
|
end
|
57
48
|
end
|
58
49
|
end
|
59
|
-
# rubocop:enable Metrics/MethodLength
|
60
50
|
|
61
|
-
def open_connection(io)
|
51
|
+
def open_connection(io, env)
|
62
52
|
Rails.logger.debug "New SSE Client connected: #{io}"
|
63
|
-
io.write(SSE_HEADER)
|
64
53
|
@mutex.synchronize do
|
65
|
-
@connections[io] =
|
54
|
+
@connections[io] = Connection.new(io, env)
|
66
55
|
end
|
67
56
|
end
|
68
57
|
|
69
58
|
def call(env)
|
70
|
-
|
59
|
+
register(env)
|
71
60
|
[-1, {}, []]
|
72
61
|
end
|
73
62
|
|
@@ -75,7 +64,7 @@ module SseRailsEngine
|
|
75
64
|
|
76
65
|
def close_connection(stream)
|
77
66
|
return if @connections[stream].nil?
|
78
|
-
@connections[stream].close
|
67
|
+
@connections[stream].stream.close
|
79
68
|
@connections.delete(stream)
|
80
69
|
end
|
81
70
|
|
@@ -84,7 +73,7 @@ module SseRailsEngine
|
|
84
73
|
@heartbeat_thread = Thread.new do
|
85
74
|
loop do
|
86
75
|
sleep SseRailsEngine.heartbeat_interval
|
87
|
-
send_event(
|
76
|
+
send_event(HEARTBEAT_EVENT)
|
88
77
|
end
|
89
78
|
end
|
90
79
|
end
|
data/test/dummy/log/test.log
CHANGED
@@ -145,3 +145,422 @@ New SSE Client connected: #<StringIO:0x007ff76cdb0838>
|
|
145
145
|
Starting SSE heartbeat thread!
|
146
146
|
New SSE Client connected: #<StringIO:0x007ff76cda0118>
|
147
147
|
Failed to send event to SSE: #<StringIO:0x007ff76cda0118> (foo, bar - RuntimeError (RuntimeError
|
148
|
+
Starting SSE heartbeat thread!
|
149
|
+
Starting SSE heartbeat thread!
|
150
|
+
New SSE Client connected: #<StringIO:0x007f8ae344fe88>
|
151
|
+
New SSE Client connected: #<StringIO:0x007f8ae345c5c0>
|
152
|
+
Starting SSE heartbeat thread!
|
153
|
+
Starting SSE heartbeat thread!
|
154
|
+
New SSE Client connected: #<StringIO:0x007f98fbe791b8>
|
155
|
+
New SSE Client connected: #<StringIO:0x007f98fbe797f8>
|
156
|
+
Starting SSE heartbeat thread!
|
157
|
+
Starting SSE heartbeat thread!
|
158
|
+
New SSE Client connected: #<StringIO:0x007fa5842f1f80>
|
159
|
+
New SSE Client connected: #<StringIO:0x007fa5842f2480>
|
160
|
+
Starting SSE heartbeat thread!
|
161
|
+
Starting SSE heartbeat thread!
|
162
|
+
New SSE Client connected: #<StringIO:0x007ffe6c069308>
|
163
|
+
New SSE Client connected: #<StringIO:0x007ffe6c06a618>
|
164
|
+
Starting SSE heartbeat thread!
|
165
|
+
Starting SSE heartbeat thread!
|
166
|
+
New SSE Client connected: #<StringIO:0x007ffc85471538>
|
167
|
+
New SSE Client connected: #<StringIO:0x007ffc85471e48>
|
168
|
+
Starting SSE heartbeat thread!
|
169
|
+
Starting SSE heartbeat thread!
|
170
|
+
New SSE Client connected: #<StringIO:0x007fe576fe1330>
|
171
|
+
New SSE Client connected: #<StringIO:0x007fe576fe1d30>
|
172
|
+
Starting SSE heartbeat thread!
|
173
|
+
Starting SSE heartbeat thread!
|
174
|
+
New SSE Client connected: #<StringIO:0x007f80c45c2cd0>
|
175
|
+
New SSE Client connected: #<StringIO:0x007f80c45c36a8>
|
176
|
+
Starting SSE heartbeat thread!
|
177
|
+
Starting SSE heartbeat thread!
|
178
|
+
New SSE Client connected: #<StringIO:0x007fb0cde30c80>
|
179
|
+
New SSE Client connected: #<StringIO:0x007fb0cde314f0>
|
180
|
+
Starting SSE heartbeat thread!
|
181
|
+
Starting SSE heartbeat thread!
|
182
|
+
New SSE Client connected: #<StringIO:0x007fb95c5c9758>
|
183
|
+
New SSE Client connected: #<StringIO:0x007fb95c5c88a8>
|
184
|
+
Starting SSE heartbeat thread!
|
185
|
+
Starting SSE heartbeat thread!
|
186
|
+
New SSE Client connected: #<StringIO:0x007fb3c8f8e5c0>
|
187
|
+
New SSE Client connected: #<StringIO:0x007fb3c8f8ed90>
|
188
|
+
Starting SSE heartbeat thread!
|
189
|
+
Starting SSE heartbeat thread!
|
190
|
+
New SSE Client connected: #<StringIO:0x007f95fcc63ce0>
|
191
|
+
New SSE Client connected: #<StringIO:0x007f95fcc70670>
|
192
|
+
Starting SSE heartbeat thread!
|
193
|
+
Starting SSE heartbeat thread!
|
194
|
+
New SSE Client connected: #<StringIO:0x007fc68bd72090>
|
195
|
+
Failed to send event to SSE: #<StringIO:0x007fc68bd72090> (foo, bar - undefined method `channels' for #<Hash:0x007fc68bd70e98> (NoMethodError
|
196
|
+
Starting SSE heartbeat thread!
|
197
|
+
New SSE Client connected: #<StringIO:0x007fc68bd696c0>
|
198
|
+
Starting SSE heartbeat thread!
|
199
|
+
Starting SSE heartbeat thread!
|
200
|
+
New SSE Client connected: #<StringIO:0x007fc68bd5a4e0>
|
201
|
+
Failed to send event to SSE: #<StringIO:0x007fc68bd5a4e0> (foo, bar - undefined method `channels' for #<Hash:0x007fc68bd59e00> (NoMethodError
|
202
|
+
Starting SSE heartbeat thread!
|
203
|
+
Starting SSE heartbeat thread!
|
204
|
+
Starting SSE heartbeat thread!
|
205
|
+
New SSE Client connected: #<StringIO:0x007fc68bd2b028>
|
206
|
+
Failed to send event to SSE: #<StringIO:0x007fc68bd2b028> (foo, bar - undefined method `channels' for #<Hash:0x007fc68bd2a7e0> (NoMethodError
|
207
|
+
Starting SSE heartbeat thread!
|
208
|
+
New SSE Client connected: #<StringIO:0x007fc68bd12f00>
|
209
|
+
New SSE Client connected: #<StringIO:0x007fc68bd13518>
|
210
|
+
Starting SSE heartbeat thread!
|
211
|
+
ENV:
|
212
|
+
New SSE Client connected: #<StringIO:0x007fc68bd027b8>
|
213
|
+
Starting SSE heartbeat thread!
|
214
|
+
New SSE Client connected: #<StringIO:0x007fc68bd001e8>
|
215
|
+
Failed to send event to SSE: #<StringIO:0x007fc68bd001e8> (foo, {:a=>123, "b"=>"abc", :c=>{:foo=>"bar"}} - undefined method `channels' for #<Hash:0x007fc68bcfbd00> (NoMethodError
|
216
|
+
Starting SSE heartbeat thread!
|
217
|
+
Starting SSE heartbeat thread!
|
218
|
+
New SSE Client connected: #<StringIO:0x007f8f6e5818f8>
|
219
|
+
Starting SSE heartbeat thread!
|
220
|
+
Starting SSE heartbeat thread!
|
221
|
+
New SSE Client connected: #<StringIO:0x007f9abb84bb58>
|
222
|
+
Starting SSE heartbeat thread!
|
223
|
+
Starting SSE heartbeat thread!
|
224
|
+
New SSE Client connected: #<StringIO:0x007fe4a5373890>
|
225
|
+
Starting SSE heartbeat thread!
|
226
|
+
Starting SSE heartbeat thread!
|
227
|
+
New SSE Client connected: #<StringIO:0x007fcffa778590>
|
228
|
+
New SSE Client connected: #<StringIO:0x007fcffa778dd8>
|
229
|
+
Starting SSE heartbeat thread!
|
230
|
+
Starting SSE heartbeat thread!
|
231
|
+
New SSE Client connected: #<StringIO:0x007ff97c572ec0>
|
232
|
+
New SSE Client connected: #<StringIO:0x007ff97c573690>
|
233
|
+
Starting SSE heartbeat thread!
|
234
|
+
Starting SSE heartbeat thread!
|
235
|
+
New SSE Client connected: #<StringIO:0x007fc5850f9068>
|
236
|
+
Starting SSE heartbeat thread!
|
237
|
+
New SSE Client connected: #<StringIO:0x007fc5850f1408>
|
238
|
+
Starting SSE heartbeat thread!
|
239
|
+
New SSE Client connected: #<StringIO:0x007fc5850d2f30>
|
240
|
+
Starting SSE heartbeat thread!
|
241
|
+
New SSE Client connected: #<StringIO:0x007fc5850aa648>
|
242
|
+
New SSE Client connected: #<StringIO:0x007fc5850aaaf8>
|
243
|
+
Starting SSE heartbeat thread!
|
244
|
+
New SSE Client connected: #<StringIO:0x007fc5850a1930>
|
245
|
+
Starting SSE heartbeat thread!
|
246
|
+
New SSE Client connected: #<StringIO:0x007fc5850912b0>
|
247
|
+
Starting SSE heartbeat thread!
|
248
|
+
Starting SSE heartbeat thread!
|
249
|
+
Starting SSE heartbeat thread!
|
250
|
+
Starting SSE heartbeat thread!
|
251
|
+
New SSE Client connected: #<StringIO:0x007fc585072658>
|
252
|
+
Starting SSE heartbeat thread!
|
253
|
+
Starting SSE heartbeat thread!
|
254
|
+
New SSE Client connected: #<StringIO:0x007f8d6ec10c70>
|
255
|
+
New SSE Client connected: #<StringIO:0x007f8d6ec11468>
|
256
|
+
Starting SSE heartbeat thread!
|
257
|
+
Starting SSE heartbeat thread!
|
258
|
+
New SSE Client connected: #<StringIO:0x007f91c60c1d68>
|
259
|
+
New SSE Client connected: #<StringIO:0x007f91c60c2560>
|
260
|
+
Starting SSE heartbeat thread!
|
261
|
+
Starting SSE heartbeat thread!
|
262
|
+
Starting SSE heartbeat thread!
|
263
|
+
New SSE Client connected: #<StringIO:0x007fb0829b5bd8>
|
264
|
+
Starting SSE heartbeat thread!
|
265
|
+
New SSE Client connected: #<StringIO:0x007fb0829a64f8>
|
266
|
+
Starting SSE heartbeat thread!
|
267
|
+
Starting SSE heartbeat thread!
|
268
|
+
New SSE Client connected: #<StringIO:0x007fb082955580>
|
269
|
+
Starting SSE heartbeat thread!
|
270
|
+
Starting SSE heartbeat thread!
|
271
|
+
New SSE Client connected: #<StringIO:0x007fb082917988>
|
272
|
+
Starting SSE heartbeat thread!
|
273
|
+
New SSE Client connected: #<StringIO:0x007fb0828a9140>
|
274
|
+
Starting SSE heartbeat thread!
|
275
|
+
New SSE Client connected: #<StringIO:0x007fb082861cf0>
|
276
|
+
Starting SSE heartbeat thread!
|
277
|
+
New SSE Client connected: #<StringIO:0x007fb082841c98>
|
278
|
+
New SSE Client connected: #<StringIO:0x007fb082842508>
|
279
|
+
Starting SSE heartbeat thread!
|
280
|
+
Starting SSE heartbeat thread!
|
281
|
+
New SSE Client connected: #<StringIO:0x007fd343f735f0>
|
282
|
+
New SSE Client connected: #<StringIO:0x007fd343f73dc0>
|
283
|
+
Starting SSE heartbeat thread!
|
284
|
+
Starting SSE heartbeat thread!
|
285
|
+
New SSE Client connected: #<StringIO:0x007fe58c1a14d0>
|
286
|
+
New SSE Client connected: #<StringIO:0x007fe58c1a1b10>
|
287
|
+
Starting SSE heartbeat thread!
|
288
|
+
Starting SSE heartbeat thread!
|
289
|
+
New SSE Client connected: #<StringIO:0x007ff49e6d3f90>
|
290
|
+
New SSE Client connected: #<StringIO:0x007ff49e6e0e20>
|
291
|
+
SSE Client disconnected: #<StringIO:0x007ff49e6e0e20> - uninitialized constant SseRailsEngine::Connection::HEARTBEAT_EVENT
|
292
|
+
Starting SSE heartbeat thread!
|
293
|
+
Starting SSE heartbeat thread!
|
294
|
+
New SSE Client connected: #<StringIO:0x007f9b99299f28>
|
295
|
+
New SSE Client connected: #<StringIO:0x007f9b9929a658>
|
296
|
+
SSE Client disconnected: #<StringIO:0x007f9b99299f28> - undefined local variable or method `channel' for #<SseRailsEngine::Connection:0x007f9b99299b18>
|
297
|
+
SSE Client disconnected: #<StringIO:0x007f9b9929a658> - uninitialized constant SseRailsEngine::Connection::HEARTBEAT_EVENT
|
298
|
+
Starting SSE heartbeat thread!
|
299
|
+
Starting SSE heartbeat thread!
|
300
|
+
New SSE Client connected: #<StringIO:0x007fa17455ad80>
|
301
|
+
New SSE Client connected: #<StringIO:0x007fa17455b5f0>
|
302
|
+
SSE Client disconnected: #<StringIO:0x007fa17455b5f0> - uninitialized constant SseRailsEngine::Connection::HEARTBEAT_EVENT
|
303
|
+
Starting SSE heartbeat thread!
|
304
|
+
Starting SSE heartbeat thread!
|
305
|
+
New SSE Client connected: #<StringIO:0x007f9b5d5aa500>
|
306
|
+
New SSE Client connected: #<StringIO:0x007f9b5d5aad20>
|
307
|
+
SSE Client disconnected: #<StringIO:0x007f9b5d5aad20> - uninitialized constant SseRailsEngine::Connection::HEARTBEAT_EVENT
|
308
|
+
Starting SSE heartbeat thread!
|
309
|
+
Starting SSE heartbeat thread!
|
310
|
+
New SSE Client connected: #<StringIO:0x007f908134f878>
|
311
|
+
New SSE Client connected: #<StringIO:0x007f90813740b0>
|
312
|
+
SSE Client disconnected: #<StringIO:0x007f90813740b0> - uninitialized constant SseRailsEngine::Connection::HEARTBEAT_EVENT
|
313
|
+
Starting SSE heartbeat thread!
|
314
|
+
Starting SSE heartbeat thread!
|
315
|
+
New SSE Client connected: #<StringIO:0x007f8666022c38>
|
316
|
+
Starting SSE heartbeat thread!
|
317
|
+
Starting SSE heartbeat thread!
|
318
|
+
New SSE Client connected: #<StringIO:0x007f8665f70ee8>
|
319
|
+
SSE Client disconnected: #<StringIO:0x007f8665f70ee8> - RuntimeError
|
320
|
+
Starting SSE heartbeat thread!
|
321
|
+
New SSE Client connected: #<StringIO:0x007f8665f512f0>
|
322
|
+
Starting SSE heartbeat thread!
|
323
|
+
Starting SSE heartbeat thread!
|
324
|
+
New SSE Client connected: #<StringIO:0x007f8665f01200>
|
325
|
+
Starting SSE heartbeat thread!
|
326
|
+
New SSE Client connected: #<StringIO:0x007f8665ee2a08>
|
327
|
+
New SSE Client connected: #<StringIO:0x007f8665ee31d8>
|
328
|
+
SSE Client disconnected: #<StringIO:0x007f8665ee31d8> - uninitialized constant SseRailsEngine::Connection::HEARTBEAT_EVENT
|
329
|
+
Starting SSE heartbeat thread!
|
330
|
+
New SSE Client connected: #<StringIO:0x007f8665ea0b80>
|
331
|
+
SSE Client disconnected: #<StringIO:0x007f8665ea0b80> - IOError
|
332
|
+
Starting SSE heartbeat thread!
|
333
|
+
New SSE Client connected: #<StringIO:0x007f8665e81348>
|
334
|
+
Starting SSE heartbeat thread!
|
335
|
+
Starting SSE heartbeat thread!
|
336
|
+
Starting SSE heartbeat thread!
|
337
|
+
New SSE Client connected: #<StringIO:0x007fdbbdb9b360>
|
338
|
+
Starting SSE heartbeat thread!
|
339
|
+
New SSE Client connected: #<StringIO:0x007fdbbdb7abd8>
|
340
|
+
Starting SSE heartbeat thread!
|
341
|
+
Starting SSE heartbeat thread!
|
342
|
+
New SSE Client connected: #<StringIO:0x007fdbbdb387d8>
|
343
|
+
Starting SSE heartbeat thread!
|
344
|
+
New SSE Client connected: #<StringIO:0x007fdbbdb0bfa8>
|
345
|
+
SSE Client disconnected: #<StringIO:0x007fdbbdb0bfa8> - IOError
|
346
|
+
Starting SSE heartbeat thread!
|
347
|
+
Starting SSE heartbeat thread!
|
348
|
+
New SSE Client connected: #<StringIO:0x007fdbbdadad40>
|
349
|
+
Starting SSE heartbeat thread!
|
350
|
+
New SSE Client connected: #<StringIO:0x007fdbbdaaa640>
|
351
|
+
SSE Client disconnected: #<StringIO:0x007fdbbdaaa640> - RuntimeError
|
352
|
+
Starting SSE heartbeat thread!
|
353
|
+
Starting SSE heartbeat thread!
|
354
|
+
New SSE Client connected: #<StringIO:0x007fdbbda6bdf0>
|
355
|
+
New SSE Client connected: #<StringIO:0x007fdbbda784d8>
|
356
|
+
SSE Client disconnected: #<StringIO:0x007fdbbda784d8> - uninitialized constant SseRailsEngine::Connection::HEARTBEAT_EVENT
|
357
|
+
Starting SSE heartbeat thread!
|
358
|
+
Starting SSE heartbeat thread!
|
359
|
+
New SSE Client connected: #<StringIO:0x007fb07d2394b8>
|
360
|
+
New SSE Client connected: #<StringIO:0x007fb07d23a430>
|
361
|
+
SSE Client disconnected: #<StringIO:0x007fb07d23a430> - uninitialized constant SseRailsEngine::Connection::HEARTBEAT_EVENT
|
362
|
+
Starting SSE heartbeat thread!
|
363
|
+
New SSE Client connected: #<StringIO:0x007fb07d1ea408>
|
364
|
+
New SSE Client connected: #<StringIO:0x007fb07d1eab10>
|
365
|
+
SSE Client disconnected: #<StringIO:0x007fb07d1eab10> - uninitialized constant SseRailsEngine::Connection::HEARTBEAT_EVENT
|
366
|
+
Starting SSE heartbeat thread!
|
367
|
+
Starting SSE heartbeat thread!
|
368
|
+
New SSE Client connected: #<StringIO:0x007fd5864badf8>
|
369
|
+
New SSE Client connected: #<StringIO:0x007fd5864bb410>
|
370
|
+
SSE Client disconnected: #<StringIO:0x007fd5864bb410> - uninitialized constant SseRailsEngine::Connection::HEARTBEAT_EVENT
|
371
|
+
Starting SSE heartbeat thread!
|
372
|
+
New SSE Client connected: #<StringIO:0x007fd58647a6e0>
|
373
|
+
New SSE Client connected: #<StringIO:0x007fd58647ae38>
|
374
|
+
SSE Client disconnected: #<StringIO:0x007fd58647ae38> - uninitialized constant SseRailsEngine::Connection::HEARTBEAT_EVENT
|
375
|
+
Starting SSE heartbeat thread!
|
376
|
+
Starting SSE heartbeat thread!
|
377
|
+
New SSE Client connected: #<StringIO:0x007fcecbe52a30>
|
378
|
+
SSE Client disconnected: #<StringIO:0x007fcecbe52a30> - uninitialized constant SseRailsEngine::Connection::HEARTBEAT_EVENT
|
379
|
+
Starting SSE heartbeat thread!
|
380
|
+
New SSE Client connected: #<StringIO:0x007fcecbdf28d8>
|
381
|
+
New SSE Client connected: #<StringIO:0x007fcecbdf3120>
|
382
|
+
SSE Client disconnected: #<StringIO:0x007fcecbdf3120> - uninitialized constant SseRailsEngine::Connection::HEARTBEAT_EVENT
|
383
|
+
Starting SSE heartbeat thread!
|
384
|
+
Starting SSE heartbeat thread!
|
385
|
+
New SSE Client connected: #<StringIO:0x007fa16ca24c38>
|
386
|
+
SSE Client disconnected: #<StringIO:0x007fa16ca24c38> - uninitialized constant SseRailsEngine::Connection::HEARTBEAT_EVENT
|
387
|
+
Starting SSE heartbeat thread!
|
388
|
+
Starting SSE heartbeat thread!
|
389
|
+
New SSE Client connected: #<StringIO:0x007fca446a1588>
|
390
|
+
Starting SSE heartbeat thread!
|
391
|
+
Starting SSE heartbeat thread!
|
392
|
+
New SSE Client connected: #<StringIO:0x007ff605c1a8d8>
|
393
|
+
Starting SSE heartbeat thread!
|
394
|
+
Starting SSE heartbeat thread!
|
395
|
+
New SSE Client connected: #<StringIO:0x007ffc9df80218>
|
396
|
+
Starting SSE heartbeat thread!
|
397
|
+
New SSE Client connected: #<StringIO:0x007ffc9df53f60>
|
398
|
+
Starting SSE heartbeat thread!
|
399
|
+
New SSE Client connected: #<StringIO:0x007ffc9df41590>
|
400
|
+
New SSE Client connected: #<StringIO:0x007ffc9df41d10>
|
401
|
+
Starting SSE heartbeat thread!
|
402
|
+
Starting SSE heartbeat thread!
|
403
|
+
New SSE Client connected: #<StringIO:0x007ffc9deb9cd0>
|
404
|
+
Starting SSE heartbeat thread!
|
405
|
+
Starting SSE heartbeat thread!
|
406
|
+
New SSE Client connected: #<StringIO:0x007ffc9de88c48>
|
407
|
+
Starting SSE heartbeat thread!
|
408
|
+
New SSE Client connected: #<StringIO:0x007ffc9de5aa00>
|
409
|
+
Starting SSE heartbeat thread!
|
410
|
+
Starting SSE heartbeat thread!
|
411
|
+
New SSE Client connected: #<StringIO:0x007ffc9de19e38>
|
412
|
+
Starting SSE heartbeat thread!
|
413
|
+
New SSE Client connected: #<StringIO:0x007ffc9ddf84e0>
|
414
|
+
SSE Client disconnected: #<StringIO:0x007ffc9ddf84e0> - IOError
|
415
|
+
Starting SSE heartbeat thread!
|
416
|
+
Starting SSE heartbeat thread!
|
417
|
+
New SSE Client connected: #<StringIO:0x007f9fa485bb50>
|
418
|
+
New SSE Client connected: #<StringIO:0x007f9fa48682d8>
|
419
|
+
Starting SSE heartbeat thread!
|
420
|
+
Starting SSE heartbeat thread!
|
421
|
+
New SSE Client connected: #<StringIO:0x007fcfbb8983d8>
|
422
|
+
Starting SSE heartbeat thread!
|
423
|
+
New SSE Client connected: #<StringIO:0x007fcfbb843450>
|
424
|
+
Starting SSE heartbeat thread!
|
425
|
+
Starting SSE heartbeat thread!
|
426
|
+
New SSE Client connected: #<StringIO:0x007fcfbb8113d8>
|
427
|
+
New SSE Client connected: #<StringIO:0x007fcfbb8125d0>
|
428
|
+
Starting SSE heartbeat thread!
|
429
|
+
Starting SSE heartbeat thread!
|
430
|
+
New SSE Client connected: #<StringIO:0x007fcfbb7c8ac0>
|
431
|
+
SSE Client disconnected: #<StringIO:0x007fcfbb7c8ac0> - IOError
|
432
|
+
Starting SSE heartbeat thread!
|
433
|
+
New SSE Client connected: #<StringIO:0x007fcfbb7a8978>
|
434
|
+
Starting SSE heartbeat thread!
|
435
|
+
Starting SSE heartbeat thread!
|
436
|
+
New SSE Client connected: #<StringIO:0x007fcfbb759990>
|
437
|
+
Starting SSE heartbeat thread!
|
438
|
+
New SSE Client connected: #<StringIO:0x007fcfbb73b710>
|
439
|
+
Starting SSE heartbeat thread!
|
440
|
+
New SSE Client connected: #<StringIO:0x007fcfbb71a538>
|
441
|
+
Starting SSE heartbeat thread!
|
442
|
+
New SSE Client connected: #<StringIO:0x007fcfbb6f9158>
|
443
|
+
Starting SSE heartbeat thread!
|
444
|
+
Starting SSE heartbeat thread!
|
445
|
+
Starting SSE heartbeat thread!
|
446
|
+
New SSE Client connected: #<StringIO:0x007f807cdaa4e0>
|
447
|
+
Starting SSE heartbeat thread!
|
448
|
+
New SSE Client connected: #<StringIO:0x007f807cd88bd8>
|
449
|
+
SSE Client disconnected: #<StringIO:0x007f807cd88bd8> - IOError
|
450
|
+
Starting SSE heartbeat thread!
|
451
|
+
New SSE Client connected: #<StringIO:0x007f807cd69300>
|
452
|
+
Starting SSE heartbeat thread!
|
453
|
+
New SSE Client connected: #<StringIO:0x007f807cd4af18>
|
454
|
+
Starting SSE heartbeat thread!
|
455
|
+
New SSE Client connected: #<StringIO:0x007f807cd38d90>
|
456
|
+
Starting SSE heartbeat thread!
|
457
|
+
New SSE Client connected: #<StringIO:0x007f807cd19418>
|
458
|
+
New SSE Client connected: #<StringIO:0x007f807cd19fa8>
|
459
|
+
Starting SSE heartbeat thread!
|
460
|
+
New SSE Client connected: #<StringIO:0x007f807ccebbf8>
|
461
|
+
Starting SSE heartbeat thread!
|
462
|
+
Starting SSE heartbeat thread!
|
463
|
+
New SSE Client connected: #<StringIO:0x007f807ccaaa68>
|
464
|
+
Starting SSE heartbeat thread!
|
465
|
+
New SSE Client connected: #<StringIO:0x007f807cc8a560>
|
466
|
+
Starting SSE heartbeat thread!
|
467
|
+
Starting SSE heartbeat thread!
|
468
|
+
Starting SSE heartbeat thread!
|
469
|
+
New SSE Client connected: #<StringIO:0x007fee75441978>
|
470
|
+
Starting SSE heartbeat thread!
|
471
|
+
New SSE Client connected: #<StringIO:0x007fee753dbf88>
|
472
|
+
SSE Client disconnected: #<StringIO:0x007fee753dbf88> - IOError
|
473
|
+
Starting SSE heartbeat thread!
|
474
|
+
New SSE Client connected: #<StringIO:0x007fee753bac20>
|
475
|
+
Starting SSE heartbeat thread!
|
476
|
+
New SSE Client connected: #<StringIO:0x007fee7539ada8>
|
477
|
+
Starting SSE heartbeat thread!
|
478
|
+
New SSE Client connected: #<StringIO:0x007fee7537abe8>
|
479
|
+
New SSE Client connected: #<StringIO:0x007fee7537b430>
|
480
|
+
Starting SSE heartbeat thread!
|
481
|
+
New SSE Client connected: #<StringIO:0x007fee7535b2c0>
|
482
|
+
Starting SSE heartbeat thread!
|
483
|
+
New SSE Client connected: #<StringIO:0x007fee753496b0>
|
484
|
+
Starting SSE heartbeat thread!
|
485
|
+
New SSE Client connected: #<StringIO:0x007fee75328640>
|
486
|
+
SSE Client disconnected: #<StringIO:0x007fee75328640> - IOError
|
487
|
+
Starting SSE heartbeat thread!
|
488
|
+
Starting SSE heartbeat thread!
|
489
|
+
Starting SSE heartbeat thread!
|
490
|
+
New SSE Client connected: #<StringIO:0x007fee752ab578>
|
491
|
+
Starting SSE heartbeat thread!
|
492
|
+
Starting SSE heartbeat thread!
|
493
|
+
Starting SSE heartbeat thread!
|
494
|
+
New SSE Client connected: #<StringIO:0x007ff5753a8f00>
|
495
|
+
Starting SSE heartbeat thread!
|
496
|
+
New SSE Client connected: #<StringIO:0x007ff57538ae38>
|
497
|
+
Starting SSE heartbeat thread!
|
498
|
+
Starting SSE heartbeat thread!
|
499
|
+
New SSE Client connected: #<StringIO:0x007ff575370fd8>
|
500
|
+
New SSE Client connected: #<StringIO:0x007ff575371500>
|
501
|
+
Starting SSE heartbeat thread!
|
502
|
+
Starting SSE heartbeat thread!
|
503
|
+
Starting SSE heartbeat thread!
|
504
|
+
New SSE Client connected: #<StringIO:0x007ff575352740>
|
505
|
+
Starting SSE heartbeat thread!
|
506
|
+
New SSE Client connected: #<StringIO:0x007ff57534b760>
|
507
|
+
Starting SSE heartbeat thread!
|
508
|
+
New SSE Client connected: #<StringIO:0x007ff575343b50>
|
509
|
+
SSE Client disconnected: #<StringIO:0x007ff575343b50> - IOError
|
510
|
+
Starting SSE heartbeat thread!
|
511
|
+
New SSE Client connected: #<StringIO:0x007ff57533b568>
|
512
|
+
Starting SSE heartbeat thread!
|
513
|
+
New SSE Client connected: #<StringIO:0x007ff5753380e8>
|
514
|
+
Starting SSE heartbeat thread!
|
515
|
+
New SSE Client connected: #<StringIO:0x007ff57532aec0>
|
516
|
+
SSE Client disconnected: #<StringIO:0x007ff57532aec0> - IOError
|
517
|
+
Starting SSE heartbeat thread!
|
518
|
+
Starting SSE heartbeat thread!
|
519
|
+
New SSE Client connected: #<StringIO:0x007f864bdfb438>
|
520
|
+
SSE Client disconnected: #<StringIO:0x007f864bdfb438> - IOError
|
521
|
+
Starting SSE heartbeat thread!
|
522
|
+
New SSE Client connected: #<StringIO:0x007f864bdfa5d8>
|
523
|
+
Starting SSE heartbeat thread!
|
524
|
+
New SSE Client connected: #<StringIO:0x007f864bdeba60>
|
525
|
+
Starting SSE heartbeat thread!
|
526
|
+
Starting SSE heartbeat thread!
|
527
|
+
Starting SSE heartbeat thread!
|
528
|
+
New SSE Client connected: #<StringIO:0x007f864bdd94f0>
|
529
|
+
Starting SSE heartbeat thread!
|
530
|
+
New SSE Client connected: #<StringIO:0x007f864bdd12a0>
|
531
|
+
Starting SSE heartbeat thread!
|
532
|
+
New SSE Client connected: #<StringIO:0x007f864bdc9488>
|
533
|
+
SSE Client disconnected: #<StringIO:0x007f864bdc9488> - IOError
|
534
|
+
Starting SSE heartbeat thread!
|
535
|
+
Starting SSE heartbeat thread!
|
536
|
+
New SSE Client connected: #<StringIO:0x007f864bdc0680>
|
537
|
+
Starting SSE heartbeat thread!
|
538
|
+
New SSE Client connected: #<StringIO:0x007f864bdb9a88>
|
539
|
+
Starting SSE heartbeat thread!
|
540
|
+
New SSE Client connected: #<StringIO:0x007f864bdb27b0>
|
541
|
+
New SSE Client connected: #<StringIO:0x007f864bdb2f58>
|
542
|
+
Starting SSE heartbeat thread!
|
543
|
+
Starting SSE heartbeat thread!
|
544
|
+
New SSE Client connected: #<StringIO:0x007fdd7a921c10>
|
545
|
+
Starting SSE heartbeat thread!
|
546
|
+
New SSE Client connected: #<StringIO:0x007fdd7a91ae10>
|
547
|
+
Starting SSE heartbeat thread!
|
548
|
+
Starting SSE heartbeat thread!
|
549
|
+
New SSE Client connected: #<StringIO:0x007fdd7a90bfa0>
|
550
|
+
SSE Client disconnected: #<StringIO:0x007fdd7a90bfa0> - IOError
|
551
|
+
Starting SSE heartbeat thread!
|
552
|
+
New SSE Client connected: #<StringIO:0x007fdd7a9087b0>
|
553
|
+
New SSE Client connected: #<StringIO:0x007fdd7a908e68>
|
554
|
+
Starting SSE heartbeat thread!
|
555
|
+
New SSE Client connected: #<StringIO:0x007fdd7a9019b0>
|
556
|
+
Starting SSE heartbeat thread!
|
557
|
+
New SSE Client connected: #<StringIO:0x007fdd7a8fa778>
|
558
|
+
Starting SSE heartbeat thread!
|
559
|
+
New SSE Client connected: #<StringIO:0x007fdd7a8f8270>
|
560
|
+
Starting SSE heartbeat thread!
|
561
|
+
Starting SSE heartbeat thread!
|
562
|
+
Starting SSE heartbeat thread!
|
563
|
+
New SSE Client connected: #<StringIO:0x007fdd7a8daf18>
|
564
|
+
SSE Client disconnected: #<StringIO:0x007fdd7a8daf18> - IOError
|
565
|
+
Starting SSE heartbeat thread!
|
566
|
+
New SSE Client connected: #<StringIO:0x007fdd7a8d27c8>
|
@@ -2,11 +2,8 @@ require_relative '../../test_helper'
|
|
2
2
|
|
3
3
|
describe SseRailsEngine::Manager do
|
4
4
|
let(:manager) { SseRailsEngine.manager }
|
5
|
-
let(:
|
6
|
-
|
7
|
-
'rack.hijack' => ->() {},
|
8
|
-
'rack.hijack_io' => StringIO.new)
|
9
|
-
end
|
5
|
+
let(:env1) { Hashie::Mash.new('rack.hijack?' => true, 'rack.hijack' => ->() {}, 'rack.hijack_io' => StringIO.new) }
|
6
|
+
let(:env2) { Hashie::Mash.new('rack.hijack?' => true, 'rack.hijack' => ->() {}, 'rack.hijack_io' => StringIO.new) }
|
10
7
|
|
11
8
|
before do
|
12
9
|
SseRailsEngine.instance_variable_set(:@manager, nil)
|
@@ -14,13 +11,13 @@ describe SseRailsEngine::Manager do
|
|
14
11
|
end
|
15
12
|
|
16
13
|
it 'ensures rack supports hijacking' do
|
17
|
-
|
18
|
-
assert_raises(SseRailsEngine::Manager::RackHijackUnsupported) { manager.register(
|
14
|
+
env1['rack.hijack'] = nil
|
15
|
+
assert_raises(SseRailsEngine::Manager::RackHijackUnsupported) { manager.register(env1) }
|
19
16
|
end
|
20
17
|
|
21
18
|
it 'registers new response streams' do
|
22
19
|
manager.connections.size.must_equal 0
|
23
|
-
manager.register(
|
20
|
+
manager.register(env1)
|
24
21
|
manager.connections.size.must_equal 1
|
25
22
|
end
|
26
23
|
|
@@ -31,36 +28,38 @@ describe SseRailsEngine::Manager do
|
|
31
28
|
it 'closes connection when client disconnects' do
|
32
29
|
ActionController::Live::SSE.any_instance.stubs(:write).raises(IOError)
|
33
30
|
|
34
|
-
manager.register(
|
31
|
+
manager.register(env1)
|
35
32
|
manager.connections.size.must_equal 1
|
36
33
|
manager.send_event('foo', 'bar')
|
37
34
|
manager.connections.size.must_equal 0
|
38
35
|
end
|
39
36
|
|
40
37
|
it 'closes connection when failed sending event to client' do
|
41
|
-
ActionController::Live::SSE.any_instance.stubs(:write).raises(
|
38
|
+
ActionController::Live::SSE.any_instance.stubs(:write).raises(IOError)
|
42
39
|
|
43
|
-
manager.register(
|
40
|
+
manager.register(env1)
|
44
41
|
manager.connections.size.must_equal 1
|
45
42
|
manager.send_event('foo', 'bar')
|
46
43
|
manager.connections.size.must_equal 0
|
47
44
|
end
|
48
45
|
|
49
46
|
it 'writes string event to stream' do
|
50
|
-
manager.register(
|
47
|
+
manager.register(env1)
|
51
48
|
manager.send_event('foo', 'bar')
|
52
|
-
|
49
|
+
env1['rack.hijack_io'].string.must_equal(SseRailsEngine::Connection::SSE_HEADER + "event: foo\ndata: bar\n\n")
|
53
50
|
end
|
54
51
|
|
55
52
|
it 'writes event object to stream' do
|
56
|
-
manager.register(
|
53
|
+
manager.register(env1)
|
57
54
|
manager.send_event('foo', a: 123, 'b' => 'abc', c: { foo: 'bar' })
|
58
|
-
|
59
|
-
SseRailsEngine::
|
55
|
+
env1['rack.hijack_io'].string.must_equal(
|
56
|
+
SseRailsEngine::Connection::SSE_HEADER +
|
57
|
+
"event: foo\ndata: {\"a\":123,\"b\":\"abc\",\"c\":{\"foo\":\"bar\"}}\n\n"
|
58
|
+
)
|
60
59
|
end
|
61
60
|
|
62
61
|
it 'writes minimum headers to rack middleware' do
|
63
|
-
manager.call(
|
62
|
+
manager.call(env1).must_equal [-1, {}, []]
|
64
63
|
end
|
65
64
|
|
66
65
|
it 'ensures heartbeat is sent' do
|
@@ -70,4 +69,31 @@ describe SseRailsEngine::Manager do
|
|
70
69
|
SseRailsEngine::Manager.new
|
71
70
|
sleep 0.2
|
72
71
|
end
|
72
|
+
|
73
|
+
it 'sends events to connections that register for that channel' do
|
74
|
+
env1['QUERY_STRING'] = 'channels=foo,bar'
|
75
|
+
manager.register(env1)
|
76
|
+
manager.send_event('foo')
|
77
|
+
env1['rack.hijack_io'].string.must_equal(
|
78
|
+
SseRailsEngine::Connection::SSE_HEADER + "event: foo\ndata: \n\n", 'env1 should have received event')
|
79
|
+
end
|
80
|
+
|
81
|
+
it 'does not send events to clients that didnt register for them' do
|
82
|
+
env1['QUERY_STRING'] = 'channels=foo,bar'
|
83
|
+
manager.register(env1)
|
84
|
+
manager.send_event('test')
|
85
|
+
env1['rack.hijack_io'].string.must_equal(
|
86
|
+
SseRailsEngine::Connection::SSE_HEADER, 'env2 should not have received event')
|
87
|
+
end
|
88
|
+
|
89
|
+
it 'filters msgs depending on channels requested' do
|
90
|
+
env2['QUERY_STRING'] = 'channels=foo,bar'
|
91
|
+
manager.register(env1)
|
92
|
+
manager.register(env2)
|
93
|
+
manager.send_event('test')
|
94
|
+
env1['rack.hijack_io'].string.must_equal(
|
95
|
+
SseRailsEngine::Connection::SSE_HEADER + "event: test\ndata: \n\n", 'env1 should have received event')
|
96
|
+
env2['rack.hijack_io'].string.must_equal(
|
97
|
+
SseRailsEngine::Connection::SSE_HEADER, 'env2 should not have received event')
|
98
|
+
end
|
73
99
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sse-rails-engine
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Shane Hender
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-
|
11
|
+
date: 2015-05-16 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|
@@ -84,16 +84,16 @@ dependencies:
|
|
84
84
|
name: rubocop
|
85
85
|
requirement: !ruby/object:Gem::Requirement
|
86
86
|
requirements:
|
87
|
-
- - "
|
87
|
+
- - "~>"
|
88
88
|
- !ruby/object:Gem::Version
|
89
|
-
version: '0'
|
89
|
+
version: '0.0'
|
90
90
|
type: :development
|
91
91
|
prerelease: false
|
92
92
|
version_requirements: !ruby/object:Gem::Requirement
|
93
93
|
requirements:
|
94
|
-
- - "
|
94
|
+
- - "~>"
|
95
95
|
- !ruby/object:Gem::Version
|
96
|
-
version: '0'
|
96
|
+
version: '0.0'
|
97
97
|
description: See the README.md at https://github.com/henders/sse-rails-engine
|
98
98
|
email:
|
99
99
|
- henders@gmail.com
|
@@ -107,6 +107,7 @@ files:
|
|
107
107
|
- config/initializers/sse_rails_engine.rb
|
108
108
|
- config/routes.rb
|
109
109
|
- lib/sse-rails-engine.rb
|
110
|
+
- lib/sse_rails_engine/connection.rb
|
110
111
|
- lib/sse_rails_engine/engine.rb
|
111
112
|
- lib/sse_rails_engine/manager.rb
|
112
113
|
- lib/sse_rails_engine/version.rb
|