aboutsummaryrefslogtreecommitdiffstats
path: root/lib/assets/javascripts/cable/connection.js.coffee
diff options
context:
space:
mode:
Diffstat (limited to 'lib/assets/javascripts/cable/connection.js.coffee')
-rw-r--r--lib/assets/javascripts/cable/connection.js.coffee46
1 files changed, 17 insertions, 29 deletions
diff --git a/lib/assets/javascripts/cable/connection.js.coffee b/lib/assets/javascripts/cable/connection.js.coffee
index 464f0c1ff7..2259ddcedd 100644
--- a/lib/assets/javascripts/cable/connection.js.coffee
+++ b/lib/assets/javascripts/cable/connection.js.coffee
@@ -11,19 +11,18 @@ class Cable.Connection
false
open: ->
- return if @isState("open", "connecting")
- @webSocket = new WebSocket(@consumer.url)
- @installEventHandlers()
+ if @isOpen()
+ throw new Error("Must close existing connection before opening")
+ else
+ @webSocket = new WebSocket(@consumer.url)
+ @installEventHandlers()
close: ->
- return if @isState("closed", "closing")
@webSocket?.close()
reopen: ->
- if @isOpen()
- @closeSilently => @open()
- else
- @open()
+ @close()
+ @open()
isOpen: ->
@isState("open")
@@ -37,26 +36,10 @@ class Cable.Connection
return state.toLowerCase() for state, value of WebSocket when value is @webSocket?.readyState
null
- closeSilently: (callback = ->) ->
- @uninstallEventHandlers()
- @installEventHandler("close", callback)
- @installEventHandler("error", callback)
- try
- @webSocket.close()
- finally
- @uninstallEventHandlers()
-
installEventHandlers: ->
for eventName of @events
- @installEventHandler(eventName)
-
- installEventHandler: (eventName, handler) ->
- handler ?= @events[eventName].bind(this)
- @webSocket.addEventListener(eventName, handler)
-
- uninstallEventHandlers: ->
- for eventName of @events
- @webSocket.removeEventListener(eventName)
+ handler = @events[eventName].bind(this)
+ @webSocket["on#{eventName}"] = handler
events:
message: (event) ->
@@ -64,14 +47,19 @@ class Cable.Connection
@consumer.subscriptions.notify(identifier, "received", message)
open: ->
+ @disconnected = false
@consumer.subscriptions.reload()
close: ->
- @consumer.subscriptions.notifyAll("disconnected")
+ @disconnect()
error: ->
- @consumer.subscriptions.notifyAll("disconnected")
- @closeSilently()
+ @disconnect()
+
+ disconnect: ->
+ return if @disconnected
+ @disconnected = true
+ @consumer.subscriptions.notifyAll("disconnected")
toJSON: ->
state: @getState()