# Collection class for creating (and internally managing) channel subscriptions. The only method intended to be triggered by the user # us ActionCable.Subscriptions#create, and it should be called through the consumer like so: # # @App = {} # App.cable = ActionCable.createConsumer “ws://example.com/accounts/1” # App.appearance = App.cable.subscriptions.create “AppearanceChannel” # # For more details on how you'd configure an actual channel subscription, see ActionCable.Subscription. class ActionCable.Subscriptions

constructor: (@consumer) ->
  @subscriptions = []

create: (channelName, mixin) ->
  channel = channelName
  params = if typeof channel is "object" then channel else {channel}
  subscription = new ActionCable.Subscription @consumer, params, mixin
  @add(subscription)

# Private

add: (subscription) ->
  @subscriptions.push(subscription)
  @consumer.ensureActiveConnection()
  @notify(subscription, "initialized")
  @sendCommand(subscription, "subscribe")
  subscription

remove: (subscription) ->
  @forget(subscription)
  unless @findAll(subscription.identifier).length
    @sendCommand(subscription, "unsubscribe")
  subscription

reject: (identifier) ->
  for subscription in @findAll(identifier)
    @forget(subscription)
    @notify(subscription, "rejected")
    subscription

forget: (subscription) ->
  @subscriptions = (s for s in @subscriptions when s isnt subscription)
  subscription

findAll: (identifier) ->
  s for s in @subscriptions when s.identifier is identifier

reload: ->
  for subscription in @subscriptions
    @sendCommand(subscription, "subscribe")

notifyAll: (callbackName, args...) ->
  for subscription in @subscriptions
    @notify(subscription, callbackName, args...)

notify: (subscription, callbackName, args...) ->
  if typeof subscription is "string"
    subscriptions = @findAll(subscription)
  else
    subscriptions = [subscription]

  for subscription in subscriptions
    subscription[callbackName]?(args...)

sendCommand: (subscription, command) ->
  {identifier} = subscription
  @consumer.send({command, identifier})