# A new subscription is created through the ActionCable.Subscriptions instance available on the consumer. # It provides a number of callbacks and a method for calling remote procedure calls on the corresponding # Channel instance on the server side. # # An example demonstrates the basic functionality: # # App.appearance = App.cable.subscriptions.create “AppearanceChannel”, # connected: -> # # Called once the subscription has been successfully completed # # disconnected: ({ willAttemptReconnect: boolean }) -> # # Called when the client has disconnected with the server. # # The object will have an `willAttemptReconnect` property which # # says whether the client has the intention of attempting # # to reconnect. # # appear: -> # @perform 'appear', appearing_on: @appearingOn() # # away: -> # @perform 'away' # # appearingOn: -> # $('main').data 'appearing-on' # # The methods appear and away forward their intent to the remote AppearanceChannel instance on the server # by calling the `@perform` method with the first parameter being the action (which maps to AppearanceChannel#appear/away). # The second parameter is a hash that'll get JSON encoded and made available on the server in the data parameter. # # This is how the server component would look: # # class AppearanceChannel < ApplicationActionCable::Channel # def subscribed # current_user.appear # end # # def unsubscribed # current_user.disappear # end # # def appear(data) # current_user.appear on: data # end # # def away # current_user.away # end # end # # The “AppearanceChannel” name is automatically mapped between the client-side subscription creation and the server-side Ruby class name. # The AppearanceChannel#appear/away public methods are exposed automatically to client-side invocation through the @perform method. class ActionCable.Subscription

constructor: (@consumer, params = {}, mixin) ->
  @identifier = JSON.stringify(params)
  extend(this, mixin)

# Perform a channel action with the optional data passed as an attribute
perform: (action, data = {}) ->
  data.action = action
  @send(data)

send: (data) ->
  @consumer.send(command: "message", identifier: @identifier, data: JSON.stringify(data))

unsubscribe: ->
  @consumer.subscriptions.remove(this)

extend = (object, properties) ->
  if properties?
    for key, value of properties
      object[key] = value
  object