actioncable 5.0.7.2 → 5.1.0.beta1
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.
- checksums.yaml +5 -5
- data/CHANGELOG.md +13 -169
- data/MIT-LICENSE +1 -1
- data/README.md +18 -15
- data/lib/action_cable.rb +9 -9
- data/lib/action_cable/channel/base.rb +17 -19
- data/lib/action_cable/channel/broadcasting.rb +2 -2
- data/lib/action_cable/channel/callbacks.rb +1 -1
- data/lib/action_cable/channel/naming.rb +2 -1
- data/lib/action_cable/channel/periodic_timers.rb +1 -1
- data/lib/action_cable/channel/streams.rb +7 -7
- data/lib/action_cable/connection.rb +0 -2
- data/lib/action_cable/connection/authorization.rb +6 -6
- data/lib/action_cable/connection/base.rb +20 -21
- data/lib/action_cable/connection/client_socket.rb +16 -16
- data/lib/action_cable/connection/identification.rb +1 -1
- data/lib/action_cable/connection/internal_channel.rb +2 -2
- data/lib/action_cable/connection/message_buffer.rb +2 -0
- data/lib/action_cable/connection/stream.rb +5 -5
- data/lib/action_cable/connection/stream_event_loop.rb +2 -2
- data/lib/action_cable/connection/subscriptions.rb +12 -10
- data/lib/action_cable/connection/tagged_logger_proxy.rb +2 -2
- data/lib/action_cable/connection/web_socket.rb +5 -3
- data/lib/action_cable/engine.rb +4 -4
- data/lib/action_cable/gem_version.rb +3 -3
- data/lib/action_cable/helpers/action_cable_helper.rb +1 -1
- data/lib/action_cable/remote_connections.rb +2 -2
- data/lib/action_cable/server.rb +1 -1
- data/lib/action_cable/server/base.rb +5 -5
- data/lib/action_cable/server/broadcasting.rb +7 -3
- data/lib/action_cable/server/configuration.rb +3 -19
- data/lib/action_cable/server/worker.rb +3 -3
- data/lib/action_cable/subscription_adapter.rb +1 -0
- data/lib/action_cable/subscription_adapter/async.rb +1 -1
- data/lib/action_cable/subscription_adapter/channel_prefix.rb +26 -0
- data/lib/action_cable/subscription_adapter/evented_redis.rb +13 -5
- data/lib/action_cable/subscription_adapter/postgresql.rb +4 -4
- data/lib/action_cable/subscription_adapter/redis.rb +9 -7
- data/lib/action_cable/subscription_adapter/subscriber_map.rb +1 -1
- data/lib/action_cable/version.rb +1 -1
- data/lib/assets/compiled/action_cable.js +554 -567
- data/lib/rails/generators/channel/USAGE +2 -2
- data/lib/rails/generators/channel/channel_generator.rb +9 -9
- data/lib/rails/generators/channel/templates/assets/cable.js +1 -1
- metadata +13 -33
- data/lib/action_cable/connection/faye_client_socket.rb +0 -48
- data/lib/action_cable/connection/faye_event_loop.rb +0 -44
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: e6a1923cc070932c10fd67f43091b790c221df82
|
4
|
+
data.tar.gz: 4f8a716a47aeb4fcd7557e8fb9efd3f2629394a6
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f46c1ea1a1d68ce4b833fa58c287be8b658e0e599c2507e68c216a403f4e19a831a5e50a37dcb5c9f0125d5e545641ac9fa19feceeaeb4d3e3e53a459d8029d0
|
7
|
+
data.tar.gz: 1495844434cdb511bec8e32976eced1a9c8c7657c6c6a6509ac9c6e8215294d1b850a08d00bca5c3ab83423ae0b34359bb137acea9c067c6d842b045c42ba59f
|
data/CHANGELOG.md
CHANGED
@@ -1,89 +1,18 @@
|
|
1
|
-
## Rails 5.0.
|
1
|
+
## Rails 5.1.0.beta1 (February 23, 2017) ##
|
2
2
|
|
3
|
-
*
|
3
|
+
* Redis subscription adapters now support `channel_prefix` option in `cable.yml`
|
4
4
|
|
5
|
+
Avoids channel name collisions when multiple apps use the same Redis server.
|
5
6
|
|
6
|
-
|
7
|
-
|
8
|
-
* No changes.
|
9
|
-
|
10
|
-
|
11
|
-
## Rails 5.0.7 (March 29, 2018) ##
|
12
|
-
|
13
|
-
* No changes.
|
14
|
-
|
15
|
-
|
16
|
-
## Rails 5.0.6 (September 07, 2017) ##
|
17
|
-
|
18
|
-
* No changes.
|
19
|
-
|
20
|
-
|
21
|
-
## Rails 5.0.6.rc1 (August 24, 2017) ##
|
22
|
-
|
23
|
-
* No changes.
|
24
|
-
|
25
|
-
|
26
|
-
## Rails 5.0.5 (July 31, 2017) ##
|
27
|
-
|
28
|
-
* No changes.
|
29
|
-
|
30
|
-
|
31
|
-
## Rails 5.0.5.rc2 (July 25, 2017) ##
|
32
|
-
|
33
|
-
* No changes.
|
34
|
-
|
35
|
-
|
36
|
-
## Rails 5.0.5.rc1 (July 19, 2017) ##
|
37
|
-
|
38
|
-
* No changes.
|
39
|
-
|
40
|
-
|
41
|
-
## Rails 5.0.4 (June 19, 2017) ##
|
42
|
-
|
43
|
-
* No changes.
|
44
|
-
|
45
|
-
|
46
|
-
## Rails 5.0.3 (May 12, 2017) ##
|
47
|
-
|
48
|
-
* No changes.
|
49
|
-
|
50
|
-
|
51
|
-
## Rails 5.0.2 (March 01, 2017) ##
|
52
|
-
|
53
|
-
* No changes.
|
54
|
-
|
55
|
-
|
56
|
-
## Rails 5.0.1 (December 21, 2016) ##
|
57
|
-
|
58
|
-
* No changes.
|
59
|
-
|
60
|
-
|
61
|
-
## Rails 5.0.1.rc2 (December 10, 2016) ##
|
62
|
-
|
63
|
-
* No changes.
|
64
|
-
|
65
|
-
|
66
|
-
## Rails 5.0.1.rc1 (December 01, 2016) ##
|
7
|
+
*Chad Ingram*
|
67
8
|
|
68
9
|
* Permit same-origin connections by default.
|
69
10
|
|
70
|
-
|
71
|
-
to disable.
|
11
|
+
Added new option `config.action_cable.allow_same_origin_as_host = false`
|
12
|
+
to disable this behaviour.
|
72
13
|
|
73
14
|
*Dávid Halász*, *Matthew Draper*
|
74
15
|
|
75
|
-
* Fixed and added a workaround to avoid race condition, when one
|
76
|
-
thread closed the IO, when an another thread was still trying read
|
77
|
-
from IO on a connection.
|
78
|
-
|
79
|
-
*Matthew Draper*
|
80
|
-
|
81
|
-
* Shutdown pubsub connection before classes are reloaded, to avoid
|
82
|
-
hangups caused by pubsub still holding reference to Active Record
|
83
|
-
connection from the pool, and Active Record trying to cleanup the pool.
|
84
|
-
|
85
|
-
*Jon Moss*
|
86
|
-
|
87
16
|
* Prevent race where the client could receive and act upon a
|
88
17
|
subscription confirmation before the channel's `subscribed` method
|
89
18
|
completed.
|
@@ -92,110 +21,25 @@
|
|
92
21
|
|
93
22
|
*Vladimir Dementyev*
|
94
23
|
|
95
|
-
* Buffer writes to
|
24
|
+
* Buffer now writes to WebSocket connections, to avoid blocking threads
|
96
25
|
that could be doing more useful things.
|
97
26
|
|
98
27
|
*Matthew Draper*, *Tinco Andringa*
|
99
28
|
|
100
|
-
*
|
101
|
-
connection was rejected.
|
102
|
-
|
103
|
-
Fixes #23757.
|
104
|
-
|
105
|
-
*Jon Moss*
|
106
|
-
|
107
|
-
* Protect against concurrent writes to a websocket connection from
|
29
|
+
* Protect against concurrent writes to a WebSocket connection from
|
108
30
|
multiple threads; the underlying OS write is not always threadsafe.
|
109
31
|
|
110
32
|
*Tinco Andringa*
|
111
33
|
|
112
|
-
*
|
113
|
-
|
114
|
-
Fixes #25613.
|
115
|
-
|
116
|
-
*Tinco Andringa*
|
117
|
-
|
118
|
-
|
119
|
-
## Rails 5.0.0 (June 30, 2016) ##
|
120
|
-
|
121
|
-
* Fix development reloading support: new cable connections are now correctly
|
122
|
-
dispatched to the reloaded channel class, instead of using a cached reference
|
123
|
-
to the originally-loaded version.
|
124
|
-
|
125
|
-
*Matthew Draper*
|
126
|
-
|
127
|
-
* WebSocket protocol negotiation.
|
128
|
-
|
129
|
-
Introduces an Action Cable protocol version that moves independently
|
130
|
-
of and, hopefully, more slowly than Action Cable itself. Client sockets
|
131
|
-
negotiate a protocol with the Cable server using WebSockets' native
|
132
|
-
subprotocol support:
|
133
|
-
* https://tools.ietf.org/html/rfc6455#section-1.9
|
134
|
-
* https://developer.mozilla.org/en-US/docs/Web/API/WebSockets_API/Writing_WebSocket_servers#Subprotocols
|
135
|
-
|
136
|
-
If they can't negotiate a compatible protocol (usually due to upgrading
|
137
|
-
the Cable server with a browser still running old JavaScript) then the
|
138
|
-
client knows to disconnect, cease retrying, and tell the app that it hit
|
139
|
-
a protocol mismatch.
|
140
|
-
|
141
|
-
This allows us to evolve the Action Cable message format, handshaking,
|
142
|
-
pings, acknowledgements, and more without breaking older clients'
|
143
|
-
expectations of server behavior.
|
144
|
-
|
145
|
-
*Daniel Rhodes*
|
146
|
-
|
147
|
-
* Pubsub: automatic stream decoding.
|
148
|
-
|
149
|
-
stream_for @room, coder: ActiveSupport::JSON do |message|
|
150
|
-
# `message` is a Ruby hash here instead of a JSON string
|
151
|
-
|
152
|
-
The `coder` must respond to `#decode`. Defaults to `coder: nil`
|
153
|
-
which skips decoding entirely.
|
154
|
-
|
155
|
-
*Jeremy Daer*
|
156
|
-
|
157
|
-
* Add ActiveSupport::Notifications to ActionCable::Channel.
|
34
|
+
* Add `ActiveSupport::Notifications` hook to `Broadcaster#broadcast`.
|
158
35
|
|
159
36
|
*Matthew Wear*
|
160
37
|
|
161
|
-
*
|
162
|
-
loads, and disconnecting all cables during reload.
|
163
|
-
|
164
|
-
*Matthew Draper*
|
165
|
-
|
166
|
-
* Ensure ActionCable behaves correctly for non-string queue names.
|
167
|
-
|
168
|
-
*Jay Hayes*
|
169
|
-
|
170
|
-
* Added `em_redis_connector` and `redis_connector` to
|
171
|
-
`ActionCable::SubscriptionAdapter::EventedRedis` and added `redis_connector`
|
172
|
-
to `ActionCable::SubscriptionAdapter::Redis`, so you can overwrite with your
|
173
|
-
own initializers. This is used when you want to use different-than-standard
|
174
|
-
Redis adapters, like for Makara distributed Redis.
|
175
|
-
|
176
|
-
*DHH*
|
177
|
-
|
178
|
-
* Support PostgreSQL pubsub adapter.
|
179
|
-
|
180
|
-
*Jon Moss*
|
181
|
-
|
182
|
-
* Remove EventMachine dependency.
|
183
|
-
|
184
|
-
*Matthew Draper*
|
185
|
-
|
186
|
-
* Remove Celluloid dependency.
|
187
|
-
|
188
|
-
*Mike Perham*
|
38
|
+
* Close hijacked socket when connection is shut down.
|
189
39
|
|
190
|
-
|
191
|
-
Separate out Redis functionality into
|
192
|
-
`ActionCable::SubscriptionAdapter::Redis`, and add a
|
193
|
-
PostgreSQL adapter as well. Configuration file for
|
194
|
-
ActionCable was changed from`config/redis/cable.yml` to
|
195
|
-
`config/cable.yml`.
|
40
|
+
Fixes #25613.
|
196
41
|
|
197
|
-
*
|
42
|
+
*Tinco Andringa*
|
198
43
|
|
199
|
-
* Added to Rails!
|
200
44
|
|
201
|
-
|
45
|
+
Please check [5-0-stable](https://github.com/rails/rails/blob/5-0-stable/actioncable/CHANGELOG.md) for previous changes.
|
data/MIT-LICENSE
CHANGED
data/README.md
CHANGED
@@ -7,7 +7,6 @@ and scalable. It's a full-stack offering that provides both a client-side
|
|
7
7
|
JavaScript framework and a server-side Ruby framework. You have access to your full
|
8
8
|
domain model written with Active Record or your ORM of choice.
|
9
9
|
|
10
|
-
|
11
10
|
## Terminology
|
12
11
|
|
13
12
|
A single Action Cable server can handle multiple connection instances. It has one
|
@@ -52,7 +51,7 @@ module ApplicationCable
|
|
52
51
|
self.current_user = find_verified_user
|
53
52
|
end
|
54
53
|
|
55
|
-
|
54
|
+
private
|
56
55
|
def find_verified_user
|
57
56
|
if current_user = User.find_by(id: cookies.signed[:user_id])
|
58
57
|
current_user
|
@@ -86,12 +85,17 @@ end
|
|
86
85
|
|
87
86
|
The client-side needs to setup a consumer instance of this connection. That's done like so:
|
88
87
|
|
89
|
-
```
|
90
|
-
|
91
|
-
|
88
|
+
```js
|
89
|
+
// app/assets/javascripts/cable.js
|
90
|
+
//= require action_cable
|
91
|
+
//= require_self
|
92
|
+
//= require_tree ./channels
|
92
93
|
|
93
|
-
|
94
|
-
App.
|
94
|
+
(function() {
|
95
|
+
this.App || (this.App = {});
|
96
|
+
|
97
|
+
App.cable = ActionCable.createConsumer("ws://cable.example.com");
|
98
|
+
}).call(this);
|
95
99
|
```
|
96
100
|
|
97
101
|
The `ws://cable.example.com` address must point to your Action Cable server(s), and it
|
@@ -163,7 +167,7 @@ App.cable.subscriptions.create "AppearanceChannel",
|
|
163
167
|
buttonSelector = "[data-behavior~=appear_away]"
|
164
168
|
|
165
169
|
install: ->
|
166
|
-
$(document).on "
|
170
|
+
$(document).on "turbolinks:load.appearance", =>
|
167
171
|
@appear()
|
168
172
|
|
169
173
|
$(document).on "click.appearance", buttonSelector, =>
|
@@ -293,8 +297,7 @@ The rebroadcast will be received by all connected clients, _including_ the clien
|
|
293
297
|
|
294
298
|
### More complete examples
|
295
299
|
|
296
|
-
See the [rails/actioncable-examples](
|
297
|
-
|
300
|
+
See the [rails/actioncable-examples](https://github.com/rails/actioncable-examples) repository for a full example of how to setup Action Cable in a Rails app, and how to add channels.
|
298
301
|
|
299
302
|
## Configuration
|
300
303
|
|
@@ -383,11 +386,11 @@ App.cable = ActionCable.createConsumer()
|
|
383
386
|
|
384
387
|
### Other Configurations
|
385
388
|
|
386
|
-
The other common option to configure is the log tags applied to the per-connection logger. Here's
|
389
|
+
The other common option to configure is the log tags applied to the per-connection logger. Here's an example that uses the user account id if available, else "no-account" while tagging:
|
387
390
|
|
388
391
|
```ruby
|
389
|
-
|
390
|
-
-> request { request.env['
|
392
|
+
config.action_cable.log_tags = [
|
393
|
+
-> request { request.env['user_account_id'] || "no-account" },
|
391
394
|
:action_cable,
|
392
395
|
-> request { request.uuid }
|
393
396
|
]
|
@@ -413,7 +416,7 @@ run ActionCable.server
|
|
413
416
|
```
|
414
417
|
|
415
418
|
Then you start the server using a binstub in bin/cable ala:
|
416
|
-
```
|
419
|
+
```sh
|
417
420
|
#!/bin/bash
|
418
421
|
bundle exec puma -p 28080 cable/config.ru
|
419
422
|
```
|
@@ -435,7 +438,7 @@ For every instance of your server you create and for every worker your server sp
|
|
435
438
|
|
436
439
|
### Notes
|
437
440
|
|
438
|
-
Beware that currently the cable server will _not_ auto-reload any changes in the framework. As we've discussed, long-running cable connections mean long-running objects. We don't yet have a way of reloading the classes of those objects in a safe manner. So when you change your channels, or the model your channels use, you must restart the cable server.
|
441
|
+
Beware that currently, the cable server will _not_ auto-reload any changes in the framework. As we've discussed, long-running cable connections mean long-running objects. We don't yet have a way of reloading the classes of those objects in a safe manner. So when you change your channels, or the model your channels use, you must restart the cable server.
|
439
442
|
|
440
443
|
We'll get all this abstracted properly when the framework is integrated into Rails.
|
441
444
|
|
data/lib/action_cable.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
#--
|
2
|
-
# Copyright (c) 2015-
|
2
|
+
# Copyright (c) 2015-2017 Basecamp, LLC
|
3
3
|
#
|
4
4
|
# Permission is hereby granted, free of charge, to any person obtaining
|
5
5
|
# a copy of this software and associated documentation files (the
|
@@ -21,21 +21,21 @@
|
|
21
21
|
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
22
22
|
#++
|
23
23
|
|
24
|
-
require
|
25
|
-
require
|
26
|
-
require
|
24
|
+
require "active_support"
|
25
|
+
require "active_support/rails"
|
26
|
+
require "action_cable/version"
|
27
27
|
|
28
28
|
module ActionCable
|
29
29
|
extend ActiveSupport::Autoload
|
30
30
|
|
31
31
|
INTERNAL = {
|
32
32
|
message_types: {
|
33
|
-
welcome:
|
34
|
-
ping:
|
35
|
-
confirmation:
|
36
|
-
rejection:
|
33
|
+
welcome: "welcome".freeze,
|
34
|
+
ping: "ping".freeze,
|
35
|
+
confirmation: "confirm_subscription".freeze,
|
36
|
+
rejection: "reject_subscription".freeze
|
37
37
|
},
|
38
|
-
default_mount_path:
|
38
|
+
default_mount_path: "/cable".freeze,
|
39
39
|
protocols: ["actioncable-v1-json".freeze, "actioncable-unsupported".freeze].freeze
|
40
40
|
}
|
41
41
|
|
@@ -1,4 +1,4 @@
|
|
1
|
-
require
|
1
|
+
require "set"
|
2
2
|
|
3
3
|
module ActionCable
|
4
4
|
module Channel
|
@@ -122,16 +122,16 @@ module ActionCable
|
|
122
122
|
end
|
123
123
|
end
|
124
124
|
|
125
|
-
|
125
|
+
private
|
126
126
|
# action_methods are cached and there is sometimes need to refresh
|
127
127
|
# them. ::clear_action_methods! allows you to do that, so next time
|
128
128
|
# you run action_methods, they will be recalculated.
|
129
|
-
def clear_action_methods!
|
129
|
+
def clear_action_methods! # :doc:
|
130
130
|
@action_methods = nil
|
131
131
|
end
|
132
132
|
|
133
133
|
# Refresh the cached action_methods when a new action_method is added.
|
134
|
-
def method_added(name)
|
134
|
+
def method_added(name) # :doc:
|
135
135
|
super
|
136
136
|
clear_action_methods!
|
137
137
|
end
|
@@ -189,24 +189,23 @@ module ActionCable
|
|
189
189
|
end
|
190
190
|
end
|
191
191
|
|
192
|
-
|
193
|
-
protected
|
192
|
+
private
|
194
193
|
# Called once a consumer has become a subscriber of the channel. Usually the place to setup any streams
|
195
194
|
# you want this channel to be sending to the subscriber.
|
196
|
-
def subscribed
|
195
|
+
def subscribed # :doc:
|
197
196
|
# Override in subclasses
|
198
197
|
end
|
199
198
|
|
200
199
|
# Called once a consumer has cut its cable connection. Can be used for cleaning up connections or marking
|
201
200
|
# users as offline or the like.
|
202
|
-
def unsubscribed
|
201
|
+
def unsubscribed # :doc:
|
203
202
|
# Override in subclasses
|
204
203
|
end
|
205
204
|
|
206
205
|
# Transmit a hash of data to the subscriber. The hash will automatically be wrapped in a JSON envelope with
|
207
206
|
# the proper channel identifier marked as the recipient.
|
208
|
-
def transmit(data, via: nil)
|
209
|
-
logger.
|
207
|
+
def transmit(data, via: nil) # :doc:
|
208
|
+
logger.debug "#{self.class.name} transmitting #{data.inspect.truncate(300)}".tap { |m| m << " (via #{via})" if via }
|
210
209
|
|
211
210
|
payload = { channel_class: self.class.name, data: data, via: via }
|
212
211
|
ActiveSupport::Notifications.instrument("transmit.action_cable", payload) do
|
@@ -214,33 +213,32 @@ module ActionCable
|
|
214
213
|
end
|
215
214
|
end
|
216
215
|
|
217
|
-
def ensure_confirmation_sent
|
216
|
+
def ensure_confirmation_sent # :doc:
|
218
217
|
return if subscription_rejected?
|
219
218
|
@defer_subscription_confirmation_counter.decrement
|
220
219
|
transmit_subscription_confirmation unless defer_subscription_confirmation?
|
221
220
|
end
|
222
221
|
|
223
|
-
def defer_subscription_confirmation!
|
222
|
+
def defer_subscription_confirmation! # :doc:
|
224
223
|
@defer_subscription_confirmation_counter.increment
|
225
224
|
end
|
226
225
|
|
227
|
-
def defer_subscription_confirmation?
|
226
|
+
def defer_subscription_confirmation? # :doc:
|
228
227
|
@defer_subscription_confirmation_counter.value > 0
|
229
228
|
end
|
230
229
|
|
231
|
-
def subscription_confirmation_sent?
|
230
|
+
def subscription_confirmation_sent? # :doc:
|
232
231
|
@subscription_confirmation_sent
|
233
232
|
end
|
234
233
|
|
235
|
-
def reject
|
234
|
+
def reject # :doc:
|
236
235
|
@reject_subscription = true
|
237
236
|
end
|
238
237
|
|
239
|
-
def subscription_rejected?
|
238
|
+
def subscription_rejected? # :doc:
|
240
239
|
@reject_subscription
|
241
240
|
end
|
242
241
|
|
243
|
-
private
|
244
242
|
def delegate_connection_identifiers
|
245
243
|
connection.identifiers.each do |identifier|
|
246
244
|
define_singleton_method(identifier) do
|
@@ -250,7 +248,7 @@ module ActionCable
|
|
250
248
|
end
|
251
249
|
|
252
250
|
def extract_action(data)
|
253
|
-
(data[
|
251
|
+
(data["action"].presence || :receive).to_sym
|
254
252
|
end
|
255
253
|
|
256
254
|
def processable_action?(action)
|
@@ -269,7 +267,7 @@ module ActionCable
|
|
269
267
|
|
270
268
|
def action_signature(action, data)
|
271
269
|
"#{self.class.name}##{action}".tap do |signature|
|
272
|
-
if (arguments = data.except(
|
270
|
+
if (arguments = data.except("action")).any?
|
273
271
|
signature << "(#{arguments.inspect})"
|
274
272
|
end
|
275
273
|
end
|