Dr.Lt.Data
10 months ago
5 changed files with 257 additions and 3 deletions
@ -0,0 +1,191 @@
|
||||
import { app } from "../../scripts/app.js"; |
||||
import { api } from "../../scripts/api.js" |
||||
import { sleep } from "./common.js"; |
||||
import { GroupNodeConfig, GroupNodeHandler } from "../../extensions/core/groupNode.js"; |
||||
|
||||
function storeGroupNode(name, data) { |
||||
let extra = app.graph.extra; |
||||
if (!extra) app.graph.extra = extra = {}; |
||||
let groupNodes = extra.groupNodes; |
||||
if (!groupNodes) extra.groupNodes = groupNodes = {}; |
||||
groupNodes[name] = data; |
||||
} |
||||
|
||||
export async function load_components() { |
||||
let data = await api.fetchApi('/manager/component/loads', {method: "POST"}); |
||||
let components = await data.json(); |
||||
|
||||
// while(!app.graph) {
|
||||
// await sleep(100);
|
||||
// }
|
||||
|
||||
let start_time = Date.now(); |
||||
let failed = []; |
||||
let failed2 = []; |
||||
|
||||
for(let name in components) { |
||||
if(app.graph.extra?.groupNodes?.[name]) { |
||||
continue; |
||||
} |
||||
|
||||
let nodeData = components[name]; |
||||
|
||||
storeGroupNode(name, nodeData); |
||||
|
||||
const config = new GroupNodeConfig(name, nodeData); |
||||
while(!success) { |
||||
var success = false; |
||||
try { |
||||
await config.registerType(); |
||||
} |
||||
catch { |
||||
let elapsed_time = Date.now() - start_time; |
||||
if (elapsed_time > 5000) { |
||||
failed.push(name); |
||||
success = true; |
||||
} else { |
||||
await sleep(100); |
||||
} |
||||
} |
||||
} |
||||
|
||||
const groupNode = LiteGraph.createNode(`workflow/${name}`); |
||||
} |
||||
|
||||
// fallback1
|
||||
for(let i in failed) { |
||||
let name = failed[i]; |
||||
|
||||
if(app.graph.extra?.groupNodes?.[name]) { |
||||
continue; |
||||
} |
||||
|
||||
let nodeData = components[name]; |
||||
|
||||
storeGroupNode(name, nodeData); |
||||
|
||||
const config = new GroupNodeConfig(name, nodeData); |
||||
while(!success) { |
||||
var success = false; |
||||
try { |
||||
await config.registerType(); |
||||
} |
||||
catch { |
||||
let elapsed_time = Date.now() - start_time; |
||||
if (elapsed_time > 10000) { |
||||
failed2.push(name); |
||||
success = true; |
||||
} else { |
||||
await sleep(100); |
||||
} |
||||
} |
||||
} |
||||
|
||||
const groupNode = LiteGraph.createNode(`workflow/${name}`); |
||||
} |
||||
|
||||
// fallback2
|
||||
for(let name in failed2) { |
||||
let name = failed2[i]; |
||||
|
||||
let nodeData = components[name]; |
||||
|
||||
storeGroupNode(name, nodeData); |
||||
|
||||
const config = new GroupNodeConfig(name, nodeData); |
||||
while(!success) { |
||||
var success = false; |
||||
try { |
||||
await config.registerType(); |
||||
} |
||||
catch { |
||||
let elapsed_time = Date.now() - start_time; |
||||
if (elapsed_time > 30000) { |
||||
failed.push(name); |
||||
success = true; |
||||
} else { |
||||
await sleep(100); |
||||
} |
||||
} |
||||
} |
||||
|
||||
const groupNode = LiteGraph.createNode(`workflow/${name}`); |
||||
} |
||||
} |
||||
|
||||
export async function save_as_component(node, app) { |
||||
let pure_name = node.comfyClass.substring(9); |
||||
let subgraph = app.graph.extra?.groupNodes?.[pure_name]; |
||||
|
||||
if(!subgraph) { |
||||
app.ui.dialog.show(`Failed to retrieve the group node '${pure_name}'.`); |
||||
return; |
||||
} |
||||
|
||||
if(node.comfyClass.includes('::')) { |
||||
let component_name = node.comfyClass.substring(9); |
||||
|
||||
if(confirm(`Will you save/overwrite component '${component_name}'?`)) { |
||||
let subgraph = app.graph.extra?.groupNodes?.[component_name]; |
||||
let body = |
||||
{ |
||||
name: component_name, |
||||
workflow: subgraph |
||||
}; |
||||
|
||||
const res = await api.fetchApi('/manager/component/save', { |
||||
method: "POST", |
||||
headers: { "Content-Type": "application/json", }, |
||||
body: JSON.stringify(body) |
||||
}); |
||||
|
||||
if(res.status == 200) { |
||||
storeGroupNode(name, subgraph); |
||||
const config = new GroupNodeConfig(name, subgraph); |
||||
await config.registerType(); |
||||
|
||||
let path = await res.text(); |
||||
app.ui.dialog.show(`Component '${component_name}' is saved into:\n${path}`); |
||||
} |
||||
else |
||||
app.ui.dialog.show(`Failed to save component.`); |
||||
} |
||||
|
||||
return; |
||||
} |
||||
|
||||
var prefix = prompt("To save as a component, a unique prefix is required. (e.g., the 'Impact' in Impact::MAKE_BASIC_PIPE)", "PREFIX"); |
||||
|
||||
if(!prefix) { |
||||
return; |
||||
} |
||||
|
||||
prefix = prefix.trim(); |
||||
|
||||
if(prefix == 'PREFIX') { |
||||
app.ui.dialog.show(`The placeholder 'PREFIX' isn't allowed for component prefix.`); |
||||
return; |
||||
} |
||||
|
||||
let component_name = prefix+'::'+pure_name; |
||||
let body = |
||||
{ |
||||
name: component_name, |
||||
workflow: subgraph |
||||
}; |
||||
|
||||
const res = await api.fetchApi('/manager/component/save', { |
||||
method: "POST", |
||||
headers: { |
||||
"Content-Type": "application/json", |
||||
}, |
||||
body: JSON.stringify(body), |
||||
}); |
||||
|
||||
if(res.status == 200) { |
||||
let path = await res.text(); |
||||
app.ui.dialog.show(`Component '${component_name}' is saved into:\n${path}`); |
||||
} |
||||
else |
||||
app.ui.dialog.show(`Failed to save component.`); |
||||
} |
Loading…
Reference in new issue