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.
- data/.env.sample +10 -0
- data/.gitignore +2 -0
- data/Procfile +1 -1
- data/README.md +117 -11
- data/config/rainbows.rb +20 -0
- data/firehose.gemspec +9 -6
- data/lib/assets/flash/firehose/WebSocketMain.swf +0 -0
- data/lib/assets/javascripts/firehose.js.coffee +4 -1
- data/lib/assets/javascripts/firehose/consumer.js.coffee +3 -11
- data/lib/assets/javascripts/firehose/lib/jquery.cors.headers.js.coffee +16 -0
- data/lib/assets/javascripts/firehose/lib/swfobject.js +4 -0
- data/lib/assets/javascripts/firehose/lib/web_socket.js +389 -0
- data/lib/assets/javascripts/firehose/long_poll.js.coffee +42 -39
- data/lib/assets/javascripts/firehose/transport.js.coffee +1 -1
- data/lib/assets/javascripts/firehose/web_socket.js.coffee +8 -14
- data/lib/firehose.rb +12 -17
- data/lib/firehose/channel.rb +84 -0
- data/lib/firehose/cli.rb +57 -13
- data/lib/firehose/client.rb +92 -0
- data/lib/firehose/default.rb +2 -2
- data/lib/firehose/logging.rb +35 -0
- data/lib/firehose/producer.rb +1 -0
- data/lib/firehose/publisher.rb +56 -4
- data/lib/firehose/rack.rb +37 -120
- data/lib/firehose/rack/consumer_app.rb +143 -0
- data/lib/firehose/rack/ping_app.rb +84 -0
- data/lib/firehose/rack/publisher_app.rb +40 -0
- data/lib/firehose/server.rb +48 -0
- data/lib/firehose/subscriber.rb +54 -0
- data/lib/firehose/swf_policy_request.rb +23 -0
- data/lib/firehose/version.rb +2 -2
- data/lib/rainbows_em_swf_policy.rb +33 -0
- data/lib/thin_em_swf_policy.rb +26 -0
- data/spec/integrations/integration_test_helper.rb +16 -0
- data/spec/integrations/rainbows_spec.rb +7 -0
- data/spec/integrations/shared_examples.rb +111 -0
- data/spec/integrations/thin_spec.rb +5 -79
- data/spec/lib/channel_spec.rb +164 -0
- data/spec/lib/client_spec.rb +9 -0
- data/spec/lib/default_spec.rb +2 -2
- data/spec/lib/publisher_spec.rb +82 -0
- data/spec/lib/rack/consumer_app_spec.rb +11 -0
- data/spec/lib/rack/ping_app_spec.rb +28 -0
- data/spec/lib/rack/publisher_app_spec.rb +26 -0
- data/spec/lib/subscriber_spec.rb +69 -0
- data/spec/spec_helper.rb +49 -8
- metadata +114 -45
- data/config.ru +0 -6
- 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.
|
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-
|
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: &
|
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.
|
23
|
+
version: 1.0.0.rc
|
23
24
|
type: :runtime
|
24
25
|
prerelease: false
|
25
|
-
version_requirements: *
|
26
|
+
version_requirements: *70112078247400
|
26
27
|
- !ruby/object:Gem::Dependency
|
27
28
|
name: em-hiredis
|
28
|
-
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: *
|
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: &
|
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: *
|
48
|
+
version_requirements: *70112078245860
|
59
49
|
- !ruby/object:Gem::Dependency
|
60
50
|
name: faraday
|
61
|
-
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: *
|
59
|
+
version_requirements: *70112078245240
|
70
60
|
- !ruby/object:Gem::Dependency
|
71
|
-
name: websocket
|
72
|
-
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: *
|
70
|
+
version_requirements: *70112078244820
|
81
71
|
- !ruby/object:Gem::Dependency
|
82
72
|
name: em-http-request
|
83
|
-
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: *
|
81
|
+
version_requirements: *70112078244280
|
92
82
|
- !ruby/object:Gem::Dependency
|
93
83
|
name: rspec
|
94
|
-
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: *
|
92
|
+
version_requirements: *70112078243780
|
103
93
|
- !ruby/object:Gem::Dependency
|
104
94
|
name: webmock
|
105
|
-
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: *
|
103
|
+
version_requirements: *70112078243260
|
114
104
|
- !ruby/object:Gem::Dependency
|
115
105
|
name: guard-rspec
|
116
|
-
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: *
|
114
|
+
version_requirements: *70112078242720
|
125
115
|
- !ruby/object:Gem::Dependency
|
126
116
|
name: guard-bundler
|
127
|
-
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: *
|
125
|
+
version_requirements: *70112078242200
|
136
126
|
- !ruby/object:Gem::Dependency
|
137
127
|
name: guard-coffeescript
|
138
|
-
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: *
|
169
|
+
version_requirements: *70112078239540
|
147
170
|
- !ruby/object:Gem::Dependency
|
148
|
-
name:
|
149
|
-
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: *
|
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.
|
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/
|
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:
|
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,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
|