actioncable 6.0.3.4 → 6.1.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +26 -195
- data/MIT-LICENSE +1 -1
- data/app/assets/javascripts/action_cable.js +1 -1
- data/lib/action_cable.rb +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/engine.rb +1 -1
- 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.rb +0 -1
- 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/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/rails/generators/channel/USAGE +2 -2
- data/lib/rails/generators/channel/templates/javascript/consumer.js.tt +1 -1
- metadata +22 -8
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7feb4f0b75d0e707652c4c754ad1a7c980c5e83909a0b3cca9f960fb552ff153
|
4
|
+
data.tar.gz: 685bc668cc0a266465ef91cfab6e9c7a0c91b3ff3ee62c14aa24212ed74e15d1
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9a8b51005331c276517a55e4438059ec6a697cc4c7e1e0c21d207370a9e542baac3c8598ab7ef068b4a5b9b1ea037213e70d5a81a720f2462d0260fed342e8b1
|
7
|
+
data.tar.gz: cf38227aab29668b58b8fcbe5295b757b9395c9369658667a153f22f4005593ea9291782c8c86f042272e947c33207a4cb2fd4fd19de5281ebb6b1b2ff619b1d
|
data/CHANGELOG.md
CHANGED
@@ -1,214 +1,45 @@
|
|
1
|
-
## Rails 6.
|
1
|
+
## Rails 6.1.1 (January 07, 2021) ##
|
2
2
|
|
3
3
|
* No changes.
|
4
4
|
|
5
5
|
|
6
|
-
## Rails 6.0
|
6
|
+
## Rails 6.1.0 (December 09, 2020) ##
|
7
7
|
|
8
|
-
*
|
9
|
-
|
10
|
-
|
11
|
-
## Rails 6.0.3.2 (June 17, 2020) ##
|
12
|
-
|
13
|
-
* No changes.
|
14
|
-
|
15
|
-
|
16
|
-
## Rails 6.0.3.1 (May 18, 2020) ##
|
17
|
-
|
18
|
-
* No changes.
|
19
|
-
|
20
|
-
|
21
|
-
## Rails 6.0.3 (May 06, 2020) ##
|
22
|
-
|
23
|
-
* No changes.
|
24
|
-
|
25
|
-
|
26
|
-
## Rails 6.0.2.2 (March 19, 2020) ##
|
27
|
-
|
28
|
-
* No changes.
|
29
|
-
|
30
|
-
|
31
|
-
## Rails 6.0.2.1 (December 18, 2019) ##
|
32
|
-
|
33
|
-
* No changes.
|
34
|
-
|
35
|
-
|
36
|
-
## Rails 6.0.2 (December 13, 2019) ##
|
37
|
-
|
38
|
-
* No changes.
|
39
|
-
|
40
|
-
|
41
|
-
## Rails 6.0.1 (November 5, 2019) ##
|
42
|
-
|
43
|
-
* No changes.
|
44
|
-
|
45
|
-
|
46
|
-
## Rails 6.0.0 (August 16, 2019) ##
|
47
|
-
|
48
|
-
* No changes.
|
49
|
-
|
50
|
-
|
51
|
-
## Rails 6.0.0.rc2 (July 22, 2019) ##
|
52
|
-
|
53
|
-
* No changes.
|
54
|
-
|
55
|
-
|
56
|
-
## Rails 6.0.0.rc1 (April 24, 2019) ##
|
57
|
-
|
58
|
-
* No changes.
|
59
|
-
|
60
|
-
|
61
|
-
## Rails 6.0.0.beta3 (March 11, 2019) ##
|
62
|
-
|
63
|
-
* No changes.
|
64
|
-
|
65
|
-
|
66
|
-
## Rails 6.0.0.beta2 (February 25, 2019) ##
|
67
|
-
|
68
|
-
* PostgreSQL subscription adapters now support `channel_prefix` option in cable.yml
|
69
|
-
|
70
|
-
Avoids channel name collisions when multiple apps use the same database for Action Cable.
|
71
|
-
|
72
|
-
*Vladimir Dementyev*
|
73
|
-
|
74
|
-
* Allow passing custom configuration to `ActionCable::Server::Base`.
|
75
|
-
|
76
|
-
You can now create a standalone Action Cable server with a custom configuration
|
77
|
-
(e.g. to run it in isolation from the default one):
|
78
|
-
|
79
|
-
```ruby
|
80
|
-
config = ActionCable::Server::Configuration.new
|
81
|
-
config.cable = { adapter: "redis", channel_prefix: "custom_" }
|
82
|
-
|
83
|
-
CUSTOM_CABLE = ActionCable::Server::Base.new(config: config)
|
84
|
-
```
|
85
|
-
|
86
|
-
Then you can mount it in the `routes.rb` file:
|
87
|
-
|
88
|
-
```ruby
|
89
|
-
Rails.application.routes.draw do
|
90
|
-
mount CUSTOM_CABLE => "/custom_cable"
|
91
|
-
# ...
|
92
|
-
end
|
93
|
-
```
|
94
|
-
|
95
|
-
*Vladimir Dementyev*
|
96
|
-
|
97
|
-
* Add `:action_cable_connection` and `:action_cable_channel` load hooks.
|
98
|
-
|
99
|
-
You can use them to extend `ActionCable::Connection::Base` and `ActionCable::Channel::Base`
|
100
|
-
functionality:
|
101
|
-
|
102
|
-
```ruby
|
103
|
-
ActiveSupport.on_load(:action_cable_channel) do
|
104
|
-
# do something in the context of ActionCable::Channel::Base
|
105
|
-
end
|
106
|
-
```
|
107
|
-
|
108
|
-
*Vladimir Dementyev*
|
109
|
-
|
110
|
-
* Add `Channel::Base#broadcast_to`.
|
111
|
-
|
112
|
-
You can now call `broadcast_to` within a channel action, which equals to
|
113
|
-
the `self.class.broadcast_to`.
|
8
|
+
* `ActionCable::Connection::Base` now allows intercepting unhandled exceptions
|
9
|
+
with `rescue_from` before they are logged, which is useful for error reporting
|
10
|
+
tools and other integrations.
|
114
11
|
|
115
|
-
*
|
12
|
+
*Justin Talbott*
|
116
13
|
|
117
|
-
*
|
14
|
+
* Add `ActionCable::Channel#stream_or_reject_for` to stream if record is present, otherwise reject the connection
|
118
15
|
|
119
|
-
|
120
|
-
a channel for the specified target (e.g. Active Record model):
|
16
|
+
*Atul Bhosale*
|
121
17
|
|
122
|
-
|
123
|
-
ChatChannel.broadcasting_for(model) # => "chat:<model.to_gid_param>"
|
124
|
-
```
|
125
|
-
|
126
|
-
*Vladimir Dementyev*
|
127
|
-
|
128
|
-
|
129
|
-
## Rails 6.0.0.beta1 (January 18, 2019) ##
|
130
|
-
|
131
|
-
* [Rename npm package](https://github.com/rails/rails/pull/34905) from
|
132
|
-
[`actioncable`](https://www.npmjs.com/package/actioncable) to
|
133
|
-
[`@rails/actioncable`](https://www.npmjs.com/package/@rails/actioncable).
|
134
|
-
|
135
|
-
*Javan Makhmali*
|
136
|
-
|
137
|
-
* Merge [`action-cable-testing`](https://github.com/palkan/action-cable-testing) to Rails.
|
138
|
-
|
139
|
-
*Vladimir Dementyev*
|
140
|
-
|
141
|
-
* The JavaScript WebSocket client will no longer try to reconnect
|
142
|
-
when you call `reject_unauthorized_connection` on the connection.
|
143
|
-
|
144
|
-
*Mick Staugaard*
|
145
|
-
|
146
|
-
* `ActionCable.Connection#getState` now references the configurable
|
147
|
-
`ActionCable.adapters.WebSocket` property rather than the `WebSocket` global
|
148
|
-
variable, matching the behavior of `ActionCable.Connection#open`.
|
18
|
+
* Add `ActionCable::Channel#stop_stream_from` and `#stop_stream_for` to unsubscribe from a specific stream.
|
149
19
|
|
150
|
-
*
|
20
|
+
*Zhang Kang*
|
151
21
|
|
152
|
-
*
|
153
|
-
to ES2015, and we now publish the source code in the npm distribution.
|
22
|
+
* Add PostgreSQL subscription connection identificator.
|
154
23
|
|
155
|
-
|
156
|
-
|
24
|
+
Now you can distinguish Action Cable PostgreSQL subscription connections among others.
|
25
|
+
Also, you can set custom `id` in `cable.yml` configuration.
|
157
26
|
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
- ActionCable.WebSocket = MyWebSocket
|
168
|
-
+ ActionCable.adapters.WebSocket = MyWebSocket
|
169
|
-
```
|
170
|
-
```diff
|
171
|
-
- ActionCable.logger = myLogger
|
172
|
-
+ ActionCable.adapters.logger = myLogger
|
173
|
-
```
|
174
|
-
|
175
|
-
- The `ActionCable.startDebugging()` and `ActionCable.stopDebugging()`
|
176
|
-
methods have been removed and replaced with the property
|
177
|
-
`ActionCable.logger.enabled`. If you are currently using these methods you
|
178
|
-
will need to make these changes when upgrading:
|
179
|
-
|
180
|
-
```diff
|
181
|
-
- ActionCable.startDebugging()
|
182
|
-
+ ActionCable.logger.enabled = true
|
183
|
-
```
|
184
|
-
```diff
|
185
|
-
- ActionCable.stopDebugging()
|
186
|
-
+ ActionCable.logger.enabled = false
|
187
|
-
```
|
188
|
-
|
189
|
-
*Richard Macklin*
|
190
|
-
|
191
|
-
* Add `id` option to redis adapter so now you can distinguish
|
192
|
-
ActionCable's redis connections among others. Also, you can set
|
193
|
-
custom id in options.
|
194
|
-
|
195
|
-
Before:
|
196
|
-
```
|
197
|
-
$ redis-cli client list
|
198
|
-
id=669 addr=127.0.0.1:46442 fd=8 name= age=18 ...
|
199
|
-
```
|
200
|
-
|
201
|
-
After:
|
202
|
-
```
|
203
|
-
$ redis-cli client list
|
204
|
-
id=673 addr=127.0.0.1:46516 fd=8 name=ActionCable-PID-19413 age=2 ...
|
27
|
+
```sql
|
28
|
+
SELECT application_name FROM pg_stat_activity;
|
29
|
+
/*
|
30
|
+
application_name
|
31
|
+
------------------------
|
32
|
+
psql
|
33
|
+
ActionCable-PID-42
|
34
|
+
(2 rows)
|
35
|
+
*/
|
205
36
|
```
|
206
37
|
|
207
|
-
*
|
38
|
+
*Sergey Ponomarev*
|
208
39
|
|
209
|
-
*
|
40
|
+
* Subscription confirmations and rejections are now logged at the `DEBUG` level instead of `INFO`.
|
210
41
|
|
211
|
-
*
|
42
|
+
*DHH*
|
212
43
|
|
213
44
|
|
214
|
-
Please check [
|
45
|
+
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);
|
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
|
@@ -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:
|
data/lib/action_cable/engine.rb
CHANGED
@@ -30,7 +30,7 @@ module ActionCable
|
|
30
30
|
|
31
31
|
ActiveSupport.on_load(:action_cable) do
|
32
32
|
if (config_path = Pathname.new(app.config.paths["config/cable"].first)).exist?
|
33
|
-
self.cable = Rails.application.config_for(config_path).with_indifferent_access
|
33
|
+
self.cable = Rails.application.config_for(config_path).to_h.with_indifferent_access
|
34
34
|
end
|
35
35
|
|
36
36
|
previous_connection_class = connection_class
|
@@ -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
|
data/lib/action_cable/server.rb
CHANGED
@@ -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
|
@@ -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
|
|
@@ -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,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: actioncable
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 6.
|
4
|
+
version: 6.1.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Pratik Naik
|
@@ -9,22 +9,36 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2021-01-07 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.1
|
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.1
|
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.
|
34
|
+
version: 6.1.1
|
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.
|
41
|
+
version: 6.1.1
|
28
42
|
- !ruby/object:Gem::Dependency
|
29
43
|
name: nio4r
|
30
44
|
requirement: !ruby/object:Gem::Requirement
|
@@ -126,10 +140,10 @@ 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.
|
130
|
-
documentation_uri: https://api.rubyonrails.org/v6.
|
143
|
+
changelog_uri: https://github.com/rails/rails/blob/v6.1.1/actioncable/CHANGELOG.md
|
144
|
+
documentation_uri: https://api.rubyonrails.org/v6.1.1/
|
131
145
|
mailing_list_uri: https://discuss.rubyonrails.org/c/rubyonrails-talk
|
132
|
-
source_code_uri: https://github.com/rails/rails/tree/v6.
|
146
|
+
source_code_uri: https://github.com/rails/rails/tree/v6.1.1/actioncable
|
133
147
|
post_install_message:
|
134
148
|
rdoc_options: []
|
135
149
|
require_paths:
|
@@ -145,7 +159,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
145
159
|
- !ruby/object:Gem::Version
|
146
160
|
version: '0'
|
147
161
|
requirements: []
|
148
|
-
rubygems_version: 3.
|
162
|
+
rubygems_version: 3.2.3
|
149
163
|
signing_key:
|
150
164
|
specification_version: 4
|
151
165
|
summary: WebSocket framework for Rails.
|