faye 1.0.3 → 1.4.0

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.
@@ -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: []