anycable-rails-core 1.5.5 → 1.5.6
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/lib/anycable/rails/action_cable_ext/channel.rb +0 -11
- data/lib/anycable/rails/connection.rb +58 -33
- data/lib/anycable/rails/version.rb +1 -1
- metadata +5 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 06a551d757afa07138babbf351024554d52b667ab35893bc995cc1fb56edd8af
|
4
|
+
data.tar.gz: c630ecf586cfd0068b0d248c00dc1372ffd7d83a3abf0e76dc9ecd52ae960a7c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2d46a5b21269ef7cb9cfc562ecee2cfd9830e055dd18fb20bce468409f0a84bc3ca3dc1ba56d9d340202039de3ab93aeba2e600388b7130b99bff101cbf00448
|
7
|
+
data.tar.gz: 64a083bf7d4046b5a1bfa57058f0aa1cedded844067b15f5f9ea660a8d5291bbe2c8f6db6c4a63768f2d17f67d40bb920f4abe8e55b9fbc9241f72c4a4d9c587
|
@@ -3,17 +3,6 @@
|
|
3
3
|
require "action_cable"
|
4
4
|
|
5
5
|
ActionCable::Channel::Base.prepend(Module.new do
|
6
|
-
def subscribe_to_channel
|
7
|
-
super unless anycabled? && !@__anycable_subscribing__
|
8
|
-
end
|
9
|
-
|
10
|
-
def handle_subscribe
|
11
|
-
@__anycable_subscribing__ = true
|
12
|
-
subscribe_to_channel
|
13
|
-
ensure
|
14
|
-
@__anycable_subscribing__ = false
|
15
|
-
end
|
16
|
-
|
17
6
|
def start_periodic_timers
|
18
7
|
super unless anycabled?
|
19
8
|
end
|
@@ -31,15 +31,65 @@ module AnyCable
|
|
31
31
|
end
|
32
32
|
|
33
33
|
refine ActionCable::Connection::Subscriptions do
|
34
|
-
#
|
35
|
-
|
36
|
-
|
34
|
+
# Override the original #execute_command to pre-initialize the channel for unsubscribe/message and
|
35
|
+
# return true/false to indicate successful/unsuccessful subscription.
|
36
|
+
# We also must not lose any exceptions raised in the process.
|
37
|
+
def execute_rpc_command(data)
|
38
|
+
# First, verify the channel name
|
39
|
+
raise "Channel not found: #{ActiveSupport::JSON.decode(data["identifier"]).fetch("channel")}" unless subscription_class_from_identifier(data["identifier"])
|
40
|
+
|
41
|
+
if data["command"] == "subscribe"
|
42
|
+
add data
|
43
|
+
subscription = subscriptions[data["identifier"]]
|
44
|
+
return !(subscription.nil? || subscription.rejected?)
|
45
|
+
end
|
46
|
+
|
47
|
+
load(data["identifier"])
|
37
48
|
|
38
|
-
|
39
|
-
|
49
|
+
case data["command"]
|
50
|
+
when "unsubscribe"
|
51
|
+
remove data
|
52
|
+
when "message"
|
53
|
+
perform_action data
|
54
|
+
when "whisper"
|
55
|
+
whisper data
|
56
|
+
else
|
57
|
+
raise UnknownCommandError, data["command"]
|
40
58
|
end
|
41
59
|
|
42
|
-
|
60
|
+
true
|
61
|
+
end
|
62
|
+
|
63
|
+
# Restore channels from the list of identifiers and the state
|
64
|
+
def restore(subscriptions, istate)
|
65
|
+
subscriptions.each do |id|
|
66
|
+
channel = load(id)
|
67
|
+
channel.__istate__ = ActiveSupport::JSON.decode(istate[id]) if istate[id]
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
# Find or create a channel for a given identifier
|
72
|
+
def load(identifier)
|
73
|
+
return subscriptions[identifier] if subscriptions[identifier]
|
74
|
+
|
75
|
+
subscription = subscription_from_identifier(identifier)
|
76
|
+
raise "Channel not found: #{ActiveSupport::JSON.decode(identifier).fetch("channel")}" unless subscription
|
77
|
+
|
78
|
+
subscriptions[identifier] = subscription
|
79
|
+
end
|
80
|
+
|
81
|
+
def subscription_class_from_identifier(id_key)
|
82
|
+
id_options = ActiveSupport::JSON.decode(id_key).with_indifferent_access
|
83
|
+
id_options[:channel].safe_constantize
|
84
|
+
end
|
85
|
+
|
86
|
+
def subscription_from_identifier(id_key)
|
87
|
+
subscription_klass = subscription_class_from_identifier(id_key)
|
88
|
+
|
89
|
+
if subscription_klass && subscription_klass < ActionCable::Channel::Base
|
90
|
+
id_options = ActiveSupport::JSON.decode(id_key).with_indifferent_access
|
91
|
+
subscription_klass.new(connection, id_key, id_options)
|
92
|
+
end
|
43
93
|
end
|
44
94
|
end
|
45
95
|
end)
|
@@ -74,15 +124,8 @@ module AnyCable
|
|
74
124
|
conn.cached_ids = {}
|
75
125
|
conn.anycable_request_builder = self
|
76
126
|
|
77
|
-
return unless subscriptions
|
78
|
-
|
79
127
|
# Pre-initialize channels (for disconnect)
|
80
|
-
subscriptions.
|
81
|
-
channel = conn.subscriptions.fetch(id)
|
82
|
-
next unless socket.istate[id]
|
83
|
-
|
84
|
-
channel.__istate__ = ActiveSupport::JSON.decode(socket.istate[id])
|
85
|
-
end
|
128
|
+
conn.subscriptions.restore(subscriptions, socket.istate) if subscriptions
|
86
129
|
end
|
87
130
|
|
88
131
|
def handle_open
|
@@ -111,26 +154,8 @@ module AnyCable
|
|
111
154
|
|
112
155
|
def handle_channel_command(identifier, command, data)
|
113
156
|
conn.run_callbacks :command do
|
114
|
-
|
115
|
-
# since we MUST return true of false, depending on the status
|
116
|
-
# of execution
|
117
|
-
channel = conn.subscriptions.fetch(identifier)
|
118
|
-
case command
|
119
|
-
when "subscribe"
|
120
|
-
channel.handle_subscribe
|
121
|
-
!channel.rejected?
|
122
|
-
when "unsubscribe"
|
123
|
-
conn.subscriptions.remove_subscription(channel)
|
124
|
-
true
|
125
|
-
when "message"
|
126
|
-
channel.perform_action ActiveSupport::JSON.decode(data)
|
127
|
-
true
|
128
|
-
else
|
129
|
-
false
|
130
|
-
end
|
157
|
+
conn.subscriptions.execute_rpc_command({"command" => command, "identifier" => identifier, "data" => data})
|
131
158
|
end
|
132
|
-
# Support rescue_from
|
133
|
-
# https://github.com/rails/rails/commit/d2571e560c62116f60429c933d0c41a0e249b58b
|
134
159
|
rescue Exception => e # rubocop:disable Lint/RescueException
|
135
160
|
rescue_with_handler(e) || raise
|
136
161
|
false
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: anycable-rails-core
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.5.
|
4
|
+
version: 1.5.6
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- palkan
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2025-01-15 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: anycable-core
|
@@ -131,7 +131,7 @@ metadata:
|
|
131
131
|
homepage_uri: https://anycable.io/
|
132
132
|
source_code_uri: http://github.com/anycable/anycable-rails
|
133
133
|
funding_uri: https://github.com/sponsors/anycable
|
134
|
-
post_install_message:
|
134
|
+
post_install_message:
|
135
135
|
rdoc_options: []
|
136
136
|
require_paths:
|
137
137
|
- lib
|
@@ -147,7 +147,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
147
147
|
version: '0'
|
148
148
|
requirements: []
|
149
149
|
rubygems_version: 3.4.19
|
150
|
-
signing_key:
|
150
|
+
signing_key:
|
151
151
|
specification_version: 4
|
152
152
|
summary: AnyCable integration for Rails (w/o RPC dependencies)
|
153
153
|
test_files: []
|