From 9ba1fac932df84b952ed615c3a0dedbac78da243 Mon Sep 17 00:00:00 2001 From: Thomas Date: Sat, 9 May 2026 21:48:58 +0200 Subject: [PATCH] debug: add detailed logging and failsafe notification logic to bridge --- .../service/impl/DefaultDownloadManager.java | 9 ++- src/main/resources/comfyui-bridge/__init__.py | 10 +-- .../comfyui-bridge/web/downloader.js | 50 +++++++++++---- web/downloader.js | 63 +++++++++++-------- 4 files changed, 84 insertions(+), 48 deletions(-) diff --git a/src/main/java/de/tki/comfymodels/service/impl/DefaultDownloadManager.java b/src/main/java/de/tki/comfymodels/service/impl/DefaultDownloadManager.java index 659006e..36b3c88 100644 --- a/src/main/java/de/tki/comfymodels/service/impl/DefaultDownloadManager.java +++ b/src/main/java/de/tki/comfymodels/service/impl/DefaultDownloadManager.java @@ -123,14 +123,17 @@ public class DefaultDownloadManager implements IDownloadManager { // NEU: Benachrichtigt ComfyUI private void notifyComfyUI() { try { + System.out.println("🚀 [Model-Downloader] Sende Refresh-Ping an ComfyUI (Port 8188)..."); HttpRequest request = HttpRequest.newBuilder() .uri(URI.create("http://127.0.0.1:8188/kippster/model-downloaded")) .POST(HttpRequest.BodyPublishers.noBody()) .build(); - // Fire and forget - httpClient.sendAsync(request, HttpResponse.BodyHandlers.discarding()); + + // Synchron senden, damit wir sehen, was passiert + HttpResponse response = httpClient.send(request, HttpResponse.BodyHandlers.ofString()); + System.out.println("✅ [Model-Downloader] ComfyUI hat geantwortet mit Status: " + response.statusCode()); } catch (Exception e) { - // Wenn ComfyUI nicht läuft, ignorieren wir das leise + System.err.println("❌ [Model-Downloader] Konnte ComfyUI nicht erreichen. Läuft es auf Port 8188? Fehler: " + e.getMessage()); } } diff --git a/src/main/resources/comfyui-bridge/__init__.py b/src/main/resources/comfyui-bridge/__init__.py index 65e4d33..0333e83 100644 --- a/src/main/resources/comfyui-bridge/__init__.py +++ b/src/main/resources/comfyui-bridge/__init__.py @@ -4,13 +4,13 @@ from aiohttp import web print("\033[95m[Model-Downloader] UI Extension Bridge active\033[0m") -# NEU: Der API-Endpunkt für den Java-Ping @server.PromptServer.instance.routes.post("/kippster/model-downloaded") async def model_downloaded(request): - print("[Model-Downloader] Download finished trigger received from Java!") - # Sendet das Signal ans Frontend - server.PromptServer.instance.send_sync("kippster-refresh-ui", {"message": "New models available!"}) - return web.json_response({"status": "success", "message": "UI refresh triggered"}) + # Dieser Text MUSS in der ComfyUI-Konsole auftauchen, wenn Java fertig ist! + print("\033[92m🔥 [Model-Downloader] PING ERHALTEN! Sende Signal ans Frontend...\033[0m") + + server.PromptServer.instance.send_sync("kippster-refresh-ui", {"message": "ready"}) + return web.json_response({"status": "success", "message": "UI refreshed"}) WEB_DIRECTORY = "web" NODE_CLASS_MAPPINGS = {} diff --git a/src/main/resources/comfyui-bridge/web/downloader.js b/src/main/resources/comfyui-bridge/web/downloader.js index b93b778..9174f55 100644 --- a/src/main/resources/comfyui-bridge/web/downloader.js +++ b/src/main/resources/comfyui-bridge/web/downloader.js @@ -39,23 +39,47 @@ const tryImports = async () => { await tryImports(); +// NEU: Dynamischer Import für den WebSocket-Listener +const setupListener = async () => { + const apiPaths = [ + "../../scripts/api.js", + "/scripts/api.js", + "../../../scripts/api.js" + ]; + + for (const path of apiPaths) { + try { + const mod = await import(path); + if (mod.api) { + console.log("%c[Model-Downloader] WebSocket Listener erfolgreich verknüpft!", "color: #00ff00; font-weight: bold;"); + + mod.api.addEventListener("kippster-refresh-ui", (event) => { + console.log("%c🔥 [Model-Downloader] SIGNAL EMPFANGEN! Lade UI neu...", "background: #ff0000; color: #fff; font-size: 14px;"); + + if (app && typeof app.refresh === 'function') { + app.refresh(); // Aktualisiert die Model-Dropdowns! + + // Kleines UI-Popup zur Bestätigung + if (app.ui?.dialog?.show) { + app.ui.dialog.show("✅ Downloads abgeschlossen! Modelle sind jetzt im Dropdown."); + } else { + alert("✅ Downloads abgeschlossen! Modelle aktualisiert."); + } + } + }); + break; // Erfolgreich gefunden, Schleife abbrechen + } + } catch (e) {} + } +}; + +await setupListener(); + // Define setup logic that can be called by extension or as fallback const initializeExtension = async () => { let apiToken = null; - if (api) { - api.addEventListener("kippster-refresh-ui", () => { - console.log("[Model-Downloader] Refresh event received from WebSocket. Refreshing ComfyUI..."); - if (app?.refresh) { - app.refresh(); - // We don't use alert() here because it's annoying during background downloads, - // but we could use a non-blocking toast if available. - if (app.ui?.dialog?.show) { - // Optional: show a temporary notification if we want - } - } - }); - } + // We removed the old inline listener here to avoid duplicates const loadConfig = async () => { try { diff --git a/web/downloader.js b/web/downloader.js index d6c2eba..beecc6d 100644 --- a/web/downloader.js +++ b/web/downloader.js @@ -39,6 +39,42 @@ const tryImports = async () => { await tryImports(); +// NEU: Dynamischer Import für den WebSocket-Listener +const setupListener = async () => { + const apiPaths = [ + "../../scripts/api.js", + "/scripts/api.js", + "../../../scripts/api.js" + ]; + + for (const path of apiPaths) { + try { + const mod = await import(path); + if (mod.api) { + console.log("%c[Model-Downloader] WebSocket Listener erfolgreich verknüpft!", "color: #00ff00; font-weight: bold;"); + + mod.api.addEventListener("kippster-refresh-ui", (event) => { + console.log("%c🔥 [Model-Downloader] SIGNAL EMPFANGEN! Lade UI neu...", "background: #ff0000; color: #fff; font-size: 14px;"); + + if (app && typeof app.refresh === 'function') { + app.refresh(); // Aktualisiert die Model-Dropdowns! + + // Kleines UI-Popup zur Bestätigung + if (app.ui?.dialog?.show) { + app.ui.dialog.show("✅ Downloads abgeschlossen! Modelle sind jetzt im Dropdown."); + } else { + alert("✅ Downloads abgeschlossen! Modelle aktualisiert."); + } + } + }); + break; // Erfolgreich gefunden, Schleife abbrechen + } + } catch (e) {} + } +}; + +await setupListener(); + // Define setup logic that can be called by extension or as fallback const initializeExtension = async () => { let apiToken = null; @@ -296,33 +332,6 @@ const initializeExtension = async () => { addFAB(); addClassic(); addV2Action(); }; -// NEU: Wir laden die API -const setupListener = async () => { - try { - const { api } = await import("../../scripts/api.js"); - api.addEventListener("kippster-refresh-ui", (event) => { - console.log("%c[Model-Downloader] Triggering UI Refresh!", "background: green; color: white;"); - - if (app && app.refresh) { - app.refresh(); // Magischer Reload-Befehl - - // Kleines Popup für den User - const notify = (msg) => { - if (app.ui?.dialog?.show) app.ui.dialog.show(msg); - else if (window.comfyAPI?.dialog?.show) window.comfyAPI.dialog.show(msg); - else alert(msg); - }; - notify("✅ Downloads abgeschlossen! Modelle sind jetzt in ComfyUI verfügbar."); - } - }); - console.log("[Model-Downloader] WebSocket Listener aktiv."); - } catch (e) { - console.error("[Model-Downloader] Konnte API nicht für Listener laden.", e); - } -}; - -setupListener(); - if (app) { app.registerExtension({ name: "TKI.ModelDownloader", async setup() { await initializeExtension(); } }); } else if (document.readyState === "complete") {