diff options
Diffstat (limited to 'lib/assets/javascripts/cable/subscriptions.js.coffee')
-rw-r--r-- | lib/assets/javascripts/cable/subscriptions.js.coffee | 41 |
1 files changed, 41 insertions, 0 deletions
diff --git a/lib/assets/javascripts/cable/subscriptions.js.coffee b/lib/assets/javascripts/cable/subscriptions.js.coffee new file mode 100644 index 0000000000..7cb008ca67 --- /dev/null +++ b/lib/assets/javascripts/cable/subscriptions.js.coffee @@ -0,0 +1,41 @@ +class Cable.Subscriptions + constructor: (@consumer) -> + @subscriptions = [] + + add: (subscription) -> + @subscriptions.push(subscription) + @notify(subscription, "initialized") + if @sendCommand(subscription, "subscribe") + @notify(subscription, "connected") + + reload: -> + for subscription in @subscriptions + if @sendCommand(subscription, "subscribe") + @notify(subscription, "connected") + + remove: (subscription) -> + @sendCommand(subscription, "unsubscribe") + @subscriptions = (s for s in @subscriptions when s isnt subscription) + + notifyAll: (callbackName, args...) -> + for subscription in @subscriptions + @notify(subscription, callbackName, args...) + + notify: (subscription, callbackName, args...) -> + if typeof subscription is "string" + subscriptions = (s for s in @subscriptions when s.identifier is subscription) + else + subscriptions = [subscription] + + for subscription in subscriptions + subscription[callbackName]?(args...) + + sendCommand: (subscription, command) -> + {identifier} = subscription + if identifier is Cable.PING_IDENTIFIER + @consumer.connection.isOpen() + else + @consumer.send({command, identifier}) + + toJSON: -> + subscription.identifier for subscription in @subscriptions |