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.
Files changed (104) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGELOG.md +31 -10
  3. data/{LICENSE.txt → LICENSE} +6 -6
  4. data/README.md +379 -187
  5. data/app/assets/javascripts/firehose.js +258 -0
  6. data/config/importmap.rb +1 -0
  7. data/db/migrate/20260214185244_create_firehose_events.rb +23 -0
  8. data/lib/commands/firehose_command.rb +119 -0
  9. data/lib/firehose/channel.rb +40 -0
  10. data/lib/firehose/cleanup_job.rb +21 -0
  11. data/lib/firehose/engine.rb +36 -0
  12. data/lib/firehose/helper.rb +40 -0
  13. data/lib/firehose/models/channel.rb +12 -0
  14. data/lib/firehose/models/message.rb +11 -0
  15. data/lib/firehose/queue.rb +44 -0
  16. data/lib/firehose/server.rb +930 -17
  17. data/lib/firehose/sse.rb +187 -0
  18. data/lib/firehose/stream.rb +32 -0
  19. data/lib/firehose/streamable.rb +25 -0
  20. data/lib/firehose/websocket.rb +242 -0
  21. data/lib/firehose.rb +67 -15
  22. data/lib/generators/firehose/install/install_generator.rb +43 -0
  23. data/lib/generators/firehose/install/templates/firehose_controller.rb +16 -0
  24. metadata +39 -366
  25. data/.codeclimate.yml +0 -29
  26. data/.dockerignore +0 -2
  27. data/.env.sample +0 -17
  28. data/.gitignore +0 -14
  29. data/.rspec +0 -1
  30. data/.rubocop.yml +0 -1156
  31. data/.ruby-version +0 -1
  32. data/.travis.yml +0 -12
  33. data/Dockerfile +0 -11
  34. data/Gemfile +0 -6
  35. data/Procfile +0 -1
  36. data/Procfile.dev +0 -3
  37. data/Rakefile +0 -64
  38. data/bin/firehose +0 -9
  39. data/coffeelint.json +0 -129
  40. data/config/rainbows.rb +0 -17
  41. data/docker-compose.yml +0 -17
  42. data/firehose.gemspec +0 -45
  43. data/karma.config.coffee +0 -89
  44. data/lib/assets/javascripts/firehose/base.js.coffee +0 -4
  45. data/lib/assets/javascripts/firehose/consumer.js.coffee +0 -86
  46. data/lib/assets/javascripts/firehose/core.js.coffee +0 -6
  47. data/lib/assets/javascripts/firehose/long_poll.js.coffee +0 -210
  48. data/lib/assets/javascripts/firehose/multiplexed_consumer.js.coffee +0 -74
  49. data/lib/assets/javascripts/firehose/transport.js.coffee +0 -44
  50. data/lib/assets/javascripts/firehose/version.js.coffee.erb +0 -2
  51. data/lib/assets/javascripts/firehose/web_socket.js.coffee +0 -148
  52. data/lib/assets/javascripts/firehose.js.coffee +0 -2
  53. data/lib/firehose/assets.rb +0 -56
  54. data/lib/firehose/cli.rb +0 -79
  55. data/lib/firehose/client/consumer.rb +0 -94
  56. data/lib/firehose/client/producer.rb +0 -114
  57. data/lib/firehose/client.rb +0 -10
  58. data/lib/firehose/logging.rb +0 -32
  59. data/lib/firehose/rack/app.rb +0 -49
  60. data/lib/firehose/rack/consumer/http_long_poll.rb +0 -159
  61. data/lib/firehose/rack/consumer/web_socket.rb +0 -200
  62. data/lib/firehose/rack/consumer.rb +0 -78
  63. data/lib/firehose/rack/ping.rb +0 -88
  64. data/lib/firehose/rack/publisher.rb +0 -59
  65. data/lib/firehose/rack.rb +0 -32
  66. data/lib/firehose/rails.rb +0 -7
  67. data/lib/firehose/server/app.rb +0 -52
  68. data/lib/firehose/server/channel.rb +0 -72
  69. data/lib/firehose/server/message_buffer.rb +0 -59
  70. data/lib/firehose/server/publisher.rb +0 -133
  71. data/lib/firehose/server/redis.rb +0 -32
  72. data/lib/firehose/server/subscriber.rb +0 -51
  73. data/lib/firehose/version.rb +0 -4
  74. data/package.json +0 -17
  75. data/spec/integrations/integration_test_helper.rb +0 -22
  76. data/spec/integrations/rainbows_spec.rb +0 -7
  77. data/spec/integrations/shared_examples.rb +0 -202
  78. data/spec/integrations/thin_spec.rb +0 -7
  79. data/spec/javascripts/firehose/base_spec.coffee +0 -2
  80. data/spec/javascripts/firehose/consumer_spec.coffee +0 -45
  81. data/spec/javascripts/firehose/long_poll_spec.coffee +0 -44
  82. data/spec/javascripts/firehose/multiplexed_consumer_spec.coffee +0 -72
  83. data/spec/javascripts/firehose/transport_spec.coffee +0 -30
  84. data/spec/javascripts/firehose/websocket_spec.coffee +0 -27
  85. data/spec/javascripts/helpers/spec_helper.js +0 -31
  86. data/spec/javascripts/support/jquery-1.11.1.js +0 -10308
  87. data/spec/javascripts/support/json2.js +0 -487
  88. data/spec/javascripts/support/sinon-1.7.3.js +0 -4290
  89. data/spec/javascripts/support/spec_helper.coffee +0 -3
  90. data/spec/lib/assets_spec.rb +0 -35
  91. data/spec/lib/client/consumer_spec.rb +0 -13
  92. data/spec/lib/client/producer_spec.rb +0 -71
  93. data/spec/lib/firehose_spec.rb +0 -7
  94. data/spec/lib/rack/consumer/http_long_poll_spec.rb +0 -30
  95. data/spec/lib/rack/consumer_spec.rb +0 -19
  96. data/spec/lib/rack/ping_spec.rb +0 -28
  97. data/spec/lib/rack/publisher_spec.rb +0 -34
  98. data/spec/lib/server/app_spec.rb +0 -15
  99. data/spec/lib/server/channel_spec.rb +0 -178
  100. data/spec/lib/server/message_buffer_spec.rb +0 -148
  101. data/spec/lib/server/publisher_spec.rb +0 -91
  102. data/spec/lib/server/redis_spec.rb +0 -13
  103. data/spec/lib/server/subscriber_spec.rb +0 -70
  104. 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