firehose 1.2.20 → 1.3.6
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.codeclimate.yml +29 -0
- data/.dockerignore +2 -0
- data/.gitignore +3 -1
- data/.rubocop.yml +1156 -0
- data/.ruby-version +1 -0
- data/.travis.yml +3 -7
- data/CHANGELOG.md +15 -0
- data/Dockerfile +11 -0
- data/Gemfile +4 -2
- data/Procfile.dev +0 -1
- data/README.md +66 -8
- data/Rakefile +43 -32
- data/coffeelint.json +129 -0
- data/docker-compose.yml +17 -0
- data/firehose.gemspec +5 -9
- data/karma.config.coffee +89 -0
- data/lib/assets/javascripts/firehose.js.coffee +1 -2
- data/lib/assets/javascripts/firehose/consumer.js.coffee +18 -2
- data/lib/assets/javascripts/firehose/core.js.coffee +2 -1
- data/lib/assets/javascripts/firehose/long_poll.js.coffee +69 -8
- data/lib/assets/javascripts/firehose/multiplexed_consumer.js.coffee +74 -0
- data/lib/assets/javascripts/firehose/transport.js.coffee +4 -2
- data/lib/assets/javascripts/firehose/web_socket.js.coffee +51 -5
- data/lib/firehose/cli.rb +2 -1
- data/lib/firehose/client/producer.rb +10 -4
- data/lib/firehose/rack/consumer.rb +39 -0
- data/lib/firehose/rack/consumer/http_long_poll.rb +118 -45
- data/lib/firehose/rack/consumer/web_socket.rb +133 -28
- data/lib/firehose/rack/ping.rb +1 -1
- data/lib/firehose/rack/publisher.rb +10 -4
- data/lib/firehose/server.rb +9 -9
- data/lib/firehose/server/channel.rb +23 -31
- data/lib/firehose/server/message_buffer.rb +59 -0
- data/lib/firehose/server/publisher.rb +16 -17
- data/lib/firehose/server/redis.rb +32 -0
- data/lib/firehose/server/subscriber.rb +7 -7
- data/lib/firehose/version.rb +2 -2
- data/package.json +14 -2
- data/spec/integrations/shared_examples.rb +89 -7
- data/spec/javascripts/firehose/multiplexed_consumer_spec.coffee +72 -0
- data/spec/javascripts/firehose/transport_spec.coffee +0 -2
- data/spec/javascripts/firehose/websocket_spec.coffee +2 -0
- data/spec/javascripts/helpers/spec_helper.js +1 -0
- data/spec/javascripts/support/jquery-1.11.1.js +10308 -0
- data/{lib/assets/javascripts/vendor → spec/javascripts/support}/json2.js +0 -0
- data/spec/javascripts/support/spec_helper.coffee +3 -0
- data/spec/lib/assets_spec.rb +8 -8
- data/spec/lib/client/producer_spec.rb +14 -14
- data/spec/lib/firehose_spec.rb +2 -2
- data/spec/lib/rack/consumer/http_long_poll_spec.rb +21 -3
- data/spec/lib/rack/consumer_spec.rb +4 -4
- data/spec/lib/rack/ping_spec.rb +4 -4
- data/spec/lib/rack/publisher_spec.rb +5 -5
- data/spec/lib/server/app_spec.rb +2 -2
- data/spec/lib/server/channel_spec.rb +58 -44
- data/spec/lib/server/message_buffer_spec.rb +148 -0
- data/spec/lib/server/publisher_spec.rb +29 -22
- data/spec/lib/server/redis_spec.rb +13 -0
- data/spec/lib/server/subscriber_spec.rb +14 -13
- data/spec/spec_helper.rb +8 -1
- metadata +34 -95
- data/.rbenv-version +0 -1
- data/Guardfile +0 -31
- data/config/evergreen.rb +0 -9
@@ -7,21 +7,17 @@ describe Firehose::Server::Publisher do
|
|
7
7
|
let(:channel_key) { "/firehose/publisher/test/#{Time.now.to_i}" }
|
8
8
|
let(:message) { "howdy friends!" }
|
9
9
|
|
10
|
-
it "
|
11
|
-
Firehose::Server::Publisher::
|
12
|
-
end
|
13
|
-
|
14
|
-
it "should have 1 day TTL" do
|
15
|
-
Firehose::Server::Publisher::TTL.should == 86400
|
10
|
+
it "has 1 day TTL" do
|
11
|
+
expect(Firehose::Server::Publisher::TTL).to eql(86400)
|
16
12
|
end
|
17
13
|
|
18
14
|
describe "#publish" do
|
19
|
-
it "
|
15
|
+
it "publishes message change" do
|
20
16
|
em do
|
21
|
-
hiredis =
|
17
|
+
hiredis = Firehose::Server.redis.connection.pubsub
|
22
18
|
hiredis.subscribe "firehose:channel_updates"
|
23
19
|
hiredis.on(:message) {|_, msg|
|
24
|
-
msg.
|
20
|
+
expect(msg).to eql("#{channel_key}\n1\n#{message}")
|
25
21
|
em.next_tick { em.stop }
|
26
22
|
}
|
27
23
|
Firehose::Server::Publisher.new.publish channel_key, message
|
@@ -29,52 +25,63 @@ describe Firehose::Server::Publisher do
|
|
29
25
|
end
|
30
26
|
|
31
27
|
"\"'\r\t\n!@\#$%^&*()[]\v\f\a\b\e{}/=?+\\|".each_char do |char|
|
32
|
-
it "
|
28
|
+
it "publishes messages with the '#{char.inspect}' character" do
|
33
29
|
msg = [char, message, char].join
|
34
30
|
em 1 do
|
35
31
|
Firehose::Server::Publisher.new.publish(channel_key, msg).callback { em.stop }
|
36
32
|
end
|
37
|
-
redis_exec('lpop', "firehose:#{channel_key}:list").
|
33
|
+
expect(redis_exec('lpop', "firehose:#{channel_key}:list")).to eql(msg)
|
38
34
|
end
|
39
35
|
end
|
40
36
|
|
41
|
-
it "
|
37
|
+
it "adds message to list" do
|
42
38
|
em do
|
43
39
|
Firehose::Server::Publisher.new.publish(channel_key, message).callback { em.stop }
|
44
40
|
end
|
45
|
-
redis_exec('lpop', "firehose:#{channel_key}:list").
|
41
|
+
expect(redis_exec('lpop', "firehose:#{channel_key}:list")).to eql(message)
|
46
42
|
end
|
47
43
|
|
48
|
-
it "
|
44
|
+
it "limits list to DEFAULT_SIZE messages" do
|
49
45
|
em do
|
50
|
-
Firehose::Server::
|
46
|
+
Firehose::Server::MessageBuffer::DEFAULT_SIZE.times do |n|
|
51
47
|
publisher.publish(channel_key, message)
|
52
48
|
end
|
53
49
|
publisher.publish(channel_key, message).callback { em.stop }
|
54
50
|
end
|
55
|
-
redis_exec('llen', "firehose:#{channel_key}:list").
|
51
|
+
expect(redis_exec('llen', "firehose:#{channel_key}:list")).to eql(Firehose::Server::MessageBuffer::DEFAULT_SIZE)
|
52
|
+
end
|
53
|
+
|
54
|
+
it "limits message list to a custom buffer size" do
|
55
|
+
buffer_size = rand(100)
|
56
|
+
em do
|
57
|
+
Firehose::Server::MessageBuffer::DEFAULT_SIZE.times do |n|
|
58
|
+
publisher.publish(channel_key, message)
|
59
|
+
end
|
60
|
+
publisher.publish(channel_key, message, buffer_size: buffer_size).callback { em.stop }
|
61
|
+
end
|
62
|
+
redis_exec('llen', "firehose:#{channel_key}:list").should == buffer_size
|
56
63
|
end
|
57
64
|
|
58
|
-
it "
|
65
|
+
it "increments sequence" do
|
59
66
|
sequence_key = "firehose:#{channel_key}:sequence"
|
60
67
|
|
61
68
|
@done_counter = 0
|
62
|
-
redis_exec('get', sequence_key).
|
69
|
+
expect(redis_exec('get', sequence_key)).to be_nil
|
63
70
|
em do
|
64
71
|
publisher.publish(channel_key, message).callback { @done_counter += 1; em.next_tick { em.stop } if @done_counter > 1 }
|
65
72
|
publisher.publish(channel_key, message).callback { @done_counter += 1; em.next_tick { em.stop } if @done_counter > 1 }
|
66
73
|
end
|
67
|
-
redis_exec('get', sequence_key).to_i.
|
74
|
+
expect(redis_exec('get', sequence_key).to_i).to eql(2)
|
68
75
|
end
|
69
76
|
|
70
|
-
it "
|
77
|
+
it "sets expiry on sequence and list keys" do
|
71
78
|
ttl = 78 # Why 78? Why not!
|
72
79
|
|
73
80
|
em do
|
74
81
|
publisher.publish(channel_key, message, :ttl => 78).callback do
|
75
82
|
# Allow for 1 second of slippage/delay
|
76
|
-
redis_exec('TTL', "firehose:#{channel_key}:sequence").
|
77
|
-
redis_exec('TTL', "firehose:#{channel_key}:list").
|
83
|
+
expect(redis_exec('TTL', "firehose:#{channel_key}:sequence")).to be > (ttl- 1)
|
84
|
+
expect(redis_exec('TTL', "firehose:#{channel_key}:list")).to be > (ttl - 1)
|
78
85
|
em.stop
|
79
86
|
end
|
80
87
|
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Firehose::Server::Redis do
|
4
|
+
describe ".key" do
|
5
|
+
subject { Firehose::Server::Redis.key("list", "channel", ["fizz", "buzz"]) }
|
6
|
+
it "has root `firehose` key" do
|
7
|
+
expect(subject).to start_with("firehose:")
|
8
|
+
end
|
9
|
+
it "flattens all arguments into key" do
|
10
|
+
expect(subject).to eql("firehose:list:channel:fizz:buzz")
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
@@ -4,23 +4,24 @@ describe Firehose::Server::Subscriber do
|
|
4
4
|
include EM::TestHelper
|
5
5
|
|
6
6
|
let(:channel_key) { '/bears/are/mean' }
|
7
|
-
let(:subscriber) { Firehose::Server::Subscriber.new(
|
7
|
+
let(:subscriber) { Firehose::Server::Subscriber.new(Firehose::Server.redis.connection) }
|
8
8
|
let(:dummy_subscriber){ Firehose::Server::Subscriber.new(double('redis', :pubsub => double('pubsub', :subscribe => EM::DefaultDeferrable.new, :on => nil))) }
|
9
9
|
let(:message) { 'Raaaarrrrrr!!!!' }
|
10
10
|
let(:publisher) { Firehose::Server::Publisher.new }
|
11
11
|
|
12
12
|
describe "#subscribe" do
|
13
|
-
it "
|
13
|
+
it "adds the deferrable to the subscriptions hash" do
|
14
14
|
deferrable = EM::DefaultDeferrable.new
|
15
15
|
dummy_subscriber.subscribe(channel_key, deferrable)
|
16
|
-
dummy_subscriber.send(:subscriptions)[channel_key].
|
16
|
+
expect(dummy_subscriber.send(:subscriptions)[channel_key]).to eql([deferrable])
|
17
17
|
end
|
18
18
|
|
19
|
-
it "
|
19
|
+
it "calls succeed on the deferrable when a message is published" do
|
20
20
|
deferrable = EM::DefaultDeferrable.new
|
21
|
-
deferrable.callback do |
|
22
|
-
msg
|
23
|
-
|
21
|
+
deferrable.callback do |messages|
|
22
|
+
msg = messages.first
|
23
|
+
expect(msg.payload).to eql(message)
|
24
|
+
expect(msg.sequence).to eql(1) # The publisher is fresh, so the sequence ID will be 1.
|
24
25
|
em.next_tick { em.stop }
|
25
26
|
end
|
26
27
|
|
@@ -30,10 +31,10 @@ describe Firehose::Server::Subscriber do
|
|
30
31
|
end
|
31
32
|
end
|
32
33
|
|
33
|
-
it "
|
34
|
+
it "doesn't call succeed on the deferrable when a 2nd message is published" do
|
34
35
|
deferrable = EM::DefaultDeferrable.new
|
35
|
-
deferrable.should_receive(:succeed).with(message, 1) # The publisher is fresh, so the sequence ID will be 1.
|
36
|
-
deferrable.should_not_receive(:succeed).with('2nd message', 2)
|
36
|
+
deferrable.should_receive(:succeed).with([Firehose::Server::MessageBuffer::Message.new(message, 1)]) # The publisher is fresh, so the sequence ID will be 1.
|
37
|
+
deferrable.should_not_receive(:succeed).with([Firehose::Server::MessageBuffer::Message.new('2nd message', 2)])
|
37
38
|
em do
|
38
39
|
subscriber.subscribe(channel_key, deferrable)
|
39
40
|
publisher.publish(channel_key, message).callback do
|
@@ -47,14 +48,14 @@ describe Firehose::Server::Subscriber do
|
|
47
48
|
end
|
48
49
|
|
49
50
|
describe "#unsubscribe" do
|
50
|
-
it "
|
51
|
+
it "removes the deferrable from the subscriptions hash" do
|
51
52
|
deferrable = EM::DefaultDeferrable.new
|
52
53
|
dummy_subscriber.subscribe(channel_key, deferrable)
|
53
54
|
dummy_subscriber.unsubscribe(channel_key, deferrable)
|
54
|
-
dummy_subscriber.send(:subscriptions).has_key?(channel_key).
|
55
|
+
expect(dummy_subscriber.send(:subscriptions).has_key?(channel_key)).to be_falsey
|
55
56
|
end
|
56
57
|
|
57
|
-
it "
|
58
|
+
it "doesn't call succeed on the deferrable when a message is published" do
|
58
59
|
deferrable = EM::DefaultDeferrable.new
|
59
60
|
deferrable.should_not_receive(:succeed).with(message, 1) # The publisher is fresh, so the sequence ID will be 1.
|
60
61
|
em do
|
data/spec/spec_helper.rb
CHANGED
@@ -6,6 +6,13 @@ require 'faye/websocket'
|
|
6
6
|
require 'hiredis'
|
7
7
|
require 'firehose'
|
8
8
|
|
9
|
+
# Test coverage reports on CodeClimate.
|
10
|
+
begin
|
11
|
+
require "codeclimate-test-reporter"
|
12
|
+
CodeClimate::TestReporter.start
|
13
|
+
rescue LoadError
|
14
|
+
end
|
15
|
+
|
9
16
|
# We use both EM::Http and Net::Http in this test lib. When EM:Http is fired up
|
10
17
|
# we're usually hitting Rainbows! for integrations, and when Net::Http we want
|
11
18
|
# to mock that up.
|
@@ -34,7 +41,7 @@ module Hiredis::TestHelper
|
|
34
41
|
def redis
|
35
42
|
@conn ||= begin
|
36
43
|
conn = Hiredis::Connection.new
|
37
|
-
conn.connect(
|
44
|
+
conn.connect(Firehose::Server.redis.url.host, Firehose::Server.redis.url.port)
|
38
45
|
conn
|
39
46
|
end
|
40
47
|
end
|
metadata
CHANGED
@@ -1,17 +1,18 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: firehose
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.3.6
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Brad Gessler
|
8
8
|
- Steel Fu
|
9
9
|
- Paul Cortens
|
10
10
|
- Zach Zolton
|
11
|
+
- Christopher Bertels
|
11
12
|
autorequire:
|
12
13
|
bindir: bin
|
13
14
|
cert_chain: []
|
14
|
-
date:
|
15
|
+
date: 2016-06-21 00:00:00.000000000 Z
|
15
16
|
dependencies:
|
16
17
|
- !ruby/object:Gem::Dependency
|
17
18
|
name: eventmachine
|
@@ -59,16 +60,16 @@ dependencies:
|
|
59
60
|
name: faraday
|
60
61
|
requirement: !ruby/object:Gem::Requirement
|
61
62
|
requirements:
|
62
|
-
- -
|
63
|
+
- - '='
|
63
64
|
- !ruby/object:Gem::Version
|
64
|
-
version:
|
65
|
+
version: 0.9.0
|
65
66
|
type: :runtime
|
66
67
|
prerelease: false
|
67
68
|
version_requirements: !ruby/object:Gem::Requirement
|
68
69
|
requirements:
|
69
|
-
- -
|
70
|
+
- - '='
|
70
71
|
- !ruby/object:Gem::Version
|
71
|
-
version:
|
72
|
+
version: 0.9.0
|
72
73
|
- !ruby/object:Gem::Dependency
|
73
74
|
name: faye-websocket
|
74
75
|
requirement: !ruby/object:Gem::Requirement
|
@@ -97,20 +98,6 @@ dependencies:
|
|
97
98
|
- - ">="
|
98
99
|
- !ruby/object:Gem::Version
|
99
100
|
version: 1.0.0
|
100
|
-
- !ruby/object:Gem::Dependency
|
101
|
-
name: json
|
102
|
-
requirement: !ruby/object:Gem::Requirement
|
103
|
-
requirements:
|
104
|
-
- - ">="
|
105
|
-
- !ruby/object:Gem::Version
|
106
|
-
version: '0'
|
107
|
-
type: :runtime
|
108
|
-
prerelease: false
|
109
|
-
version_requirements: !ruby/object:Gem::Requirement
|
110
|
-
requirements:
|
111
|
-
- - ">="
|
112
|
-
- !ruby/object:Gem::Version
|
113
|
-
version: '0'
|
114
101
|
- !ruby/object:Gem::Dependency
|
115
102
|
name: rack
|
116
103
|
requirement: !ruby/object:Gem::Requirement
|
@@ -167,62 +154,6 @@ dependencies:
|
|
167
154
|
- - ">="
|
168
155
|
- !ruby/object:Gem::Version
|
169
156
|
version: '0'
|
170
|
-
- !ruby/object:Gem::Dependency
|
171
|
-
name: guard-rspec
|
172
|
-
requirement: !ruby/object:Gem::Requirement
|
173
|
-
requirements:
|
174
|
-
- - ">="
|
175
|
-
- !ruby/object:Gem::Version
|
176
|
-
version: '0'
|
177
|
-
type: :development
|
178
|
-
prerelease: false
|
179
|
-
version_requirements: !ruby/object:Gem::Requirement
|
180
|
-
requirements:
|
181
|
-
- - ">="
|
182
|
-
- !ruby/object:Gem::Version
|
183
|
-
version: '0'
|
184
|
-
- !ruby/object:Gem::Dependency
|
185
|
-
name: guard-bundler
|
186
|
-
requirement: !ruby/object:Gem::Requirement
|
187
|
-
requirements:
|
188
|
-
- - ">="
|
189
|
-
- !ruby/object:Gem::Version
|
190
|
-
version: '0'
|
191
|
-
type: :development
|
192
|
-
prerelease: false
|
193
|
-
version_requirements: !ruby/object:Gem::Requirement
|
194
|
-
requirements:
|
195
|
-
- - ">="
|
196
|
-
- !ruby/object:Gem::Version
|
197
|
-
version: '0'
|
198
|
-
- !ruby/object:Gem::Dependency
|
199
|
-
name: guard-coffeescript
|
200
|
-
requirement: !ruby/object:Gem::Requirement
|
201
|
-
requirements:
|
202
|
-
- - ">="
|
203
|
-
- !ruby/object:Gem::Version
|
204
|
-
version: '0'
|
205
|
-
type: :development
|
206
|
-
prerelease: false
|
207
|
-
version_requirements: !ruby/object:Gem::Requirement
|
208
|
-
requirements:
|
209
|
-
- - ">="
|
210
|
-
- !ruby/object:Gem::Version
|
211
|
-
version: '0'
|
212
|
-
- !ruby/object:Gem::Dependency
|
213
|
-
name: guard-copy
|
214
|
-
requirement: !ruby/object:Gem::Requirement
|
215
|
-
requirements:
|
216
|
-
- - ">="
|
217
|
-
- !ruby/object:Gem::Version
|
218
|
-
version: '0'
|
219
|
-
type: :development
|
220
|
-
prerelease: false
|
221
|
-
version_requirements: !ruby/object:Gem::Requirement
|
222
|
-
requirements:
|
223
|
-
- - ">="
|
224
|
-
- !ruby/object:Gem::Version
|
225
|
-
version: '0'
|
226
157
|
- !ruby/object:Gem::Dependency
|
227
158
|
name: rainbows
|
228
159
|
requirement: !ruby/object:Gem::Requirement
|
@@ -321,20 +252,6 @@ dependencies:
|
|
321
252
|
- - ">="
|
322
253
|
- !ruby/object:Gem::Version
|
323
254
|
version: '0'
|
324
|
-
- !ruby/object:Gem::Dependency
|
325
|
-
name: evergreen
|
326
|
-
requirement: !ruby/object:Gem::Requirement
|
327
|
-
requirements:
|
328
|
-
- - ">="
|
329
|
-
- !ruby/object:Gem::Version
|
330
|
-
version: '0'
|
331
|
-
type: :development
|
332
|
-
prerelease: false
|
333
|
-
version_requirements: !ruby/object:Gem::Requirement
|
334
|
-
requirements:
|
335
|
-
- - ">="
|
336
|
-
- !ruby/object:Gem::Version
|
337
|
-
version: '0'
|
338
255
|
- !ruby/object:Gem::Dependency
|
339
256
|
name: capybara-webkit
|
340
257
|
requirement: !ruby/object:Gem::Requirement
|
@@ -370,36 +287,43 @@ email:
|
|
370
287
|
- steel@polleverywhere.com
|
371
288
|
- paul@polleverywhere.com
|
372
289
|
- zach@polleverywhere.com
|
290
|
+
- christopher@polleverywhere.com
|
373
291
|
executables:
|
374
292
|
- firehose
|
375
293
|
extensions: []
|
376
294
|
extra_rdoc_files: []
|
377
295
|
files:
|
296
|
+
- ".codeclimate.yml"
|
297
|
+
- ".dockerignore"
|
378
298
|
- ".env.sample"
|
379
299
|
- ".gitignore"
|
380
|
-
- ".rbenv-version"
|
381
300
|
- ".rspec"
|
301
|
+
- ".rubocop.yml"
|
302
|
+
- ".ruby-version"
|
382
303
|
- ".travis.yml"
|
304
|
+
- CHANGELOG.md
|
305
|
+
- Dockerfile
|
383
306
|
- Gemfile
|
384
|
-
- Guardfile
|
385
307
|
- LICENSE.txt
|
386
308
|
- Procfile
|
387
309
|
- Procfile.dev
|
388
310
|
- README.md
|
389
311
|
- Rakefile
|
390
312
|
- bin/firehose
|
391
|
-
-
|
313
|
+
- coffeelint.json
|
392
314
|
- config/rainbows.rb
|
315
|
+
- docker-compose.yml
|
393
316
|
- firehose.gemspec
|
317
|
+
- karma.config.coffee
|
394
318
|
- lib/assets/javascripts/firehose.js.coffee
|
395
319
|
- lib/assets/javascripts/firehose/base.js.coffee
|
396
320
|
- lib/assets/javascripts/firehose/consumer.js.coffee
|
397
321
|
- lib/assets/javascripts/firehose/core.js.coffee
|
398
322
|
- lib/assets/javascripts/firehose/long_poll.js.coffee
|
323
|
+
- lib/assets/javascripts/firehose/multiplexed_consumer.js.coffee
|
399
324
|
- lib/assets/javascripts/firehose/transport.js.coffee
|
400
325
|
- lib/assets/javascripts/firehose/version.js.coffee.erb
|
401
326
|
- lib/assets/javascripts/firehose/web_socket.js.coffee
|
402
|
-
- lib/assets/javascripts/vendor/json2.js
|
403
327
|
- lib/firehose.rb
|
404
328
|
- lib/firehose/assets.rb
|
405
329
|
- lib/firehose/cli.rb
|
@@ -418,7 +342,9 @@ files:
|
|
418
342
|
- lib/firehose/server.rb
|
419
343
|
- lib/firehose/server/app.rb
|
420
344
|
- lib/firehose/server/channel.rb
|
345
|
+
- lib/firehose/server/message_buffer.rb
|
421
346
|
- lib/firehose/server/publisher.rb
|
347
|
+
- lib/firehose/server/redis.rb
|
422
348
|
- lib/firehose/server/subscriber.rb
|
423
349
|
- lib/firehose/version.rb
|
424
350
|
- package.json
|
@@ -429,10 +355,14 @@ files:
|
|
429
355
|
- spec/javascripts/firehose/base_spec.coffee
|
430
356
|
- spec/javascripts/firehose/consumer_spec.coffee
|
431
357
|
- spec/javascripts/firehose/long_poll_spec.coffee
|
358
|
+
- spec/javascripts/firehose/multiplexed_consumer_spec.coffee
|
432
359
|
- spec/javascripts/firehose/transport_spec.coffee
|
433
360
|
- spec/javascripts/firehose/websocket_spec.coffee
|
434
361
|
- spec/javascripts/helpers/spec_helper.js
|
362
|
+
- spec/javascripts/support/jquery-1.11.1.js
|
363
|
+
- spec/javascripts/support/json2.js
|
435
364
|
- spec/javascripts/support/sinon-1.7.3.js
|
365
|
+
- spec/javascripts/support/spec_helper.coffee
|
436
366
|
- spec/lib/assets_spec.rb
|
437
367
|
- spec/lib/client/consumer_spec.rb
|
438
368
|
- spec/lib/client/producer_spec.rb
|
@@ -443,7 +373,9 @@ files:
|
|
443
373
|
- spec/lib/rack/publisher_spec.rb
|
444
374
|
- spec/lib/server/app_spec.rb
|
445
375
|
- spec/lib/server/channel_spec.rb
|
376
|
+
- spec/lib/server/message_buffer_spec.rb
|
446
377
|
- spec/lib/server/publisher_spec.rb
|
378
|
+
- spec/lib/server/redis_spec.rb
|
447
379
|
- spec/lib/server/subscriber_spec.rb
|
448
380
|
- spec/spec_helper.rb
|
449
381
|
homepage: http://firehose.io/
|
@@ -466,7 +398,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
466
398
|
version: '0'
|
467
399
|
requirements: []
|
468
400
|
rubyforge_project: firehose
|
469
|
-
rubygems_version: 2.
|
401
|
+
rubygems_version: 2.5.1
|
470
402
|
signing_key:
|
471
403
|
specification_version: 4
|
472
404
|
summary: Build realtime Ruby web applications
|
@@ -478,10 +410,14 @@ test_files:
|
|
478
410
|
- spec/javascripts/firehose/base_spec.coffee
|
479
411
|
- spec/javascripts/firehose/consumer_spec.coffee
|
480
412
|
- spec/javascripts/firehose/long_poll_spec.coffee
|
413
|
+
- spec/javascripts/firehose/multiplexed_consumer_spec.coffee
|
481
414
|
- spec/javascripts/firehose/transport_spec.coffee
|
482
415
|
- spec/javascripts/firehose/websocket_spec.coffee
|
483
416
|
- spec/javascripts/helpers/spec_helper.js
|
417
|
+
- spec/javascripts/support/jquery-1.11.1.js
|
418
|
+
- spec/javascripts/support/json2.js
|
484
419
|
- spec/javascripts/support/sinon-1.7.3.js
|
420
|
+
- spec/javascripts/support/spec_helper.coffee
|
485
421
|
- spec/lib/assets_spec.rb
|
486
422
|
- spec/lib/client/consumer_spec.rb
|
487
423
|
- spec/lib/client/producer_spec.rb
|
@@ -492,6 +428,9 @@ test_files:
|
|
492
428
|
- spec/lib/rack/publisher_spec.rb
|
493
429
|
- spec/lib/server/app_spec.rb
|
494
430
|
- spec/lib/server/channel_spec.rb
|
431
|
+
- spec/lib/server/message_buffer_spec.rb
|
495
432
|
- spec/lib/server/publisher_spec.rb
|
433
|
+
- spec/lib/server/redis_spec.rb
|
496
434
|
- spec/lib/server/subscriber_spec.rb
|
497
435
|
- spec/spec_helper.rb
|
436
|
+
has_rdoc:
|