100 lines
4.2 KiB
JavaScript
100 lines
4.2 KiB
JavaScript
import { createModuleLogger } from "../log_system/log_funcs.js";
|
|
// @ts-ignore
|
|
import { ComfyApp } from "../../../scripts/app.js";
|
|
const log = createModuleLogger('ClipspaceUtils');
|
|
/**
|
|
* Validates and fixes ComfyUI clipspace structure to prevent 'Cannot read properties of undefined' errors
|
|
* @returns {boolean} - True if clipspace is valid and ready to use, false otherwise
|
|
*/
|
|
export function validateAndFixClipspace() {
|
|
log.debug("Validating and fixing clipspace structure");
|
|
// Check if clipspace exists
|
|
if (!ComfyApp.clipspace) {
|
|
log.debug("ComfyUI clipspace is not available");
|
|
return false;
|
|
}
|
|
// Validate clipspace structure
|
|
if (!ComfyApp.clipspace.imgs || ComfyApp.clipspace.imgs.length === 0) {
|
|
log.debug("ComfyUI clipspace has no images");
|
|
return false;
|
|
}
|
|
log.debug("Current clipspace state:", {
|
|
hasImgs: !!ComfyApp.clipspace.imgs,
|
|
imgsLength: ComfyApp.clipspace.imgs?.length,
|
|
selectedIndex: ComfyApp.clipspace.selectedIndex,
|
|
combinedIndex: ComfyApp.clipspace.combinedIndex,
|
|
img_paste_mode: ComfyApp.clipspace.img_paste_mode
|
|
});
|
|
// Ensure required indices are set
|
|
if (ComfyApp.clipspace.selectedIndex === undefined || ComfyApp.clipspace.selectedIndex === null) {
|
|
ComfyApp.clipspace.selectedIndex = 0;
|
|
log.debug("Fixed clipspace selectedIndex to 0");
|
|
}
|
|
if (ComfyApp.clipspace.combinedIndex === undefined || ComfyApp.clipspace.combinedIndex === null) {
|
|
ComfyApp.clipspace.combinedIndex = 0;
|
|
log.debug("Fixed clipspace combinedIndex to 0");
|
|
}
|
|
if (!ComfyApp.clipspace.img_paste_mode) {
|
|
ComfyApp.clipspace.img_paste_mode = 'selected';
|
|
log.debug("Fixed clipspace img_paste_mode to 'selected'");
|
|
}
|
|
// Ensure indices are within bounds
|
|
const maxIndex = ComfyApp.clipspace.imgs.length - 1;
|
|
if (ComfyApp.clipspace.selectedIndex > maxIndex) {
|
|
ComfyApp.clipspace.selectedIndex = maxIndex;
|
|
log.debug(`Fixed clipspace selectedIndex to ${maxIndex} (max available)`);
|
|
}
|
|
if (ComfyApp.clipspace.combinedIndex > maxIndex) {
|
|
ComfyApp.clipspace.combinedIndex = maxIndex;
|
|
log.debug(`Fixed clipspace combinedIndex to ${maxIndex} (max available)`);
|
|
}
|
|
// Verify the image at combinedIndex exists and has src
|
|
const combinedImg = ComfyApp.clipspace.imgs[ComfyApp.clipspace.combinedIndex];
|
|
if (!combinedImg || !combinedImg.src) {
|
|
log.debug("Image at combinedIndex is missing or has no src, trying to find valid image");
|
|
// Try to use the first available image
|
|
for (let i = 0; i < ComfyApp.clipspace.imgs.length; i++) {
|
|
if (ComfyApp.clipspace.imgs[i] && ComfyApp.clipspace.imgs[i].src) {
|
|
ComfyApp.clipspace.combinedIndex = i;
|
|
log.debug(`Fixed combinedIndex to ${i} (first valid image)`);
|
|
break;
|
|
}
|
|
}
|
|
// Final check - if still no valid image found
|
|
const finalImg = ComfyApp.clipspace.imgs[ComfyApp.clipspace.combinedIndex];
|
|
if (!finalImg || !finalImg.src) {
|
|
log.error("No valid images found in clipspace after attempting fixes");
|
|
return false;
|
|
}
|
|
}
|
|
log.debug("Final clipspace structure:", {
|
|
selectedIndex: ComfyApp.clipspace.selectedIndex,
|
|
combinedIndex: ComfyApp.clipspace.combinedIndex,
|
|
img_paste_mode: ComfyApp.clipspace.img_paste_mode,
|
|
imgsLength: ComfyApp.clipspace.imgs?.length,
|
|
combinedImgSrc: ComfyApp.clipspace.imgs[ComfyApp.clipspace.combinedIndex]?.src?.substring(0, 50) + '...'
|
|
});
|
|
return true;
|
|
}
|
|
/**
|
|
* Safely calls ComfyApp.pasteFromClipspace after validating clipspace structure
|
|
* @param {any} node - The ComfyUI node to paste to
|
|
* @returns {boolean} - True if paste was successful, false otherwise
|
|
*/
|
|
export function safeClipspacePaste(node) {
|
|
log.debug("Attempting safe clipspace paste");
|
|
if (!validateAndFixClipspace()) {
|
|
log.debug("Clipspace validation failed, cannot paste");
|
|
return false;
|
|
}
|
|
try {
|
|
ComfyApp.pasteFromClipspace(node);
|
|
log.debug("Successfully called pasteFromClipspace");
|
|
return true;
|
|
}
|
|
catch (error) {
|
|
log.error("Error calling pasteFromClipspace:", error);
|
|
return false;
|
|
}
|
|
}
|