From 7c6a7f28eb882a7e4eca75fc87c42dd5d9e78d8f Mon Sep 17 00:00:00 2001 From: David Heinemeier Hansson Date: Wed, 8 Jul 2015 11:00:24 +0200 Subject: Rename SubscriptionManager/Subscriber -> Subscriptions This matches the server-side setup and is more consistent. --- lib/assets/javascripts/cable/connection.js.coffee | 8 ++--- .../javascripts/cable/connection_monitor.js.coffee | 2 +- lib/assets/javascripts/cable/consumer.js.coffee | 18 ++++++++-- .../javascripts/cable/subscriber_manager.js.coffee | 41 ---------------------- .../javascripts/cable/subscription.js.coffee | 4 +-- .../javascripts/cable/subscriptions.js.coffee | 41 ++++++++++++++++++++++ 6 files changed, 63 insertions(+), 51 deletions(-) delete mode 100644 lib/assets/javascripts/cable/subscriber_manager.js.coffee create mode 100644 lib/assets/javascripts/cable/subscriptions.js.coffee diff --git a/lib/assets/javascripts/cable/connection.js.coffee b/lib/assets/javascripts/cable/connection.js.coffee index 2e7a9930ec..87fd038a6f 100644 --- a/lib/assets/javascripts/cable/connection.js.coffee +++ b/lib/assets/javascripts/cable/connection.js.coffee @@ -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: -> diff --git a/lib/assets/javascripts/cable/connection_monitor.js.coffee b/lib/assets/javascripts/cable/connection_monitor.js.coffee index ea0c360b75..1f8ce4eb20 100644 --- a/lib/assets/javascripts/cable/connection_monitor.js.coffee +++ b/lib/assets/javascripts/cable/connection_monitor.js.coffee @@ -10,7 +10,7 @@ class Cable.ConnectionMonitor pingedAt: 8 constructor: (@consumer) -> - @consumer.subscribers.add(this) + @consumer.subscriptions.add(this) @start() connected: -> diff --git a/lib/assets/javascripts/cable/consumer.js.coffee b/lib/assets/javascripts/cable/consumer.js.coffee index 27314ee508..b01ae586aa 100644 --- a/lib/assets/javascripts/cable/consumer.js.coffee +++ b/lib/assets/javascripts/cable/consumer.js.coffee @@ -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} diff --git a/lib/assets/javascripts/cable/subscriber_manager.js.coffee b/lib/assets/javascripts/cable/subscriber_manager.js.coffee deleted file mode 100644 index 1eef98ff0b..0000000000 --- a/lib/assets/javascripts/cable/subscriber_manager.js.coffee +++ /dev/null @@ -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 diff --git a/lib/assets/javascripts/cable/subscription.js.coffee b/lib/assets/javascripts/cable/subscription.js.coffee index 74cc35a7a7..17f5a10868 100644 --- a/lib/assets/javascripts/cable/subscription.js.coffee +++ b/lib/assets/javascripts/cable/subscription.js.coffee @@ -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? diff --git a/lib/assets/javascripts/cable/subscriptions.js.coffee b/lib/assets/javascripts/cable/subscriptions.js.coffee new file mode 100644 index 0000000000..7cb008ca67 --- /dev/null +++ b/lib/assets/javascripts/cable/subscriptions.js.coffee @@ -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 -- cgit v1.2.3