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.
- 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
|