mirror of
https://github.com/Comfy-Org/ComfyUI_frontend.git
synced 2026-07-17 01:07:56 +00:00
## Summary Adds a branded local `NodeId` helper and starts separating local node identity from serialized workflow IDs. ## Changes - **What**: Adds central `NodeId` parsing/branding helpers, migrates nearby widget identity types, keeps queue results at the serialized boundary, and removes misleading workflow `NodeId` usage from execution error maps. ## Review Focus Check that the first migration slice keeps serialized/API IDs as raw `number | string` while local UI/store IDs use the branded string type. ## Caveat `SUBGRAPH_INPUT_ID` and `SUBGRAPH_OUTPUT_ID` are now branded local `NodeId` string values internally instead of numeric sentinels. Reviewers should double-check extension compatibility for callers that import `Constants` and compare those values numerically. ## Screenshots (if applicable) N/A --------- Co-authored-by: GitHub Action <action@github.com> Co-authored-by: AustinMroz <austin@comfy.org> Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
82 lines
2.5 KiB
TypeScript
82 lines
2.5 KiB
TypeScript
import { defineStore } from 'pinia'
|
|
import { reactive, ref } from 'vue'
|
|
|
|
import type { UUID } from '@/utils/uuid'
|
|
import { parseNodeId } from '@/types/nodeId'
|
|
import type { NodeId, SerializedNodeId } from '@/types/nodeId'
|
|
import { parseWidgetId } from '@/types/widgetId'
|
|
import type { WidgetId } from '@/types/widgetId'
|
|
import type { WidgetState, WidgetStateInit } from '@/types/widgetState'
|
|
|
|
export function stripGraphPrefix(scopedId: SerializedNodeId): NodeId | null {
|
|
return parseNodeId(String(scopedId).replace(/^(.*:)+/, ''))
|
|
}
|
|
|
|
export const useWidgetValueStore = defineStore('widgetValue', () => {
|
|
const graphWidgetStates = ref(new Map<UUID, Map<WidgetId, WidgetState>>())
|
|
|
|
function getGraphWidgetStates(graphId: UUID): Map<WidgetId, WidgetState> {
|
|
const widgetStates = graphWidgetStates.value.get(graphId)
|
|
if (widgetStates) return widgetStates
|
|
|
|
const nextWidgetStates = reactive(new Map<WidgetId, WidgetState>())
|
|
graphWidgetStates.value.set(graphId, nextWidgetStates)
|
|
return nextWidgetStates
|
|
}
|
|
|
|
function registerWidget<TValue = unknown>(
|
|
widgetId: WidgetId,
|
|
init: WidgetStateInit<TValue>
|
|
): WidgetState<TValue> {
|
|
const existing = getWidget(widgetId)
|
|
if (existing) return existing as WidgetState<TValue>
|
|
|
|
const { graphId, nodeId, name } = parseWidgetId(widgetId)
|
|
const state: WidgetState<TValue> = {
|
|
...init,
|
|
nodeId,
|
|
name,
|
|
y: init.y ?? 0
|
|
}
|
|
const widgetStates = getGraphWidgetStates(graphId)
|
|
widgetStates.set(widgetId, state)
|
|
return widgetStates.get(widgetId) as WidgetState<TValue>
|
|
}
|
|
|
|
function getWidget(widgetId: WidgetId): WidgetState | undefined {
|
|
const { graphId } = parseWidgetId(widgetId)
|
|
return getGraphWidgetStates(graphId).get(widgetId)
|
|
}
|
|
|
|
function setValue(widgetId: WidgetId, value: WidgetState['value']): boolean {
|
|
const state = getWidget(widgetId)
|
|
if (!state) return false
|
|
state.value = value
|
|
return true
|
|
}
|
|
|
|
function deleteWidget(widgetId: WidgetId): boolean {
|
|
const { graphId } = parseWidgetId(widgetId)
|
|
return getGraphWidgetStates(graphId).delete(widgetId)
|
|
}
|
|
|
|
function getNodeWidgets(graphId: UUID, localNodeId: NodeId): WidgetState[] {
|
|
return [...getGraphWidgetStates(graphId).values()].filter(
|
|
(state) => state.nodeId === localNodeId
|
|
)
|
|
}
|
|
|
|
function clearGraph(graphId: UUID): void {
|
|
graphWidgetStates.value.delete(graphId)
|
|
}
|
|
|
|
return {
|
|
registerWidget,
|
|
getWidget,
|
|
setValue,
|
|
deleteWidget,
|
|
getNodeWidgets,
|
|
clearGraph
|
|
}
|
|
})
|