actioncable 7.1.5.1 → 7.2.3
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 +40 -125
- data/README.md +1 -1
- data/app/assets/javascripts/action_cable.js +3 -3
- data/app/assets/javascripts/actioncable.esm.js +3 -3
- data/app/assets/javascripts/actioncable.js +3 -3
- data/lib/action_cable/channel/base.rb +104 -86
- data/lib/action_cable/channel/broadcasting.rb +25 -18
- data/lib/action_cable/channel/callbacks.rb +27 -25
- data/lib/action_cable/channel/naming.rb +9 -8
- data/lib/action_cable/channel/periodic_timers.rb +7 -7
- data/lib/action_cable/channel/streams.rb +79 -64
- data/lib/action_cable/channel/test_case.rb +112 -86
- data/lib/action_cable/connection/authorization.rb +4 -1
- data/lib/action_cable/connection/base.rb +53 -38
- data/lib/action_cable/connection/callbacks.rb +20 -18
- data/lib/action_cable/connection/client_socket.rb +3 -1
- data/lib/action_cable/connection/identification.rb +9 -5
- data/lib/action_cable/connection/internal_channel.rb +5 -2
- data/lib/action_cable/connection/message_buffer.rb +4 -1
- data/lib/action_cable/connection/stream.rb +2 -0
- data/lib/action_cable/connection/stream_event_loop.rb +4 -3
- data/lib/action_cable/connection/subscriptions.rb +6 -3
- data/lib/action_cable/connection/tagged_logger_proxy.rb +7 -4
- data/lib/action_cable/connection/test_case.rb +66 -59
- data/lib/action_cable/connection/web_socket.rb +10 -8
- data/lib/action_cable/deprecator.rb +2 -0
- data/lib/action_cable/engine.rb +5 -3
- data/lib/action_cable/gem_version.rb +6 -4
- data/lib/action_cable/helpers/action_cable_helper.rb +21 -19
- data/lib/action_cable/remote_connections.rb +19 -16
- data/lib/action_cable/server/base.rb +27 -15
- data/lib/action_cable/server/broadcasting.rb +23 -17
- data/lib/action_cable/server/configuration.rb +17 -14
- data/lib/action_cable/server/connections.rb +11 -5
- data/lib/action_cable/server/worker/active_record_connection_management.rb +2 -0
- data/lib/action_cable/server/worker.rb +4 -2
- data/lib/action_cable/subscription_adapter/async.rb +2 -0
- data/lib/action_cable/subscription_adapter/base.rb +2 -0
- data/lib/action_cable/subscription_adapter/channel_prefix.rb +2 -0
- data/lib/action_cable/subscription_adapter/inline.rb +2 -0
- data/lib/action_cable/subscription_adapter/postgresql.rb +7 -6
- data/lib/action_cable/subscription_adapter/redis.rb +13 -5
- data/lib/action_cable/subscription_adapter/subscriber_map.rb +2 -0
- data/lib/action_cable/subscription_adapter/test.rb +8 -5
- data/lib/action_cable/test_case.rb +2 -0
- data/lib/action_cable/test_helper.rb +51 -48
- data/lib/action_cable/version.rb +3 -1
- data/lib/action_cable.rb +12 -6
- data/lib/rails/generators/channel/channel_generator.rb +4 -2
- data/lib/rails/generators/test_unit/channel_generator.rb +2 -0
- metadata +13 -16
- /data/lib/rails/generators/channel/templates/application_cable/{channel.rb → channel.rb.tt} +0 -0
- /data/lib/rails/generators/channel/templates/application_cable/{connection.rb → connection.rb.tt} +0 -0
|
@@ -1,11 +1,15 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
+
# :markup: markdown
|
|
4
|
+
|
|
3
5
|
module ActionCable
|
|
4
6
|
module Server
|
|
5
|
-
#
|
|
7
|
+
# # Action Cable Server Connections
|
|
6
8
|
#
|
|
7
|
-
# Collection class for all the connections that have been established on this
|
|
8
|
-
#
|
|
9
|
+
# Collection class for all the connections that have been established on this
|
|
10
|
+
# specific server. Remember, usually you'll run many Action Cable servers, so
|
|
11
|
+
# you can't use this collection as a full list of all of the connections
|
|
12
|
+
# established against your application. Instead, use RemoteConnections for that.
|
|
9
13
|
module Connections # :nodoc:
|
|
10
14
|
BEAT_INTERVAL = 3
|
|
11
15
|
|
|
@@ -21,8 +25,10 @@ module ActionCable
|
|
|
21
25
|
connections.delete connection
|
|
22
26
|
end
|
|
23
27
|
|
|
24
|
-
# WebSocket connection implementations differ on when they'll mark a connection
|
|
25
|
-
#
|
|
28
|
+
# WebSocket connection implementations differ on when they'll mark a connection
|
|
29
|
+
# as stale. We basically never want a connection to go stale, as you then can't
|
|
30
|
+
# rely on being able to communicate with the connection. To solve this, a 3
|
|
31
|
+
# second heartbeat runs on all connections. If the beat fails, we automatically
|
|
26
32
|
# disconnect.
|
|
27
33
|
def setup_heartbeat_timer
|
|
28
34
|
@heartbeat_timer ||= event_loop.timer(BEAT_INTERVAL) do
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
+
# :markup: markdown
|
|
4
|
+
|
|
3
5
|
require "active_support/callbacks"
|
|
4
6
|
require "active_support/core_ext/module/attribute_accessors_per_thread"
|
|
5
7
|
require "concurrent"
|
|
@@ -25,8 +27,8 @@ module ActionCable
|
|
|
25
27
|
)
|
|
26
28
|
end
|
|
27
29
|
|
|
28
|
-
# Stop processing work: any work that has not already started
|
|
29
|
-
#
|
|
30
|
+
# Stop processing work: any work that has not already started running will be
|
|
31
|
+
# discarded from the queue
|
|
30
32
|
def halt
|
|
31
33
|
@executor.shutdown
|
|
32
34
|
end
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
+
# :markup: markdown
|
|
4
|
+
|
|
3
5
|
gem "pg", "~> 1.1"
|
|
4
6
|
require "pg"
|
|
5
7
|
require "openssl"
|
|
@@ -33,18 +35,17 @@ module ActionCable
|
|
|
33
35
|
end
|
|
34
36
|
|
|
35
37
|
def with_subscriptions_connection(&block) # :nodoc:
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
end
|
|
38
|
+
# Action Cable is taking ownership over this database connection, and will
|
|
39
|
+
# perform the necessary cleanup tasks.
|
|
40
|
+
# We purposedly avoid #checkout to not end up with a pinned connection
|
|
41
|
+
ar_conn = ActiveRecord::Base.connection_pool.new_connection
|
|
41
42
|
pg_conn = ar_conn.raw_connection
|
|
42
43
|
|
|
43
44
|
verify!(pg_conn)
|
|
44
45
|
pg_conn.exec("SET application_name = #{pg_conn.escape_identifier(identifier)}")
|
|
45
46
|
yield pg_conn
|
|
46
47
|
ensure
|
|
47
|
-
ar_conn
|
|
48
|
+
ar_conn&.disconnect!
|
|
48
49
|
end
|
|
49
50
|
|
|
50
51
|
def with_broadcast_connection(&block) # :nodoc:
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
+
# :markup: markdown
|
|
4
|
+
|
|
3
5
|
gem "redis", ">= 4", "< 6"
|
|
4
6
|
require "redis"
|
|
5
7
|
|
|
@@ -10,8 +12,9 @@ module ActionCable
|
|
|
10
12
|
class Redis < Base # :nodoc:
|
|
11
13
|
prepend ChannelPrefix
|
|
12
14
|
|
|
13
|
-
# Overwrite this factory method for Redis connections if you want to use a
|
|
14
|
-
# This is needed, for example, when
|
|
15
|
+
# Overwrite this factory method for Redis connections if you want to use a
|
|
16
|
+
# different Redis library than the redis gem. This is needed, for example, when
|
|
17
|
+
# using Makara proxies for distributed Redis.
|
|
15
18
|
cattr_accessor :redis_connector, default: ->(config) do
|
|
16
19
|
::Redis.new(config.except(:adapter, :channel_prefix))
|
|
17
20
|
end
|
|
@@ -161,7 +164,7 @@ module ActionCable
|
|
|
161
164
|
begin
|
|
162
165
|
conn = @adapter.redis_connection_for_subscriptions
|
|
163
166
|
listen conn
|
|
164
|
-
rescue
|
|
167
|
+
rescue *CONNECTION_ERRORS
|
|
165
168
|
reset
|
|
166
169
|
if retry_connecting?
|
|
167
170
|
when_connected { resubscribe }
|
|
@@ -207,7 +210,7 @@ module ActionCable
|
|
|
207
210
|
end
|
|
208
211
|
|
|
209
212
|
if ::Redis::VERSION < "5"
|
|
210
|
-
|
|
213
|
+
CONNECTION_ERRORS = [::Redis::BaseConnectionError].freeze
|
|
211
214
|
|
|
212
215
|
class SubscribedClient
|
|
213
216
|
def initialize(raw_client)
|
|
@@ -241,7 +244,12 @@ module ActionCable
|
|
|
241
244
|
SubscribedClient.new(conn._client)
|
|
242
245
|
end
|
|
243
246
|
else
|
|
244
|
-
|
|
247
|
+
CONNECTION_ERRORS = [
|
|
248
|
+
::Redis::BaseConnectionError,
|
|
249
|
+
|
|
250
|
+
# Some older versions of redis-rb sometime leak underlying exceptions
|
|
251
|
+
RedisClient::ConnectionError,
|
|
252
|
+
].freeze
|
|
245
253
|
|
|
246
254
|
def extract_subscribed_client(conn)
|
|
247
255
|
conn
|
|
@@ -1,16 +1,19 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
+
# :markup: markdown
|
|
4
|
+
|
|
3
5
|
module ActionCable
|
|
4
6
|
module SubscriptionAdapter
|
|
5
|
-
#
|
|
7
|
+
# ## Test adapter for Action Cable
|
|
6
8
|
#
|
|
7
9
|
# The test adapter should be used only in testing. Along with
|
|
8
|
-
# ActionCable::TestHelper it makes a great tool to test your
|
|
10
|
+
# ActionCable::TestHelper it makes a great tool to test your Rails application.
|
|
9
11
|
#
|
|
10
|
-
# To use the test adapter set
|
|
12
|
+
# To use the test adapter set `adapter` value to `test` in your
|
|
13
|
+
# `config/cable.yml` file.
|
|
11
14
|
#
|
|
12
|
-
# NOTE:
|
|
13
|
-
# so it could be used in system tests too.
|
|
15
|
+
# NOTE: `Test` adapter extends the `ActionCable::SubscriptionAdapter::Async`
|
|
16
|
+
# adapter, so it could be used in system tests too.
|
|
14
17
|
class Test < Async
|
|
15
18
|
def broadcast(channel, payload)
|
|
16
19
|
broadcasts(channel) << payload
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
+
# :markup: markdown
|
|
4
|
+
|
|
3
5
|
module ActionCable
|
|
4
6
|
# Provides helper methods for testing Action Cable broadcasting
|
|
5
7
|
module TestHelper
|
|
@@ -18,29 +20,30 @@ module ActionCable
|
|
|
18
20
|
ActionCable.server.instance_variable_set(:@pubsub, @old_pubsub_adapter)
|
|
19
21
|
end
|
|
20
22
|
|
|
21
|
-
# Asserts that the number of broadcasted messages to the stream matches the
|
|
22
|
-
#
|
|
23
|
-
# def test_broadcasts
|
|
24
|
-
# assert_broadcasts 'messages', 0
|
|
25
|
-
# ActionCable.server.broadcast 'messages', { text: 'hello' }
|
|
26
|
-
# assert_broadcasts 'messages', 1
|
|
27
|
-
# ActionCable.server.broadcast 'messages', { text: 'world' }
|
|
28
|
-
# assert_broadcasts 'messages', 2
|
|
29
|
-
# end
|
|
30
|
-
#
|
|
31
|
-
# If a block is passed, that block should cause the specified number of
|
|
32
|
-
# messages to be broadcasted.
|
|
23
|
+
# Asserts that the number of broadcasted messages to the stream matches the
|
|
24
|
+
# given number.
|
|
33
25
|
#
|
|
34
|
-
#
|
|
35
|
-
#
|
|
26
|
+
# def test_broadcasts
|
|
27
|
+
# assert_broadcasts 'messages', 0
|
|
36
28
|
# ActionCable.server.broadcast 'messages', { text: 'hello' }
|
|
29
|
+
# assert_broadcasts 'messages', 1
|
|
30
|
+
# ActionCable.server.broadcast 'messages', { text: 'world' }
|
|
31
|
+
# assert_broadcasts 'messages', 2
|
|
37
32
|
# end
|
|
38
33
|
#
|
|
39
|
-
#
|
|
40
|
-
#
|
|
41
|
-
#
|
|
34
|
+
# If a block is passed, that block should cause the specified number of messages
|
|
35
|
+
# to be broadcasted.
|
|
36
|
+
#
|
|
37
|
+
# def test_broadcasts_again
|
|
38
|
+
# assert_broadcasts('messages', 1) do
|
|
39
|
+
# ActionCable.server.broadcast 'messages', { text: 'hello' }
|
|
40
|
+
# end
|
|
41
|
+
#
|
|
42
|
+
# assert_broadcasts('messages', 2) do
|
|
43
|
+
# ActionCable.server.broadcast 'messages', { text: 'hi' }
|
|
44
|
+
# ActionCable.server.broadcast 'messages', { text: 'how are you?' }
|
|
45
|
+
# end
|
|
42
46
|
# end
|
|
43
|
-
# end
|
|
44
47
|
#
|
|
45
48
|
def assert_broadcasts(stream, number, &block)
|
|
46
49
|
if block_given?
|
|
@@ -56,23 +59,23 @@ module ActionCable
|
|
|
56
59
|
|
|
57
60
|
# Asserts that no messages have been sent to the stream.
|
|
58
61
|
#
|
|
59
|
-
#
|
|
60
|
-
#
|
|
61
|
-
#
|
|
62
|
-
#
|
|
63
|
-
#
|
|
62
|
+
# def test_no_broadcasts
|
|
63
|
+
# assert_no_broadcasts 'messages'
|
|
64
|
+
# ActionCable.server.broadcast 'messages', { text: 'hi' }
|
|
65
|
+
# assert_broadcasts 'messages', 1
|
|
66
|
+
# end
|
|
64
67
|
#
|
|
65
68
|
# If a block is passed, that block should not cause any message to be sent.
|
|
66
69
|
#
|
|
67
|
-
#
|
|
68
|
-
#
|
|
69
|
-
#
|
|
70
|
+
# def test_broadcasts_again
|
|
71
|
+
# assert_no_broadcasts 'messages' do
|
|
72
|
+
# # No job messages should be sent from this block
|
|
73
|
+
# end
|
|
70
74
|
# end
|
|
71
|
-
# end
|
|
72
75
|
#
|
|
73
76
|
# Note: This assertion is simply a shortcut for:
|
|
74
77
|
#
|
|
75
|
-
#
|
|
78
|
+
# assert_broadcasts 'messages', 0, &block
|
|
76
79
|
#
|
|
77
80
|
def assert_no_broadcasts(stream, &block)
|
|
78
81
|
assert_broadcasts stream, 0, &block
|
|
@@ -80,15 +83,15 @@ module ActionCable
|
|
|
80
83
|
|
|
81
84
|
# Returns the messages that are broadcasted in the block.
|
|
82
85
|
#
|
|
83
|
-
#
|
|
84
|
-
#
|
|
85
|
-
#
|
|
86
|
-
#
|
|
86
|
+
# def test_broadcasts
|
|
87
|
+
# messages = capture_broadcasts('messages') do
|
|
88
|
+
# ActionCable.server.broadcast 'messages', { text: 'hi' }
|
|
89
|
+
# ActionCable.server.broadcast 'messages', { text: 'how are you?' }
|
|
90
|
+
# end
|
|
91
|
+
# assert_equal 2, messages.length
|
|
92
|
+
# assert_equal({ text: 'hi' }, messages.first)
|
|
93
|
+
# assert_equal({ text: 'how are you?' }, messages.last)
|
|
87
94
|
# end
|
|
88
|
-
# assert_equal 2, messages.length
|
|
89
|
-
# assert_equal({ text: 'hi' }, messages.first)
|
|
90
|
-
# assert_equal({ text: 'how are you?' }, messages.last)
|
|
91
|
-
# end
|
|
92
95
|
#
|
|
93
96
|
def capture_broadcasts(stream, &block)
|
|
94
97
|
new_broadcasts_from(broadcasts(stream), stream, "capture_broadcasts", &block).map { |m| ActiveSupport::JSON.decode(m) }
|
|
@@ -96,23 +99,23 @@ module ActionCable
|
|
|
96
99
|
|
|
97
100
|
# Asserts that the specified message has been sent to the stream.
|
|
98
101
|
#
|
|
99
|
-
#
|
|
100
|
-
#
|
|
101
|
-
#
|
|
102
|
-
#
|
|
102
|
+
# def test_assert_transmitted_message
|
|
103
|
+
# ActionCable.server.broadcast 'messages', text: 'hello'
|
|
104
|
+
# assert_broadcast_on('messages', text: 'hello')
|
|
105
|
+
# end
|
|
103
106
|
#
|
|
104
|
-
# If a block is passed, that block should cause a message with the specified
|
|
107
|
+
# If a block is passed, that block should cause a message with the specified
|
|
108
|
+
# data to be sent.
|
|
105
109
|
#
|
|
106
|
-
#
|
|
107
|
-
#
|
|
108
|
-
#
|
|
110
|
+
# def test_assert_broadcast_on_again
|
|
111
|
+
# assert_broadcast_on('messages', text: 'hello') do
|
|
112
|
+
# ActionCable.server.broadcast 'messages', text: 'hello'
|
|
113
|
+
# end
|
|
109
114
|
# end
|
|
110
|
-
# end
|
|
111
115
|
#
|
|
112
116
|
def assert_broadcast_on(stream, data, &block)
|
|
113
|
-
# Encode to JSON and back–we want to use this value to compare
|
|
114
|
-
#
|
|
115
|
-
# Comparing JSON strings doesn't work due to the order if the keys.
|
|
117
|
+
# Encode to JSON and back–we want to use this value to compare with decoded
|
|
118
|
+
# JSON. Comparing JSON strings doesn't work due to the order if the keys.
|
|
116
119
|
serialized_msg =
|
|
117
120
|
ActiveSupport::JSON.decode(ActiveSupport::JSON.encode(data))
|
|
118
121
|
|
data/lib/action_cable/version.rb
CHANGED
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
+
# :markup: markdown
|
|
4
|
+
|
|
3
5
|
require_relative "gem_version"
|
|
4
6
|
|
|
5
7
|
module ActionCable
|
|
6
|
-
# Returns the currently loaded version of Action Cable as a
|
|
8
|
+
# Returns the currently loaded version of Action Cable as a `Gem::Version`.
|
|
7
9
|
def self.version
|
|
8
10
|
gem_version
|
|
9
11
|
end
|
data/lib/action_cable.rb
CHANGED
|
@@ -27,17 +27,23 @@ require "active_support"
|
|
|
27
27
|
require "active_support/rails"
|
|
28
28
|
require "zeitwerk"
|
|
29
29
|
|
|
30
|
+
# We compute lib this way instead of using __dir__ because __dir__ gives a real
|
|
31
|
+
# path, while __FILE__ honors symlinks. If the gem is stored under a symlinked
|
|
32
|
+
# directory, this matters.
|
|
33
|
+
lib = File.dirname(__FILE__)
|
|
34
|
+
|
|
30
35
|
Zeitwerk::Loader.for_gem.tap do |loader|
|
|
31
36
|
loader.ignore(
|
|
32
|
-
"#{
|
|
33
|
-
"#{
|
|
34
|
-
"#{
|
|
37
|
+
"#{lib}/rails", # Contains generators, templates, docs, etc.
|
|
38
|
+
"#{lib}/action_cable/gem_version.rb",
|
|
39
|
+
"#{lib}/action_cable/version.rb",
|
|
40
|
+
"#{lib}/action_cable/deprecator.rb",
|
|
35
41
|
)
|
|
36
42
|
|
|
37
43
|
loader.do_not_eager_load(
|
|
38
|
-
"#{
|
|
39
|
-
"#{
|
|
40
|
-
Dir["#{
|
|
44
|
+
"#{lib}/action_cable/subscription_adapter", # Adapters are required and loaded on demand.
|
|
45
|
+
"#{lib}/action_cable/test_helper.rb",
|
|
46
|
+
Dir["#{lib}/action_cable/**/test_case.rb"]
|
|
41
47
|
)
|
|
42
48
|
|
|
43
49
|
loader.inflector.inflect("postgresql" => "PostgreSQL")
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
+
# :markup: markdown
|
|
4
|
+
|
|
3
5
|
module Rails
|
|
4
6
|
module Generators
|
|
5
7
|
class ChannelGenerator < NamedBase
|
|
@@ -103,8 +105,8 @@ pin_all_from "app/javascript/channels", under: "channels"
|
|
|
103
105
|
end
|
|
104
106
|
|
|
105
107
|
def using_bun?
|
|
106
|
-
# Cannot assume bun.lockb has been generated yet so we look for
|
|
107
|
-
#
|
|
108
|
+
# Cannot assume bun.lockb has been generated yet so we look for a file known to
|
|
109
|
+
# be generated by the jsbundling-rails gem
|
|
108
110
|
@using_bun ||= using_js_runtime? && root.join("bun.config.js").exist?
|
|
109
111
|
end
|
|
110
112
|
|
metadata
CHANGED
|
@@ -1,15 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: actioncable
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 7.
|
|
4
|
+
version: 7.2.3
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Pratik Naik
|
|
8
8
|
- David Heinemeier Hansson
|
|
9
|
-
autorequire:
|
|
10
9
|
bindir: bin
|
|
11
10
|
cert_chain: []
|
|
12
|
-
date:
|
|
11
|
+
date: 1980-01-02 00:00:00.000000000 Z
|
|
13
12
|
dependencies:
|
|
14
13
|
- !ruby/object:Gem::Dependency
|
|
15
14
|
name: activesupport
|
|
@@ -17,28 +16,28 @@ dependencies:
|
|
|
17
16
|
requirements:
|
|
18
17
|
- - '='
|
|
19
18
|
- !ruby/object:Gem::Version
|
|
20
|
-
version: 7.
|
|
19
|
+
version: 7.2.3
|
|
21
20
|
type: :runtime
|
|
22
21
|
prerelease: false
|
|
23
22
|
version_requirements: !ruby/object:Gem::Requirement
|
|
24
23
|
requirements:
|
|
25
24
|
- - '='
|
|
26
25
|
- !ruby/object:Gem::Version
|
|
27
|
-
version: 7.
|
|
26
|
+
version: 7.2.3
|
|
28
27
|
- !ruby/object:Gem::Dependency
|
|
29
28
|
name: actionpack
|
|
30
29
|
requirement: !ruby/object:Gem::Requirement
|
|
31
30
|
requirements:
|
|
32
31
|
- - '='
|
|
33
32
|
- !ruby/object:Gem::Version
|
|
34
|
-
version: 7.
|
|
33
|
+
version: 7.2.3
|
|
35
34
|
type: :runtime
|
|
36
35
|
prerelease: false
|
|
37
36
|
version_requirements: !ruby/object:Gem::Requirement
|
|
38
37
|
requirements:
|
|
39
38
|
- - '='
|
|
40
39
|
- !ruby/object:Gem::Version
|
|
41
|
-
version: 7.
|
|
40
|
+
version: 7.2.3
|
|
42
41
|
- !ruby/object:Gem::Dependency
|
|
43
42
|
name: nio4r
|
|
44
43
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -141,8 +140,8 @@ files:
|
|
|
141
140
|
- lib/action_cable/version.rb
|
|
142
141
|
- lib/rails/generators/channel/USAGE
|
|
143
142
|
- lib/rails/generators/channel/channel_generator.rb
|
|
144
|
-
- lib/rails/generators/channel/templates/application_cable/channel.rb
|
|
145
|
-
- lib/rails/generators/channel/templates/application_cable/connection.rb
|
|
143
|
+
- lib/rails/generators/channel/templates/application_cable/channel.rb.tt
|
|
144
|
+
- lib/rails/generators/channel/templates/application_cable/connection.rb.tt
|
|
146
145
|
- lib/rails/generators/channel/templates/channel.rb.tt
|
|
147
146
|
- lib/rails/generators/channel/templates/javascript/channel.js.tt
|
|
148
147
|
- lib/rails/generators/channel/templates/javascript/consumer.js.tt
|
|
@@ -154,12 +153,11 @@ licenses:
|
|
|
154
153
|
- MIT
|
|
155
154
|
metadata:
|
|
156
155
|
bug_tracker_uri: https://github.com/rails/rails/issues
|
|
157
|
-
changelog_uri: https://github.com/rails/rails/blob/v7.
|
|
158
|
-
documentation_uri: https://api.rubyonrails.org/v7.
|
|
156
|
+
changelog_uri: https://github.com/rails/rails/blob/v7.2.3/actioncable/CHANGELOG.md
|
|
157
|
+
documentation_uri: https://api.rubyonrails.org/v7.2.3/
|
|
159
158
|
mailing_list_uri: https://discuss.rubyonrails.org/c/rubyonrails-talk
|
|
160
|
-
source_code_uri: https://github.com/rails/rails/tree/v7.
|
|
159
|
+
source_code_uri: https://github.com/rails/rails/tree/v7.2.3/actioncable
|
|
161
160
|
rubygems_mfa_required: 'true'
|
|
162
|
-
post_install_message:
|
|
163
161
|
rdoc_options: []
|
|
164
162
|
require_paths:
|
|
165
163
|
- lib
|
|
@@ -167,15 +165,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
|
167
165
|
requirements:
|
|
168
166
|
- - ">="
|
|
169
167
|
- !ruby/object:Gem::Version
|
|
170
|
-
version:
|
|
168
|
+
version: 3.1.0
|
|
171
169
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
172
170
|
requirements:
|
|
173
171
|
- - ">="
|
|
174
172
|
- !ruby/object:Gem::Version
|
|
175
173
|
version: '0'
|
|
176
174
|
requirements: []
|
|
177
|
-
rubygems_version: 3.
|
|
178
|
-
signing_key:
|
|
175
|
+
rubygems_version: 3.6.9
|
|
179
176
|
specification_version: 4
|
|
180
177
|
summary: WebSocket framework for Rails.
|
|
181
178
|
test_files: []
|
|
File without changes
|
/data/lib/rails/generators/channel/templates/application_cable/{connection.rb → connection.rb.tt}
RENAMED
|
File without changes
|