firehose 1.2.20 → 1.3.6
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/.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:
|