Files
robertvoy-ComfyUI-Distributed/web/workerUtils.js

126 lines
4.3 KiB
JavaScript

import { TIMEOUTS, ENDPOINTS } from './constants.js';
import { checkAllWorkerStatuses, getWorkerUrl } from './workerLifecycle.js';
export async function handleWorkerOperation(extension, button, operation, successText, errorText) {
const originalText = button.textContent;
const originalStyle = button.style.cssText;
const originalClasses = Array.from(button.classList);
const stateClasses = ["btn--working", "btn--success", "btn--error"];
const setButtonStateClass = (className) => {
button.classList.remove(...stateClasses);
if (className) {
button.classList.add(className);
}
};
button.textContent = operation.loadingText;
button.disabled = true;
setButtonStateClass("btn--working");
try {
const urlsToProcess = extension.enabledWorkers.map(w => ({
name: w.name,
url: getWorkerUrl(extension, w)
}));
if (urlsToProcess.length === 0) {
button.textContent = "No Workers";
setButtonStateClass("btn--error");
setTimeout(() => {
button.textContent = originalText;
button.style.cssText = originalStyle;
button.classList.remove(...stateClasses);
button.classList.add(...originalClasses);
button.disabled = false;
}, TIMEOUTS.BUTTON_RESET);
return;
}
const promises = urlsToProcess.map(target =>
fetch(`${target.url}${operation.endpoint}`, {
method: 'POST',
mode: 'cors'
})
.then(response => ({ ok: response.ok, name: target.name }))
.catch(() => ({ ok: false, name: target.name }))
);
const results = await Promise.all(promises);
const failures = results.filter(r => !r.ok);
if (failures.length === 0) {
button.textContent = successText;
setButtonStateClass("btn--success");
if (operation.onSuccess) operation.onSuccess();
} else {
button.textContent = errorText;
setButtonStateClass("btn--error");
extension.log(`${operation.name} failed on: ${failures.map(f => f.name).join(", ")}`, "error");
}
setTimeout(() => {
button.textContent = originalText;
button.style.cssText = originalStyle;
button.classList.remove(...stateClasses);
button.classList.add(...originalClasses);
}, TIMEOUTS.BUTTON_RESET);
} finally {
button.disabled = false;
}
}
export async function handleInterruptWorkers(extension, button) {
return handleWorkerOperation(extension, button, {
name: "Interrupt",
endpoint: ENDPOINTS.INTERRUPT,
loadingText: "Interrupting...",
onSuccess: () => setTimeout(() => checkAllWorkerStatuses(extension), TIMEOUTS.POST_ACTION_DELAY)
}, "Interrupted!", "Error! See Console");
}
export async function handleClearMemory(extension, button) {
return handleWorkerOperation(extension, button, {
name: "Clear memory",
endpoint: ENDPOINTS.CLEAR_MEMORY,
loadingText: "Clearing..."
}, "Success!", "Error! See Console");
}
export function findNodesByClass(apiPrompt, className) {
return Object.entries(apiPrompt)
.filter(([, nodeData]) => nodeData.class_type === className)
.map(([nodeId, nodeData]) => ({ id: nodeId, data: nodeData }));
}
export function applyProbeResultToWorkerDot(workerId, probeResult) {
const dot = document.getElementById(`status-${workerId}`);
if (!dot) {
return;
}
dot.classList.remove(
'worker-status--online',
'worker-status--offline',
'worker-status--processing',
'worker-status--unknown',
'status-pulsing',
);
if (!probeResult || !probeResult.ok) {
dot.classList.add('worker-status--offline');
dot.title = 'Offline - Cannot connect';
return;
}
if ((probeResult.queueRemaining || 0) > 0) {
dot.classList.add('worker-status--processing');
dot.title = `Processing (${probeResult.queueRemaining} queued)`;
return;
}
dot.classList.add('worker-status--online');
dot.title = 'Online - Idle';
}