(subflowStore: SubflowStore, id: string)
| 169 | * so we need a program to parse comfyui workflow data to a flattern structure |
| 170 | */ |
| 171 | export async function loadSubflowToStore(subflowStore: SubflowStore, id: string): Promise<SubflowStore> { |
| 172 | if (!id) { |
| 173 | return subflowStore; |
| 174 | } |
| 175 | |
| 176 | let doc = subflowStore.mapping[id] |
| 177 | if (!doc) { |
| 178 | doc = await documentDatabaseInstance.getDoc(id); |
| 179 | subflowStore.mapping[id] = doc; |
| 180 | } |
| 181 | |
| 182 | // update relationships |
| 183 | const allNodes = Object.values(doc.snapshot.nodes); |
| 184 | const {graph} = subflowStore.workflowStates[id] || { |
| 185 | graph: {}, |
| 186 | isRootSubflow: false |
| 187 | } |
| 188 | |
| 189 | allNodes.forEach(node => { |
| 190 | subflowStore.relations[node.id] = id; |
| 191 | graph[id] = node.value; |
| 192 | }); |
| 193 | |
| 194 | // find nested workflows |
| 195 | const subFlowNodes = allNodes.filter(node => node.value.widget === SUBFLOW_WIDGET_TYPE_NAME); |
| 196 | |
| 197 | for (const node of subFlowNodes) { |
| 198 | await loadSubflowToStore(subflowStore, node.value.flowId!,); |
| 199 | } |
| 200 | |
| 201 | return { |
| 202 | ...subflowStore, |
| 203 | mapping: { |
| 204 | ...subflowStore.mapping, |
| 205 | } |
| 206 | } |
| 207 | } |
| 208 | |
| 209 | export function parseSubflow(doc: PersistedFullWorkflow, widgets: Widgets): SubflowNodeRenderingInfo { |
| 210 | if (!doc || !doc.snapshot.controlboard?.shareAsSubflowConfig) { |
no test coverage detected