From ed8e7672180aff0101da0826087bf4ca07094f02 Mon Sep 17 00:00:00 2001 From: Jorge Manrubia Date: Wed, 2 Feb 2022 15:50:34 +0100 Subject: [PATCH] Only close websockets when connection is open (#44304) This addresses a problem where Safari's websockets gets permanently broken when closing them in a "connecting" state. See https://github.com/rails/rails/issues/43835#issuecomment-1002288478 --- actioncable/app/assets/javascripts/action_cable.js | 2 +- actioncable/app/assets/javascripts/actioncable.esm.js | 2 +- actioncable/app/assets/javascripts/actioncable.js | 2 +- actioncable/app/javascript/action_cable/connection.js | 3 ++- 4 files changed, 5 insertions(+), 4 deletions(-) diff --git a/actioncable/app/assets/javascripts/action_cable.js b/actioncable/app/assets/javascripts/action_cable.js index d2c264baa4..22edeccf30 100644 --- a/actioncable/app/assets/javascripts/action_cable.js +++ b/actioncable/app/assets/javascripts/action_cable.js @@ -166,7 +166,7 @@ if (!allowReconnect) { this.monitor.stop(); } - if (this.isActive()) { + if (this.isOpen()) { return this.webSocket.close(); } } diff --git a/actioncable/app/assets/javascripts/actioncable.esm.js b/actioncable/app/assets/javascripts/actioncable.esm.js index 416448ce6c..2187eb90bf 100644 --- a/actioncable/app/assets/javascripts/actioncable.esm.js +++ b/actioncable/app/assets/javascripts/actioncable.esm.js @@ -172,7 +172,7 @@ class Connection { if (!allowReconnect) { this.monitor.stop(); } - if (this.isActive()) { + if (this.isOpen()) { return this.webSocket.close(); } } diff --git a/actioncable/app/assets/javascripts/actioncable.js b/actioncable/app/assets/javascripts/actioncable.js index e8f48805e0..b3cc4299db 100644 --- a/actioncable/app/assets/javascripts/actioncable.js +++ b/actioncable/app/assets/javascripts/actioncable.js @@ -166,7 +166,7 @@ if (!allowReconnect) { this.monitor.stop(); } - if (this.isActive()) { + if (this.isOpen()) { return this.webSocket.close(); } } diff --git a/actioncable/app/javascript/action_cable/connection.js b/actioncable/app/javascript/action_cable/connection.js index 87584545cc..d21761bd07 100644 --- a/actioncable/app/javascript/action_cable/connection.js +++ b/actioncable/app/javascript/action_cable/connection.js @@ -44,7 +44,8 @@ class Connection { close({allowReconnect} = {allowReconnect: true}) { if (!allowReconnect) { this.monitor.stop() } - if (this.isActive()) { + // Avoid closing websockets in a "connecting" state due to Safari 15.1+ bug. See: https://github.com/rails/rails/issues/43835#issuecomment-1002288478 + if (this.isOpen()) { return this.webSocket.close() } }