|
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); |
|
|