firehose 1.3.6 → 2.1.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 +5 -5
- data/CHANGELOG.md +31 -10
- data/{LICENSE.txt → LICENSE} +6 -6
- data/README.md +379 -187
- data/app/assets/javascripts/firehose.js +258 -0
- data/config/importmap.rb +1 -0
- data/db/migrate/20260214185244_create_firehose_events.rb +23 -0
- data/lib/commands/firehose_command.rb +119 -0
- data/lib/firehose/channel.rb +40 -0
- data/lib/firehose/cleanup_job.rb +21 -0
- data/lib/firehose/engine.rb +36 -0
- data/lib/firehose/helper.rb +40 -0
- data/lib/firehose/models/channel.rb +12 -0
- data/lib/firehose/models/message.rb +11 -0
- data/lib/firehose/queue.rb +44 -0
- data/lib/firehose/server.rb +930 -17
- data/lib/firehose/sse.rb +187 -0
- data/lib/firehose/stream.rb +32 -0
- data/lib/firehose/streamable.rb +25 -0
- data/lib/firehose/websocket.rb +242 -0
- data/lib/firehose.rb +67 -15
- data/lib/generators/firehose/install/install_generator.rb +43 -0
- data/lib/generators/firehose/install/templates/firehose_controller.rb +16 -0
- metadata +39 -366
- data/.codeclimate.yml +0 -29
- data/.dockerignore +0 -2
- data/.env.sample +0 -17
- data/.gitignore +0 -14
- data/.rspec +0 -1
- data/.rubocop.yml +0 -1156
- data/.ruby-version +0 -1
- data/.travis.yml +0 -12
- data/Dockerfile +0 -11
- data/Gemfile +0 -6
- data/Procfile +0 -1
- data/Procfile.dev +0 -3
- data/Rakefile +0 -64
- data/bin/firehose +0 -9
- data/coffeelint.json +0 -129
- data/config/rainbows.rb +0 -17
- data/docker-compose.yml +0 -17
- data/firehose.gemspec +0 -45
- data/karma.config.coffee +0 -89
- data/lib/assets/javascripts/firehose/base.js.coffee +0 -4
- data/lib/assets/javascripts/firehose/consumer.js.coffee +0 -86
- data/lib/assets/javascripts/firehose/core.js.coffee +0 -6
- data/lib/assets/javascripts/firehose/long_poll.js.coffee +0 -210
- data/lib/assets/javascripts/firehose/multiplexed_consumer.js.coffee +0 -74
- data/lib/assets/javascripts/firehose/transport.js.coffee +0 -44
- data/lib/assets/javascripts/firehose/version.js.coffee.erb +0 -2
- data/lib/assets/javascripts/firehose/web_socket.js.coffee +0 -148
- data/lib/assets/javascripts/firehose.js.coffee +0 -2
- data/lib/firehose/assets.rb +0 -56
- data/lib/firehose/cli.rb +0 -79
- data/lib/firehose/client/consumer.rb +0 -94
- data/lib/firehose/client/producer.rb +0 -114
- data/lib/firehose/client.rb +0 -10
- data/lib/firehose/logging.rb +0 -32
- data/lib/firehose/rack/app.rb +0 -49
- data/lib/firehose/rack/consumer/http_long_poll.rb +0 -159
- data/lib/firehose/rack/consumer/web_socket.rb +0 -200
- data/lib/firehose/rack/consumer.rb +0 -78
- data/lib/firehose/rack/ping.rb +0 -88
- data/lib/firehose/rack/publisher.rb +0 -59
- data/lib/firehose/rack.rb +0 -32
- data/lib/firehose/rails.rb +0 -7
- data/lib/firehose/server/app.rb +0 -52
- data/lib/firehose/server/channel.rb +0 -72
- data/lib/firehose/server/message_buffer.rb +0 -59
- data/lib/firehose/server/publisher.rb +0 -133
- data/lib/firehose/server/redis.rb +0 -32
- data/lib/firehose/server/subscriber.rb +0 -51
- data/lib/firehose/version.rb +0 -4
- data/package.json +0 -17
- data/spec/integrations/integration_test_helper.rb +0 -22
- data/spec/integrations/rainbows_spec.rb +0 -7
- data/spec/integrations/shared_examples.rb +0 -202
- data/spec/integrations/thin_spec.rb +0 -7
- data/spec/javascripts/firehose/base_spec.coffee +0 -2
- data/spec/javascripts/firehose/consumer_spec.coffee +0 -45
- data/spec/javascripts/firehose/long_poll_spec.coffee +0 -44
- data/spec/javascripts/firehose/multiplexed_consumer_spec.coffee +0 -72
- data/spec/javascripts/firehose/transport_spec.coffee +0 -30
- data/spec/javascripts/firehose/websocket_spec.coffee +0 -27
- data/spec/javascripts/helpers/spec_helper.js +0 -31
- data/spec/javascripts/support/jquery-1.11.1.js +0 -10308
- data/spec/javascripts/support/json2.js +0 -487
- data/spec/javascripts/support/sinon-1.7.3.js +0 -4290
- data/spec/javascripts/support/spec_helper.coffee +0 -3
- data/spec/lib/assets_spec.rb +0 -35
- data/spec/lib/client/consumer_spec.rb +0 -13
- data/spec/lib/client/producer_spec.rb +0 -71
- data/spec/lib/firehose_spec.rb +0 -7
- data/spec/lib/rack/consumer/http_long_poll_spec.rb +0 -30
- data/spec/lib/rack/consumer_spec.rb +0 -19
- data/spec/lib/rack/ping_spec.rb +0 -28
- data/spec/lib/rack/publisher_spec.rb +0 -34
- data/spec/lib/server/app_spec.rb +0 -15
- data/spec/lib/server/channel_spec.rb +0 -178
- data/spec/lib/server/message_buffer_spec.rb +0 -148
- data/spec/lib/server/publisher_spec.rb +0 -91
- data/spec/lib/server/redis_spec.rb +0 -13
- data/spec/lib/server/subscriber_spec.rb +0 -70
- data/spec/spec_helper.rb +0 -84
|
@@ -1,13 +0,0 @@
|
|
|
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
|
|
@@ -1,70 +0,0 @@
|
|
|
1
|
-
require 'spec_helper'
|
|
2
|
-
|
|
3
|
-
describe Firehose::Server::Subscriber do
|
|
4
|
-
include EM::TestHelper
|
|
5
|
-
|
|
6
|
-
let(:channel_key) { '/bears/are/mean' }
|
|
7
|
-
let(:subscriber) { Firehose::Server::Subscriber.new(Firehose::Server.redis.connection) }
|
|
8
|
-
let(:dummy_subscriber){ Firehose::Server::Subscriber.new(double('redis', :pubsub => double('pubsub', :subscribe => EM::DefaultDeferrable.new, :on => nil))) }
|
|
9
|
-
let(:message) { 'Raaaarrrrrr!!!!' }
|
|
10
|
-
let(:publisher) { Firehose::Server::Publisher.new }
|
|
11
|
-
|
|
12
|
-
describe "#subscribe" do
|
|
13
|
-
it "adds the deferrable to the subscriptions hash" do
|
|
14
|
-
deferrable = EM::DefaultDeferrable.new
|
|
15
|
-
dummy_subscriber.subscribe(channel_key, deferrable)
|
|
16
|
-
expect(dummy_subscriber.send(:subscriptions)[channel_key]).to eql([deferrable])
|
|
17
|
-
end
|
|
18
|
-
|
|
19
|
-
it "calls succeed on the deferrable when a message is published" do
|
|
20
|
-
deferrable = EM::DefaultDeferrable.new
|
|
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.
|
|
25
|
-
em.next_tick { em.stop }
|
|
26
|
-
end
|
|
27
|
-
|
|
28
|
-
em do
|
|
29
|
-
subscriber.subscribe(channel_key, deferrable)
|
|
30
|
-
publisher.publish(channel_key, message)
|
|
31
|
-
end
|
|
32
|
-
end
|
|
33
|
-
|
|
34
|
-
it "doesn't call succeed on the deferrable when a 2nd message is published" do
|
|
35
|
-
deferrable = EM::DefaultDeferrable.new
|
|
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)])
|
|
38
|
-
em do
|
|
39
|
-
subscriber.subscribe(channel_key, deferrable)
|
|
40
|
-
publisher.publish(channel_key, message).callback do
|
|
41
|
-
publisher.publish(channel_key, '2nd message').callback do
|
|
42
|
-
em.stop
|
|
43
|
-
end
|
|
44
|
-
end
|
|
45
|
-
end
|
|
46
|
-
|
|
47
|
-
end
|
|
48
|
-
end
|
|
49
|
-
|
|
50
|
-
describe "#unsubscribe" do
|
|
51
|
-
it "removes the deferrable from the subscriptions hash" do
|
|
52
|
-
deferrable = EM::DefaultDeferrable.new
|
|
53
|
-
dummy_subscriber.subscribe(channel_key, deferrable)
|
|
54
|
-
dummy_subscriber.unsubscribe(channel_key, deferrable)
|
|
55
|
-
expect(dummy_subscriber.send(:subscriptions).has_key?(channel_key)).to be_falsey
|
|
56
|
-
end
|
|
57
|
-
|
|
58
|
-
it "doesn't call succeed on the deferrable when a message is published" do
|
|
59
|
-
deferrable = EM::DefaultDeferrable.new
|
|
60
|
-
deferrable.should_not_receive(:succeed).with(message, 1) # The publisher is fresh, so the sequence ID will be 1.
|
|
61
|
-
em do
|
|
62
|
-
subscriber.subscribe(channel_key, deferrable)
|
|
63
|
-
subscriber.unsubscribe(channel_key, deferrable)
|
|
64
|
-
publisher.publish(channel_key, message).callback do
|
|
65
|
-
em.stop
|
|
66
|
-
end
|
|
67
|
-
end
|
|
68
|
-
end
|
|
69
|
-
end
|
|
70
|
-
end
|
data/spec/spec_helper.rb
DELETED
|
@@ -1,84 +0,0 @@
|
|
|
1
|
-
ENV['RACK_ENV'] ||= 'test'
|
|
2
|
-
|
|
3
|
-
require 'logger'
|
|
4
|
-
require 'em-http'
|
|
5
|
-
require 'faye/websocket'
|
|
6
|
-
require 'hiredis'
|
|
7
|
-
require 'firehose'
|
|
8
|
-
|
|
9
|
-
# Test coverage reports on CodeClimate.
|
|
10
|
-
begin
|
|
11
|
-
require "codeclimate-test-reporter"
|
|
12
|
-
CodeClimate::TestReporter.start
|
|
13
|
-
rescue LoadError
|
|
14
|
-
end
|
|
15
|
-
|
|
16
|
-
# We use both EM::Http and Net::Http in this test lib. When EM:Http is fired up
|
|
17
|
-
# we're usually hitting Rainbows! for integrations, and when Net::Http we want
|
|
18
|
-
# to mock that up.
|
|
19
|
-
require 'webmock/rspec'
|
|
20
|
-
WebMock.allow_net_connect!
|
|
21
|
-
|
|
22
|
-
module EM::TestHelper
|
|
23
|
-
# Run test inside of reactor.
|
|
24
|
-
def em(ttl=30, &block)
|
|
25
|
-
if block
|
|
26
|
-
# Run the block inside of a reactor
|
|
27
|
-
EM.run do
|
|
28
|
-
EM.add_timer(ttl) do
|
|
29
|
-
EM.stop
|
|
30
|
-
raise "Test timed-out"
|
|
31
|
-
end
|
|
32
|
-
block.call(EM)
|
|
33
|
-
end
|
|
34
|
-
else # or just grab em and go nuts.
|
|
35
|
-
EM
|
|
36
|
-
end
|
|
37
|
-
end
|
|
38
|
-
end
|
|
39
|
-
|
|
40
|
-
module Hiredis::TestHelper
|
|
41
|
-
def redis
|
|
42
|
-
@conn ||= begin
|
|
43
|
-
conn = Hiredis::Connection.new
|
|
44
|
-
conn.connect(Firehose::Server.redis.url.host, Firehose::Server.redis.url.port)
|
|
45
|
-
conn
|
|
46
|
-
end
|
|
47
|
-
end
|
|
48
|
-
|
|
49
|
-
def reset_redis
|
|
50
|
-
redis_exec 'flushdb'
|
|
51
|
-
end
|
|
52
|
-
|
|
53
|
-
def redis_exec(*tokens)
|
|
54
|
-
redis.write tokens
|
|
55
|
-
redis.read
|
|
56
|
-
end
|
|
57
|
-
end
|
|
58
|
-
|
|
59
|
-
# Configure RSpec runner. See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration
|
|
60
|
-
RSpec.configure do |config|
|
|
61
|
-
config.treat_symbols_as_metadata_keys_with_true_values = true
|
|
62
|
-
config.run_all_when_everything_filtered = true
|
|
63
|
-
config.filter_run :focus
|
|
64
|
-
config.include Hiredis::TestHelper
|
|
65
|
-
config.before(:each) do
|
|
66
|
-
reset_redis
|
|
67
|
-
end
|
|
68
|
-
end
|
|
69
|
-
|
|
70
|
-
# Allow async responses to get through rack/lint
|
|
71
|
-
require 'rack/lint'
|
|
72
|
-
class Rack::Lint
|
|
73
|
-
def check_status_with_async(status)
|
|
74
|
-
check_status_without_async(status) unless status == -1
|
|
75
|
-
end
|
|
76
|
-
alias_method :check_status_without_async, :check_status
|
|
77
|
-
alias_method :check_status, :check_status_with_async
|
|
78
|
-
|
|
79
|
-
def check_content_type_with_async(status, headers)
|
|
80
|
-
check_content_type_without_async(status, headers) unless status == -1
|
|
81
|
-
end
|
|
82
|
-
alias_method :check_content_type_without_async, :check_content_type
|
|
83
|
-
alias_method :check_content_type, :check_content_type_with_async
|
|
84
|
-
end
|