aboutsummaryrefslogtreecommitdiffstats
path: root/lib/action_cable/connection/subscriptions.rb
diff options
context:
space:
mode:
Diffstat (limited to 'lib/action_cable/connection/subscriptions.rb')
-rw-r--r--lib/action_cable/connection/subscriptions.rb31
1 files changed, 25 insertions, 6 deletions
diff --git a/lib/action_cable/connection/subscriptions.rb b/lib/action_cable/connection/subscriptions.rb
index d6525b61c3..e0a3a133c5 100644
--- a/lib/action_cable/connection/subscriptions.rb
+++ b/lib/action_cable/connection/subscriptions.rb
@@ -6,6 +6,19 @@ module ActionCable
@subscriptions = {}
end
+ def execute_command(data)
+ case data['command']
+ when 'subscribe' then add data
+ when 'unsubscribe' then remove data
+ when 'message' then perform_action data
+ else
+ logger.error "Received unrecognized command in #{data.inspect}"
+ end
+ rescue Exception => e
+ logger.error "Could not execute command from #{data.inspect})"
+ connection.log_exception(e)
+ end
+
def add(data)
id_key = data['identifier']
id_options = ActiveSupport::JSON.decode(id_key).with_indifferent_access
@@ -27,14 +40,11 @@ module ActionCable
subscriptions.delete(data['identifier'])
end
- def find(identifier)
- if subscription = subscriptions[identifier]
- subscription
- else
- raise "Unable to find subscription with identifier: #{identifier}"
- end
+ def perform_action(data)
+ find(data).perform_action ActiveSupport::JSON.decode(data['data'])
end
+
def identifiers
subscriptions.keys
end
@@ -43,9 +53,18 @@ module ActionCable
subscriptions.each { |id, channel| channel.perform_disconnection }
end
+
private
attr_reader :connection, :subscriptions
delegate :logger, to: :connection
+
+ def find(data)
+ if subscription = subscriptions[data['identifier']]
+ subscription
+ else
+ raise "Unable to find subscription with identifier: #{identifier}"
+ end
+ end
end
end
end \ No newline at end of file