faye-huboard 1.0.4

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,69 @@
1
+ module Faye
2
+
3
+ class Transport::Http < Transport
4
+ def self.usable?(dispatcher, endpoint, &callback)
5
+ callback.call(URI === endpoint)
6
+ end
7
+
8
+ def encode(messages)
9
+ Faye.to_json(messages)
10
+ end
11
+
12
+ def request(messages)
13
+ content = encode(messages)
14
+ params = build_params(@endpoint, content)
15
+ request = create_request(params)
16
+
17
+ request.callback do
18
+ handle_response(messages, request.response)
19
+ store_cookies(request.response_header['SET_COOKIE'])
20
+ end
21
+
22
+ request.errback do
23
+ handle_error(messages)
24
+ end
25
+
26
+ request
27
+ end
28
+
29
+ private
30
+
31
+ def build_params(uri, content)
32
+ {
33
+ :head => {
34
+ 'Content-Length' => content.bytesize,
35
+ 'Content-Type' => 'application/json',
36
+ 'Cookie' => get_cookies,
37
+ 'Host' => uri.host
38
+ }.merge(@dispatcher.headers),
39
+
40
+ :body => content,
41
+ :timeout => -1 # for em-http-request < 1.0
42
+ }
43
+ end
44
+
45
+ def create_request(params)
46
+ version = EventMachine::HttpRequest::VERSION.split('.')[0].to_i
47
+ client = if version >= 1
48
+ options = {:inactivity_timeout => 0}
49
+ EventMachine::HttpRequest.new(@endpoint.to_s, options)
50
+ else
51
+ EventMachine::HttpRequest.new(@endpoint.to_s)
52
+ end
53
+
54
+ client.post(params)
55
+ end
56
+
57
+ def handle_response(messages, response)
58
+ replies = MultiJson.load(response) rescue nil
59
+ if replies
60
+ receive(replies)
61
+ else
62
+ handle_error(messages)
63
+ end
64
+ end
65
+ end
66
+
67
+ Transport.register 'long-polling', Transport::Http
68
+
69
+ end
@@ -0,0 +1,21 @@
1
+ module Faye
2
+
3
+ class Transport::Local < Transport
4
+ def self.usable?(dispatcher, endpoint, &callback)
5
+ callback.call(Server === endpoint)
6
+ end
7
+
8
+ def batching?
9
+ false
10
+ end
11
+
12
+ def request(messages)
13
+ @endpoint.process(messages, nil) do |replies|
14
+ receive(Faye.copy_object(replies))
15
+ end
16
+ end
17
+ end
18
+
19
+ Transport.register 'in-process', Transport::Local
20
+
21
+ end
@@ -0,0 +1,155 @@
1
+ module Faye
2
+ class Transport
3
+
4
+ include Logging
5
+ include Publisher
6
+ include Timeouts
7
+
8
+ attr_reader :endpoint
9
+
10
+ def initialize(dispatcher, endpoint)
11
+ super()
12
+ @dispatcher = dispatcher
13
+ @endpoint = endpoint
14
+ @outbox = []
15
+ end
16
+
17
+ def batching?
18
+ true
19
+ end
20
+
21
+ def close
22
+ end
23
+
24
+ def encode(messages)
25
+ ''
26
+ end
27
+
28
+ def connection_type
29
+ self.class.connection_type
30
+ end
31
+
32
+ def send_message(message)
33
+ client_id = @dispatcher.client_id
34
+ debug('Client ? sending message to ? via ?: ?', client_id, @endpoint, connection_type, message)
35
+
36
+ unless batching?
37
+ promise = EventMachine::DefaultDeferrable.new
38
+ promise.succeed(request([message]))
39
+ return promise
40
+ end
41
+
42
+ @outbox << message
43
+ flush_large_batch
44
+ @promise ||= EventMachine::DefaultDeferrable.new
45
+
46
+ if message['channel'] == Channel::HANDSHAKE
47
+ add_timeout(:publish, 0.01) { flush }
48
+ return @promise
49
+ end
50
+
51
+ if message['channel'] == Channel::CONNECT
52
+ @connection_message = message
53
+ end
54
+
55
+ add_timeout(:publish, Engine::MAX_DELAY) { flush }
56
+ @promise
57
+ end
58
+
59
+ private
60
+
61
+ def flush
62
+ remove_timeout(:publish)
63
+
64
+ if @outbox.size > 1 and @connection_message
65
+ @connection_message['advice'] = {'timeout' => 0}
66
+ end
67
+
68
+ @promise.succeed(request(@outbox))
69
+ @promise = nil
70
+
71
+ @connection_message = nil
72
+ @outbox = []
73
+ end
74
+
75
+ def flush_large_batch
76
+ string = encode(@outbox)
77
+ return if string.size < @dispatcher.max_request_size
78
+ last = @outbox.pop
79
+ flush
80
+ @outbox.push(last) if last
81
+ end
82
+
83
+ def receive(replies)
84
+ replies = [replies].flatten
85
+ client_id = @dispatcher.client_id
86
+ debug('Client ? received from ? via ?: ?', client_id, @endpoint, connection_type, replies)
87
+ replies.each do |reply|
88
+ @dispatcher.handle_response(reply)
89
+ end
90
+ end
91
+
92
+ def handle_error(messages, immediate = false)
93
+ client_id = @dispatcher.client_id
94
+ debug('Client ? failed to send to ? via ?: ?', client_id, @endpoint, connection_type, messages)
95
+ messages.each do |message|
96
+ @dispatcher.handle_error(message, immediate)
97
+ end
98
+ end
99
+
100
+ def get_cookies
101
+ @dispatcher.cookies.get_cookies(@endpoint.to_s) * ';'
102
+ end
103
+
104
+ def store_cookies(set_cookie)
105
+ [*set_cookie].compact.each do |cookie|
106
+ @dispatcher.cookies.set_cookie(@endpoint.to_s, cookie)
107
+ end
108
+ end
109
+
110
+ @transports = []
111
+
112
+ class << self
113
+ attr_accessor :connection_type
114
+
115
+ def get(dispatcher, allowed, disabled, &callback)
116
+ endpoint = dispatcher.endpoint
117
+
118
+ select = lambda do |(conn_type, klass), resume|
119
+ conn_endpoint = dispatcher.endpoint_for(conn_type)
120
+
121
+ if disabled.include?(conn_type)
122
+ next resume.call
123
+ end
124
+
125
+ unless allowed.include?(conn_type)
126
+ klass.usable?(dispatcher, conn_endpoint) { |u| }
127
+ next resume.call
128
+ end
129
+
130
+ klass.usable?(dispatcher, conn_endpoint) do |is_usable|
131
+ next resume.call unless is_usable
132
+ transport = klass.respond_to?(:create) ? klass.create(dispatcher, conn_endpoint) : klass.new(dispatcher, conn_endpoint)
133
+ callback.call(transport)
134
+ end
135
+ end
136
+
137
+ error = lambda do
138
+ raise "Could not find a usable connection type for #{ endpoint }"
139
+ end
140
+
141
+ Faye.async_each(@transports, select, error)
142
+ end
143
+
144
+ def register(type, klass)
145
+ @transports << [type, klass]
146
+ klass.connection_type = type
147
+ end
148
+ end
149
+
150
+ %w[local web_socket http].each do |type|
151
+ require File.join(ROOT, 'faye', 'transport', type)
152
+ end
153
+
154
+ end
155
+ end
@@ -0,0 +1,134 @@
1
+ module Faye
2
+
3
+ class Transport::WebSocket < Transport
4
+ UNCONNECTED = 1
5
+ CONNECTING = 2
6
+ CONNECTED = 3
7
+
8
+ PROTOCOLS = {
9
+ 'http' => 'ws',
10
+ 'https' => 'wss'
11
+ }
12
+
13
+ include Deferrable
14
+
15
+ class Request
16
+ include Deferrable
17
+
18
+ def close
19
+ callback { |socket| socket.close }
20
+ end
21
+ end
22
+
23
+ def self.usable?(dispatcher, endpoint, &callback)
24
+ create(dispatcher, endpoint).usable?(&callback)
25
+ end
26
+
27
+ def self.create(dispatcher, endpoint)
28
+ sockets = dispatcher.transports[:websocket] ||= {}
29
+ sockets[endpoint.to_s] ||= new(dispatcher, endpoint)
30
+ end
31
+
32
+ def batching?
33
+ false
34
+ end
35
+
36
+ def usable?(&callback)
37
+ self.callback { callback.call(true) }
38
+ self.errback { callback.call(false) }
39
+ connect
40
+ end
41
+
42
+ def request(messages)
43
+ @pending ||= Set.new
44
+ messages.each { |message| @pending.add(message) }
45
+
46
+ promise = Request.new
47
+
48
+ callback do |socket|
49
+ next unless socket
50
+ socket.send(Faye.to_json(messages))
51
+ promise.succeed(socket)
52
+ end
53
+
54
+ connect
55
+ promise
56
+ end
57
+
58
+ def connect
59
+ @state ||= UNCONNECTED
60
+ return unless @state == UNCONNECTED
61
+ @state = CONNECTING
62
+
63
+ headers = @dispatcher.headers.dup
64
+ headers['Cookie'] = get_cookies
65
+
66
+ url = @endpoint.dup
67
+ url.scheme = PROTOCOLS[url.scheme]
68
+ socket = Faye::WebSocket::Client.new(url.to_s, [], :headers => headers)
69
+
70
+ socket.onopen = lambda do |*args|
71
+ store_cookies(socket.headers['Set-Cookie'])
72
+ @socket = socket
73
+ @state = CONNECTED
74
+ @ever_connected = true
75
+ ping
76
+ set_deferred_status(:succeeded, socket)
77
+ end
78
+
79
+ closed = false
80
+ socket.onclose = socket.onerror = lambda do |*args|
81
+ next if closed
82
+ closed = true
83
+
84
+ was_connected = (@state == CONNECTED)
85
+ socket.onopen = socket.onclose = socket.onerror = socket.onmessage = nil
86
+
87
+ @socket = nil
88
+ @state = UNCONNECTED
89
+ remove_timeout(:ping)
90
+ set_deferred_status(:unknown)
91
+
92
+ pending = @pending ? @pending.to_a : []
93
+ @pending = nil
94
+
95
+ if was_connected
96
+ handle_error(pending, true)
97
+ elsif @ever_connected
98
+ handle_error(pending)
99
+ else
100
+ set_deferred_status(:failed)
101
+ end
102
+ end
103
+
104
+ socket.onmessage = lambda do |event|
105
+ replies = MultiJson.load(event.data)
106
+ next if replies.nil?
107
+ replies = [replies].flatten
108
+
109
+ replies.each do |reply|
110
+ next unless reply.has_key?('successful')
111
+ next unless message = @pending.find { |m| m['id'] == reply['id'] }
112
+ @pending.delete(message)
113
+ end
114
+ receive(replies)
115
+ end
116
+ end
117
+
118
+ def close
119
+ return unless @socket
120
+ @socket.close
121
+ end
122
+
123
+ private
124
+
125
+ def ping
126
+ return unless @socket
127
+ @socket.send('[]')
128
+ add_timeout(:ping, @dispatcher.timeout / 2) { ping }
129
+ end
130
+ end
131
+
132
+ Transport.register 'websocket', Transport::WebSocket
133
+
134
+ end
@@ -0,0 +1,19 @@
1
+ module Faye
2
+ class Namespace
3
+
4
+ extend Forwardable
5
+ def_delegator :@used, :delete, :release
6
+ def_delegator :@used, :has_key?, :exists?
7
+
8
+ def initialize
9
+ @used = {}
10
+ end
11
+
12
+ def generate
13
+ name = Engine.random
14
+ name = Engine.random while @used.has_key?(name)
15
+ @used[name] = name
16
+ end
17
+
18
+ end
19
+ end
metadata ADDED
@@ -0,0 +1,400 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: faye-huboard
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.4
5
+ platform: ruby
6
+ authors:
7
+ - Ryan Rauh
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2014-10-29 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: cookiejar
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - '>='
18
+ - !ruby/object:Gem::Version
19
+ version: 0.3.0
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - '>='
25
+ - !ruby/object:Gem::Version
26
+ version: 0.3.0
27
+ - !ruby/object:Gem::Dependency
28
+ name: em-http-request
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - '>='
32
+ - !ruby/object:Gem::Version
33
+ version: 0.3.0
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - '>='
39
+ - !ruby/object:Gem::Version
40
+ version: 0.3.0
41
+ - !ruby/object:Gem::Dependency
42
+ name: eventmachine
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - '>='
46
+ - !ruby/object:Gem::Version
47
+ version: 0.12.0
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - '>='
53
+ - !ruby/object:Gem::Version
54
+ version: 0.12.0
55
+ - !ruby/object:Gem::Dependency
56
+ name: faye-websocket
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - '>='
60
+ - !ruby/object:Gem::Version
61
+ version: 0.7.0
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - '>='
67
+ - !ruby/object:Gem::Version
68
+ version: 0.7.0
69
+ - !ruby/object:Gem::Dependency
70
+ name: multi_json
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - '>='
74
+ - !ruby/object:Gem::Version
75
+ version: 1.0.0
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - '>='
81
+ - !ruby/object:Gem::Version
82
+ version: 1.0.0
83
+ - !ruby/object:Gem::Dependency
84
+ name: rack
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - '>='
88
+ - !ruby/object:Gem::Version
89
+ version: 1.0.0
90
+ type: :runtime
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - '>='
95
+ - !ruby/object:Gem::Version
96
+ version: 1.0.0
97
+ - !ruby/object:Gem::Dependency
98
+ name: websocket-driver
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - '>='
102
+ - !ruby/object:Gem::Version
103
+ version: 0.3.0
104
+ type: :runtime
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - '>='
109
+ - !ruby/object:Gem::Version
110
+ version: 0.3.0
111
+ - !ruby/object:Gem::Dependency
112
+ name: compass
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - ~>
116
+ - !ruby/object:Gem::Version
117
+ version: 0.11.0
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - ~>
123
+ - !ruby/object:Gem::Version
124
+ version: 0.11.0
125
+ - !ruby/object:Gem::Dependency
126
+ name: haml
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - ~>
130
+ - !ruby/object:Gem::Version
131
+ version: 3.1.0
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - ~>
137
+ - !ruby/object:Gem::Version
138
+ version: 3.1.0
139
+ - !ruby/object:Gem::Dependency
140
+ name: puma
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - '>='
144
+ - !ruby/object:Gem::Version
145
+ version: 2.0.0
146
+ type: :development
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - '>='
151
+ - !ruby/object:Gem::Version
152
+ version: 2.0.0
153
+ - !ruby/object:Gem::Dependency
154
+ name: rack-proxy
155
+ requirement: !ruby/object:Gem::Requirement
156
+ requirements:
157
+ - - ~>
158
+ - !ruby/object:Gem::Version
159
+ version: 0.4.0
160
+ type: :development
161
+ prerelease: false
162
+ version_requirements: !ruby/object:Gem::Requirement
163
+ requirements:
164
+ - - ~>
165
+ - !ruby/object:Gem::Version
166
+ version: 0.4.0
167
+ - !ruby/object:Gem::Dependency
168
+ name: rack-test
169
+ requirement: !ruby/object:Gem::Requirement
170
+ requirements:
171
+ - - '>='
172
+ - !ruby/object:Gem::Version
173
+ version: '0'
174
+ type: :development
175
+ prerelease: false
176
+ version_requirements: !ruby/object:Gem::Requirement
177
+ requirements:
178
+ - - '>='
179
+ - !ruby/object:Gem::Version
180
+ version: '0'
181
+ - !ruby/object:Gem::Dependency
182
+ name: rake
183
+ requirement: !ruby/object:Gem::Requirement
184
+ requirements:
185
+ - - '>='
186
+ - !ruby/object:Gem::Version
187
+ version: '0'
188
+ type: :development
189
+ prerelease: false
190
+ version_requirements: !ruby/object:Gem::Requirement
191
+ requirements:
192
+ - - '>='
193
+ - !ruby/object:Gem::Version
194
+ version: '0'
195
+ - !ruby/object:Gem::Dependency
196
+ name: rspec
197
+ requirement: !ruby/object:Gem::Requirement
198
+ requirements:
199
+ - - ~>
200
+ - !ruby/object:Gem::Version
201
+ version: 2.99.0
202
+ type: :development
203
+ prerelease: false
204
+ version_requirements: !ruby/object:Gem::Requirement
205
+ requirements:
206
+ - - ~>
207
+ - !ruby/object:Gem::Version
208
+ version: 2.99.0
209
+ - !ruby/object:Gem::Dependency
210
+ name: rspec-eventmachine
211
+ requirement: !ruby/object:Gem::Requirement
212
+ requirements:
213
+ - - '>='
214
+ - !ruby/object:Gem::Version
215
+ version: 0.2.0
216
+ type: :development
217
+ prerelease: false
218
+ version_requirements: !ruby/object:Gem::Requirement
219
+ requirements:
220
+ - - '>='
221
+ - !ruby/object:Gem::Version
222
+ version: 0.2.0
223
+ - !ruby/object:Gem::Dependency
224
+ name: RedCloth
225
+ requirement: !ruby/object:Gem::Requirement
226
+ requirements:
227
+ - - ~>
228
+ - !ruby/object:Gem::Version
229
+ version: 3.0.0
230
+ type: :development
231
+ prerelease: false
232
+ version_requirements: !ruby/object:Gem::Requirement
233
+ requirements:
234
+ - - ~>
235
+ - !ruby/object:Gem::Version
236
+ version: 3.0.0
237
+ - !ruby/object:Gem::Dependency
238
+ name: sinatra
239
+ requirement: !ruby/object:Gem::Requirement
240
+ requirements:
241
+ - - '>='
242
+ - !ruby/object:Gem::Version
243
+ version: '0'
244
+ type: :development
245
+ prerelease: false
246
+ version_requirements: !ruby/object:Gem::Requirement
247
+ requirements:
248
+ - - '>='
249
+ - !ruby/object:Gem::Version
250
+ version: '0'
251
+ - !ruby/object:Gem::Dependency
252
+ name: sass
253
+ requirement: !ruby/object:Gem::Requirement
254
+ requirements:
255
+ - - ~>
256
+ - !ruby/object:Gem::Version
257
+ version: 3.2.0
258
+ type: :development
259
+ prerelease: false
260
+ version_requirements: !ruby/object:Gem::Requirement
261
+ requirements:
262
+ - - ~>
263
+ - !ruby/object:Gem::Version
264
+ version: 3.2.0
265
+ - !ruby/object:Gem::Dependency
266
+ name: staticmatic
267
+ requirement: !ruby/object:Gem::Requirement
268
+ requirements:
269
+ - - '>='
270
+ - !ruby/object:Gem::Version
271
+ version: '0'
272
+ type: :development
273
+ prerelease: false
274
+ version_requirements: !ruby/object:Gem::Requirement
275
+ requirements:
276
+ - - '>='
277
+ - !ruby/object:Gem::Version
278
+ version: '0'
279
+ - !ruby/object:Gem::Dependency
280
+ name: rainbows
281
+ requirement: !ruby/object:Gem::Requirement
282
+ requirements:
283
+ - - ~>
284
+ - !ruby/object:Gem::Version
285
+ version: 4.4.0
286
+ type: :development
287
+ prerelease: false
288
+ version_requirements: !ruby/object:Gem::Requirement
289
+ requirements:
290
+ - - ~>
291
+ - !ruby/object:Gem::Version
292
+ version: 4.4.0
293
+ - !ruby/object:Gem::Dependency
294
+ name: thin
295
+ requirement: !ruby/object:Gem::Requirement
296
+ requirements:
297
+ - - '>='
298
+ - !ruby/object:Gem::Version
299
+ version: 1.2.0
300
+ type: :development
301
+ prerelease: false
302
+ version_requirements: !ruby/object:Gem::Requirement
303
+ requirements:
304
+ - - '>='
305
+ - !ruby/object:Gem::Version
306
+ version: 1.2.0
307
+ - !ruby/object:Gem::Dependency
308
+ name: goliath
309
+ requirement: !ruby/object:Gem::Requirement
310
+ requirements:
311
+ - - '>='
312
+ - !ruby/object:Gem::Version
313
+ version: '0'
314
+ type: :development
315
+ prerelease: false
316
+ version_requirements: !ruby/object:Gem::Requirement
317
+ requirements:
318
+ - - '>='
319
+ - !ruby/object:Gem::Version
320
+ version: '0'
321
+ - !ruby/object:Gem::Dependency
322
+ name: passenger
323
+ requirement: !ruby/object:Gem::Requirement
324
+ requirements:
325
+ - - '>='
326
+ - !ruby/object:Gem::Version
327
+ version: 4.0.0
328
+ type: :development
329
+ prerelease: false
330
+ version_requirements: !ruby/object:Gem::Requirement
331
+ requirements:
332
+ - - '>='
333
+ - !ruby/object:Gem::Version
334
+ version: 4.0.0
335
+ description:
336
+ email:
337
+ executables: []
338
+ extensions: []
339
+ extra_rdoc_files:
340
+ - README.md
341
+ files:
342
+ - CHANGELOG.md
343
+ - README.md
344
+ - lib/faye-browser.js
345
+ - lib/faye-browser-min.js
346
+ - lib/faye-browser-min.js.map
347
+ - lib/faye/adapters/rack_adapter.rb
348
+ - lib/faye/adapters/static_server.rb
349
+ - lib/faye/engines/connection.rb
350
+ - lib/faye/engines/memory.rb
351
+ - lib/faye/engines/proxy.rb
352
+ - lib/faye/error.rb
353
+ - lib/faye/mixins/deferrable.rb
354
+ - lib/faye/mixins/logging.rb
355
+ - lib/faye/mixins/publisher.rb
356
+ - lib/faye/mixins/timeouts.rb
357
+ - lib/faye/protocol/channel.rb
358
+ - lib/faye/protocol/client.rb
359
+ - lib/faye/protocol/dispatcher.rb
360
+ - lib/faye/protocol/extensible.rb
361
+ - lib/faye/protocol/grammar.rb
362
+ - lib/faye/protocol/publication.rb
363
+ - lib/faye/protocol/server.rb
364
+ - lib/faye/protocol/socket.rb
365
+ - lib/faye/protocol/subscription.rb
366
+ - lib/faye/transport/http.rb
367
+ - lib/faye/transport/local.rb
368
+ - lib/faye/transport/transport.rb
369
+ - lib/faye/transport/web_socket.rb
370
+ - lib/faye/util/namespace.rb
371
+ - lib/faye.rb
372
+ homepage:
373
+ licenses:
374
+ - MIT
375
+ metadata: {}
376
+ post_install_message:
377
+ rdoc_options:
378
+ - --main
379
+ - README.md
380
+ - --markup
381
+ - markdown
382
+ require_paths:
383
+ - lib
384
+ required_ruby_version: !ruby/object:Gem::Requirement
385
+ requirements:
386
+ - - '>='
387
+ - !ruby/object:Gem::Version
388
+ version: '0'
389
+ required_rubygems_version: !ruby/object:Gem::Requirement
390
+ requirements:
391
+ - - '>='
392
+ - !ruby/object:Gem::Version
393
+ version: '0'
394
+ requirements: []
395
+ rubyforge_project:
396
+ rubygems_version: 2.0.14
397
+ signing_key:
398
+ specification_version: 4
399
+ summary: Simple pub/sub messaging for the web
400
+ test_files: []