From 1379e973bef49b087dfb680756740665e3fe879c Mon Sep 17 00:00:00 2001 From: Javan Makhmali Date: Fri, 28 Aug 2015 17:45:07 -0400 Subject: Simplify WebSocket reconnects and guard against opening multiple connections --- lib/assets/javascripts/cable/connection.js.coffee | 36 ++++++----------------- 1 file changed, 9 insertions(+), 27 deletions(-) diff --git a/lib/assets/javascripts/cable/connection.js.coffee b/lib/assets/javascripts/cable/connection.js.coffee index 464f0c1ff7..73a40acfe4 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) -> @@ -71,7 +54,6 @@ class Cable.Connection error: -> @consumer.subscriptions.notifyAll("disconnected") - @closeSilently() toJSON: -> state: @getState() -- cgit v1.2.3 From ddfd649c11cad494a678f3baeb7b0873f4ad6fa9 Mon Sep 17 00:00:00 2001 From: Javan Makhmali Date: Fri, 28 Aug 2015 17:52:46 -0400 Subject: Only send "disconnected" notification once --- lib/assets/javascripts/cable/connection.js.coffee | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/lib/assets/javascripts/cable/connection.js.coffee b/lib/assets/javascripts/cable/connection.js.coffee index 73a40acfe4..2259ddcedd 100644 --- a/lib/assets/javascripts/cable/connection.js.coffee +++ b/lib/assets/javascripts/cable/connection.js.coffee @@ -47,13 +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") + @disconnect() + + disconnect: -> + return if @disconnected + @disconnected = true + @consumer.subscriptions.notifyAll("disconnected") toJSON: -> state: @getState() -- cgit v1.2.3 From f4b5a4ecdf09d3dafb6974cbd67fd98c03717d8f Mon Sep 17 00:00:00 2001 From: Javan Makhmali Date: Fri, 28 Aug 2015 18:05:46 -0400 Subject: Immediately reconnect after first disconnect --- lib/assets/javascripts/cable/connection_monitor.js.coffee | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/lib/assets/javascripts/cable/connection_monitor.js.coffee b/lib/assets/javascripts/cable/connection_monitor.js.coffee index 5573ea5a77..60e14b51ad 100644 --- a/lib/assets/javascripts/cable/connection_monitor.js.coffee +++ b/lib/assets/javascripts/cable/connection_monitor.js.coffee @@ -19,6 +19,13 @@ class Cable.ConnectionMonitor @reset() @pingedAt = now() + disconnected: -> + if @reconnectAttempts is 0 + @reconnectAttempts += 1 + setTimeout => + @consumer.connection.open() + , 200 + received: -> @pingedAt = now() -- cgit v1.2.3 From 9e0c0afe1c4e8d1fb831de82049ff94c23b22924 Mon Sep 17 00:00:00 2001 From: Javan Makhmali Date: Mon, 31 Aug 2015 07:54:54 -0500 Subject: Guard against opening multiple connections --- lib/assets/javascripts/cable/connection_monitor.js.coffee | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/assets/javascripts/cable/connection_monitor.js.coffee b/lib/assets/javascripts/cable/connection_monitor.js.coffee index 60e14b51ad..c6949971fb 100644 --- a/lib/assets/javascripts/cable/connection_monitor.js.coffee +++ b/lib/assets/javascripts/cable/connection_monitor.js.coffee @@ -23,7 +23,7 @@ class Cable.ConnectionMonitor if @reconnectAttempts is 0 @reconnectAttempts += 1 setTimeout => - @consumer.connection.open() + @consumer.connection.open() unless @consumer.connection.isOpen() , 200 received: -> -- cgit v1.2.3 From 60adbaf4af97dc4aa9cd3a96058e0c94f642e911 Mon Sep 17 00:00:00 2001 From: Javan Makhmali Date: Mon, 31 Aug 2015 08:14:17 -0500 Subject: Increment style --- lib/assets/javascripts/cable/connection_monitor.js.coffee | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/lib/assets/javascripts/cable/connection_monitor.js.coffee b/lib/assets/javascripts/cable/connection_monitor.js.coffee index c6949971fb..30ce11957c 100644 --- a/lib/assets/javascripts/cable/connection_monitor.js.coffee +++ b/lib/assets/javascripts/cable/connection_monitor.js.coffee @@ -20,8 +20,7 @@ class Cable.ConnectionMonitor @pingedAt = now() disconnected: -> - if @reconnectAttempts is 0 - @reconnectAttempts += 1 + if @reconnectAttempts++ is 0 setTimeout => @consumer.connection.open() unless @consumer.connection.isOpen() , 200 @@ -57,7 +56,7 @@ class Cable.ConnectionMonitor reconnectIfStale: -> if @connectionIsStale() - @reconnectAttempts += 1 + @reconnectAttempts++ @consumer.connection.reopen() connectionIsStale: -> -- cgit v1.2.3