Rename SubscriptionManager/Subscriber -> Subscriptions

This matches the server-side setup and is more consistent.
This commit is contained in:
David Heinemeier Hansson 2015-07-08 11:00:24 +02:00
parent 212ba994b3
commit 7c6a7f28eb
6 changed files with 63 additions and 51 deletions

@ -60,16 +60,16 @@ class Cable.Connection
events:
message: (event) ->
{identifier, message} = JSON.parse(event.data)
@consumer.subscribers.notify(identifier, "received", message)
@consumer.subscriptions.notify(identifier, "received", message)
open: ->
@consumer.subscribers.reload()
@consumer.subscriptions.reload()
close: ->
@consumer.subscribers.notifyAll("disconnected")
@consumer.subscriptions.notifyAll("disconnected")
error: ->
@consumer.subscribers.notifyAll("disconnected")
@consumer.subscriptions.notifyAll("disconnected")
@closeSilently()
toJSON: ->

@ -10,7 +10,7 @@ class Cable.ConnectionMonitor
pingedAt: 8
constructor: (@consumer) ->
@consumer.subscribers.add(this)
@consumer.subscriptions.add(this)
@start()
connected: ->

@ -1,11 +1,23 @@
#= require cable/connection
#= require cable/connection_monitor
#= require cable/subscriptions
#= require cable/subscription
#= require cable/subscriber_manager
# The Cable.Consumer establishes the connection to a server-side Ruby Connection object. Once established,
# the Cable.ConnectionMonitor will ensure that its properly maintained through heartbeats and checking for stale updates.
# The Consumer instance is also the gateway to establishing subscriptions to desired channels through the #createSubscription
# method.
#
# The following example shows how this can be setup:
#
# @App = {}
# App.cable = Cable.createConsumer "http://example.com/accounts/1"
# App.appearance = App.cable.createSubscription "AppearanceChannel"
#
# For more details on how you'd configure an actual channel subscription, see Cable.Subscription.
class Cable.Consumer
constructor: (@url) ->
@subscribers = new Cable.SubscriberManager this
@subscriptions = new Cable.Subscriptions this
@connection = new Cable.Connection this
@connectionMonitor = new Cable.ConnectionMonitor this
@ -21,4 +33,4 @@ class Cable.Consumer
JSON.stringify(this, null, 2)
toJSON: ->
{@url, @subscribers, @connection, @connectionMonitor}
{@url, @subscriptions, @connection, @connectionMonitor}

@ -1,41 +0,0 @@
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})
toJSON: ->
subscriber.identifier for subscriber in @subscribers

@ -2,7 +2,7 @@ class Cable.Subscription
constructor: (@consumer, params = {}, mixin) ->
@identifier = JSON.stringify(params)
extend(this, mixin)
@consumer.subscribers.add(this)
@consumer.subscriptions.add(this)
# Perform a channel action with the optional data passed as an attribute
perform: (action, data = {}) ->
@ -13,7 +13,7 @@ class Cable.Subscription
@consumer.send(command: "message", identifier: @identifier, data: JSON.stringify(data))
unsubscribe: ->
@consumer.subscribers.remove(this)
@consumer.subscriptions.remove(this)
extend = (object, properties) ->
if properties?

@ -0,0 +1,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