From f9a03a65a9e66dc2a0889e007f46886e4b8a2953 Mon Sep 17 00:00:00 2001 From: Dariusz L Date: Sun, 2 Aug 2026 13:10:40 +0200 Subject: [PATCH] Add footer version check failure retry interval Use a separate shorter refresh interval when footer version checks fail, track the failure state, and schedule retries via a dedicated timer. On success, clear any pending retry timer so recovery is immediate. --- web/resolver/actions/queue_methods.js | 31 ++++++++++++++++++++++++++- 1 file changed, 30 insertions(+), 1 deletion(-) diff --git a/web/resolver/actions/queue_methods.js b/web/resolver/actions/queue_methods.js index e88ec6e..285a7cb 100644 --- a/web/resolver/actions/queue_methods.js +++ b/web/resolver/actions/queue_methods.js @@ -3,6 +3,7 @@ import { $el } from "../../../../../scripts/ui.js"; import { getSvgIcon } from "../../utils/icon_utils.js"; import { startSplitterDrag } from "../utils/splitter_drag.js"; const FOOTER_VERSION_REFRESH_INTERVAL_MS = 6 * 60 * 60 * 1000; +const FOOTER_VERSION_FAILURE_REFRESH_INTERVAL_MS = 5 * 60 * 1000; export const queueMethods = { createContent() { @@ -2883,10 +2884,18 @@ export const queueMethods = { if (!this.footerVersionCurrent || !this.footerVersionLatest) return; const now = Date.now(); + const refreshInterval = this._footerVersionCheckFailed + ? FOOTER_VERSION_FAILURE_REFRESH_INTERVAL_MS + : FOOTER_VERSION_REFRESH_INTERVAL_MS; if ( this._footerVersionLastCheckedAt - && now - this._footerVersionLastCheckedAt < FOOTER_VERSION_REFRESH_INTERVAL_MS + && now - this._footerVersionLastCheckedAt < refreshInterval ) { + if (this._footerVersionCheckFailed) { + this.scheduleFooterVersionRetry( + refreshInterval - (now - this._footerVersionLastCheckedAt) + ); + } return; } this._footerVersionLastCheckedAt = now; @@ -2903,6 +2912,12 @@ export const queueMethods = { }; const currentVersion = formatVersion(data?.current_version); const latestVersion = formatVersion(data?.latest_version); + const versionCheckFailed = !latestVersion || data?.status === 'unavailable'; + this._footerVersionCheckFailed = versionCheckFailed; + if (!versionCheckFailed && this._footerVersionRetryTimer) { + clearTimeout(this._footerVersionRetryTimer); + this._footerVersionRetryTimer = null; + } this.footerVersionCurrent.textContent = currentVersion || 'v—'; this.footerVersionLatest.textContent = latestVersion @@ -2926,7 +2941,9 @@ export const queueMethods = { : `Model Resolver ${currentVersion}; latest GitHub version unavailable` ); this.updateFooterStarLayout(); + if (versionCheckFailed) this.scheduleFooterVersionRetry(); } catch (_) { + this._footerVersionCheckFailed = true; this.footerVersionLatest.textContent = '(latest: unavailable)'; this.footerVersionElement?.classList.remove( 'mr-footer-version-up-to-date', @@ -2934,9 +2951,21 @@ export const queueMethods = { ); this.footerVersionLatest.classList.remove('mr-footer-version-update'); this.updateFooterStarLayout(); + this.scheduleFooterVersionRetry(); } }, + scheduleFooterVersionRetry(delayMs = FOOTER_VERSION_FAILURE_REFRESH_INTERVAL_MS) { + if (this._footerVersionRetryTimer) return; + + const delay = Math.max(0, Number(delayMs) || FOOTER_VERSION_FAILURE_REFRESH_INTERVAL_MS); + this._footerVersionRetryTimer = setTimeout(() => { + this._footerVersionRetryTimer = null; + if (this.element?.style?.display === 'none') return; + void this.loadFooterVersion(); + }, delay); + }, + createFooter() { this.footerMenus = new Map(); this.footerMenuButtons = new Map();