From 1499d5bdf56fd2491dac7a0167954b55eafddc38 Mon Sep 17 00:00:00 2001 From: jamesread Date: Mon, 15 Jun 2026 01:09:13 +0100 Subject: [PATCH] chore: fix flakey test in suggestionsBrowserKey --- frontend/js/websocket.js | 26 +++++++- frontend/resources/vue/views/ArgumentForm.vue | 63 ++++++++++++------- .../suggestionsBrowserKey.mjs | 11 +++- 3 files changed, 76 insertions(+), 24 deletions(-) diff --git a/frontend/js/websocket.js b/frontend/js/websocket.js index e559126..15912c9 100644 --- a/frontend/js/websocket.js +++ b/frontend/js/websocket.js @@ -8,12 +8,20 @@ const BANNER_DELAY_MS = 2000 let reconnectAttempt = 0 let reconnectTimer = null let listenersInitialized = false +let eventStreamGeneration = 0 +let eventStreamAbortController = null function shouldConnectEventStream () { return window.initResponse && !window.initResponse.loginRequired } export function stopEventStream () { + eventStreamGeneration++ + if (eventStreamAbortController != null) { + eventStreamAbortController.abort() + eventStreamAbortController = null + } + if (reconnectTimer != null) { clearTimeout(reconnectTimer) reconnectTimer = null @@ -105,6 +113,12 @@ async function reconnectWebsocket () { return } + const streamGeneration = ++eventStreamGeneration + if (eventStreamAbortController != null) { + eventStreamAbortController.abort() + } + eventStreamAbortController = new AbortController() + connectionState.reconnecting = true connectionState.connected = false if (connectionState.disconnectedAt == null) { @@ -115,7 +129,7 @@ async function reconnectWebsocket () { try { window.websocketAvailable = true - const stream = window.client.eventStream() + const stream = window.client.eventStream({}, { signal: eventStreamAbortController.signal }) connectionState.connected = true connectionState.reconnecting = false connectionState.disconnectedAt = null @@ -123,15 +137,25 @@ async function reconnectWebsocket () { connectionState.scheduledReconnectDelayMs = 0 connectionState.showDisconnectedBanner = false for await (const e of stream) { + if (streamGeneration !== eventStreamGeneration) { + return + } if (reconnectAttempt !== 0) { reconnectAttempt = 0 } handleEvent(e) } } catch (err) { + if (streamGeneration !== eventStreamGeneration) { + return + } console.error('Websocket connection failed: ', err) } + if (streamGeneration !== eventStreamGeneration) { + return + } + window.websocketAvailable = false connectionState.connected = false connectionState.reconnecting = false diff --git a/frontend/resources/vue/views/ArgumentForm.vue b/frontend/resources/vue/views/ArgumentForm.vue index 4cdf67c..e821d8f 100644 --- a/frontend/resources/vue/views/ArgumentForm.vue +++ b/frontend/resources/vue/views/ArgumentForm.vue @@ -45,7 +45,7 @@
-