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