diff options
Diffstat (limited to 'lib')
-rw-r--r-- | lib/action_cable.rb | 3 | ||||
-rw-r--r-- | lib/action_cable/channel/base.rb | 39 | ||||
-rw-r--r-- | lib/action_cable/version.rb | 3 | ||||
-rw-r--r-- | lib/assets/javascripts/cable/subscriptions.js.coffee | 8 |
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] |