aboutsummaryrefslogtreecommitdiffstats
path: root/lib/assets/javascripts/cable/subscriptions.js.coffee
blob: 7cb008ca67a276d4ac54be142ba60c948152605c (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
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