aboutsummaryrefslogtreecommitdiffstats
path: root/actioncable/app
diff options
context:
space:
mode:
authorJavan Makhmali <javan@javan.us>2016-03-03 17:33:56 -0500
committerJavan Makhmali <javan@javan.us>2016-03-03 17:59:12 -0500
commit82a1bf268d289cd647f681ce5c92c6b1efedd816 (patch)
tree4534ae4c9a14b87f711866265609e6529a13353e /actioncable/app
parentdaeaac702795f2ab6bb882abef1a349b1b799b22 (diff)
downloadrails-82a1bf268d289cd647f681ce5c92c6b1efedd816.tar.gz
rails-82a1bf268d289cd647f681ce5c92c6b1efedd816.tar.bz2
rails-82a1bf268d289cd647f681ce5c92c6b1efedd816.zip
Establish WebSocket connection when first subscription is created. Fixes #24026
* More intention revealing than connecting on the first call to Connection#send * Fixes that calls to Connection#send would attempt to open a connection when the WebSocket's state is CONNECTING
Diffstat (limited to 'actioncable/app')
-rw-r--r--actioncable/app/assets/javascripts/action_cable/connection.coffee13
-rw-r--r--actioncable/app/assets/javascripts/action_cable/consumer.coffee4
-rw-r--r--actioncable/app/assets/javascripts/action_cable/subscriptions.coffee2
3 files changed, 10 insertions, 9 deletions
diff --git a/actioncable/app/assets/javascripts/action_cable/connection.coffee b/actioncable/app/assets/javascripts/action_cable/connection.coffee
index 25793ea3d3..9be5cdf5fb 100644
--- a/actioncable/app/assets/javascripts/action_cable/connection.coffee
+++ b/actioncable/app/assets/javascripts/action_cable/connection.coffee
@@ -8,9 +8,6 @@ class ActionCable.Connection
constructor: (@consumer) ->
send: (data) ->
- unless @isOpen()
- @open()
-
if @isOpen()
@webSocket.send(JSON.stringify(data))
true
@@ -18,7 +15,7 @@ class ActionCable.Connection
false
open: =>
- if @isAlive()
+ if @isActive()
ActionCable.log("Attemped to open WebSocket, but existing socket is #{@getState()}")
throw new Error("Existing connection must be closed before opening")
else
@@ -33,7 +30,7 @@ class ActionCable.Connection
reopen: ->
ActionCable.log("Reopening WebSocket, current state is #{@getState()}")
- if @isAlive()
+ if @isActive()
try
@close()
catch error
@@ -47,10 +44,10 @@ class ActionCable.Connection
isOpen: ->
@isState("open")
- # Private
+ isActive: ->
+ @isState("open", "connecting")
- isAlive: ->
- @webSocket? and not @isState("closing", "closed")
+ # Private
isState: (states...) ->
@getState() in states
diff --git a/actioncable/app/assets/javascripts/action_cable/consumer.coffee b/actioncable/app/assets/javascripts/action_cable/consumer.coffee
index 717c0641a9..3d93d40b99 100644
--- a/actioncable/app/assets/javascripts/action_cable/consumer.coffee
+++ b/actioncable/app/assets/javascripts/action_cable/consumer.coffee
@@ -23,3 +23,7 @@ class ActionCable.Consumer
send: (data) ->
@connection.send(data)
+
+ ensureActiveConnection: ->
+ unless @connection.isActive()
+ @connection.open()
diff --git a/actioncable/app/assets/javascripts/action_cable/subscriptions.coffee b/actioncable/app/assets/javascripts/action_cable/subscriptions.coffee
index 2443bca14a..9d93b462a7 100644
--- a/actioncable/app/assets/javascripts/action_cable/subscriptions.coffee
+++ b/actioncable/app/assets/javascripts/action_cable/subscriptions.coffee
@@ -19,6 +19,7 @@ class ActionCable.Subscriptions
add: (subscription) ->
@subscriptions.push(subscription)
+ @consumer.ensureActiveConnection()
@notify(subscription, "initialized")
@sendCommand(subscription, "subscribe")
@@ -59,4 +60,3 @@ class ActionCable.Subscriptions
sendCommand: (subscription, command) ->
{identifier} = subscription
@consumer.send({command, identifier})
-