aboutsummaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/action_cable.rb3
-rw-r--r--lib/action_cable/channel/base.rb39
-rw-r--r--lib/action_cable/version.rb3
-rw-r--r--lib/assets/javascripts/cable/subscriptions.js.coffee8
4 files changed, 47 insertions, 6 deletions
diff --git a/lib/action_cable.rb b/lib/action_cable.rb
index 968adafc25..13c5c77578 100644
--- a/lib/action_cable.rb
+++ b/lib/action_cable.rb
@@ -16,10 +16,9 @@ require 'em-hiredis'
require 'redis'
require 'action_cable/engine' if defined?(Rails)
+require 'action_cable/version'
module ActionCable
- VERSION = '0.0.3'
-
autoload :Server, 'action_cable/server'
autoload :Connection, 'action_cable/connection'
autoload :Channel, 'action_cable/channel'
diff --git a/lib/action_cable/channel/base.rb b/lib/action_cable/channel/base.rb
index c83c3b74fd..2f1b4a187d 100644
--- a/lib/action_cable/channel/base.rb
+++ b/lib/action_cable/channel/base.rb
@@ -77,6 +77,42 @@ module ActionCable
attr_reader :params, :connection
delegate :logger, to: :connection
+ class << self
+ # A list of method names that should be considered actions. This
+ # includes all public instance methods on a channel, less
+ # any internal methods (defined on Base), adding back in
+ # any methods that are internal, but still exist on the class
+ # itself.
+ #
+ # ==== Returns
+ # * <tt>Set</tt> - A set of all methods that should be considered actions.
+ def action_methods
+ @action_methods ||= begin
+ # All public instance methods of this class, including ancestors
+ methods = (public_instance_methods(true) -
+ # Except for public instance methods of Base and its ancestors
+ ActionCable::Channel::Base.public_instance_methods(true) +
+ # Be sure to include shadowed public instance methods of this class
+ public_instance_methods(false)).uniq.map(&:to_s)
+ methods.to_set
+ end
+ end
+
+ protected
+ # action_methods are cached and there is sometimes need to refresh
+ # them. ::clear_action_methods! allows you to do that, so next time
+ # you run action_methods, they will be recalculated
+ def clear_action_methods!
+ @action_methods = nil
+ end
+
+ # Refresh the cached action_methods when a new action_method is added.
+ def method_added(name)
+ super
+ clear_action_methods!
+ end
+ end
+
def initialize(connection, identifier, params = {})
@connection = connection
@identifier = identifier
@@ -149,7 +185,7 @@ module ActionCable
end
def processable_action?(action)
- self.class.instance_methods(false).include?(action)
+ self.class.action_methods.include?(action.to_s)
end
def dispatch_action(action, data)
@@ -170,7 +206,6 @@ module ActionCable
end
end
-
def run_subscribe_callbacks
self.class.on_subscribe_callbacks.each { |callback| send(callback) }
end
diff --git a/lib/action_cable/version.rb b/lib/action_cable/version.rb
new file mode 100644
index 0000000000..4947029dcc
--- /dev/null
+++ b/lib/action_cable/version.rb
@@ -0,0 +1,3 @@
+module ActionCable
+ VERSION = '0.0.3'
+end \ No newline at end of file
diff --git a/lib/assets/javascripts/cable/subscriptions.js.coffee b/lib/assets/javascripts/cable/subscriptions.js.coffee
index 3bc53f2d6a..fe6975c870 100644
--- a/lib/assets/javascripts/cable/subscriptions.js.coffee
+++ b/lib/assets/javascripts/cable/subscriptions.js.coffee
@@ -29,8 +29,12 @@ class Cable.Subscriptions
@notify(subscription, "connected")
remove: (subscription) ->
- @sendCommand(subscription, "unsubscribe")
@subscriptions = (s for s in @subscriptions when s isnt subscription)
+ unless @findAll(subscription.identifier).length
+ @sendCommand(subscription, "unsubscribe")
+
+ findAll: (identifier) ->
+ s for s in @subscriptions when s.identifier is identifier
notifyAll: (callbackName, args...) ->
for subscription in @subscriptions
@@ -38,7 +42,7 @@ class Cable.Subscriptions
notify: (subscription, callbackName, args...) ->
if typeof subscription is "string"
- subscriptions = (s for s in @subscriptions when s.identifier is subscription)
+ subscriptions = @findAll(subscription)
else
subscriptions = [subscription]