Spaces:
Running
on
Zero
Running
on
Zero
| import { api } from "../../scripts/api.js"; | |
| import { getResolver } from "./shared_utils.js"; | |
| export class PromptExecution { | |
| constructor(id) { | |
| this.promptApi = null; | |
| this.executedNodeIds = []; | |
| this.totalNodes = 0; | |
| this.currentlyExecuting = null; | |
| this.errorDetails = null; | |
| this.apiPrompt = getResolver(); | |
| this.id = id; | |
| } | |
| setPrompt(prompt) { | |
| this.promptApi = prompt.output; | |
| this.totalNodes = Object.keys(this.promptApi).length; | |
| this.apiPrompt.resolve(null); | |
| } | |
| getApiNode(nodeId) { | |
| var _a; | |
| return ((_a = this.promptApi) === null || _a === void 0 ? void 0 : _a[String(nodeId)]) || null; | |
| } | |
| getNodeLabel(nodeId) { | |
| var _a, _b; | |
| const apiNode = this.getApiNode(nodeId); | |
| let label = ((_a = apiNode === null || apiNode === void 0 ? void 0 : apiNode._meta) === null || _a === void 0 ? void 0 : _a.title) || (apiNode === null || apiNode === void 0 ? void 0 : apiNode.class_type) || undefined; | |
| if (!label) { | |
| const graphNode = (_b = this.maybeGetComfyGraph()) === null || _b === void 0 ? void 0 : _b.getNodeById(Number(nodeId)); | |
| label = (graphNode === null || graphNode === void 0 ? void 0 : graphNode.title) || (graphNode === null || graphNode === void 0 ? void 0 : graphNode.type) || undefined; | |
| } | |
| return label; | |
| } | |
| executing(nodeId, step, maxSteps) { | |
| var _a; | |
| if (nodeId == null) { | |
| this.currentlyExecuting = null; | |
| return; | |
| } | |
| if (((_a = this.currentlyExecuting) === null || _a === void 0 ? void 0 : _a.nodeId) !== nodeId) { | |
| if (this.currentlyExecuting != null) { | |
| this.executedNodeIds.push(nodeId); | |
| } | |
| this.currentlyExecuting = { nodeId, nodeLabel: this.getNodeLabel(nodeId), pass: 0 }; | |
| this.apiPrompt.promise.then(() => { | |
| var _a; | |
| if (this.currentlyExecuting == null) { | |
| return; | |
| } | |
| const apiNode = this.getApiNode(nodeId); | |
| if (!this.currentlyExecuting.nodeLabel) { | |
| this.currentlyExecuting.nodeLabel = this.getNodeLabel(nodeId); | |
| } | |
| if ((apiNode === null || apiNode === void 0 ? void 0 : apiNode.class_type) === "UltimateSDUpscale") { | |
| this.currentlyExecuting.pass--; | |
| this.currentlyExecuting.maxPasses = -1; | |
| } | |
| else if ((apiNode === null || apiNode === void 0 ? void 0 : apiNode.class_type) === "IterativeImageUpscale") { | |
| this.currentlyExecuting.maxPasses = (_a = apiNode === null || apiNode === void 0 ? void 0 : apiNode.inputs["steps"]) !== null && _a !== void 0 ? _a : -1; | |
| } | |
| }); | |
| } | |
| if (step != null) { | |
| if (!this.currentlyExecuting.step || step < this.currentlyExecuting.step) { | |
| this.currentlyExecuting.pass++; | |
| } | |
| this.currentlyExecuting.step = step; | |
| this.currentlyExecuting.maxSteps = maxSteps; | |
| } | |
| } | |
| error(details) { | |
| this.errorDetails = details; | |
| } | |
| maybeGetComfyGraph() { | |
| var _a; | |
| return ((_a = window === null || window === void 0 ? void 0 : window.app) === null || _a === void 0 ? void 0 : _a.graph) || null; | |
| } | |
| } | |
| class PromptService extends EventTarget { | |
| constructor(api) { | |
| super(); | |
| this.promptsMap = new Map(); | |
| this.currentExecution = null; | |
| this.lastQueueRemaining = 0; | |
| const that = this; | |
| const queuePrompt = api.queuePrompt; | |
| api.queuePrompt = async function (num, prompt) { | |
| let response; | |
| try { | |
| response = await queuePrompt.apply(api, [...arguments]); | |
| } | |
| catch (e) { | |
| const promptExecution = that.getOrMakePrompt("error"); | |
| promptExecution.error({ exception_type: "Unknown." }); | |
| throw e; | |
| } | |
| const promptExecution = that.getOrMakePrompt(response.prompt_id); | |
| promptExecution.setPrompt(prompt); | |
| if (!that.currentExecution) { | |
| that.currentExecution = promptExecution; | |
| } | |
| that.promptsMap.set(response.prompt_id, promptExecution); | |
| that.dispatchEvent(new CustomEvent("queue-prompt", { | |
| detail: { | |
| prompt: promptExecution, | |
| }, | |
| })); | |
| return response; | |
| }; | |
| api.addEventListener("status", (e) => { | |
| var _a; | |
| if (!((_a = e.detail) === null || _a === void 0 ? void 0 : _a.exec_info)) | |
| return; | |
| this.lastQueueRemaining = e.detail.exec_info.queue_remaining; | |
| this.dispatchProgressUpdate(); | |
| }); | |
| api.addEventListener("execution_start", (e) => { | |
| if (!this.promptsMap.has(e.detail.prompt_id)) { | |
| console.warn("'execution_start' fired before prompt was made."); | |
| } | |
| const prompt = this.getOrMakePrompt(e.detail.prompt_id); | |
| this.currentExecution = prompt; | |
| this.dispatchProgressUpdate(); | |
| }); | |
| api.addEventListener("executing", (e) => { | |
| if (!this.currentExecution) { | |
| this.currentExecution = this.getOrMakePrompt("unknown"); | |
| console.warn("'executing' fired before prompt was made."); | |
| } | |
| this.currentExecution.executing(e.detail); | |
| this.dispatchProgressUpdate(); | |
| if (e.detail == null) { | |
| this.currentExecution = null; | |
| } | |
| }); | |
| api.addEventListener("progress", (e) => { | |
| if (!this.currentExecution) { | |
| this.currentExecution = this.getOrMakePrompt(e.detail.prompt_id); | |
| console.warn("'progress' fired before prompt was made."); | |
| } | |
| this.currentExecution.executing(e.detail.node, e.detail.value, e.detail.max); | |
| this.dispatchProgressUpdate(); | |
| }); | |
| api.addEventListener("execution_cached", (e) => { | |
| if (!this.currentExecution) { | |
| this.currentExecution = this.getOrMakePrompt(e.detail.prompt_id); | |
| console.warn("'execution_cached' fired before prompt was made."); | |
| } | |
| for (const cached of e.detail.nodes) { | |
| this.currentExecution.executing(cached); | |
| } | |
| this.dispatchProgressUpdate(); | |
| }); | |
| api.addEventListener("executed", (e) => { | |
| if (!this.currentExecution) { | |
| this.currentExecution = this.getOrMakePrompt(e.detail.prompt_id); | |
| console.warn("'executed' fired before prompt was made."); | |
| } | |
| }); | |
| api.addEventListener("execution_error", (e) => { | |
| var _a; | |
| if (!this.currentExecution) { | |
| this.currentExecution = this.getOrMakePrompt(e.detail.prompt_id); | |
| console.warn("'execution_error' fired before prompt was made."); | |
| } | |
| (_a = this.currentExecution) === null || _a === void 0 ? void 0 : _a.error(e.detail); | |
| this.dispatchProgressUpdate(); | |
| }); | |
| } | |
| async queuePrompt(prompt) { | |
| return await api.queuePrompt(-1, prompt); | |
| } | |
| dispatchProgressUpdate() { | |
| this.dispatchEvent(new CustomEvent("progress-update", { | |
| detail: { | |
| queue: this.lastQueueRemaining, | |
| prompt: this.currentExecution, | |
| }, | |
| })); | |
| } | |
| getOrMakePrompt(id) { | |
| let prompt = this.promptsMap.get(id); | |
| if (!prompt) { | |
| prompt = new PromptExecution(id); | |
| this.promptsMap.set(id, prompt); | |
| } | |
| return prompt; | |
| } | |
| } | |
| export const SERVICE = new PromptService(api); | |