firehose 0.1.1 → 0.2.alpha.2

Sign up to get free protection for your applications and to get access to all the features.
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