From fc1e963660630cdfbe52b5a1eb3cfb61240a8322 Mon Sep 17 00:00:00 2001 From: Thomas Kippster Date: Mon, 11 May 2026 15:10:57 +0200 Subject: [PATCH] fix: improve ComfyUI bridge refresh by moving delay to backend and ensuring clean frontend refresh --- src/main/resources/comfyui-bridge/__init__.py | 11 +++++++---- .../resources/comfyui-bridge/web/downloader.js | 17 ++++++----------- 2 files changed, 13 insertions(+), 15 deletions(-) diff --git a/src/main/resources/comfyui-bridge/__init__.py b/src/main/resources/comfyui-bridge/__init__.py index 7725dc7..53bbd37 100644 --- a/src/main/resources/comfyui-bridge/__init__.py +++ b/src/main/resources/comfyui-bridge/__init__.py @@ -2,6 +2,7 @@ import server import folder_paths import os +import asyncio from aiohttp import web print("\033[95m[Model-Downloader] UI Extension Bridge active\033[0m") @@ -16,9 +17,11 @@ if os.path.exists(USER_MODEL_PATH): async def model_downloaded(request): print("\033[92mđŸ”„ [Model-Downloader] PING ERHALTEN! Bereite UI-Refresh vor...\033[0m") + # 1. Dem Dateisystem Zeit geben, BEVOR wir den Cache leeren! + await asyncio.sleep(2) + try: - # 1. Wir löschen nur die Caches, machen aber KEINEN eigenen Scan mehr! - # Das verhindert, dass wir einen noch unfertigen Windows-Ordner scannen und den Fehler cachen. + # 2. Erst jetzt die Caches leeren, wenn die Datei sicher im OS registriert ist if hasattr(folder_paths, "filename_list_cache"): folder_paths.filename_list_cache.clear() @@ -28,13 +31,13 @@ async def model_downloaded(request): if hasattr(folder_paths, "cache") and hasattr(folder_paths.cache, "clear"): folder_paths.cache.clear() - # 2. Object Info zurĂŒcksetzen (zwingt ComfyUI beim nĂ€chsten UI-Klick zum Neuladen) + # Object Info zurĂŒcksetzen (zwingt ComfyUI beim nĂ€chsten UI-Klick zum Neuladen) server.PromptServer.instance.object_info = None except Exception as e: print(f"[Model-Downloader] Fehler beim Cache-Reset: {e}") - # 3. Signal an das Frontend senden + # 3. Signal an das Frontend senden (jetzt ist der Cache wirklich leer und das OS bereit!) server.PromptServer.instance.send_sync("kippster-refresh-ui", {"message": "ready"}) return web.json_response({"status": "success"}) diff --git a/src/main/resources/comfyui-bridge/web/downloader.js b/src/main/resources/comfyui-bridge/web/downloader.js index ac998d1..3349e09 100644 --- a/src/main/resources/comfyui-bridge/web/downloader.js +++ b/src/main/resources/comfyui-bridge/web/downloader.js @@ -12,7 +12,7 @@ const initializeExtension = async () => { api.addEventListener("kippster-refresh-ui", async (event) => { console.log("%cđŸ”„ [Model-Downloader] SIGNAL ERHALTEN! Starte Refresh-Sequenz...", "background: #ff0000; color: #fff; font-size: 14px;"); - + try { const showToast = (text) => { const toast = document.createElement("div"); @@ -21,24 +21,19 @@ const initializeExtension = async () => { document.body.appendChild(toast); setTimeout(() => { toast.style.opacity = "0"; setTimeout(() => document.body.removeChild(toast), 500); }, 3000); }; - - showToast("🔄 Sync: Warte auf Windows-Dateisystem..."); - // WICHTIG: 2 Sekunden warten! - // Windows braucht einen Moment, um die Ordner-Indizes nach dem Verschieben/Entpacken zu aktualisieren. - await new Promise(r => setTimeout(r, 2000)); - showToast("🔄 FĂŒhre 'Refresh Node Definitions' aus..."); - + // ComfyUI Frontend-Cache leeren api.nodeDefs = null; - // Den originalen Refresh-Befehl von ComfyUI ausfĂŒhren (exakt wie der manuelle Klick) + // Den originalen Refresh-Befehl von ComfyUI ausfĂŒhren if (app.refresh) { - await app.refresh(); + await app.refresh(); // Wichtig: Erst abwarten, bis das Backend die neuen Daten gesendet hat! } - // Fallback: Bereits gerenderte Dropdowns zwingen, die neuen Werte zu fressen und rote Nodes zu heilen + // Fallback: Bereits gerenderte Dropdowns zwingen + let healedCount = 0; if (app.graph && app.graph._nodes) { const nodeDefs = await api.getNodeDefs();