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
data/.ruby-version
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
2.3.0
|
data/.travis.yml
CHANGED
@@ -1,16 +1,12 @@
|
|
1
1
|
language: ruby
|
2
2
|
|
3
3
|
rvm:
|
4
|
-
- 1.
|
5
|
-
- 2.
|
6
|
-
- 2.1
|
4
|
+
- 2.1.10
|
5
|
+
- 2.2.5
|
6
|
+
- 2.3.1
|
7
7
|
|
8
8
|
services:
|
9
9
|
- redis-server
|
10
10
|
|
11
|
-
before_script:
|
12
|
-
- bundle exec rake travis:prepare
|
13
|
-
|
14
11
|
script:
|
15
12
|
- bundle exec rake spec
|
16
|
-
- xvfb-run bundle exec rake evergreen:run
|
data/CHANGELOG.md
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
## master
|
2
|
+
|
3
|
+
- Configuration of Redis via the `Firehose::Server.redis` object.
|
4
|
+
- Less rubygem dependencies: JSON gem removed because its included in Ruby 2.x
|
5
|
+
- DEPRECATED: `firehose javascript` command will be removed. Those have been moved to https://github.com/firehoseio/js_client.
|
6
|
+
|
7
|
+
## 1.3.6
|
8
|
+
|
9
|
+
- DEPRECATION WARNING: `firehose javascript` has been removed from this project.
|
10
|
+
- BUG: The null message bug fix in 1.3.5 introduce different behavior into the messages delivered when a client reconnects with a last_sequence. This has been corrected and 1.3.5 will be yanked.
|
11
|
+
|
12
|
+
## 1.3.5
|
13
|
+
|
14
|
+
- Fix bug where null messages are sent over WebSockets to client. Issue https://github.com/firehoseio/firehose/issues/51.
|
15
|
+
- Drop support for Ruby 1.9.3. Documented official Ruby support policy in README.md
|
data/Dockerfile
ADDED
data/Gemfile
CHANGED
data/Procfile.dev
CHANGED
data/README.md
CHANGED
@@ -1,13 +1,13 @@
|
|
1
|
-
__ _ _
|
2
|
-
/ _(_) | |
|
3
|
-
| |_ _ _ __ ___| |__ ___ ___ ___
|
1
|
+
__ _ _
|
2
|
+
/ _(_) | |
|
3
|
+
| |_ _ _ __ ___| |__ ___ ___ ___
|
4
4
|
| _| | '__/ _ \ '_ \ / _ \/ __|/ _ \
|
5
5
|
| | | | | | __/ | | | (_) \__ \ __/
|
6
6
|
|_| |_|_| \___|_| |_|\___/|___/\___|
|
7
|
-
|
7
|
+
|
8
8
|
Build realtime web applications in Ruby and JS
|
9
9
|
|
10
|
-
[](https://travis-ci.org/firehoseio/firehose) [](https://codeclimate.com/github/firehoseio/firehose) [](https://codeclimate.com/github/firehoseio/firehose/coverage)
|
11
11
|
|
12
12
|
# What is Firehose?
|
13
13
|
|
@@ -90,6 +90,53 @@ new Firehose.Consumer({
|
|
90
90
|
}).connect();
|
91
91
|
```
|
92
92
|
|
93
|
+
There's also a Consumer that uses channel multiplexing.
|
94
|
+
The multiplexed consumer is useful for scenarios where you want to subscribe
|
95
|
+
to messages from many channels at once, without having to use one connection
|
96
|
+
per channel. You can specify a list of channels to subscribe to, including a
|
97
|
+
handler function per channel that gets called with all messages coming from that
|
98
|
+
channel.
|
99
|
+
|
100
|
+
Example:
|
101
|
+
|
102
|
+
```javascript
|
103
|
+
new Firehose.MultiplexedConsumer({
|
104
|
+
connected: function(){
|
105
|
+
console.log("Great Scotts!! We're connected!");
|
106
|
+
},
|
107
|
+
disconnected: function(){
|
108
|
+
console.log("Well shucks, we're not connected anymore");
|
109
|
+
},
|
110
|
+
error: function(){
|
111
|
+
console.log("Well then, something went horribly wrong.");
|
112
|
+
},
|
113
|
+
// Note that we don't specify a general message handler function
|
114
|
+
// but instead define one per channel below
|
115
|
+
|
116
|
+
// Note that we do NOT specify a protocol here because we don't
|
117
|
+
// know that yet. We also don't specify a specific channel name as part of
|
118
|
+
// the URI but instead pass in a list of subscriptions below
|
119
|
+
uri: '//localhost:7474/',
|
120
|
+
|
121
|
+
// List of channel subscriptions:
|
122
|
+
channels: {
|
123
|
+
"/my/channel/1": {
|
124
|
+
last_sequence: 10, // defaults to 0 and can be ommitted
|
125
|
+
message: function(msg) {
|
126
|
+
console.log("got message on channel 1:");
|
127
|
+
console.log(msg);
|
128
|
+
}
|
129
|
+
},
|
130
|
+
"/my/channel/2": {
|
131
|
+
message: function(msg) {
|
132
|
+
console.log("got message on channel 2:");
|
133
|
+
console.log(msg);
|
134
|
+
}
|
135
|
+
}
|
136
|
+
}
|
137
|
+
}).connect();
|
138
|
+
```
|
139
|
+
|
93
140
|
Then publish another message.
|
94
141
|
|
95
142
|
```sh
|
@@ -120,7 +167,7 @@ Firehose can be configured via environmental variables. Take a look at the [`.en
|
|
120
167
|
|
121
168
|
## Rack Configuration
|
122
169
|
|
123
|
-
There are two rack applications that are included with Firehose: `Firehose::Rack::Producer` which a client can `PUT` HTTP request with message payloads to publish information on Firehose and the `Firehose::Rack::Consumer` application which a client connects to via
|
170
|
+
There are two rack applications that are included with Firehose: `Firehose::Rack::Producer` which a client can `PUT` HTTP request with message payloads to publish information on Firehose and the `Firehose::Rack::Consumer` application which a client connects to via HTTP long polling or WebSockets to consume a message.
|
124
171
|
|
125
172
|
### Consumer Configuration
|
126
173
|
|
@@ -208,7 +255,7 @@ end
|
|
208
255
|
|
209
256
|
# Deployment
|
210
257
|
|
211
|
-
The recommended method
|
258
|
+
The recommended method ofGdeploying firehose is to deploy it separately from your main app.
|
212
259
|
|
213
260
|
1. Create a new project with a Gemfile such as
|
214
261
|
|
@@ -216,7 +263,7 @@ The recommended method of deploying firehose is to deploy it separately from you
|
|
216
263
|
gem "firehose"
|
217
264
|
gem "airbrake"
|
218
265
|
gem "rainbows", :require => false
|
219
|
-
gem "rack", "~> 1.4.0" # if you're using Rainbows. See https://github.com/
|
266
|
+
gem "rack", "~> 1.4.0" # if you're using Rainbows. See https://github.com/firehoseio/firehose/commit/dfe55fff
|
220
267
|
gem "foreman", :require => false
|
221
268
|
gem "capistrano", :require => false
|
222
269
|
```
|
@@ -226,3 +273,14 @@ Of course, you could use `exceptional` instead of `airbrake` and `thin` instead
|
|
226
273
|
2. Set up `config/deploy.rb` to your liking. You can follow most directions for using Capistrano and Foreman to deploy Rack apps, such as https://gist.github.com/1027117
|
227
274
|
|
228
275
|
3. Set up `config/rainbows.rb` (if you are using Rainbows!). The gem includes example configurations scripts to get you started. There's also an example at https://gist.github.com/bradgessler/f2416efdbb1771e983b3.
|
276
|
+
|
277
|
+
# New releases & version bump
|
278
|
+
|
279
|
+
For a new release of Firehose, bump the version number in `lib/firehose/version.rb` as well as `package.json`.
|
280
|
+
Make sure, they have the same version number.
|
281
|
+
|
282
|
+
# Support
|
283
|
+
|
284
|
+
## Ruby version
|
285
|
+
|
286
|
+
Firehose will support the latest minor 2.x revisions of Ruby that are officially supported by the Ruby community. More details at https://www.ruby-lang.org/.
|
data/Rakefile
CHANGED
@@ -3,51 +3,62 @@ require 'bundler/gem_tasks'
|
|
3
3
|
require 'rspec/core/rake_task'
|
4
4
|
require 'coffee-script'
|
5
5
|
|
6
|
+
task :default => :spec
|
7
|
+
task :debug => ["spec:debug"]
|
8
|
+
task :ci => ["spec:ci"]
|
6
9
|
|
7
|
-
task :
|
10
|
+
task :spec => ["spec:all"]
|
8
11
|
|
12
|
+
namespace :js do
|
13
|
+
desc "Compile *.js.coffee.erb files"
|
14
|
+
task :compile_erb do
|
15
|
+
require 'erb'
|
16
|
+
require_relative "lib/firehose"
|
9
17
|
|
10
|
-
|
11
|
-
task :spec do
|
12
|
-
sh 'rspec spec'
|
13
|
-
end
|
18
|
+
erb_files = Dir.glob("lib/assets/javascripts/**/*.erb")
|
14
19
|
|
20
|
+
erb_files.each do |template_file|
|
21
|
+
output_file = template_file.split(".erb")[0]
|
22
|
+
puts "ERB compile #{template_file} => #{output_file}"
|
15
23
|
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
24
|
+
renderer = ERB.new File.read(template_file)
|
25
|
+
File.open(output_file, "w+") do |f|
|
26
|
+
f.puts renderer.result
|
27
|
+
end
|
28
|
+
end
|
20
29
|
end
|
30
|
+
end
|
31
|
+
|
32
|
+
namespace :spec do
|
33
|
+
desc "Run all specs"
|
34
|
+
task :all => [:ruby, "js:run"]
|
21
35
|
|
22
|
-
desc '
|
23
|
-
task :
|
24
|
-
sh '
|
36
|
+
desc 'run Rspec specs'
|
37
|
+
task :ruby do
|
38
|
+
sh 'rspec spec'
|
25
39
|
end
|
26
|
-
end
|
27
40
|
|
41
|
+
task :js => "js:run"
|
28
42
|
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
sh "mkdir -p public/javascripts/firehose"
|
43
|
+
# desc "Run specs with Karma runner"
|
44
|
+
namespace :js do
|
45
|
+
task :setup => "js:compile_erb" do
|
46
|
+
sh %[npm install]
|
47
|
+
end
|
35
48
|
|
36
|
-
|
37
|
-
|
38
|
-
|
49
|
+
desc "CI specs run on PhantomJS"
|
50
|
+
task :ci => :setup do
|
51
|
+
sh %[./node_modules/karma/bin/karma start karma.config.coffee --browsers PhantomJS --single-run --reporters dots,junit]
|
52
|
+
end
|
39
53
|
|
40
|
-
|
41
|
-
|
42
|
-
|
54
|
+
desc "Run local specs in PhantomJS"
|
55
|
+
task :run => :setup do
|
56
|
+
sh %[./node_modules/karma/bin/karma start karma.config.coffee --browsers PhantomJS --single-run]
|
43
57
|
end
|
44
58
|
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
'lib/assets/javascripts/vendor/*.js'
|
49
|
-
] do |js_file|
|
50
|
-
sh "cp #{js_file} public/javascripts/vendor"
|
59
|
+
desc "Run local specs in Chrome and leaves the window open for debugging"
|
60
|
+
task :debug => :setup do
|
61
|
+
sh %[./node_modules/karma/bin/karma start karma.config.coffee --browsers Chrome]
|
51
62
|
end
|
52
63
|
end
|
53
|
-
end
|
64
|
+
end
|
data/coffeelint.json
ADDED
@@ -0,0 +1,129 @@
|
|
1
|
+
{
|
2
|
+
"arrow_spacing": {
|
3
|
+
"level": "ignore"
|
4
|
+
},
|
5
|
+
"braces_spacing": {
|
6
|
+
"level": "ignore",
|
7
|
+
"spaces": 0,
|
8
|
+
"empty_object_spaces": 0
|
9
|
+
},
|
10
|
+
"camel_case_classes": {
|
11
|
+
"level": "error"
|
12
|
+
},
|
13
|
+
"coffeescript_error": {
|
14
|
+
"level": "error"
|
15
|
+
},
|
16
|
+
"colon_assignment_spacing": {
|
17
|
+
"level": "ignore",
|
18
|
+
"spacing": {
|
19
|
+
"left": 0,
|
20
|
+
"right": 0
|
21
|
+
}
|
22
|
+
},
|
23
|
+
"cyclomatic_complexity": {
|
24
|
+
"value": 10,
|
25
|
+
"level": "ignore"
|
26
|
+
},
|
27
|
+
"duplicate_key": {
|
28
|
+
"level": "error"
|
29
|
+
},
|
30
|
+
"empty_constructor_needs_parens": {
|
31
|
+
"level": "ignore"
|
32
|
+
},
|
33
|
+
"ensure_comprehensions": {
|
34
|
+
"level": "warn"
|
35
|
+
},
|
36
|
+
"eol_last": {
|
37
|
+
"level": "ignore"
|
38
|
+
},
|
39
|
+
"indentation": {
|
40
|
+
"value": 2,
|
41
|
+
"level": "error"
|
42
|
+
},
|
43
|
+
"line_endings": {
|
44
|
+
"level": "ignore",
|
45
|
+
"value": "unix"
|
46
|
+
},
|
47
|
+
"max_line_length": {
|
48
|
+
"value": 80,
|
49
|
+
"level": "error",
|
50
|
+
"limitComments": true
|
51
|
+
},
|
52
|
+
"missing_fat_arrows": {
|
53
|
+
"level": "ignore",
|
54
|
+
"is_strict": false
|
55
|
+
},
|
56
|
+
"newlines_after_classes": {
|
57
|
+
"value": 3,
|
58
|
+
"level": "ignore"
|
59
|
+
},
|
60
|
+
"no_backticks": {
|
61
|
+
"level": "error"
|
62
|
+
},
|
63
|
+
"no_debugger": {
|
64
|
+
"level": "warn",
|
65
|
+
"console": false
|
66
|
+
},
|
67
|
+
"no_empty_functions": {
|
68
|
+
"level": "ignore"
|
69
|
+
},
|
70
|
+
"no_empty_param_list": {
|
71
|
+
"level": "ignore"
|
72
|
+
},
|
73
|
+
"no_implicit_braces": {
|
74
|
+
"level": "ignore",
|
75
|
+
"strict": true
|
76
|
+
},
|
77
|
+
"no_implicit_parens": {
|
78
|
+
"strict": true,
|
79
|
+
"level": "ignore"
|
80
|
+
},
|
81
|
+
"no_interpolation_in_single_quotes": {
|
82
|
+
"level": "ignore"
|
83
|
+
},
|
84
|
+
"no_plusplus": {
|
85
|
+
"level": "ignore"
|
86
|
+
},
|
87
|
+
"no_stand_alone_at": {
|
88
|
+
"level": "ignore"
|
89
|
+
},
|
90
|
+
"no_tabs": {
|
91
|
+
"level": "error"
|
92
|
+
},
|
93
|
+
"no_this": {
|
94
|
+
"level": "ignore"
|
95
|
+
},
|
96
|
+
"no_throwing_strings": {
|
97
|
+
"level": "error"
|
98
|
+
},
|
99
|
+
"no_trailing_semicolons": {
|
100
|
+
"level": "error"
|
101
|
+
},
|
102
|
+
"no_trailing_whitespace": {
|
103
|
+
"level": "error",
|
104
|
+
"allowed_in_comments": false,
|
105
|
+
"allowed_in_empty_lines": true
|
106
|
+
},
|
107
|
+
"no_unnecessary_double_quotes": {
|
108
|
+
"level": "ignore"
|
109
|
+
},
|
110
|
+
"no_unnecessary_fat_arrows": {
|
111
|
+
"level": "warn"
|
112
|
+
},
|
113
|
+
"non_empty_constructor_needs_parens": {
|
114
|
+
"level": "ignore"
|
115
|
+
},
|
116
|
+
"prefer_english_operator": {
|
117
|
+
"level": "ignore",
|
118
|
+
"doubleNotLevel": "ignore"
|
119
|
+
},
|
120
|
+
"space_operators": {
|
121
|
+
"level": "ignore"
|
122
|
+
},
|
123
|
+
"spacing_after_comma": {
|
124
|
+
"level": "ignore"
|
125
|
+
},
|
126
|
+
"transform_messes_up_line_numbers": {
|
127
|
+
"level": "warn"
|
128
|
+
}
|
129
|
+
}
|
data/docker-compose.yml
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
# Isolated development and test environment.
|
2
|
+
version: '2'
|
3
|
+
services:
|
4
|
+
firehose:
|
5
|
+
build: .
|
6
|
+
depends_on:
|
7
|
+
- redis
|
8
|
+
environment:
|
9
|
+
REDIS_URL: redis://redis:6379/0
|
10
|
+
ports:
|
11
|
+
- 7474
|
12
|
+
volumes:
|
13
|
+
- .:/firehose/
|
14
|
+
redis:
|
15
|
+
image: redis
|
16
|
+
expose:
|
17
|
+
- 6379
|
data/firehose.gemspec
CHANGED
@@ -5,8 +5,8 @@ require "firehose/version"
|
|
5
5
|
Gem::Specification.new do |s|
|
6
6
|
s.name = "firehose"
|
7
7
|
s.version = Firehose::VERSION
|
8
|
-
s.authors = ["Brad Gessler", "Steel Fu", "Paul Cortens", "Zach Zolton"]
|
9
|
-
s.email = ["brad@polleverywhere.com", "steel@polleverywhere.com", "paul@polleverywhere.com", "zach@polleverywhere.com"]
|
8
|
+
s.authors = ["Brad Gessler", "Steel Fu", "Paul Cortens", "Zach Zolton", "Christopher Bertels"]
|
9
|
+
s.email = ["brad@polleverywhere.com", "steel@polleverywhere.com", "paul@polleverywhere.com", "zach@polleverywhere.com", "christopher@polleverywhere.com"]
|
10
10
|
s.homepage = "http://firehose.io/"
|
11
11
|
s.summary = %q{Build realtime Ruby web applications}
|
12
12
|
s.description = %q{Firehose is a realtime web application toolkit for building realtime Ruby web applications.}
|
@@ -23,19 +23,16 @@ Gem::Specification.new do |s|
|
|
23
23
|
s.add_runtime_dependency "eventmachine", ">= 1.0.0"
|
24
24
|
s.add_runtime_dependency "em-hiredis", ">= 0.2.0"
|
25
25
|
s.add_runtime_dependency "thor"
|
26
|
-
|
26
|
+
# faraday 0.9.1 causes some specs to fail
|
27
|
+
# need to investigate this further
|
28
|
+
s.add_runtime_dependency "faraday", "0.9.0"
|
27
29
|
s.add_runtime_dependency "faye-websocket"
|
28
30
|
s.add_runtime_dependency "em-http-request", ">= 1.0.0"
|
29
|
-
s.add_runtime_dependency "json"
|
30
31
|
s.add_runtime_dependency "rack"
|
31
32
|
|
32
33
|
s.add_development_dependency "rspec", "~> 2"
|
33
34
|
s.add_development_dependency "webmock"
|
34
35
|
s.add_development_dependency "coffee-script"
|
35
|
-
s.add_development_dependency "guard-rspec"
|
36
|
-
s.add_development_dependency "guard-bundler"
|
37
|
-
s.add_development_dependency "guard-coffeescript"
|
38
|
-
s.add_development_dependency "guard-copy"
|
39
36
|
s.add_development_dependency "rainbows", "~> 4.4.3"
|
40
37
|
s.add_development_dependency "thin"
|
41
38
|
s.add_development_dependency "rack-test"
|
@@ -43,7 +40,6 @@ Gem::Specification.new do |s|
|
|
43
40
|
s.add_development_dependency "foreman"
|
44
41
|
s.add_development_dependency "sprockets"
|
45
42
|
s.add_development_dependency "rake"
|
46
|
-
s.add_development_dependency "evergreen"
|
47
43
|
s.add_development_dependency "capybara-webkit"
|
48
44
|
s.add_development_dependency "therubyracer"
|
49
45
|
end
|