88 lines
3.3 KiB
JavaScript
88 lines
3.3 KiB
JavaScript
import { PromptStatus } from "./constants.js";
|
|
|
|
const STORAGE_KEY = "comfy_sidebar_prompt_states";
|
|
|
|
export const PersistenceAdapter = {
|
|
load() {
|
|
try {
|
|
const data = localStorage.getItem(STORAGE_KEY);
|
|
if (!data) return [];
|
|
const list = JSON.parse(data);
|
|
return Array.isArray(list) ? list : [];
|
|
} catch (e) {
|
|
console.warn("Comfy Sidebar: Failed to load states from localStorage", e);
|
|
return [];
|
|
}
|
|
},
|
|
|
|
save(promptsMap) {
|
|
try {
|
|
const serializable = [];
|
|
|
|
for (const [pid, state] of promptsMap.entries()) {
|
|
const cleanedImages = (state.images || []).map(img => {
|
|
if (img && img.url && img.url.startsWith("blob:")) return null;
|
|
return img;
|
|
}).filter(Boolean);
|
|
|
|
const includeWorkflow = cleanedImages.length === 0 || state.status !== PromptStatus.COMPLETED;
|
|
|
|
serializable.push({
|
|
pid: String(state.pid),
|
|
status: state.status,
|
|
images: cleanedImages,
|
|
texts: state.texts || [],
|
|
promptSearchText: state.promptSearchText,
|
|
nodeOutputs: state.nodeOutputs || {},
|
|
nodeTitles: state.nodeTitles || {}, // Always preserved across restarts
|
|
workflow: includeWorkflow ? state.workflow : null,
|
|
progress: state.progress || 0,
|
|
queueNumber: state.queueNumber,
|
|
progressText: state.progressText || "",
|
|
timestamp: state.timestamp,
|
|
activeNodeName: state.activeNodeName || "",
|
|
rendered: !!state.rendered,
|
|
startTime: state.startTime,
|
|
endTime: state.endTime,
|
|
duration: state.duration
|
|
});
|
|
}
|
|
|
|
if (serializable.length === 0) {
|
|
localStorage.removeItem(STORAGE_KEY);
|
|
return;
|
|
}
|
|
|
|
serializable.sort((a, b) => a.timestamp - b.timestamp);
|
|
|
|
while (serializable.length > 0) {
|
|
try {
|
|
localStorage.setItem(STORAGE_KEY, JSON.stringify(serializable));
|
|
break;
|
|
} catch (e) {
|
|
if (e.name === "QuotaExceededError" || e.code === 22 || e.code === 1014) {
|
|
serializable.shift();
|
|
} else {
|
|
console.warn("Comfy Sidebar: LocalStorage error", e);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
} catch (e) {
|
|
console.warn("Comfy Sidebar: Failed to serialize states", e);
|
|
}
|
|
},
|
|
|
|
getPruneCandidates(promptsMap, maxItems = 64) {
|
|
const finished = Array.from(promptsMap.entries())
|
|
.filter(([_, state]) => state.status !== PromptStatus.PENDING && state.status !== PromptStatus.ACTIVE);
|
|
|
|
finished.sort((a, b) => (a[1].timestamp || 0) - (b[1].timestamp || 0));
|
|
|
|
if (finished.length > maxItems) {
|
|
const deleteCount = finished.length - maxItems;
|
|
return finished.slice(0, deleteCount).map(([pid]) => pid);
|
|
}
|
|
return [];
|
|
}
|
|
}; |