Spaces:
Running
on
Zero
Running
on
Zero
| import type {DynamicContextNodeBase} from "../dynamic_context_base.js"; | |
| import {app} from "scripts/app.js"; | |
| import {NodeTypesString} from "../constants.js"; | |
| import {getConnectedOutputNodesAndFilterPassThroughs} from "../utils.js"; | |
| import {INodeInputSlot, INodeOutputSlot, INodeSlot, LGraphNode} from "typings/litegraph.js"; | |
| export let SERVICE: ContextService; | |
| const OWNED_PREFIX = "+"; | |
| const REGEX_PREFIX = /^[\+⚠️]\s*/; | |
| const REGEX_EMPTY_INPUT = /^\+\s*$/; | |
| export function stripContextInputPrefixes(name: string) { | |
| return name.replace(REGEX_PREFIX, ""); | |
| } | |
| export function getContextOutputName(inputName: string) { | |
| if (inputName === "base_ctx") return "CONTEXT"; | |
| return stripContextInputPrefixes(inputName).toUpperCase(); | |
| } | |
| export enum InputMutationOperation { | |
| "UNKNOWN", | |
| "ADDED", | |
| "REMOVED", | |
| "RENAMED", | |
| } | |
| export type InputMutation = { | |
| operation: InputMutationOperation; | |
| node: DynamicContextNodeBase; | |
| slotIndex: number; | |
| slot: INodeSlot; | |
| }; | |
| export class ContextService { | |
| constructor() { | |
| if (SERVICE) { | |
| throw new Error("ContextService was already instantiated."); | |
| } | |
| } | |
| onInputChanges(node: any, mutation: InputMutation) { | |
| const childCtxs = getConnectedOutputNodesAndFilterPassThroughs( | |
| node, | |
| node, | |
| 0, | |
| ) as DynamicContextNodeBase[]; | |
| for (const childCtx of childCtxs) { | |
| childCtx.handleUpstreamMutation(mutation); | |
| } | |
| } | |
| getDynamicContextInputsData(node: DynamicContextNodeBase) { | |
| return node | |
| .getContextInputsList() | |
| .map((input: INodeInputSlot, index: number) => ({ | |
| name: stripContextInputPrefixes(input.name), | |
| type: String(input.type), | |
| index, | |
| })) | |
| .filter((i) => i.type !== "*"); | |
| } | |
| getDynamicContextOutputsData(node: LGraphNode) { | |
| return node.outputs.map((output: INodeOutputSlot, index: number) => ({ | |
| name: stripContextInputPrefixes(output.name), | |
| type: String(output.type), | |
| index, | |
| })); | |
| } | |
| } | |
| SERVICE = new ContextService(); | |