actioncable 6.0.6.1 → 6.1.0.rc1
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 +4 -4
- data/CHANGELOG.md +25 -284
- data/MIT-LICENSE +1 -1
- data/app/assets/javascripts/action_cable.js +1 -1
- data/lib/action_cable/channel/base.rb +3 -3
- data/lib/action_cable/channel/naming.rb +1 -1
- data/lib/action_cable/channel/streams.rb +28 -2
- data/lib/action_cable/channel/test_case.rb +2 -2
- data/lib/action_cable/connection/base.rb +2 -0
- data/lib/action_cable/connection/subscriptions.rb +1 -0
- data/lib/action_cable/connection/test_case.rb +2 -2
- data/lib/action_cable/gem_version.rb +3 -3
- data/lib/action_cable/helpers/action_cable_helper.rb +3 -3
- data/lib/action_cable/server/base.rb +1 -1
- data/lib/action_cable/server/broadcasting.rb +1 -1
- data/lib/action_cable/server/worker.rb +1 -0
- data/lib/action_cable/server.rb +0 -1
- data/lib/action_cable/subscription_adapter/base.rb +4 -0
- data/lib/action_cable/subscription_adapter/postgresql.rb +2 -1
- data/lib/action_cable/subscription_adapter/redis.rb +1 -2
- data/lib/action_cable/test_helper.rb +4 -4
- data/lib/action_cable.rb +1 -1
- data/lib/rails/generators/channel/USAGE +2 -2
- data/lib/rails/generators/channel/templates/javascript/consumer.js.tt +1 -1
- metadata +27 -14
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: '092e0f4da989f896c2b9926bde6aba57287b719f59a31eb9d6e50447547c14f9'
|
|
4
|
+
data.tar.gz: bc103b20688523c1d869c08ba8b7a211b30e01f8e8b46f545a3c4f8dcbbe09d2
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 923749293a1a29b9d75507a0558c755c737b12a595f0e33ca81e5e39b415dedc63fb8b93e40be99e50877d6470312cad3adf0e303e5652864aa6bcf159a9fbca
|
|
7
|
+
data.tar.gz: 533a1cf1c47f07c9d6f9044e5ad5f6a78ed78a2ec5daf29d0de51b63d5f2d8bbeff46355ddc4ff0466d8a3d91d6da5d29818a5142f0a669032dad85455d403ab
|
data/CHANGELOG.md
CHANGED
|
@@ -1,299 +1,40 @@
|
|
|
1
|
-
## Rails 6.0.
|
|
1
|
+
## Rails 6.1.0.rc1 (November 02, 2020) ##
|
|
2
2
|
|
|
3
|
-
*
|
|
3
|
+
* `ActionCable::Connection::Base` now allows intercepting unhandled exceptions
|
|
4
|
+
with `rescue_from` before they are logged, which is useful for error reporting
|
|
5
|
+
tools and other integrations.
|
|
4
6
|
|
|
7
|
+
*Justin Talbott*
|
|
5
8
|
|
|
6
|
-
|
|
9
|
+
* Add `ActionCable::Channel#stream_or_reject_for` to stream if record is present, otherwise reject the connection
|
|
7
10
|
|
|
8
|
-
*
|
|
11
|
+
*Atul Bhosale*
|
|
9
12
|
|
|
13
|
+
* Add `ActionCable::Channel#stop_stream_from` and `#stop_stream_for` to unsubscribe from a specific stream.
|
|
10
14
|
|
|
11
|
-
|
|
15
|
+
*Zhang Kang*
|
|
12
16
|
|
|
13
|
-
*
|
|
17
|
+
* Add PostgreSQL subscription connection identificator.
|
|
14
18
|
|
|
19
|
+
Now you can distinguish Action Cable PostgreSQL subscription connections among others.
|
|
20
|
+
Also, you can set custom `id` in `cable.yml` configuration.
|
|
15
21
|
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
## Rails 6.0.4.7 (March 08, 2022) ##
|
|
27
|
-
|
|
28
|
-
* No changes.
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
## Rails 6.0.4.6 (February 11, 2022) ##
|
|
32
|
-
|
|
33
|
-
* No changes.
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
## Rails 6.0.4.5 (February 11, 2022) ##
|
|
37
|
-
|
|
38
|
-
* No changes.
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
## Rails 6.0.4.4 (December 15, 2021) ##
|
|
42
|
-
|
|
43
|
-
* No changes.
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
## Rails 6.0.4.3 (December 14, 2021) ##
|
|
47
|
-
|
|
48
|
-
* No changes.
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
## Rails 6.0.4.2 (December 14, 2021) ##
|
|
52
|
-
|
|
53
|
-
* No changes.
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
## Rails 6.0.4.1 (August 19, 2021) ##
|
|
57
|
-
|
|
58
|
-
* No changes.
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
## Rails 6.0.4 (June 15, 2021) ##
|
|
62
|
-
|
|
63
|
-
* No changes.
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
## Rails 6.0.3.7 (May 05, 2021) ##
|
|
67
|
-
|
|
68
|
-
* No changes.
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
## Rails 6.0.3.6 (May 04, 2021) ##
|
|
72
|
-
|
|
73
|
-
* No changes.
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
## Rails 6.0.3.6 (March 26, 2021) ##
|
|
77
|
-
|
|
78
|
-
* No changes.
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
## Rails 6.0.3.5 (February 10, 2021) ##
|
|
82
|
-
|
|
83
|
-
* No changes.
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
## Rails 6.0.3.4 (October 07, 2020) ##
|
|
87
|
-
|
|
88
|
-
* No changes.
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
## Rails 6.0.3.3 (September 09, 2020) ##
|
|
92
|
-
|
|
93
|
-
* No changes.
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
## Rails 6.0.3.2 (June 17, 2020) ##
|
|
97
|
-
|
|
98
|
-
* No changes.
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
## Rails 6.0.3.1 (May 18, 2020) ##
|
|
102
|
-
|
|
103
|
-
* No changes.
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
## Rails 6.0.3 (May 06, 2020) ##
|
|
107
|
-
|
|
108
|
-
* No changes.
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
## Rails 6.0.2.2 (March 19, 2020) ##
|
|
112
|
-
|
|
113
|
-
* No changes.
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
## Rails 6.0.2.1 (December 18, 2019) ##
|
|
117
|
-
|
|
118
|
-
* No changes.
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
## Rails 6.0.2 (December 13, 2019) ##
|
|
122
|
-
|
|
123
|
-
* No changes.
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
## Rails 6.0.1 (November 5, 2019) ##
|
|
127
|
-
|
|
128
|
-
* No changes.
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
## Rails 6.0.0 (August 16, 2019) ##
|
|
132
|
-
|
|
133
|
-
* No changes.
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
## Rails 6.0.0.rc2 (July 22, 2019) ##
|
|
137
|
-
|
|
138
|
-
* No changes.
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
## Rails 6.0.0.rc1 (April 24, 2019) ##
|
|
142
|
-
|
|
143
|
-
* No changes.
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
## Rails 6.0.0.beta3 (March 11, 2019) ##
|
|
147
|
-
|
|
148
|
-
* No changes.
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
## Rails 6.0.0.beta2 (February 25, 2019) ##
|
|
152
|
-
|
|
153
|
-
* PostgreSQL subscription adapters now support `channel_prefix` option in cable.yml
|
|
154
|
-
|
|
155
|
-
Avoids channel name collisions when multiple apps use the same database for Action Cable.
|
|
156
|
-
|
|
157
|
-
*Vladimir Dementyev*
|
|
158
|
-
|
|
159
|
-
* Allow passing custom configuration to `ActionCable::Server::Base`.
|
|
160
|
-
|
|
161
|
-
You can now create a standalone Action Cable server with a custom configuration
|
|
162
|
-
(e.g. to run it in isolation from the default one):
|
|
163
|
-
|
|
164
|
-
```ruby
|
|
165
|
-
config = ActionCable::Server::Configuration.new
|
|
166
|
-
config.cable = { adapter: "redis", channel_prefix: "custom_" }
|
|
167
|
-
|
|
168
|
-
CUSTOM_CABLE = ActionCable::Server::Base.new(config: config)
|
|
169
|
-
```
|
|
170
|
-
|
|
171
|
-
Then you can mount it in the `routes.rb` file:
|
|
172
|
-
|
|
173
|
-
```ruby
|
|
174
|
-
Rails.application.routes.draw do
|
|
175
|
-
mount CUSTOM_CABLE => "/custom_cable"
|
|
176
|
-
# ...
|
|
177
|
-
end
|
|
178
|
-
```
|
|
179
|
-
|
|
180
|
-
*Vladimir Dementyev*
|
|
181
|
-
|
|
182
|
-
* Add `:action_cable_connection` and `:action_cable_channel` load hooks.
|
|
183
|
-
|
|
184
|
-
You can use them to extend `ActionCable::Connection::Base` and `ActionCable::Channel::Base`
|
|
185
|
-
functionality:
|
|
186
|
-
|
|
187
|
-
```ruby
|
|
188
|
-
ActiveSupport.on_load(:action_cable_channel) do
|
|
189
|
-
# do something in the context of ActionCable::Channel::Base
|
|
190
|
-
end
|
|
191
|
-
```
|
|
192
|
-
|
|
193
|
-
*Vladimir Dementyev*
|
|
194
|
-
|
|
195
|
-
* Add `Channel::Base#broadcast_to`.
|
|
196
|
-
|
|
197
|
-
You can now call `broadcast_to` within a channel action, which equals to
|
|
198
|
-
the `self.class.broadcast_to`.
|
|
199
|
-
|
|
200
|
-
*Vladimir Dementyev*
|
|
201
|
-
|
|
202
|
-
* Make `Channel::Base.broadcasting_for` a public API.
|
|
203
|
-
|
|
204
|
-
You can use `.broadcasting_for` to generate a unique stream identifier within
|
|
205
|
-
a channel for the specified target (e.g. Active Record model):
|
|
206
|
-
|
|
207
|
-
```ruby
|
|
208
|
-
ChatChannel.broadcasting_for(model) # => "chat:<model.to_gid_param>"
|
|
209
|
-
```
|
|
210
|
-
|
|
211
|
-
*Vladimir Dementyev*
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
## Rails 6.0.0.beta1 (January 18, 2019) ##
|
|
215
|
-
|
|
216
|
-
* [Rename npm package](https://github.com/rails/rails/pull/34905) from
|
|
217
|
-
[`actioncable`](https://www.npmjs.com/package/actioncable) to
|
|
218
|
-
[`@rails/actioncable`](https://www.npmjs.com/package/@rails/actioncable).
|
|
219
|
-
|
|
220
|
-
*Javan Makhmali*
|
|
221
|
-
|
|
222
|
-
* Merge [`action-cable-testing`](https://github.com/palkan/action-cable-testing) to Rails.
|
|
223
|
-
|
|
224
|
-
*Vladimir Dementyev*
|
|
225
|
-
|
|
226
|
-
* The JavaScript WebSocket client will no longer try to reconnect
|
|
227
|
-
when you call `reject_unauthorized_connection` on the connection.
|
|
228
|
-
|
|
229
|
-
*Mick Staugaard*
|
|
230
|
-
|
|
231
|
-
* `ActionCable.Connection#getState` now references the configurable
|
|
232
|
-
`ActionCable.adapters.WebSocket` property rather than the `WebSocket` global
|
|
233
|
-
variable, matching the behavior of `ActionCable.Connection#open`.
|
|
234
|
-
|
|
235
|
-
*Richard Macklin*
|
|
236
|
-
|
|
237
|
-
* The ActionCable javascript package has been converted from CoffeeScript
|
|
238
|
-
to ES2015, and we now publish the source code in the npm distribution.
|
|
239
|
-
|
|
240
|
-
This allows ActionCable users to depend on the javascript source code
|
|
241
|
-
rather than the compiled code, which can produce smaller javascript bundles.
|
|
242
|
-
|
|
243
|
-
This change includes some breaking changes to optional parts of the
|
|
244
|
-
ActionCable javascript API:
|
|
245
|
-
|
|
246
|
-
- Configuration of the WebSocket adapter and logger adapter have been moved
|
|
247
|
-
from properties of `ActionCable` to properties of `ActionCable.adapters`.
|
|
248
|
-
If you are currently configuring these adapters you will need to make
|
|
249
|
-
these changes when upgrading:
|
|
250
|
-
|
|
251
|
-
```diff
|
|
252
|
-
- ActionCable.WebSocket = MyWebSocket
|
|
253
|
-
+ ActionCable.adapters.WebSocket = MyWebSocket
|
|
254
|
-
```
|
|
255
|
-
```diff
|
|
256
|
-
- ActionCable.logger = myLogger
|
|
257
|
-
+ ActionCable.adapters.logger = myLogger
|
|
258
|
-
```
|
|
259
|
-
|
|
260
|
-
- The `ActionCable.startDebugging()` and `ActionCable.stopDebugging()`
|
|
261
|
-
methods have been removed and replaced with the property
|
|
262
|
-
`ActionCable.logger.enabled`. If you are currently using these methods you
|
|
263
|
-
will need to make these changes when upgrading:
|
|
264
|
-
|
|
265
|
-
```diff
|
|
266
|
-
- ActionCable.startDebugging()
|
|
267
|
-
+ ActionCable.logger.enabled = true
|
|
268
|
-
```
|
|
269
|
-
```diff
|
|
270
|
-
- ActionCable.stopDebugging()
|
|
271
|
-
+ ActionCable.logger.enabled = false
|
|
272
|
-
```
|
|
273
|
-
|
|
274
|
-
*Richard Macklin*
|
|
275
|
-
|
|
276
|
-
* Add `id` option to redis adapter so now you can distinguish
|
|
277
|
-
ActionCable's redis connections among others. Also, you can set
|
|
278
|
-
custom id in options.
|
|
279
|
-
|
|
280
|
-
Before:
|
|
281
|
-
```
|
|
282
|
-
$ redis-cli client list
|
|
283
|
-
id=669 addr=127.0.0.1:46442 fd=8 name= age=18 ...
|
|
284
|
-
```
|
|
285
|
-
|
|
286
|
-
After:
|
|
287
|
-
```
|
|
288
|
-
$ redis-cli client list
|
|
289
|
-
id=673 addr=127.0.0.1:46516 fd=8 name=ActionCable-PID-19413 age=2 ...
|
|
22
|
+
```sql
|
|
23
|
+
SELECT application_name FROM pg_stat_activity;
|
|
24
|
+
/*
|
|
25
|
+
application_name
|
|
26
|
+
------------------------
|
|
27
|
+
psql
|
|
28
|
+
ActionCable-PID-42
|
|
29
|
+
(2 rows)
|
|
30
|
+
*/
|
|
290
31
|
```
|
|
291
32
|
|
|
292
|
-
*
|
|
33
|
+
*Sergey Ponomarev*
|
|
293
34
|
|
|
294
|
-
*
|
|
35
|
+
* Subscription confirmations and rejections are now logged at the `DEBUG` level instead of `INFO`.
|
|
295
36
|
|
|
296
|
-
*
|
|
37
|
+
*DHH*
|
|
297
38
|
|
|
298
39
|
|
|
299
|
-
Please check [
|
|
40
|
+
Please check [6-0-stable](https://github.com/rails/rails/blob/6-0-stable/actioncable/CHANGELOG.md) for previous changes.
|
data/MIT-LICENSE
CHANGED
|
@@ -135,7 +135,7 @@
|
|
|
135
135
|
if (document.visibilityState === "visible") {
|
|
136
136
|
setTimeout(function() {
|
|
137
137
|
if (_this2.connectionIsStale() || !_this2.connection.isOpen()) {
|
|
138
|
-
logger.log("ConnectionMonitor reopening stale connection on visibilitychange.
|
|
138
|
+
logger.log("ConnectionMonitor reopening stale connection on visibilitychange. visibilityState = " + document.visibilityState);
|
|
139
139
|
_this2.connection.reopen();
|
|
140
140
|
}
|
|
141
141
|
}, 200);
|
|
@@ -194,7 +194,7 @@ module ActionCable
|
|
|
194
194
|
end
|
|
195
195
|
|
|
196
196
|
private
|
|
197
|
-
# Called once a consumer has become a subscriber of the channel. Usually the place to
|
|
197
|
+
# Called once a consumer has become a subscriber of the channel. Usually the place to set up any streams
|
|
198
198
|
# you want this channel to be sending to the subscriber.
|
|
199
199
|
def subscribed # :doc:
|
|
200
200
|
# Override in subclasses
|
|
@@ -283,7 +283,7 @@ module ActionCable
|
|
|
283
283
|
|
|
284
284
|
def transmit_subscription_confirmation
|
|
285
285
|
unless subscription_confirmation_sent?
|
|
286
|
-
logger.
|
|
286
|
+
logger.debug "#{self.class.name} is transmitting the subscription confirmation"
|
|
287
287
|
|
|
288
288
|
ActiveSupport::Notifications.instrument("transmit_subscription_confirmation.action_cable", channel_class: self.class.name) do
|
|
289
289
|
connection.transmit identifier: @identifier, type: ActionCable::INTERNAL[:message_types][:confirmation]
|
|
@@ -298,7 +298,7 @@ module ActionCable
|
|
|
298
298
|
end
|
|
299
299
|
|
|
300
300
|
def transmit_subscription_rejection
|
|
301
|
-
logger.
|
|
301
|
+
logger.debug "#{self.class.name} is transmitting the subscription rejection"
|
|
302
302
|
|
|
303
303
|
ActiveSupport::Notifications.instrument("transmit_subscription_rejection.action_cable", channel_class: self.class.name) do
|
|
304
304
|
connection.transmit identifier: @identifier, type: ActionCable::INTERNAL[:message_types][:rejection]
|
|
@@ -14,7 +14,7 @@ module ActionCable
|
|
|
14
14
|
# Chats::AppearancesChannel.channel_name # => 'chats:appearances'
|
|
15
15
|
# FooChats::BarAppearancesChannel.channel_name # => 'foo_chats:bar_appearances'
|
|
16
16
|
def channel_name
|
|
17
|
-
@channel_name ||= name.
|
|
17
|
+
@channel_name ||= name.delete_suffix("Channel").gsub("::", ":").underscore
|
|
18
18
|
end
|
|
19
19
|
end
|
|
20
20
|
|
|
@@ -82,7 +82,7 @@ module ActionCable
|
|
|
82
82
|
# Build a stream handler by wrapping the user-provided callback with
|
|
83
83
|
# a decoder or defaulting to a JSON-decoding retransmitter.
|
|
84
84
|
handler = worker_pool_stream_handler(broadcasting, callback || block, coder: coder)
|
|
85
|
-
streams
|
|
85
|
+
streams[broadcasting] = handler
|
|
86
86
|
|
|
87
87
|
connection.server.event_loop.post do
|
|
88
88
|
pubsub.subscribe(broadcasting, handler, lambda do
|
|
@@ -102,6 +102,20 @@ module ActionCable
|
|
|
102
102
|
stream_from(broadcasting_for(model), callback || block, coder: coder)
|
|
103
103
|
end
|
|
104
104
|
|
|
105
|
+
# Unsubscribes streams from the named <tt>broadcasting</tt>.
|
|
106
|
+
def stop_stream_from(broadcasting)
|
|
107
|
+
callback = streams.delete(broadcasting)
|
|
108
|
+
if callback
|
|
109
|
+
pubsub.unsubscribe(broadcasting, callback)
|
|
110
|
+
logger.info "#{self.class.name} stopped streaming from #{broadcasting}"
|
|
111
|
+
end
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
# Unsubscribes streams for the <tt>model</tt>.
|
|
115
|
+
def stop_stream_for(model)
|
|
116
|
+
stop_stream_from(broadcasting_for(model))
|
|
117
|
+
end
|
|
118
|
+
|
|
105
119
|
# Unsubscribes all streams associated with this channel from the pubsub queue.
|
|
106
120
|
def stop_all_streams
|
|
107
121
|
streams.each do |broadcasting, callback|
|
|
@@ -110,11 +124,23 @@ module ActionCable
|
|
|
110
124
|
end.clear
|
|
111
125
|
end
|
|
112
126
|
|
|
127
|
+
# Calls stream_for if record is present, otherwise calls reject.
|
|
128
|
+
# This method is intended to be called when you're looking
|
|
129
|
+
# for a record based on a parameter, if its found it will start
|
|
130
|
+
# streaming. If the record is nil then it will reject the connection.
|
|
131
|
+
def stream_or_reject_for(record)
|
|
132
|
+
if record
|
|
133
|
+
stream_for record
|
|
134
|
+
else
|
|
135
|
+
reject
|
|
136
|
+
end
|
|
137
|
+
end
|
|
138
|
+
|
|
113
139
|
private
|
|
114
140
|
delegate :pubsub, to: :connection
|
|
115
141
|
|
|
116
142
|
def streams
|
|
117
|
-
@_streams ||=
|
|
143
|
+
@_streams ||= {}
|
|
118
144
|
end
|
|
119
145
|
|
|
120
146
|
# Always wrap the outermost handler to invoke the user handler on the
|
|
@@ -159,7 +159,7 @@ module ActionCable
|
|
|
159
159
|
# def test_speak
|
|
160
160
|
# subscribe room_id: rooms(:chat).id
|
|
161
161
|
#
|
|
162
|
-
#
|
|
162
|
+
# assert_broadcast_on(rooms(:chat), text: "Hello, Rails!") do
|
|
163
163
|
# perform :speak, message: "Hello, Rails!"
|
|
164
164
|
# end
|
|
165
165
|
# end
|
|
@@ -209,7 +209,7 @@ module ActionCable
|
|
|
209
209
|
end
|
|
210
210
|
end
|
|
211
211
|
|
|
212
|
-
#
|
|
212
|
+
# Set up test connection with the specified identifiers:
|
|
213
213
|
#
|
|
214
214
|
# class ApplicationCable < ActionCable::Connection::Base
|
|
215
215
|
# identified_by :user, :token
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
3
|
require "action_dispatch"
|
|
4
|
+
require "active_support/rescuable"
|
|
4
5
|
|
|
5
6
|
module ActionCable
|
|
6
7
|
module Connection
|
|
@@ -46,6 +47,7 @@ module ActionCable
|
|
|
46
47
|
include Identification
|
|
47
48
|
include InternalChannel
|
|
48
49
|
include Authorization
|
|
50
|
+
include ActiveSupport::Rescuable
|
|
49
51
|
|
|
50
52
|
attr_reader :server, :env, :subscriptions, :logger, :worker_pool, :protocol
|
|
51
53
|
delegate :event_loop, :pubsub, to: :server
|
|
@@ -21,6 +21,7 @@ module ActionCable
|
|
|
21
21
|
logger.error "Received unrecognized command in #{data.inspect}"
|
|
22
22
|
end
|
|
23
23
|
rescue Exception => e
|
|
24
|
+
@connection.rescue_with_handler(e)
|
|
24
25
|
logger.error "Could not execute command from (#{data.inspect}) [#{e.class} - #{e.message}]: #{e.backtrace.first(5).join(" | ")}"
|
|
25
26
|
end
|
|
26
27
|
|
|
@@ -85,7 +85,7 @@ module ActionCable
|
|
|
85
85
|
# end
|
|
86
86
|
# end
|
|
87
87
|
#
|
|
88
|
-
# +connect+ accepts additional information the HTTP request with the
|
|
88
|
+
# +connect+ accepts additional information about the HTTP request with the
|
|
89
89
|
# +params+, +headers+, +session+ and Rack +env+ options.
|
|
90
90
|
#
|
|
91
91
|
# def test_connect_with_headers_and_query_string
|
|
@@ -101,7 +101,7 @@ module ActionCable
|
|
|
101
101
|
# assert_equal "1", connection.user.id
|
|
102
102
|
# end
|
|
103
103
|
#
|
|
104
|
-
# You can also
|
|
104
|
+
# You can also set up the correct cookies before the connection request:
|
|
105
105
|
#
|
|
106
106
|
# def test_connect_with_cookies
|
|
107
107
|
# # Plain cookies:
|
|
@@ -12,11 +12,11 @@ module ActionCable
|
|
|
12
12
|
# </head>
|
|
13
13
|
#
|
|
14
14
|
# This is then used by Action Cable to determine the URL of your WebSocket server.
|
|
15
|
-
# Your
|
|
15
|
+
# Your JavaScript can then connect to the server without needing to specify the
|
|
16
16
|
# URL directly:
|
|
17
17
|
#
|
|
18
|
-
#
|
|
19
|
-
#
|
|
18
|
+
# window.Cable = require("@rails/actioncable")
|
|
19
|
+
# window.App = {}
|
|
20
20
|
# App.cable = Cable.createConsumer()
|
|
21
21
|
#
|
|
22
22
|
# Make sure to specify the correct server location in each of your environment
|
|
@@ -27,7 +27,7 @@ module ActionCable
|
|
|
27
27
|
@remote_connections = @event_loop = @worker_pool = @pubsub = nil
|
|
28
28
|
end
|
|
29
29
|
|
|
30
|
-
# Called by Rack to
|
|
30
|
+
# Called by Rack to set up the server.
|
|
31
31
|
def call(env)
|
|
32
32
|
setup_heartbeat_timer
|
|
33
33
|
config.connection_class.call.new(self, env).process
|
|
@@ -40,7 +40,7 @@ module ActionCable
|
|
|
40
40
|
end
|
|
41
41
|
|
|
42
42
|
def broadcast(message)
|
|
43
|
-
server.logger.debug "[ActionCable] Broadcasting to #{broadcasting}: #{message.inspect}"
|
|
43
|
+
server.logger.debug { "[ActionCable] Broadcasting to #{broadcasting}: #{message.inspect}" }
|
|
44
44
|
|
|
45
45
|
payload = { broadcasting: broadcasting, message: message, coder: coder }
|
|
46
46
|
ActiveSupport::Notifications.instrument("broadcast.action_cable", payload) do
|
data/lib/action_cable/server.rb
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
-
gem "pg", "
|
|
3
|
+
gem "pg", "~> 1.1"
|
|
4
4
|
require "pg"
|
|
5
5
|
require "thread"
|
|
6
6
|
require "digest/sha1"
|
|
@@ -42,6 +42,7 @@ module ActionCable
|
|
|
42
42
|
pg_conn = ar_conn.raw_connection
|
|
43
43
|
|
|
44
44
|
verify!(pg_conn)
|
|
45
|
+
pg_conn.exec("SET application_name = #{pg_conn.escape_identifier(identifier)}")
|
|
45
46
|
yield pg_conn
|
|
46
47
|
ensure
|
|
47
48
|
ar_conn.disconnect!
|
|
@@ -15,7 +15,6 @@ module ActionCable
|
|
|
15
15
|
# Overwrite this factory method for Redis connections if you want to use a different Redis library than the redis gem.
|
|
16
16
|
# This is needed, for example, when using Makara proxies for distributed Redis.
|
|
17
17
|
cattr_accessor :redis_connector, default: ->(config) do
|
|
18
|
-
config[:id] ||= "ActionCable-PID-#{$$}"
|
|
19
18
|
::Redis.new(config.except(:adapter, :channel_prefix))
|
|
20
19
|
end
|
|
21
20
|
|
|
@@ -57,7 +56,7 @@ module ActionCable
|
|
|
57
56
|
end
|
|
58
57
|
|
|
59
58
|
def redis_connection
|
|
60
|
-
self.class.redis_connector.call(@server.config.cable)
|
|
59
|
+
self.class.redis_connector.call(@server.config.cable.merge(id: identifier))
|
|
61
60
|
end
|
|
62
61
|
|
|
63
62
|
class Listener < SubscriberMap
|
|
@@ -42,10 +42,10 @@ module ActionCable
|
|
|
42
42
|
# end
|
|
43
43
|
# end
|
|
44
44
|
#
|
|
45
|
-
def assert_broadcasts(stream, number)
|
|
45
|
+
def assert_broadcasts(stream, number, &block)
|
|
46
46
|
if block_given?
|
|
47
47
|
original_count = broadcasts_size(stream)
|
|
48
|
-
|
|
48
|
+
assert_nothing_raised(&block)
|
|
49
49
|
new_count = broadcasts_size(stream)
|
|
50
50
|
actual_count = new_count - original_count
|
|
51
51
|
else
|
|
@@ -94,7 +94,7 @@ module ActionCable
|
|
|
94
94
|
# end
|
|
95
95
|
# end
|
|
96
96
|
#
|
|
97
|
-
def assert_broadcast_on(stream, data)
|
|
97
|
+
def assert_broadcast_on(stream, data, &block)
|
|
98
98
|
# Encode to JSON and back–we want to use this value to compare
|
|
99
99
|
# with decoded JSON.
|
|
100
100
|
# Comparing JSON strings doesn't work due to the order if the keys.
|
|
@@ -106,7 +106,7 @@ module ActionCable
|
|
|
106
106
|
old_messages = new_messages
|
|
107
107
|
clear_messages(stream)
|
|
108
108
|
|
|
109
|
-
|
|
109
|
+
assert_nothing_raised(&block)
|
|
110
110
|
new_messages = broadcasts(stream)
|
|
111
111
|
clear_messages(stream)
|
|
112
112
|
|
data/lib/action_cable.rb
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
3
|
#--
|
|
4
|
-
# Copyright (c) 2015-
|
|
4
|
+
# Copyright (c) 2015-2020 Basecamp, LLC
|
|
5
5
|
#
|
|
6
6
|
# Permission is hereby granted, free of charge, to any person obtaining
|
|
7
7
|
# a copy of this software and associated documentation files (the
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
Description:
|
|
2
2
|
============
|
|
3
|
-
|
|
3
|
+
Generates a new cable channel for the server (in Ruby) and client (in JavaScript).
|
|
4
4
|
Pass the channel name, either CamelCased or under_scored, and an optional list of channel actions as arguments.
|
|
5
5
|
|
|
6
6
|
Example:
|
|
7
7
|
========
|
|
8
|
-
rails generate channel Chat speak
|
|
8
|
+
bin/rails generate channel Chat speak
|
|
9
9
|
|
|
10
10
|
creates a Chat channel class, test and JavaScript asset:
|
|
11
11
|
Channel: app/channels/chat_channel.rb
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
// Action Cable provides the framework to deal with WebSockets in Rails.
|
|
2
|
-
// You can generate new channels where WebSocket features live using the `rails generate channel` command.
|
|
2
|
+
// You can generate new channels where WebSocket features live using the `bin/rails generate channel` command.
|
|
3
3
|
|
|
4
4
|
import { createConsumer } from "@rails/actioncable"
|
|
5
5
|
|
metadata
CHANGED
|
@@ -1,30 +1,44 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: actioncable
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 6.0.
|
|
4
|
+
version: 6.1.0.rc1
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Pratik Naik
|
|
8
8
|
- David Heinemeier Hansson
|
|
9
|
-
autorequire:
|
|
9
|
+
autorequire:
|
|
10
10
|
bindir: bin
|
|
11
11
|
cert_chain: []
|
|
12
|
-
date:
|
|
12
|
+
date: 2020-11-02 00:00:00.000000000 Z
|
|
13
13
|
dependencies:
|
|
14
|
+
- !ruby/object:Gem::Dependency
|
|
15
|
+
name: activesupport
|
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
|
17
|
+
requirements:
|
|
18
|
+
- - '='
|
|
19
|
+
- !ruby/object:Gem::Version
|
|
20
|
+
version: 6.1.0.rc1
|
|
21
|
+
type: :runtime
|
|
22
|
+
prerelease: false
|
|
23
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
24
|
+
requirements:
|
|
25
|
+
- - '='
|
|
26
|
+
- !ruby/object:Gem::Version
|
|
27
|
+
version: 6.1.0.rc1
|
|
14
28
|
- !ruby/object:Gem::Dependency
|
|
15
29
|
name: actionpack
|
|
16
30
|
requirement: !ruby/object:Gem::Requirement
|
|
17
31
|
requirements:
|
|
18
32
|
- - '='
|
|
19
33
|
- !ruby/object:Gem::Version
|
|
20
|
-
version: 6.0.
|
|
34
|
+
version: 6.1.0.rc1
|
|
21
35
|
type: :runtime
|
|
22
36
|
prerelease: false
|
|
23
37
|
version_requirements: !ruby/object:Gem::Requirement
|
|
24
38
|
requirements:
|
|
25
39
|
- - '='
|
|
26
40
|
- !ruby/object:Gem::Version
|
|
27
|
-
version: 6.0.
|
|
41
|
+
version: 6.1.0.rc1
|
|
28
42
|
- !ruby/object:Gem::Dependency
|
|
29
43
|
name: nio4r
|
|
30
44
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -126,12 +140,11 @@ licenses:
|
|
|
126
140
|
- MIT
|
|
127
141
|
metadata:
|
|
128
142
|
bug_tracker_uri: https://github.com/rails/rails/issues
|
|
129
|
-
changelog_uri: https://github.com/rails/rails/blob/v6.0.
|
|
130
|
-
documentation_uri: https://api.rubyonrails.org/v6.0.
|
|
143
|
+
changelog_uri: https://github.com/rails/rails/blob/v6.1.0.rc1/actioncable/CHANGELOG.md
|
|
144
|
+
documentation_uri: https://api.rubyonrails.org/v6.1.0.rc1/
|
|
131
145
|
mailing_list_uri: https://discuss.rubyonrails.org/c/rubyonrails-talk
|
|
132
|
-
source_code_uri: https://github.com/rails/rails/tree/v6.0.
|
|
133
|
-
|
|
134
|
-
post_install_message:
|
|
146
|
+
source_code_uri: https://github.com/rails/rails/tree/v6.1.0.rc1/actioncable
|
|
147
|
+
post_install_message:
|
|
135
148
|
rdoc_options: []
|
|
136
149
|
require_paths:
|
|
137
150
|
- lib
|
|
@@ -142,12 +155,12 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
|
142
155
|
version: 2.5.0
|
|
143
156
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
144
157
|
requirements:
|
|
145
|
-
- - "
|
|
158
|
+
- - ">"
|
|
146
159
|
- !ruby/object:Gem::Version
|
|
147
|
-
version:
|
|
160
|
+
version: 1.3.1
|
|
148
161
|
requirements: []
|
|
149
|
-
rubygems_version: 3.4
|
|
150
|
-
signing_key:
|
|
162
|
+
rubygems_version: 3.1.4
|
|
163
|
+
signing_key:
|
|
151
164
|
specification_version: 4
|
|
152
165
|
summary: WebSocket framework for Rails.
|
|
153
166
|
test_files: []
|