1
0
Fork 0
mirror of https://github.com/rails/rails.git synced 2022-11-09 12:12:34 -05:00
rails--rails/actioncable/app/assets/javascripts/action_cable/subscription.coffee
Daniel Rhodes cbd15da027 Added protocol negotiation
This is primarily for backwards compatibility for when
or if the protocol is changed in future versions.

If the server fails to respond with an acceptable
protocol, the client disconnects and disables
the monitor.
2016-04-05 15:55:59 +02:00

72 lines
2.5 KiB
CoffeeScript

# 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['appearing_on']
# 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