firehose 0.1.1 → 0.2.alpha.2

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 (49) hide show
  1. data/.env.sample +10 -0
  2. data/.gitignore +2 -0
  3. data/Procfile +1 -1
  4. data/README.md +117 -11
  5. data/config/rainbows.rb +20 -0
  6. data/firehose.gemspec +9 -6
  7. data/lib/assets/flash/firehose/WebSocketMain.swf +0 -0
  8. data/lib/assets/javascripts/firehose.js.coffee +4 -1
  9. data/lib/assets/javascripts/firehose/consumer.js.coffee +3 -11
  10. data/lib/assets/javascripts/firehose/lib/jquery.cors.headers.js.coffee +16 -0
  11. data/lib/assets/javascripts/firehose/lib/swfobject.js +4 -0
  12. data/lib/assets/javascripts/firehose/lib/web_socket.js +389 -0
  13. data/lib/assets/javascripts/firehose/long_poll.js.coffee +42 -39
  14. data/lib/assets/javascripts/firehose/transport.js.coffee +1 -1
  15. data/lib/assets/javascripts/firehose/web_socket.js.coffee +8 -14
  16. data/lib/firehose.rb +12 -17
  17. data/lib/firehose/channel.rb +84 -0
  18. data/lib/firehose/cli.rb +57 -13
  19. data/lib/firehose/client.rb +92 -0
  20. data/lib/firehose/default.rb +2 -2
  21. data/lib/firehose/logging.rb +35 -0
  22. data/lib/firehose/producer.rb +1 -0
  23. data/lib/firehose/publisher.rb +56 -4
  24. data/lib/firehose/rack.rb +37 -120
  25. data/lib/firehose/rack/consumer_app.rb +143 -0
  26. data/lib/firehose/rack/ping_app.rb +84 -0
  27. data/lib/firehose/rack/publisher_app.rb +40 -0
  28. data/lib/firehose/server.rb +48 -0
  29. data/lib/firehose/subscriber.rb +54 -0
  30. data/lib/firehose/swf_policy_request.rb +23 -0
  31. data/lib/firehose/version.rb +2 -2
  32. data/lib/rainbows_em_swf_policy.rb +33 -0
  33. data/lib/thin_em_swf_policy.rb +26 -0
  34. data/spec/integrations/integration_test_helper.rb +16 -0
  35. data/spec/integrations/rainbows_spec.rb +7 -0
  36. data/spec/integrations/shared_examples.rb +111 -0
  37. data/spec/integrations/thin_spec.rb +5 -79
  38. data/spec/lib/channel_spec.rb +164 -0
  39. data/spec/lib/client_spec.rb +9 -0
  40. data/spec/lib/default_spec.rb +2 -2
  41. data/spec/lib/publisher_spec.rb +82 -0
  42. data/spec/lib/rack/consumer_app_spec.rb +11 -0
  43. data/spec/lib/rack/ping_app_spec.rb +28 -0
  44. data/spec/lib/rack/publisher_app_spec.rb +26 -0
  45. data/spec/lib/subscriber_spec.rb +69 -0
  46. data/spec/spec_helper.rb +49 -8
  47. metadata +114 -45
  48. data/config.ru +0 -6
  49. data/lib/firehose/subscription.rb +0 -77
metadata CHANGED
@@ -1,31 +1,32 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: firehose
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
5
- prerelease:
4
+ version: 0.2.alpha.2
5
+ prerelease: 4
6
6
  platform: ruby
7
7
  authors:
8
8
  - Brad Gessler
9
9
  - Steel Fu
10
+ - Paul Cortens
10
11
  autorequire:
11
12
  bindir: bin
12
13
  cert_chain: []
13
- date: 2012-05-11 00:00:00.000000000 Z
14
+ date: 2012-06-20 00:00:00.000000000 Z
14
15
  dependencies:
15
16
  - !ruby/object:Gem::Dependency
16
17
  name: eventmachine
17
- requirement: &70305542896500 !ruby/object:Gem::Requirement
18
+ requirement: &70112078247400 !ruby/object:Gem::Requirement
18
19
  none: false
19
20
  requirements:
20
21
  - - ! '>='
21
22
  - !ruby/object:Gem::Version
22
- version: 1.0.0.beta
23
+ version: 1.0.0.rc
23
24
  type: :runtime
24
25
  prerelease: false
25
- version_requirements: *70305542896500
26
+ version_requirements: *70112078247400
26
27
  - !ruby/object:Gem::Dependency
27
28
  name: em-hiredis
28
- requirement: &70305536313020 !ruby/object:Gem::Requirement
29
+ requirement: &70112078246780 !ruby/object:Gem::Requirement
29
30
  none: false
30
31
  requirements:
31
32
  - - ! '>='
@@ -33,21 +34,10 @@ dependencies:
33
34
  version: '0'
34
35
  type: :runtime
35
36
  prerelease: false
36
- version_requirements: *70305536313020
37
- - !ruby/object:Gem::Dependency
38
- name: thin
39
- requirement: &70305536312560 !ruby/object:Gem::Requirement
40
- none: false
41
- requirements:
42
- - - ! '>='
43
- - !ruby/object:Gem::Version
44
- version: '0'
45
- type: :runtime
46
- prerelease: false
47
- version_requirements: *70305536312560
37
+ version_requirements: *70112078246780
48
38
  - !ruby/object:Gem::Dependency
49
39
  name: thor
50
- requirement: &70305536312140 !ruby/object:Gem::Requirement
40
+ requirement: &70112078245860 !ruby/object:Gem::Requirement
51
41
  none: false
52
42
  requirements:
53
43
  - - ! '>='
@@ -55,10 +45,10 @@ dependencies:
55
45
  version: '0'
56
46
  type: :runtime
57
47
  prerelease: false
58
- version_requirements: *70305536312140
48
+ version_requirements: *70112078245860
59
49
  - !ruby/object:Gem::Dependency
60
50
  name: faraday
61
- requirement: &70305536311720 !ruby/object:Gem::Requirement
51
+ requirement: &70112078245240 !ruby/object:Gem::Requirement
62
52
  none: false
63
53
  requirements:
64
54
  - - ! '>='
@@ -66,10 +56,10 @@ dependencies:
66
56
  version: '0'
67
57
  type: :runtime
68
58
  prerelease: false
69
- version_requirements: *70305536311720
59
+ version_requirements: *70112078245240
70
60
  - !ruby/object:Gem::Dependency
71
- name: websocket-rack
72
- requirement: &70305536311300 !ruby/object:Gem::Requirement
61
+ name: faye-websocket
62
+ requirement: &70112078244820 !ruby/object:Gem::Requirement
73
63
  none: false
74
64
  requirements:
75
65
  - - ! '>='
@@ -77,10 +67,10 @@ dependencies:
77
67
  version: '0'
78
68
  type: :runtime
79
69
  prerelease: false
80
- version_requirements: *70305536311300
70
+ version_requirements: *70112078244820
81
71
  - !ruby/object:Gem::Dependency
82
72
  name: em-http-request
83
- requirement: &70305536310800 !ruby/object:Gem::Requirement
73
+ requirement: &70112078244280 !ruby/object:Gem::Requirement
84
74
  none: false
85
75
  requirements:
86
76
  - - ~>
@@ -88,10 +78,10 @@ dependencies:
88
78
  version: 1.0.0
89
79
  type: :runtime
90
80
  prerelease: false
91
- version_requirements: *70305536310800
81
+ version_requirements: *70112078244280
92
82
  - !ruby/object:Gem::Dependency
93
83
  name: rspec
94
- requirement: &70305536310380 !ruby/object:Gem::Requirement
84
+ requirement: &70112078243780 !ruby/object:Gem::Requirement
95
85
  none: false
96
86
  requirements:
97
87
  - - ! '>='
@@ -99,10 +89,10 @@ dependencies:
99
89
  version: '0'
100
90
  type: :development
101
91
  prerelease: false
102
- version_requirements: *70305536310380
92
+ version_requirements: *70112078243780
103
93
  - !ruby/object:Gem::Dependency
104
94
  name: webmock
105
- requirement: &70305536309920 !ruby/object:Gem::Requirement
95
+ requirement: &70112078243260 !ruby/object:Gem::Requirement
106
96
  none: false
107
97
  requirements:
108
98
  - - ! '>='
@@ -110,10 +100,10 @@ dependencies:
110
100
  version: '0'
111
101
  type: :development
112
102
  prerelease: false
113
- version_requirements: *70305536309920
103
+ version_requirements: *70112078243260
114
104
  - !ruby/object:Gem::Dependency
115
105
  name: guard-rspec
116
- requirement: &70305536309500 !ruby/object:Gem::Requirement
106
+ requirement: &70112078242720 !ruby/object:Gem::Requirement
117
107
  none: false
118
108
  requirements:
119
109
  - - ! '>='
@@ -121,10 +111,10 @@ dependencies:
121
111
  version: '0'
122
112
  type: :development
123
113
  prerelease: false
124
- version_requirements: *70305536309500
114
+ version_requirements: *70112078242720
125
115
  - !ruby/object:Gem::Dependency
126
116
  name: guard-bundler
127
- requirement: &70305536309080 !ruby/object:Gem::Requirement
117
+ requirement: &70112078242200 !ruby/object:Gem::Requirement
128
118
  none: false
129
119
  requirements:
130
120
  - - ! '>='
@@ -132,10 +122,43 @@ dependencies:
132
122
  version: '0'
133
123
  type: :development
134
124
  prerelease: false
135
- version_requirements: *70305536309080
125
+ version_requirements: *70112078242200
136
126
  - !ruby/object:Gem::Dependency
137
127
  name: guard-coffeescript
138
- requirement: &70305536308660 !ruby/object:Gem::Requirement
128
+ requirement: &70112078241540 !ruby/object:Gem::Requirement
129
+ none: false
130
+ requirements:
131
+ - - ! '>='
132
+ - !ruby/object:Gem::Version
133
+ version: '0'
134
+ type: :development
135
+ prerelease: false
136
+ version_requirements: *70112078241540
137
+ - !ruby/object:Gem::Dependency
138
+ name: rainbows
139
+ requirement: &70112078240700 !ruby/object:Gem::Requirement
140
+ none: false
141
+ requirements:
142
+ - - ! '>='
143
+ - !ruby/object:Gem::Version
144
+ version: '0'
145
+ type: :development
146
+ prerelease: false
147
+ version_requirements: *70112078240700
148
+ - !ruby/object:Gem::Dependency
149
+ name: thin
150
+ requirement: &70112078240220 !ruby/object:Gem::Requirement
151
+ none: false
152
+ requirements:
153
+ - - ! '>='
154
+ - !ruby/object:Gem::Version
155
+ version: '0'
156
+ type: :development
157
+ prerelease: false
158
+ version_requirements: *70112078240220
159
+ - !ruby/object:Gem::Dependency
160
+ name: rack-test
161
+ requirement: &70112078239540 !ruby/object:Gem::Requirement
139
162
  none: false
140
163
  requirements:
141
164
  - - ! '>='
@@ -143,10 +166,10 @@ dependencies:
143
166
  version: '0'
144
167
  type: :development
145
168
  prerelease: false
146
- version_requirements: *70305536308660
169
+ version_requirements: *70112078239540
147
170
  - !ruby/object:Gem::Dependency
148
- name: em-websocket-client
149
- requirement: &70305536308240 !ruby/object:Gem::Requirement
171
+ name: async_rack_test
172
+ requirement: &70112078238640 !ruby/object:Gem::Requirement
150
173
  none: false
151
174
  requirements:
152
175
  - - ! '>='
@@ -154,17 +177,30 @@ dependencies:
154
177
  version: '0'
155
178
  type: :development
156
179
  prerelease: false
157
- version_requirements: *70305536308240
180
+ version_requirements: *70112078238640
181
+ - !ruby/object:Gem::Dependency
182
+ name: foreman
183
+ requirement: &70112078238000 !ruby/object:Gem::Requirement
184
+ none: false
185
+ requirements:
186
+ - - ! '>='
187
+ - !ruby/object:Gem::Version
188
+ version: '0'
189
+ type: :development
190
+ prerelease: false
191
+ version_requirements: *70112078238000
158
192
  description: Firehose is a realtime web application toolkit for building realtime
159
193
  Ruby web applications.
160
194
  email:
161
195
  - brad@polleverywhere.com
162
196
  - steel@polleverywhere.com
197
+ - paul@polleverywhere.com
163
198
  executables:
164
199
  - firehose
165
200
  extensions: []
166
201
  extra_rdoc_files: []
167
202
  files:
203
+ - .env.sample
168
204
  - .gitignore
169
205
  - .rbenv-version
170
206
  - .rspec
@@ -174,29 +210,52 @@ files:
174
210
  - README.md
175
211
  - Rakefile
176
212
  - bin/firehose
177
- - config.ru
213
+ - config/rainbows.rb
178
214
  - firehose.gemspec
179
215
  - lib/assets/flash/firehose/WebSocketMain.swf
180
216
  - lib/assets/javascripts/firehose.js.coffee
181
217
  - lib/assets/javascripts/firehose/base.js.coffee
182
218
  - lib/assets/javascripts/firehose/consumer.js.coffee
219
+ - lib/assets/javascripts/firehose/lib/jquery.cors.headers.js.coffee
220
+ - lib/assets/javascripts/firehose/lib/swfobject.js
221
+ - lib/assets/javascripts/firehose/lib/web_socket.js
183
222
  - lib/assets/javascripts/firehose/long_poll.js.coffee
184
223
  - lib/assets/javascripts/firehose/transport.js.coffee
185
224
  - lib/assets/javascripts/firehose/web_socket.js.coffee
186
225
  - lib/firehose.rb
226
+ - lib/firehose/channel.rb
187
227
  - lib/firehose/cli.rb
228
+ - lib/firehose/client.rb
188
229
  - lib/firehose/default.rb
230
+ - lib/firehose/logging.rb
189
231
  - lib/firehose/producer.rb
190
232
  - lib/firehose/publisher.rb
191
233
  - lib/firehose/rack.rb
234
+ - lib/firehose/rack/consumer_app.rb
235
+ - lib/firehose/rack/ping_app.rb
236
+ - lib/firehose/rack/publisher_app.rb
192
237
  - lib/firehose/rails.rb
193
- - lib/firehose/subscription.rb
238
+ - lib/firehose/server.rb
239
+ - lib/firehose/subscriber.rb
240
+ - lib/firehose/swf_policy_request.rb
194
241
  - lib/firehose/version.rb
242
+ - lib/rainbows_em_swf_policy.rb
243
+ - lib/thin_em_swf_policy.rb
244
+ - spec/integrations/integration_test_helper.rb
245
+ - spec/integrations/rainbows_spec.rb
246
+ - spec/integrations/shared_examples.rb
195
247
  - spec/integrations/thin_spec.rb
196
248
  - spec/lib/broker_spec.rb
249
+ - spec/lib/channel_spec.rb
250
+ - spec/lib/client_spec.rb
197
251
  - spec/lib/consumer_spec.rb
198
252
  - spec/lib/default_spec.rb
199
253
  - spec/lib/producer_spec.rb
254
+ - spec/lib/publisher_spec.rb
255
+ - spec/lib/rack/consumer_app_spec.rb
256
+ - spec/lib/rack/ping_app_spec.rb
257
+ - spec/lib/rack/publisher_app_spec.rb
258
+ - spec/lib/subscriber_spec.rb
200
259
  - spec/spec_helper.rb
201
260
  homepage: http://firehose.io/
202
261
  licenses: []
@@ -213,9 +272,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
213
272
  required_rubygems_version: !ruby/object:Gem::Requirement
214
273
  none: false
215
274
  requirements:
216
- - - ! '>='
275
+ - - ! '>'
217
276
  - !ruby/object:Gem::Version
218
- version: '0'
277
+ version: 1.3.1
219
278
  requirements: []
220
279
  rubyforge_project: firehose
221
280
  rubygems_version: 1.8.11
@@ -223,9 +282,19 @@ signing_key:
223
282
  specification_version: 3
224
283
  summary: Build realtime Ruby web applications
225
284
  test_files:
285
+ - spec/integrations/integration_test_helper.rb
286
+ - spec/integrations/rainbows_spec.rb
287
+ - spec/integrations/shared_examples.rb
226
288
  - spec/integrations/thin_spec.rb
227
289
  - spec/lib/broker_spec.rb
290
+ - spec/lib/channel_spec.rb
291
+ - spec/lib/client_spec.rb
228
292
  - spec/lib/consumer_spec.rb
229
293
  - spec/lib/default_spec.rb
230
294
  - spec/lib/producer_spec.rb
295
+ - spec/lib/publisher_spec.rb
296
+ - spec/lib/rack/consumer_app_spec.rb
297
+ - spec/lib/rack/ping_app_spec.rb
298
+ - spec/lib/rack/publisher_app_spec.rb
299
+ - spec/lib/subscriber_spec.rb
231
300
  - spec/spec_helper.rb
data/config.ru DELETED
@@ -1,6 +0,0 @@
1
- require 'firehose'
2
- require 'rack'
3
-
4
- use Rack::Reloader
5
-
6
- run Firehose::Rack::App.new
@@ -1,77 +0,0 @@
1
- module Firehose
2
- class Subscription
3
- # consumer_id and channel for the subscription.
4
- attr_reader :consumer_id
5
-
6
- # Channel that we'll use for the pub-sub activity. This probably maps to an URL
7
- attr_reader :channel
8
-
9
- def initialize(consumer_id, channel)
10
- @consumer_id, @channel = consumer_id, channel
11
- end
12
-
13
- # Subscribe to messages on the backend to fill up the subscription queue. consumer_ids of the messages
14
- # will queue up units of "work" to process data from the subscription.
15
- def subscribe(&block)
16
- redis.subscribe(channel)
17
- redis.on(:message) do |channel, message|
18
- Firehose.logger.debug "Redis recieved `#{message}` to `#{consumer_id}@#{channel}`"
19
- block.call message, self
20
- end
21
- Firehose.logger.debug "Redis subscribed to `#{consumer_id}@#{channel}`"
22
- self # Return the subscription for chaining.
23
- end
24
-
25
- def unsubscribe(&block)
26
- redis.unsubscribe(channel)
27
- Firehose.logger.debug "Redis unsubscribed from `#{consumer_id}@#{channel}`"
28
- redis.close_connection
29
- @redis = nil
30
- block.call(self) if block
31
- self
32
- end
33
-
34
- private
35
- def redis
36
- @redis ||= EM::Hiredis.connect
37
- end
38
- end
39
-
40
- # Queue subscription messages so that we can remember and/or operate on them
41
- class Subscription::Queue
42
- attr_reader :subscription, :channel
43
-
44
- def initialize(consumer_id, channel)
45
- @subscription = Subscription.new(consumer_id, channel)
46
- # Start the subscription and start dropping mesasge onto the queue
47
- subscription.subscribe do |message|
48
- queue.push message
49
- end
50
- end
51
-
52
- # Pop an item off the subscription queue so we can work on it.
53
- def pop(&block)
54
- queue.pop do |message|
55
- block.call message, subscription
56
- end
57
- end
58
-
59
- # Kill the queue in n seconds.
60
- def kill(ttl=0, &block)
61
- if ttl.zero?
62
- subscription.unsubscribe &block
63
- else
64
- @timer = EM::Timer.new(ttl){ kill 0 }
65
- end
66
- end
67
-
68
- def live
69
- @timer.cancel if @timer
70
- end
71
-
72
- private
73
- def queue
74
- @queue ||= EM::Queue.new
75
- end
76
- end
77
- end