From d627c5e094d92155f14326786da5109df0e2d2e0 Mon Sep 17 00:00:00 2001 From: Hornwitser Date: Thu, 18 Mar 2021 23:01:11 +0100 Subject: [PATCH] Fix issues with reconnect and logging out Fix problems encountered logging out and in while the connection has dropped and is in the process of reconnecting. --- packages/lib/link/connectors.js | 3 ++- packages/web_ui/src/bootstrap.jsx | 1 + packages/web_ui/src/components/App.jsx | 17 ++++++++++------- packages/web_ui/src/util/websocket.jsx | 6 ++++-- 4 files changed, 17 insertions(+), 10 deletions(-) diff --git a/packages/lib/link/connectors.js b/packages/lib/link/connectors.js index 1dd60cbe..8b797fbb 100644 --- a/packages/lib/link/connectors.js +++ b/packages/lib/link/connectors.js @@ -178,7 +178,7 @@ class WebSocketClientConnector extends WebSocketBaseConnector { setTimeout(timeout) { this._timeout = timeout; - if (this._reconnectId && this.timeout < this._reconnectDelay / 2) { + if (this._reconnectId && this._timeout < this._reconnectDelay / 2) { clearTimeout(this._reconnectId); this.reconnect(); } @@ -280,6 +280,7 @@ class WebSocketClientConnector extends WebSocketBaseConnector { this._lastReceivedSeq = null; this._sessionToken = null; this._sendBuffer.length = 0; + this._state = "new"; this._connected = false; this.emit("close"); return; diff --git a/packages/web_ui/src/bootstrap.jsx b/packages/web_ui/src/bootstrap.jsx index 6acef556..2de400dc 100644 --- a/packages/web_ui/src/bootstrap.jsx +++ b/packages/web_ui/src/bootstrap.jsx @@ -87,6 +87,7 @@ export default async function bootstrap() { wsUrl.protocol = wsUrl.protocol.replace("http", "ws"); let controlConnector = new ControlConnector(wsUrl, 10); + controlConnector.setTimeout(15); let control = new Control(controlConnector, plugins); ReactDOM.render(, document.getElementById("root")); diff --git a/packages/web_ui/src/components/App.jsx b/packages/web_ui/src/components/App.jsx index b5ea5aa8..89feee57 100644 --- a/packages/web_ui/src/components/App.jsx +++ b/packages/web_ui/src/components/App.jsx @@ -31,6 +31,7 @@ export default function App(props) { function clearToken() { setToken(null); + connector.token = null; localStorage.removeItem("master_token"); } @@ -54,6 +55,14 @@ export default function App(props) { connector.on("close", onClose); connector.on("error", onError); + return () => { + connector.off("error", onError); + connector.off("close", onClose); + connector.off("connect", onConnect); + }; + }, [props.control]); + + useEffect(() => { if (token && !connected) { if (props.control.loggingOut) { clearToken(); @@ -63,13 +72,7 @@ export default function App(props) { connector.connect(); } } - - return () => { - connector.off("error", onError); - connector.off("close", onClose); - connector.off("connect", onConnect); - }; - }); + }, [token, connected]); let page; if (connected) { diff --git a/packages/web_ui/src/util/websocket.jsx b/packages/web_ui/src/util/websocket.jsx index f0611eb8..dd93c94a 100644 --- a/packages/web_ui/src/util/websocket.jsx +++ b/packages/web_ui/src/util/websocket.jsx @@ -122,6 +122,10 @@ export class Control extends libLink.Link { } async updateLogSubscriptions() { + if (!this.connector.connected) { + return; + } + await libLink.messages.setLogSubscriptions.send(this, { all: false, master: false, @@ -137,8 +141,6 @@ export class Control extends libLink.Link { } async shutdown() { - this.connector.setTimeout(5); - try { await libLink.messages.prepareDisconnect.send(this); } catch (err) {