faye 1.0.3 → 1.4.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,7 +1,7 @@
1
1
  module Faye
2
2
 
3
3
  class Transport::Local < Transport
4
- def self.usable?(client, endpoint, &callback)
4
+ def self.usable?(dispatcher, endpoint, &callback)
5
5
  callback.call(Server === endpoint)
6
6
  end
7
7
 
@@ -9,10 +9,11 @@ module Faye
9
9
  false
10
10
  end
11
11
 
12
- def request(envelopes)
13
- messages = Faye.copy_object(envelopes.map { |e| e.message })
14
- @endpoint.process(messages, nil) do |responses|
15
- receive(envelopes, Faye.copy_object(responses))
12
+ def request(messages)
13
+ EventMachine.next_tick do
14
+ @endpoint.process(messages, nil) do |replies|
15
+ receive(Faye.copy_object(replies))
16
+ end
16
17
  end
17
18
  end
18
19
  end
@@ -5,13 +5,20 @@ module Faye
5
5
  include Publisher
6
6
  include Timeouts
7
7
 
8
+ DEFAULT_PORTS = { 'http' => 80, 'https' => 433, 'ws' => 80, 'wss' => 443 }
9
+
8
10
  attr_reader :endpoint
9
11
 
10
- def initialize(client, endpoint)
12
+ def initialize(dispatcher, endpoint)
11
13
  super()
12
- @client = client
13
- @endpoint = endpoint
14
- @outbox = []
14
+ @dispatcher = dispatcher
15
+ @endpoint = endpoint
16
+ @outbox = []
17
+ @proxy = @dispatcher.proxy.dup
18
+
19
+ @proxy[:origin] ||= @endpoint.respond_to?(:find_proxy) ?
20
+ @endpoint.find_proxy :
21
+ nil
15
22
  end
16
23
 
17
24
  def batching?
@@ -21,7 +28,7 @@ module Faye
21
28
  def close
22
29
  end
23
30
 
24
- def encode(envelopes)
31
+ def encode(messages)
25
32
  ''
26
33
  end
27
34
 
@@ -29,35 +36,50 @@ module Faye
29
36
  self.class.connection_type
30
37
  end
31
38
 
32
- def send(envelope)
33
- message = envelope.message
34
- client_id = @client.instance_eval { @client_id }
35
- debug('Client ? sending message to ?: ?', client_id, @endpoint, message)
39
+ def send_message(message)
40
+ debug('Client ? sending message to ? via ?: ?', @dispatcher.client_id, @endpoint, connection_type, message)
36
41
 
37
- return request([envelope]) unless batching?
42
+ unless batching?
43
+ promise = EventMachine::DefaultDeferrable.new
44
+ promise.succeed(request([message]))
45
+ return promise
46
+ end
38
47
 
39
- @outbox << envelope
48
+ @outbox << message
49
+ flush_large_batch
40
50
 
41
51
  if message['channel'] == Channel::HANDSHAKE
42
- return add_timeout(:publish, 0.01) { flush }
52
+ return publish(0.01)
43
53
  end
44
54
 
45
55
  if message['channel'] == Channel::CONNECT
46
56
  @connection_message = message
47
57
  end
48
58
 
49
- flush_large_batch
50
- add_timeout(:publish, Engine::MAX_DELAY) { flush }
59
+ publish(Engine::MAX_DELAY)
60
+ end
61
+
62
+ private
63
+
64
+ def publish(delay)
65
+ @promise ||= EventMachine::DefaultDeferrable.new
66
+
67
+ add_timeout(:publish, delay) do
68
+ flush
69
+ @promise = nil
70
+ end
71
+
72
+ @promise
51
73
  end
52
74
 
53
75
  def flush
54
76
  remove_timeout(:publish)
55
77
 
56
78
  if @outbox.size > 1 and @connection_message
57
- @connection_message['advice'] = {'timeout' => 0}
79
+ @connection_message['advice'] = { 'timeout' => 0 }
58
80
  end
59
81
 
60
- request(@outbox)
82
+ @promise.succeed(request(@outbox))
61
83
 
62
84
  @connection_message = nil
63
85
  @outbox = []
@@ -65,35 +87,41 @@ module Faye
65
87
 
66
88
  def flush_large_batch
67
89
  string = encode(@outbox)
68
- return if string.size < @client.max_request_size
90
+ return if string.size < @dispatcher.max_request_size
69
91
  last = @outbox.pop
92
+
93
+ @promise ||= EventMachine::DefaultDeferrable.new
70
94
  flush
95
+
71
96
  @outbox.push(last) if last
72
97
  end
73
98
 
74
- def receive(envelopes, responses)
75
- envelopes.each { |e| e.set_deferred_status(:succeeded) }
76
- responses = [responses].flatten
77
- client_id = @client.instance_eval { @client_id }
78
- debug('Client ? received from ?: ?', client_id, @endpoint, responses)
79
- responses.each { |response| @client.receive_message(response) }
80
- end
99
+ def receive(replies)
100
+ return unless replies
101
+ replies = [replies].flatten
102
+
103
+ debug('Client ? received from ? via ?: ?', @dispatcher.client_id, @endpoint, connection_type, replies)
81
104
 
82
- def handle_error(envelopes, immediate = false)
83
- envelopes.each { |e| e.set_deferred_status(:failed, immediate) }
105
+ replies.each do |reply|
106
+ @dispatcher.handle_response(reply)
107
+ end
84
108
  end
85
109
 
86
- private
110
+ def handle_error(messages, immediate = false)
111
+ debug('Client ? failed to send to ? via ?: ?', @dispatcher.client_id, @endpoint, connection_type, messages)
112
+
113
+ messages.each do |message|
114
+ @dispatcher.handle_error(message, immediate)
115
+ end
116
+ end
87
117
 
88
118
  def get_cookies
89
- return @client.cookies
90
- @client.cookies.get_cookies(@endpoint.to_s) * ';'
119
+ @dispatcher.cookies.get_cookies(@endpoint.to_s) * ';'
91
120
  end
92
121
 
93
122
  def store_cookies(set_cookie)
94
- return @client.cookies
95
123
  [*set_cookie].compact.each do |cookie|
96
- @client.cookies.set_cookie(@endpoint.to_s, cookie)
124
+ @dispatcher.cookies.set_cookie(@endpoint.to_s, cookie)
97
125
  end
98
126
  end
99
127
 
@@ -102,24 +130,24 @@ module Faye
102
130
  class << self
103
131
  attr_accessor :connection_type
104
132
 
105
- def get(client, allowed, disabled, &callback)
106
- endpoint = client.endpoint
133
+ def get(dispatcher, allowed, disabled, &callback)
134
+ endpoint = dispatcher.endpoint
107
135
 
108
136
  select = lambda do |(conn_type, klass), resume|
109
- conn_endpoint = client.endpoints[conn_type] || endpoint
137
+ conn_endpoint = dispatcher.endpoint_for(conn_type)
110
138
 
111
139
  if disabled.include?(conn_type)
112
140
  next resume.call
113
141
  end
114
142
 
115
143
  unless allowed.include?(conn_type)
116
- klass.usable?(client, conn_endpoint) { |u| }
144
+ klass.usable?(dispatcher, conn_endpoint) { |u| }
117
145
  next resume.call
118
146
  end
119
147
 
120
- klass.usable?(client, conn_endpoint) do |is_usable|
148
+ klass.usable?(dispatcher, conn_endpoint) do |is_usable|
121
149
  next resume.call unless is_usable
122
- transport = klass.respond_to?(:create) ? klass.create(client, conn_endpoint) : klass.new(client, conn_endpoint)
150
+ transport = klass.respond_to?(:create) ? klass.create(dispatcher, conn_endpoint) : klass.new(dispatcher, conn_endpoint)
123
151
  callback.call(transport)
124
152
  end
125
153
  end
@@ -135,6 +163,10 @@ module Faye
135
163
  @transports << [type, klass]
136
164
  klass.connection_type = type
137
165
  end
166
+
167
+ def connection_types
168
+ @transports.map { |t| t[0] }
169
+ end
138
170
  end
139
171
 
140
172
  %w[local web_socket http].each do |type|
@@ -143,4 +175,3 @@ module Faye
143
175
 
144
176
  end
145
177
  end
146
-
@@ -12,13 +12,21 @@ module Faye
12
12
 
13
13
  include Deferrable
14
14
 
15
- def self.usable?(client, endpoint, &callback)
16
- create(client, endpoint).usable?(&callback)
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)
17
25
  end
18
26
 
19
- def self.create(client, endpoint)
20
- sockets = client.transports[:websocket] ||= {}
21
- sockets[endpoint.to_s] ||= new(client, endpoint)
27
+ def self.create(dispatcher, endpoint)
28
+ sockets = dispatcher.transports[:websocket] ||= {}
29
+ sockets[endpoint.to_s] ||= new(dispatcher, endpoint)
22
30
  end
23
31
 
24
32
  def batching?
@@ -31,16 +39,20 @@ module Faye
31
39
  connect
32
40
  end
33
41
 
34
- def request(envelopes)
42
+ def request(messages)
35
43
  @pending ||= Set.new
36
- envelopes.each { |envelope| @pending.add(envelope) }
44
+ messages.each { |message| @pending.add(message) }
45
+
46
+ promise = Request.new
37
47
 
38
48
  callback do |socket|
39
- next unless socket
40
- messages = envelopes.map { |e| e.message }
49
+ next unless socket and socket.ready_state == 1
41
50
  socket.send(Faye.to_json(messages))
51
+ promise.succeed(socket)
42
52
  end
53
+
43
54
  connect
55
+ promise
44
56
  end
45
57
 
46
58
  def connect
@@ -48,19 +60,28 @@ module Faye
48
60
  return unless @state == UNCONNECTED
49
61
  @state = CONNECTING
50
62
 
51
- headers = @client.headers.dup
52
- headers['Cookie'] = get_cookies
63
+ url = @endpoint.dup
64
+ headers = @dispatcher.headers.dup
65
+ extensions = @dispatcher.ws_extensions
66
+ cookie = get_cookies
53
67
 
54
- url = @endpoint.dup
55
68
  url.scheme = PROTOCOLS[url.scheme]
56
- socket = Faye::WebSocket::Client.new(url.to_s, [], :headers => headers)
69
+ headers['Cookie'] = cookie unless cookie == ''
70
+
71
+ options = {
72
+ :extensions => extensions,
73
+ :headers => headers,
74
+ :proxy => @proxy,
75
+ :tls => @dispatcher.tls
76
+ }
77
+
78
+ socket = Faye::WebSocket::Client.new(url.to_s, [], options)
57
79
 
58
80
  socket.onopen = lambda do |*args|
59
81
  store_cookies(socket.headers['Set-Cookie'])
60
82
  @socket = socket
61
83
  @state = CONNECTED
62
84
  @ever_connected = true
63
- ping
64
85
  set_deferred_status(:succeeded, socket)
65
86
  end
66
87
 
@@ -74,35 +95,29 @@ module Faye
74
95
 
75
96
  @socket = nil
76
97
  @state = UNCONNECTED
77
- remove_timeout(:ping)
78
- set_deferred_status(:unknown)
79
98
 
80
99
  pending = @pending ? @pending.to_a : []
81
100
  @pending = nil
82
101
 
83
- if was_connected
84
- handle_error(pending, true)
85
- elsif @ever_connected
86
- handle_error(pending)
102
+ if was_connected or @ever_connected
103
+ set_deferred_status(:unknown)
104
+ handle_error(pending, was_connected)
87
105
  else
88
106
  set_deferred_status(:failed)
89
107
  end
90
108
  end
91
109
 
92
110
  socket.onmessage = lambda do |event|
93
- messages = MultiJson.load(event.data)
94
- envelopes = []
95
-
96
- next if messages.nil?
97
- messages = [messages].flatten
98
-
99
- messages.each do |message|
100
- next unless message.has_key?('successful')
101
- next unless envelope = @pending.find { |e| e.id == message['id'] }
102
- @pending.delete(envelope)
103
- envelopes << envelope
111
+ replies = MultiJson.load(event.data) rescue nil
112
+ next if replies.nil?
113
+ replies = [replies].flatten
114
+
115
+ replies.each do |reply|
116
+ next unless reply.has_key?('successful')
117
+ next unless message = @pending.find { |m| m['id'] == reply['id'] }
118
+ @pending.delete(message)
104
119
  end
105
- receive(envelopes, messages)
120
+ receive(replies)
106
121
  end
107
122
  end
108
123
 
@@ -110,15 +125,6 @@ module Faye
110
125
  return unless @socket
111
126
  @socket.close
112
127
  end
113
-
114
- private
115
-
116
- def ping
117
- return unless @socket
118
- @socket.send('[]')
119
- timeout = @client.instance_eval { @advice['timeout'] }
120
- add_timeout(:ping, timeout/2000.0) { ping }
121
- end
122
128
  end
123
129
 
124
130
  Transport.register 'websocket', Transport::WebSocket
@@ -17,4 +17,3 @@ module Faye
17
17
 
18
18
  end
19
19
  end
20
-
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: faye
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.3
4
+ version: 1.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - James Coglan
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-07-08 00:00:00.000000000 Z
11
+ date: 2020-07-31 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: cookiejar
@@ -30,14 +30,14 @@ dependencies:
30
30
  requirements:
31
31
  - - ">="
32
32
  - !ruby/object:Gem::Version
33
- version: 0.3.0
33
+ version: 1.1.6
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - ">="
39
39
  - !ruby/object:Gem::Version
40
- version: 0.3.0
40
+ version: 1.1.6
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: eventmachine
43
43
  requirement: !ruby/object:Gem::Requirement
@@ -58,14 +58,14 @@ dependencies:
58
58
  requirements:
59
59
  - - ">="
60
60
  - !ruby/object:Gem::Version
61
- version: 0.7.0
61
+ version: 0.11.0
62
62
  type: :runtime
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
66
  - - ">="
67
67
  - !ruby/object:Gem::Version
68
- version: 0.7.0
68
+ version: 0.11.0
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: multi_json
71
71
  requirement: !ruby/object:Gem::Requirement
@@ -100,14 +100,14 @@ dependencies:
100
100
  requirements:
101
101
  - - ">="
102
102
  - !ruby/object:Gem::Version
103
- version: 0.3.0
103
+ version: 0.5.1
104
104
  type: :runtime
105
105
  prerelease: false
106
106
  version_requirements: !ruby/object:Gem::Requirement
107
107
  requirements:
108
108
  - - ">="
109
109
  - !ruby/object:Gem::Version
110
- version: 0.3.0
110
+ version: 0.5.1
111
111
  - !ruby/object:Gem::Dependency
112
112
  name: compass
113
113
  requirement: !ruby/object:Gem::Requirement
@@ -136,6 +136,20 @@ dependencies:
136
136
  - - "~>"
137
137
  - !ruby/object:Gem::Version
138
138
  version: 3.1.0
139
+ - !ruby/object:Gem::Dependency
140
+ name: permessage_deflate
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - ">="
144
+ - !ruby/object:Gem::Version
145
+ version: 0.1.0
146
+ type: :development
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - ">="
151
+ - !ruby/object:Gem::Version
152
+ version: 0.1.0
139
153
  - !ruby/object:Gem::Dependency
140
154
  name: puma
141
155
  requirement: !ruby/object:Gem::Requirement
@@ -192,48 +206,62 @@ dependencies:
192
206
  - - ">="
193
207
  - !ruby/object:Gem::Version
194
208
  version: '0'
209
+ - !ruby/object:Gem::Dependency
210
+ name: RedCloth
211
+ requirement: !ruby/object:Gem::Requirement
212
+ requirements:
213
+ - - "~>"
214
+ - !ruby/object:Gem::Version
215
+ version: 3.0.0
216
+ type: :development
217
+ prerelease: false
218
+ version_requirements: !ruby/object:Gem::Requirement
219
+ requirements:
220
+ - - "~>"
221
+ - !ruby/object:Gem::Version
222
+ version: 3.0.0
195
223
  - !ruby/object:Gem::Dependency
196
224
  name: rspec
197
225
  requirement: !ruby/object:Gem::Requirement
198
226
  requirements:
199
- - - ">="
227
+ - - "~>"
200
228
  - !ruby/object:Gem::Version
201
- version: '0'
229
+ version: 2.99.0
202
230
  type: :development
203
231
  prerelease: false
204
232
  version_requirements: !ruby/object:Gem::Requirement
205
233
  requirements:
206
- - - ">="
234
+ - - "~>"
207
235
  - !ruby/object:Gem::Version
208
- version: '0'
236
+ version: 2.99.0
209
237
  - !ruby/object:Gem::Dependency
210
238
  name: rspec-eventmachine
211
239
  requirement: !ruby/object:Gem::Requirement
212
240
  requirements:
213
241
  - - ">="
214
242
  - !ruby/object:Gem::Version
215
- version: '0'
243
+ version: 0.2.0
216
244
  type: :development
217
245
  prerelease: false
218
246
  version_requirements: !ruby/object:Gem::Requirement
219
247
  requirements:
220
248
  - - ">="
221
249
  - !ruby/object:Gem::Version
222
- version: '0'
250
+ version: 0.2.0
223
251
  - !ruby/object:Gem::Dependency
224
- name: RedCloth
252
+ name: sass
225
253
  requirement: !ruby/object:Gem::Requirement
226
254
  requirements:
227
255
  - - "~>"
228
256
  - !ruby/object:Gem::Version
229
- version: 3.0.0
257
+ version: 3.2.0
230
258
  type: :development
231
259
  prerelease: false
232
260
  version_requirements: !ruby/object:Gem::Requirement
233
261
  requirements:
234
262
  - - "~>"
235
263
  - !ruby/object:Gem::Version
236
- version: 3.0.0
264
+ version: 3.2.0
237
265
  - !ruby/object:Gem::Dependency
238
266
  name: sinatra
239
267
  requirement: !ruby/object:Gem::Requirement
@@ -318,7 +346,7 @@ dependencies:
318
346
  - - ">="
319
347
  - !ruby/object:Gem::Version
320
348
  version: 4.0.0
321
- description:
349
+ description:
322
350
  email: jcoglan@gmail.com
323
351
  executables: []
324
352
  extensions: []
@@ -326,10 +354,12 @@ extra_rdoc_files:
326
354
  - README.md
327
355
  files:
328
356
  - CHANGELOG.md
357
+ - LICENSE.md
329
358
  - README.md
330
- - lib/faye-browser-min.js
331
- - lib/faye-browser-min.js.map
332
- - lib/faye-browser.js
359
+ - build/client/faye-browser-min.js
360
+ - build/client/faye-browser-min.js.map
361
+ - build/client/faye-browser.js
362
+ - build/client/faye-browser.js.map
333
363
  - lib/faye.rb
334
364
  - lib/faye/adapters/rack_adapter.rb
335
365
  - lib/faye/adapters/static_server.rb
@@ -343,10 +373,11 @@ files:
343
373
  - lib/faye/mixins/timeouts.rb
344
374
  - lib/faye/protocol/channel.rb
345
375
  - lib/faye/protocol/client.rb
346
- - lib/faye/protocol/envelope.rb
376
+ - lib/faye/protocol/dispatcher.rb
347
377
  - lib/faye/protocol/extensible.rb
348
378
  - lib/faye/protocol/grammar.rb
349
379
  - lib/faye/protocol/publication.rb
380
+ - lib/faye/protocol/scheduler.rb
350
381
  - lib/faye/protocol/server.rb
351
382
  - lib/faye/protocol/socket.rb
352
383
  - lib/faye/protocol/subscription.rb
@@ -355,11 +386,11 @@ files:
355
386
  - lib/faye/transport/transport.rb
356
387
  - lib/faye/transport/web_socket.rb
357
388
  - lib/faye/util/namespace.rb
358
- homepage: http://faye.jcoglan.com
389
+ homepage: https://faye.jcoglan.com
359
390
  licenses:
360
- - MIT
391
+ - Apache-2.0
361
392
  metadata: {}
362
- post_install_message:
393
+ post_install_message:
363
394
  rdoc_options:
364
395
  - "--main"
365
396
  - README.md
@@ -378,9 +409,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
378
409
  - !ruby/object:Gem::Version
379
410
  version: '0'
380
411
  requirements: []
381
- rubyforge_project:
382
- rubygems_version: 2.2.2
383
- signing_key:
412
+ rubygems_version: 3.1.2
413
+ signing_key:
384
414
  specification_version: 4
385
415
  summary: Simple pub/sub messaging for the web
386
416
  test_files: []