{"version":3,"file":"main.module.mjs","sources":["../src/utils/Errors.ts","../../../node_modules/.pnpm/eventemitter3@5.0.1/node_modules/eventemitter3/index.js","../src/utils/misc.ts","../src/client/WsClient.ts","../src/utils/CachedFn.ts","../src/builtins.ts","../src/client/Client.ts","../src/utils/Disposable.ts","../src/workflow/InvokedWorkflow.ts","../src/pipeline/types.ts","../src/workflow/Workflow.ts","../src/plugins/Plugin.ts","../src/plugins/LoginAuthPlugin.ts","../src/pipeline/base.ts","../src/pipeline/efficient.ts","../src/main.ts"],"sourcesContent":["export namespace Errors {\n  export class HttpError extends Error {\n    status: number;\n    json: any;\n\n    constructor(message: string, status: number, json?: any) {\n      super(message);\n      this.name = \"HttpError\";\n      this.status = status;\n      this.json = json;\n    }\n  }\n}\n","'use strict';\n\nvar has = Object.prototype.hasOwnProperty\n  , prefix = '~';\n\n/**\n * Constructor to create a storage for our `EE` objects.\n * An `Events` instance is a plain object whose properties are event names.\n *\n * @constructor\n * @private\n */\nfunction Events() {}\n\n//\n// We try to not inherit from `Object.prototype`. In some engines creating an\n// instance in this way is faster than calling `Object.create(null)` directly.\n// If `Object.create(null)` is not supported we prefix the event names with a\n// character to make sure that the built-in object properties are not\n// overridden or used as an attack vector.\n//\nif (Object.create) {\n  Events.prototype = Object.create(null);\n\n  //\n  // This hack is needed because the `__proto__` property is still inherited in\n  // some old browsers like Android 4, iPhone 5.1, Opera 11 and Safari 5.\n  //\n  if (!new Events().__proto__) prefix = false;\n}\n\n/**\n * Representation of a single event listener.\n *\n * @param {Function} fn The listener function.\n * @param {*} context The context to invoke the listener with.\n * @param {Boolean} [once=false] Specify if the listener is a one-time listener.\n * @constructor\n * @private\n */\nfunction EE(fn, context, once) {\n  this.fn = fn;\n  this.context = context;\n  this.once = once || false;\n}\n\n/**\n * Add a listener for a given event.\n *\n * @param {EventEmitter} emitter Reference to the `EventEmitter` instance.\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn The listener function.\n * @param {*} context The context to invoke the listener with.\n * @param {Boolean} once Specify if the listener is a one-time listener.\n * @returns {EventEmitter}\n * @private\n */\nfunction addListener(emitter, event, fn, context, once) {\n  if (typeof fn !== 'function') {\n    throw new TypeError('The listener must be a function');\n  }\n\n  var listener = new EE(fn, context || emitter, once)\n    , evt = prefix ? prefix + event : event;\n\n  if (!emitter._events[evt]) emitter._events[evt] = listener, emitter._eventsCount++;\n  else if (!emitter._events[evt].fn) emitter._events[evt].push(listener);\n  else emitter._events[evt] = [emitter._events[evt], listener];\n\n  return emitter;\n}\n\n/**\n * Clear event by name.\n *\n * @param {EventEmitter} emitter Reference to the `EventEmitter` instance.\n * @param {(String|Symbol)} evt The Event name.\n * @private\n */\nfunction clearEvent(emitter, evt) {\n  if (--emitter._eventsCount === 0) emitter._events = new Events();\n  else delete emitter._events[evt];\n}\n\n/**\n * Minimal `EventEmitter` interface that is molded against the Node.js\n * `EventEmitter` interface.\n *\n * @constructor\n * @public\n */\nfunction EventEmitter() {\n  this._events = new Events();\n  this._eventsCount = 0;\n}\n\n/**\n * Return an array listing the events for which the emitter has registered\n * listeners.\n *\n * @returns {Array}\n * @public\n */\nEventEmitter.prototype.eventNames = function eventNames() {\n  var names = []\n    , events\n    , name;\n\n  if (this._eventsCount === 0) return names;\n\n  for (name in (events = this._events)) {\n    if (has.call(events, name)) names.push(prefix ? name.slice(1) : name);\n  }\n\n  if (Object.getOwnPropertySymbols) {\n    return names.concat(Object.getOwnPropertySymbols(events));\n  }\n\n  return names;\n};\n\n/**\n * Return the listeners registered for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @returns {Array} The registered listeners.\n * @public\n */\nEventEmitter.prototype.listeners = function listeners(event) {\n  var evt = prefix ? prefix + event : event\n    , handlers = this._events[evt];\n\n  if (!handlers) return [];\n  if (handlers.fn) return [handlers.fn];\n\n  for (var i = 0, l = handlers.length, ee = new Array(l); i < l; i++) {\n    ee[i] = handlers[i].fn;\n  }\n\n  return ee;\n};\n\n/**\n * Return the number of listeners listening to a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @returns {Number} The number of listeners.\n * @public\n */\nEventEmitter.prototype.listenerCount = function listenerCount(event) {\n  var evt = prefix ? prefix + event : event\n    , listeners = this._events[evt];\n\n  if (!listeners) return 0;\n  if (listeners.fn) return 1;\n  return listeners.length;\n};\n\n/**\n * Calls each of the listeners registered for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @returns {Boolean} `true` if the event had listeners, else `false`.\n * @public\n */\nEventEmitter.prototype.emit = function emit(event, a1, a2, a3, a4, a5) {\n  var evt = prefix ? prefix + event : event;\n\n  if (!this._events[evt]) return false;\n\n  var listeners = this._events[evt]\n    , len = arguments.length\n    , args\n    , i;\n\n  if (listeners.fn) {\n    if (listeners.once) this.removeListener(event, listeners.fn, undefined, true);\n\n    switch (len) {\n      case 1: return listeners.fn.call(listeners.context), true;\n      case 2: return listeners.fn.call(listeners.context, a1), true;\n      case 3: return listeners.fn.call(listeners.context, a1, a2), true;\n      case 4: return listeners.fn.call(listeners.context, a1, a2, a3), true;\n      case 5: return listeners.fn.call(listeners.context, a1, a2, a3, a4), true;\n      case 6: return listeners.fn.call(listeners.context, a1, a2, a3, a4, a5), true;\n    }\n\n    for (i = 1, args = new Array(len -1); i < len; i++) {\n      args[i - 1] = arguments[i];\n    }\n\n    listeners.fn.apply(listeners.context, args);\n  } else {\n    var length = listeners.length\n      , j;\n\n    for (i = 0; i < length; i++) {\n      if (listeners[i].once) this.removeListener(event, listeners[i].fn, undefined, true);\n\n      switch (len) {\n        case 1: listeners[i].fn.call(listeners[i].context); break;\n        case 2: listeners[i].fn.call(listeners[i].context, a1); break;\n        case 3: listeners[i].fn.call(listeners[i].context, a1, a2); break;\n        case 4: listeners[i].fn.call(listeners[i].context, a1, a2, a3); break;\n        default:\n          if (!args) for (j = 1, args = new Array(len -1); j < len; j++) {\n            args[j - 1] = arguments[j];\n          }\n\n          listeners[i].fn.apply(listeners[i].context, args);\n      }\n    }\n  }\n\n  return true;\n};\n\n/**\n * Add a listener for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn The listener function.\n * @param {*} [context=this] The context to invoke the listener with.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.on = function on(event, fn, context) {\n  return addListener(this, event, fn, context, false);\n};\n\n/**\n * Add a one-time listener for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn The listener function.\n * @param {*} [context=this] The context to invoke the listener with.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.once = function once(event, fn, context) {\n  return addListener(this, event, fn, context, true);\n};\n\n/**\n * Remove the listeners of a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn Only remove the listeners that match this function.\n * @param {*} context Only remove the listeners that have this context.\n * @param {Boolean} once Only remove one-time listeners.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.removeListener = function removeListener(event, fn, context, once) {\n  var evt = prefix ? prefix + event : event;\n\n  if (!this._events[evt]) return this;\n  if (!fn) {\n    clearEvent(this, evt);\n    return this;\n  }\n\n  var listeners = this._events[evt];\n\n  if (listeners.fn) {\n    if (\n      listeners.fn === fn &&\n      (!once || listeners.once) &&\n      (!context || listeners.context === context)\n    ) {\n      clearEvent(this, evt);\n    }\n  } else {\n    for (var i = 0, events = [], length = listeners.length; i < length; i++) {\n      if (\n        listeners[i].fn !== fn ||\n        (once && !listeners[i].once) ||\n        (context && listeners[i].context !== context)\n      ) {\n        events.push(listeners[i]);\n      }\n    }\n\n    //\n    // Reset the array, or remove it completely if we have no more listeners.\n    //\n    if (events.length) this._events[evt] = events.length === 1 ? events[0] : events;\n    else clearEvent(this, evt);\n  }\n\n  return this;\n};\n\n/**\n * Remove all listeners, or those of the specified event.\n *\n * @param {(String|Symbol)} [event] The event name.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.removeAllListeners = function removeAllListeners(event) {\n  var evt;\n\n  if (event) {\n    evt = prefix ? prefix + event : event;\n    if (this._events[evt]) clearEvent(this, evt);\n  } else {\n    this._events = new Events();\n    this._eventsCount = 0;\n  }\n\n  return this;\n};\n\n//\n// Alias methods names because people roll like that.\n//\nEventEmitter.prototype.off = EventEmitter.prototype.removeListener;\nEventEmitter.prototype.addListener = EventEmitter.prototype.on;\n\n//\n// Expose the prefix.\n//\nEventEmitter.prefixed = prefix;\n\n//\n// Allow `EventEmitter` to be imported as module namespace.\n//\nEventEmitter.EventEmitter = EventEmitter;\n\n//\n// Expose the module.\n//\nif ('undefined' !== typeof module) {\n  module.exports = EventEmitter;\n}\n","export const uuidv4 = () =>\n  \"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx\".replace(/[xy]/g, (c) => {\n    const r = (Math.random() * 16) | 0,\n      v = c === \"x\" ? r : (r & 0x3) | 0x8;\n    return v.toString(16);\n  });\n\nexport const isNone = (x: any): x is null | undefined =>\n  x === null || x === undefined;\n","import { EventEmitter } from \"eventemitter3\";\nimport { ComfyUIClientEvents } from \"./ws.types\";\nimport { uuidv4 } from \"../utils/misc\";\nimport { Errors } from \"../utils/Errors\";\nimport { IComfyApiConfig } from \"./types\";\n\n/**\n * A client for interacting with the ComfyUI API server using WebSockets.\n *\n * NOTE: CORS policy: Request header field comfy-user is not allowed by Access-Control-Allow-Headers in preflight response. Please config.use empty string in browser.\n *\n * @example\n * ```typescript\n * const client = new WsClient({\n *  api_host: \"YOUR_API_HOST\"\n * });\n *\n * // Connect to the server\n * client.connect();\n *\n * // Listen for status updates\n * client.on(\"status\", (status) => {\n *   console.log(\"Status:\", status);\n * });\n *\n * // when done, close the client\n * client.close();\n */\nexport class WsClient {\n  static DEFAULT_API_HOST = \"127.0.0.1:8188\";\n  static DEFAULT_API_BASE = \"\";\n  static DEFAULT_USER = \"\";\n  static IS_BROWSER = typeof window !== \"undefined\";\n\n  static loadImageData(buf: ArrayBuffer) {\n    const view = new DataView(buf);\n    const eventType = view.getUint32(0);\n    const imageType = view.getUint32(1);\n\n    if (eventType !== 1) {\n      throw new Error(`Unknown binary websocket message of type ${eventType}`);\n    }\n\n    const mimeTypes = {\n      1: \"image/jpeg\",\n      2: \"image/png\",\n    } as any;\n\n    const mime = mimeTypes[imageType] || \"image/png\";\n    const image = buf.slice(8);\n\n    return { image, mime };\n  }\n\n  api_host: string;\n  api_base: string;\n  clientId?: string;\n  socket?: WebSocket | null;\n  WebSocket: typeof WebSocket;\n  ssl: boolean;\n  user: string;\n  fetch: typeof fetch;\n\n  events: EventEmitter<ComfyUIClientEvents & Record<string & {}, any>> =\n    new EventEmitter();\n\n  protected socket_callbacks: Record<string, any> = {};\n\n  get registered() {\n    return this.events.eventNames();\n  }\n\n  constructor(config: IComfyApiConfig) {\n    this.api_host = config.api_host ?? WsClient.DEFAULT_API_HOST;\n    this.api_base = config.api_base ?? WsClient.DEFAULT_API_BASE;\n    this.clientId = config.clientId ?? uuidv4();\n    this.WebSocket = config.WebSocket ?? globalThis.WebSocket;\n    this.ssl = config.ssl ?? false;\n    this.user = config.user ?? WsClient.DEFAULT_USER;\n    if (!globalThis.fetch) {\n      throw new Error(\"fetch is not defined\");\n    }\n    this.fetch = config.fetch ?? globalThis.fetch.bind(globalThis);\n\n    if (!this.WebSocket) {\n      console.warn(\"No WebSocket implementation available, WebSocket disabled\");\n    }\n  }\n\n  /**\n   * Returns the headers for the API request.\n   *\n   * @param {RequestInit} [options] - (Optional) Additional options for the request.\n   * @return {HeadersInit} The headers for the API request.\n   */\n  apiHeaders(options?: RequestInit) {\n    const headers: HeadersInit = {\n      ...(this.user\n        ? {\n            \"Comfy-User\": this.user,\n          }\n        : {}),\n      // \"User-Agent\": `ComfyUIClient/${version}`,\n      Accept: \"*/*\",\n      ...(options?.headers ?? {}),\n    };\n    return headers;\n  }\n\n  /**\n   * Generates the URL for the API endpoint based on the provided route.\n   *\n   * @param {string} route - The route for the API endpoint.\n   * @return {string} The generated URL for the API endpoint.\n   */\n  apiURL(route: string): string {\n    const url = new URL(`http${this.ssl ? \"s\" : \"\"}://${this.api_host}`);\n    let [pathname, query] = (this.api_base + route).split(\"?\");\n    url.pathname = pathname;\n    url.pathname = url.pathname.replace(/\\/+/g, \"/\");\n    if (query) {\n      url.search = query;\n    }\n    if (this.clientId) {\n      url.searchParams.set(\"clientId\", this.clientId);\n    }\n    return url.toString();\n  }\n\n  /**\n   * Generates a URL for viewing a specific file with the given filename, subfolder, and type.\n   *\n   * @param {string} filename - The name of the file to view.\n   * @param {string} subfolder - The subfolder where the file is located.\n   * @param {string} type - The type of the file.\n   * @return {string} The URL for viewing the file.\n   */\n  viewURL(filename: string, subfolder: string, type: string): string {\n    const query = new URLSearchParams({\n      filename,\n      subfolder,\n      type,\n    }).toString();\n    return `http${this.ssl ? \"s\" : \"\"}://${this.api_host}${\n      this.api_base\n    }/view?${query}`;\n  }\n\n  /**\n   * Generates the WebSocket URL based on the current API host and SSL configuration.\n   *\n   * @return {string} The generated WebSocket URL.\n   */\n  wsURL(): string {\n    const url = new URL(`ws${this.ssl ? \"s\" : \"\"}://${this.api_host}`);\n    url.pathname = \"/ws\";\n    if (this.clientId) {\n      url.searchParams.set(\"clientId\", this.clientId);\n    }\n    return url.toString();\n  }\n\n  /**\n   * Fetches API data based on the provided route and options.\n   *\n   * NOTE: CORS policy: Request header field comfy-user is not allowed by Access-Control-Allow-Headers in preflight response. Please use empty string in browser.\n   *\n   * @param {string} route - The route for the API request.\n   * @param {RequestInit} [options] - (Optional) Additional options for the request.\n   * @return {Promise<Response>} A promise that resolves to the API response.\n   */\n  async fetchApi(route: string, options?: RequestInit): Promise<Response> {\n    if (this.closed) {\n      throw new Error(\"Client is closed\");\n    }\n    const url = this.apiURL(route);\n    const res = await this.fetch(url, {\n      ...options,\n      headers: this.apiHeaders(options),\n    });\n    const { status, statusText } = res;\n\n    if (status < 200 || status >= 400) {\n      throw new Errors.HttpError(\n        `Endpoint Bad Request (${status} ${statusText}): ${url}`,\n        status,\n        await res.json(),\n      );\n    }\n\n    return res;\n  }\n\n  /**\n   * Adds an event listener for the specified event type.\n   *\n   * @param {keyof ComfyUIClientEvents | (string & {})} type - The type of event to listen for.\n   * @param {(...args: any) => void} callback - The callback function to be executed when the event is triggered.\n   * @param {any} options - (Optional) Additional options for the event listener.\n   * @return {() => void} A function that removes the event listener when called.\n   */\n  addEventListener<T extends EventEmitter.EventNames<ComfyUIClientEvents>>(\n    type: T,\n    callback: EventEmitter.EventListener<ComfyUIClientEvents, T>,\n    options?: any,\n  ) {\n    this.events.on(type as any, callback as any, options);\n\n    return () => {\n      this.events.off(type as any, callback as any);\n    };\n  }\n\n  /**\n   * Adds an event listener for the specified event type.\n   *\n   * @param {keyof ComfyUIClientEvents | (string & {})} type - The type of event to listen for.\n   * @param {(...args: any) => void} callback - The callback function to be executed when the event is triggered.\n   * @param {any} options - (Optional) Additional options for the event listener.\n   * @return {() => void} A function that removes the event listener when called.\n   */\n  on<T extends EventEmitter.EventNames<ComfyUIClientEvents>>(\n    type: T,\n    callback: EventEmitter.EventListener<ComfyUIClientEvents, T>,\n    options?: any,\n  ) {\n    return this.addEventListener(type, callback, options);\n  }\n\n  /**\n   * Adds an event listener for the specified event type.\n   *\n   * @param {keyof ComfyUIClientEvents | (string & {})} type - The type of event to listen for.\n   * @param {(...args: any) => void} callback - The callback function to be executed when the event is triggered.\n   * @param {any} options - (Optional) Additional options for the event listener.\n   * @return {() => void} A function that removes the event listener when called.\n   */\n  once<T extends EventEmitter.EventNames<ComfyUIClientEvents>>(\n    type: T,\n    callback: EventEmitter.EventListener<ComfyUIClientEvents, T>,\n    options?: any,\n  ) {\n    this.events.once(type as any, callback as any, options);\n\n    return () => {\n      this.events.off(type as any, callback as any);\n    };\n  }\n\n  protected _polling_timer: any = null;\n  protected _polling_interval = 1000;\n  /**\n   * Poll status for colab and other things that don't support websockets.\n   */\n  private startPollingQueue() {\n    if (this._polling_timer) {\n      return;\n    }\n    // FIXME: 优化点\n    // 这里不需要一直 polling ，只有有任务的时候才需要 polling\n    this._polling_timer = setInterval(async () => {\n      try {\n        const resp = await this.fetchApi(\"/prompt\");\n        const status = await resp.json();\n        this.events.emit(\"status\", status);\n      } catch (error) {\n        this.events.emit(\"status\", null);\n      }\n    }, this._polling_interval);\n  }\n\n  protected addSocketCallback<K extends keyof WebSocketEventMap>(\n    socket: WebSocket,\n    type: K,\n    listener: (this: WebSocket, ev: WebSocketEventMap[K]) => any,\n    options?: boolean | AddEventListenerOptions,\n  ) {\n    this.socket_callbacks[type] = listener;\n    socket.addEventListener(type, listener, options);\n    return () => {\n      delete this.socket_callbacks[type];\n      socket.removeEventListener(type, listener, options);\n    };\n  }\n\n  /**\n   * Removes all event listeners from the given WebSocket and clears the socket_callbacks object.\n   */\n  protected removeSocketCallbacks() {\n    if (this.socket) {\n      for (const type in this.socket_callbacks) {\n        const listener = this.socket_callbacks[type];\n        this.socket.removeEventListener(type, listener);\n      }\n    }\n    this.socket_callbacks = {};\n  }\n\n  /**\n   * Creates and connects a WebSocket for realtime updates\n   * @param {boolean} isReconnect If the socket is connection is a reconnect attempt\n   */\n  private createSocket(isReconnect = false) {\n    if (this.socket) {\n      return;\n    }\n    if (!this.WebSocket) {\n      throw new Error(\n        \"WebSocket is not defined, please provide a WebSocket implementation\",\n      );\n    }\n    if (this.closed) {\n      return;\n    }\n\n    let opened = false;\n\n    this.socket = new this.WebSocket(this.wsURL());\n    this.socket.binaryType = \"arraybuffer\";\n\n    this.addSocketCallback(this.socket, \"open\", () => {\n      opened = true;\n      if (isReconnect) {\n        this.events.emit(\"reconnected\");\n      } else {\n        this.events.emit(\"connected\");\n      }\n    });\n\n    this.addSocketCallback(this.socket, \"error\", (ev: Event) => {\n      // Expose websocket errors as unhandled events\n      // Allows for catching 404 and other network errors\n      const err = ev as ErrorEvent;\n      const is404Error = err.message?.includes(\"404\");\n\n      this.events.emit(\"connection_error\", {\n        type: \"404\",\n        message: err.message,\n      });\n\n      if (this.socket) this.socket.close();\n\n      if (!is404Error && !isReconnect && !opened) {\n        this.startPollingQueue();\n      }\n    });\n\n    this.addSocketCallback(this.socket, \"close\", () => {\n      setTimeout(() => {\n        this.socket = null;\n        this.createSocket(true);\n      }, 300);\n      if (opened) {\n        this.events.emit(\"status\", null);\n        this.events.emit(\"reconnecting\");\n      }\n    });\n\n    const isImageMessage = (event: MessageEvent) => {\n      if (typeof event.data === \"string\") {\n        return false;\n      }\n      if (ArrayBuffer && event.data instanceof ArrayBuffer) {\n        return true;\n      }\n      if (Buffer && Buffer.isBuffer(event.data)) {\n        return true;\n      }\n      return false;\n    };\n\n    this.addSocketCallback(this.socket, \"message\", (event) => {\n      this.events.emit(\"message\", event);\n\n      if (isImageMessage(event)) {\n        const image = WsClient.loadImageData(event.data);\n        this.events.emit(\"image_data\", image);\n      } else {\n        const msg = JSON.parse(event.data);\n\n        switch (msg.type) {\n          case \"status\":\n            if (msg.data.sid) {\n              this.clientId = msg.data.sid;\n            }\n            this.events.emit(\"status\", msg.data.status);\n            break;\n          case \"progress\":\n            this.events.emit(\"progress\", msg.data);\n            break;\n          case \"executing\":\n            this.events.emit(\"executing\", msg.data);\n            break;\n          case \"executed\":\n            this.events.emit(\"executed\", msg.data);\n            break;\n          case \"execution_start\":\n            this.events.emit(\"execution_start\", msg.data);\n            break;\n          case \"execution_error\":\n            this.events.emit(\"execution_error\", msg.data);\n            break;\n          case \"execution_cached\":\n            this.events.emit(\"execution_cached\", msg.data);\n            break;\n          case \"execution_interrupted\":\n            this.events.emit(\"execution_interrupted\", msg.data);\n            break;\n          default:\n            this.events.emit(msg.type, msg.data);\n            break;\n        }\n\n        const is_unhandled_message =\n          msg.type !== \"message\" &&\n          this.registered.includes(msg.type) === false;\n        if (is_unhandled_message) {\n          this.events.emit(\"unhandled\", msg);\n        }\n      }\n    });\n  }\n\n  /**\n   * Initializes sockets and realtime updates\n   *\n   * @deprecated move to client.connect()\n   */\n  init() {\n    this.createSocket();\n  }\n\n  closed = false;\n  /**\n   * Closes the WebSocket connection and cleans up event listeners\n   */\n  close() {\n    if (this.closed) {\n      return;\n    }\n    this.closed = true;\n    this.events.emit(\"close\");\n\n    this.disconnect();\n    this.events.removeAllListeners();\n  }\n\n  /**\n   * Connects to the WebSocket server by creating a new socket connection.\n   *\n   * @param {Object} options - The options for connecting to the server.\n   * @param {Object} options.polling - The options for polling.\n   * @param {boolean} options.polling.enabled - Whether polling is enabled.\n   * @param {number} [options.polling.interval] - The interval for polling.\n   * @param {Object} options.websocket - The options for the WebSocket connection.\n   * @param {boolean} options.websocket.enabled - Whether the WebSocket connection is enabled.\n   * @param {number} [options.timeout_ms] - The timeout for the connection in milliseconds.\n   * @return {Promise<boolean>} - A promise that resolves to true if the connection was successful, false otherwise.\n   */\n  connect({\n    polling = {\n      enabled: false,\n    },\n    websocket = {\n      enabled: true,\n    },\n    timeout_ms = 15 * 1000,\n  }: {\n    polling?: {\n      enabled: boolean;\n      interval?: number;\n    };\n    websocket?: {\n      enabled: boolean;\n    };\n    timeout_ms?: number;\n  } = {}) {\n    if (polling?.enabled) {\n      this._polling_interval = polling.interval ?? this._polling_interval;\n      this.startPollingQueue();\n      return new Promise(async (resolve, reject) => {\n        const timer = setTimeout(() => {\n          reject(new Error(\"Polling connection timed out\"));\n        }, timeout_ms);\n        // ping to ok or fail\n        const resp = await this.fetchApi(\"/system_stats\");\n        resolve(resp.ok && resp.status === 200);\n        clearTimeout(timer);\n      });\n    }\n    if (websocket?.enabled) {\n      this.createSocket();\n      return new Promise((resolve, reject) => {\n        const timer = setTimeout(() => {\n          reject(new Error(\"WebSocket connection timed out\"));\n        }, timeout_ms);\n        this.once(\"connected\", () => {\n          resolve(true);\n          clearTimeout(timer);\n        });\n      });\n    }\n    throw new Error(\"You must enable either polling or websocket\");\n  }\n\n  /**\n   * Disconnects the WebSocket connection and cleans up event listeners.\n   */\n  disconnect() {\n    if (!this.socket) {\n      process.nextTick(this._disconnectPolling.bind(this));\n    } else {\n      this._disconnectSocket();\n    }\n    this._disconnectPolling();\n  }\n\n  /**\n   * Disconnects the WebSocket connection and cleans up event listeners.\n   *\n   * @return {void} This function does not return anything.\n   */\n  _disconnectSocket() {\n    const { socket } = this;\n    if (!socket) return;\n    this.socket = null;\n    try {\n      if (socket.readyState === socket.OPEN) {\n        socket.close(1000, \"Client closed\");\n      }\n    } catch (error) {\n      // pass\n    }\n    this.removeSocketCallbacks();\n    if (\"removeAllListeners\" in socket) {\n      (socket.removeAllListeners as any)?.();\n    }\n  }\n\n  /**\n   * Disconnects the polling timer and sets it to null.\n   *\n   * @return {void}\n   */\n  _disconnectPolling() {\n    if (this._polling_timer !== null) {\n      clearInterval(this._polling_timer);\n      this._polling_timer = null;\n    }\n  }\n}\n","export type CachedFnOptions = {\r\n  expire_time?: number;\r\n  enabled?: boolean;\r\n};\r\n\r\nclass GlobalCacheHub {\r\n  static KEY = \"__COMFY_UI_CLIENT_CACHE__\";\r\n  protected _cached: Map<string, { result: any; expire: number }>;\r\n\r\n  constructor() {\r\n    this._cached = (globalThis as any)[GlobalCacheHub.KEY] || new Map();\r\n    (globalThis as any)[GlobalCacheHub.KEY] = this._cached;\r\n  }\r\n\r\n  clear() {\r\n    this._cached.clear();\r\n  }\r\n\r\n  get(key: string) {\r\n    return this._cached.get(key);\r\n  }\r\n\r\n  set(key: string, value: { result: any; expire: number }) {\r\n    this._cached.set(key, value);\r\n  }\r\n}\r\n\r\nexport class CachedFn {\r\n  static _defaultExpire: number = 60 * 1000;\r\n\r\n  protected expire_time_ms: number;\r\n  protected enabled: boolean;\r\n\r\n  protected _cached = new GlobalCacheHub();\r\n\r\n  protected cache_ns: string = \"\";\r\n\r\n  constructor(ns: string, options?: CachedFnOptions) {\r\n    this.expire_time_ms = options?.expire_time ?? CachedFn._defaultExpire;\r\n    this.enabled = options?.enabled ?? true;\r\n    this.cache_ns = ns;\r\n  }\r\n\r\n  public reset() {\r\n    this._cached.clear();\r\n  }\r\n\r\n  private _hashArgs(args: any[]): string {\r\n    try {\r\n      return JSON.stringify(args);\r\n    } catch (error) {\r\n      return args.toString();\r\n    }\r\n  }\r\n\r\n  public warp<ARGS extends any[], RET>(\r\n    key: string,\r\n    fn: (...args: ARGS) => RET\r\n  ): (...args: ARGS) => RET {\r\n    if (!this.enabled) {\r\n      return fn;\r\n    }\r\n    return (...args: ARGS) => {\r\n      const now = Date.now();\r\n      const argsHash = this._hashArgs(args);\r\n      const cacheKey = `${this.cache_ns}:${key}:${argsHash}`;\r\n      const hit_cached = this._cached.get(cacheKey);\r\n\r\n      if (hit_cached && hit_cached.expire > now) {\r\n        return hit_cached.result;\r\n      }\r\n\r\n      const result = fn(...args);\r\n      this._cached.set(cacheKey, { result, expire: now + this.expire_time_ms });\r\n      return result;\r\n    };\r\n  }\r\n}\r\n","import { WorkflowOutputResolver } from \"./client/types\";\nimport { isNone } from \"./utils/misc\";\nimport { WorkflowOutput } from \"./workflow/types\";\n\nexport const RESOLVERS = {\n  image: ((acc, output, { client }) => {\n    if (output === null || output === undefined) {\n      return acc;\n    }\n\n    const output_images: {\n      filename?: string;\n      subfolder?: string;\n      type: string;\n    }[] = (output?.images || []) as any;\n\n    const images_url = output_images\n      .map((image) => {\n        const { filename, subfolder, type } = image;\n        if (isNone(filename) || isNone(subfolder) || type !== \"output\") {\n          return null;\n        }\n        return client.viewURL(filename, subfolder, type);\n      })\n      .filter(Boolean) as string[];\n\n    const images = images_url.map((image) => ({\n      type: \"url\" as const,\n      data: image,\n    }));\n    return {\n      ...acc,\n      images: [...acc.images, ...images],\n    };\n  }) as WorkflowOutputResolver<WorkflowOutput>,\n};\n","import { CachedFn } from \"../utils/CachedFn\";\nimport type { Plugin } from \"../plugins/Plugin\";\nimport { WsClient } from \"./WsClient\";\nimport { RESOLVERS } from \"../builtins\";\nimport {\n  WorkflowOutputResolver,\n  EnqueueOptions,\n  IComfyApiConfig,\n} from \"./types\";\nimport { ComfyUIClientResponseTypes } from \"./response.types\";\nimport { WorkflowOutput } from \"../workflow/types\";\n\n/**\n * The Client class provides a high-level interface for interacting with the ComfyUI API.\n *\n * @extends WsClient\n *\n * @example\n * ```typescript\n * const client = new Client({\n *  api_host: \"YOUR_API_HOST\",\n *  clientId: \"YOUR_CLIENT_ID\",\n * });\n *\n * const extensions = await client.getEmbeddings();\n * console.log(extensions);\n * ```\n */\nexport class Client extends WsClient {\n  private _cached_fn: CachedFn;\n\n  // NOTE: useless ... just for debug\n  private _plugins = [] as Plugin[];\n\n  constructor(\n    config: Omit<IComfyApiConfig, \"fetch\" | \"WebSocket\"> & {\n      // NOTE: This is written to reduce type issues... because sometimes `as any` is unavoidable\n      fetch?: any;\n      WebSocket?: any;\n    },\n  ) {\n    super(config);\n\n    const cache_ns = `${config.api_host}`;\n    this._cached_fn = new CachedFn(cache_ns, config.cache);\n  }\n\n  /**\n   * Use a plugin by calling its install method on this instance.\n   *\n   * @param {Plugin} plugin - The plugin to install.\n   */\n  use(plugin: Plugin) {\n    plugin.install(this);\n    this._plugins.push(plugin);\n  }\n\n  /**\n   * Gets a list of extension urls\n   * @returns An array of script urls to import\n   */\n  async getExtensions(): Promise<string[]> {\n    const invoke = async () => {\n      const resp = await this.fetchApi(\"/extensions\", { cache: \"no-store\" });\n      return await resp.json();\n    };\n    const cached = this._cached_fn.warp(\"extensions\", invoke);\n    return cached();\n  }\n\n  /**\n   * Gets a list of embedding names\n   * @returns An array of script urls to import\n   */\n  async getEmbeddings(): Promise<string[]> {\n    const invoke = async () => {\n      const resp = await this.fetchApi(\"/embeddings\", { cache: \"no-store\" });\n      return await resp.json();\n    };\n    const cached = this._cached_fn.warp(\"embeddings\", invoke);\n    return cached();\n  }\n\n  /**\n   * Loads node object definitions for the graph\n   * @returns {Promise<ComfyUIClientResponseTypes.ObjectInfo>} The object info for the graph\n   */\n  async getNodeDefs(): Promise<ComfyUIClientResponseTypes.ObjectInfo> {\n    const invoke = async () => {\n      const resp = await this.fetchApi(\"/object_info\", { cache: \"no-store\" });\n      const node_defs = await resp.json();\n      return node_defs;\n    };\n    const cached = this._cached_fn.warp(\"object_info\", invoke);\n    return cached();\n  }\n\n  /**\n   * Clears the node object definitions cache\n   */\n  resetCache() {\n    this._cached_fn.reset();\n  }\n\n  /**\n   *\n   * @param {number} queue_index The index at which to queue the prompt, passing -1 will insert the prompt at the front of the queue\n   * @param {Object} options\n   * @param {Object} options.prompt The prompt to queue\n   * @param {Object} options.workflow This png info to be added to resulting image\n   * @returns {Promise<ComfyUIClientResponseTypes.QueuePrompt>} The response from the server\n   */\n  async queuePrompt(\n    queue_index: number,\n    { prompt, workflow }: { prompt: any; workflow: any },\n  ): Promise<ComfyUIClientResponseTypes.QueuePrompt> {\n    const body: Record<string, unknown> = {\n      client_id: this.clientId,\n      prompt,\n      extra_data: { extra_pnginfo: { workflow } },\n    };\n\n    if (queue_index === -1) {\n      body.front = true;\n    } else if (queue_index !== 0) {\n      body.number = queue_index;\n    }\n\n    const res = await this.fetchApi(\"/prompt\", {\n      method: \"POST\",\n      headers: {\n        \"Content-Type\": \"application/json\",\n      },\n      body: JSON.stringify(body),\n    });\n\n    if (res.status !== 200) {\n      const error_resp = await res.text();\n      try {\n        const error_data = JSON.parse(error_resp);\n        // TODO throw Error class\n        throw { response: error_data };\n      } catch (error) {\n        throw { response: error_resp };\n      }\n    }\n\n    return await res.json();\n  }\n\n  /**\n   * Loads a list of items (queue or history)\n   * @param {\"queue\" | \"history\"} type The type of items to load, queue or history\n   * @returns The items of the specified type grouped by their status\n   */\n  async getItems(type: \"history\"): ReturnType<Client[\"getHistory\"]>;\n  async getItems(type: \"queue\"): ReturnType<Client[\"getQueue\"]>;\n  async getItems(type: \"queue\" | \"history\"): Promise<any> {\n    if (type === \"queue\") {\n      return this.getQueue();\n    }\n    return this.getHistory();\n  }\n\n  /**\n   * Gets the current state of the queue\n   * @returns The currently running and queued items\n   */\n  async getQueue(): Promise<{\n    Running: Array<Record<string, unknown>>;\n    Pending: Array<Record<string, unknown>>;\n  }> {\n    try {\n      const res = await this.fetchApi(\"/queue\");\n      const data = await res.json();\n      return {\n        Running: data.queue_running.map((prompt: any) => ({\n          prompt,\n          remove: { name: \"Cancel\", cb: () => this.interrupt() },\n        })),\n        Pending: data.queue_pending.map((prompt: any) => ({ prompt })),\n      };\n    } catch (error) {\n      console.error(error);\n      return { Running: [], Pending: [] };\n    }\n  }\n\n  /**\n   * Gets the prompt execution history\n   * @returns Prompt history including node outputs\n   */\n  async getHistory(max_items = 200): Promise<{\n    History: Array<{\n      // [index, prompt_id, prompt, payload, outputs_node]\n      prompt: [number, string, any, any, any];\n      outputs: Record<string, unknown>;\n      status: {\n        status_str: string;\n        completed: boolean;\n        messages: any[];\n      };\n    }>;\n  }> {\n    try {\n      const res = await this.fetchApi(`/history?max_items=${max_items}`);\n      return { History: Object.values(await res.json()) };\n    } catch (error) {\n      console.error(error);\n      return { History: [] };\n    }\n  }\n\n  /**\n   * Gets system & device stats\n   * @returns {ComfyUIClientResponseTypes.SystemStatsRoot} System stats such as python version, OS, per device info\n   */\n\n  async getSystemStats(): Promise<ComfyUIClientResponseTypes.SystemStatsRoot> {\n    const res = await this.fetchApi(\"/system_stats\");\n    return res.json();\n  }\n\n  /**\n   * Sends a POST request to the API\n   * @param {string} type The endpoint to post to\n   * @param {any} body Optional POST data\n   */\n  private async postApi(type: string, body: any) {\n    await this.fetchApi(\"/\" + type, {\n      method: \"POST\",\n      headers: {\n        \"Content-Type\": \"application/json\",\n      },\n      body: body ? JSON.stringify(body) : undefined,\n    });\n  }\n\n  /**\n   * Deletes an item from the specified list\n   * @param {\"queue\" | \"history\"} type The type of item to delete, queue or history\n   * @param {any} id The id of the item to delete\n   */\n  async deleteItem(type: \"queue\" | \"history\", id: any) {\n    await this.postApi(type, { delete: [id] });\n  }\n\n  /**\n   * Clears the specified list\n   * @param {\"queue\" | \"history\"} type The type of list to clear, queue or history\n   */\n  async clearItems(type: \"queue\" | \"history\") {\n    await this.postApi(type, { clear: true });\n  }\n\n  /**\n   * Interrupts the execution of the running prompt\n   */\n  async interrupt() {\n    await this.postApi(\"interrupt\", null);\n  }\n\n  /**\n   * Free up memory by unloading models and freeing memory\n   */\n  async free(params?: { unload_models?: boolean; free_memory?: boolean }) {\n    await this.postApi(\"free\", params);\n  }\n\n  /**\n   * Gets user configuration data and where data should be stored\n   * @returns { Promise<{ storage: \"server\" | \"browser\", users?: Promise<string, unknown>, migrated?: boolean }> }\n   */\n  async getUserConfig() {\n    return (await this.fetchApi(\"/users\")).json();\n  }\n\n  /**\n   * Creates a new user\n   * @param { string } username\n   * @returns The fetch response\n   */\n  async createUser(username: string): Promise<Response> {\n    return this.fetchApi(\"/users\", {\n      method: \"POST\",\n      headers: {\n        \"Content-Type\": \"application/json\",\n      },\n      body: JSON.stringify({ username }),\n    });\n  }\n\n  /**\n   * Gets all setting values for the current user\n   * @returns { Promise<string, unknown> } A dictionary of id -> value\n   */\n  async getSettings(): Promise<Record<string, unknown>> {\n    return (await this.fetchApi(\"/settings\")).json();\n  }\n\n  /**\n   * Gets a setting for the current user\n   * @param { string } id The id of the setting to fetch\n   * @returns { Promise<unknown> } The setting value\n   */\n  async getSetting(id: string): Promise<unknown> {\n    return (await this.fetchApi(`/settings/${encodeURIComponent(id)}`)).json();\n  }\n\n  /**\n   * Stores a dictionary of settings for the current user\n   * @param { Record<string, unknown> } settings Dictionary of setting id -> value to save\n   * @returns { Promise<void> }\n   */\n  async storeSettings(settings: Record<string, unknown>): Promise<Response> {\n    return this.fetchApi(`/settings`, {\n      method: \"POST\",\n      body: JSON.stringify(settings),\n    });\n  }\n\n  /**\n   * Stores a setting for the current user\n   * @param { string } id The id of the setting to update\n   * @param { unknown } value The value of the setting\n   * @returns { Promise<void> }\n   */\n  async storeSetting(id: string, value: unknown): Promise<Response> {\n    return this.fetchApi(`/settings/${encodeURIComponent(id)}`, {\n      method: \"POST\",\n      body: JSON.stringify(value),\n    });\n  }\n\n  /**\n   * Gets a user data file for the current user\n   * @param { string } file The name of the userdata file to load\n   * @param { RequestInit } [options]\n   * @returns { Promise<unknown> } The fetch response object\n   */\n  async getUserData(file: string, options?: RequestInit): Promise<Response> {\n    return this.fetchApi(`/userdata/${encodeURIComponent(file)}`, options);\n  }\n\n  /**\n   * Stores a user data file for the current user\n   * @param { string } file The name of the userdata file to save\n   * @param { any } data The data to save to the file\n   * @param { RequestInit & { stringify?: boolean, throwOnError?: boolean } } [options]\n   * @returns { Promise<void> }\n   */\n  async storeUserData(\n    file: string,\n    data: any,\n    options?: RequestInit & { stringify?: boolean; throwOnError?: boolean },\n  ): Promise<void> {\n    const resp = await this.fetchApi(`/userdata/${encodeURIComponent(file)}`, {\n      method: \"POST\",\n      body: options?.stringify ? JSON.stringify(data) : data,\n      ...options,\n    });\n    if (resp.status !== 200) {\n      const error = await resp.text();\n      throw new Error(\n        `Error storing user data file '${file}': ${resp.status} ${error}`,\n      );\n    }\n  }\n\n  // ----------------- get status ++ -----------------\n\n  /**\n   * Retrieves the list of samplers from the node definitions.\n   *\n   * @return {Promise<string[]>} A promise that resolves to an array of strings representing the sampler names.\n   */\n  async getSamplers() {\n    const node_config = await this.getNodeDefs();\n    // find KSampler node\n    const node = node_config[\"KSampler\"];\n    const sampler_name = node?.input?.required?.[\"sampler_name\"]?.[0] || [];\n    return sampler_name as string[];\n  }\n\n  /**\n   * Retrieves the list of schedulers from the node definitions.\n   *\n   * @return {Promise<string[]>} A promise that resolves to an array of strings representing the scheduler names.\n   */\n  async getSchedulers() {\n    const node_config = await this.getNodeDefs();\n    // find Scheduler node\n    const node = node_config[\"KSampler\"];\n    const scheduler_name = node?.input?.required?.[\"scheduler\"]?.[0] || [];\n    return scheduler_name as string[];\n  }\n\n  /**\n   * Retrieves the list of model names from the node definitions.\n   *\n   * @return {Promise<string[]>} A promise that resolves to an array of strings representing the model names.\n   */\n  async getSDModels() {\n    const node_config = await this.getNodeDefs();\n    // find CheckpointLoaderSimple node\n    const node = node_config[\"CheckpointLoaderSimple\"];\n    const model_name = node?.input?.required?.[\"ckpt_name\"]?.[0] || [];\n    return model_name as string[];\n  }\n\n  /**\n   * Retrieves the list of model names from the node definitions.\n   *\n   * @return {Promise<string[]>} A promise that resolves to an array of strings representing the model names.\n   */\n  async getCNetModels() {\n    const node_config = await this.getNodeDefs();\n    // find ControlNetLoader node\n    const node = node_config[\"ControlNetLoader\"];\n    const model_name = node?.input?.required?.[\"control_net_name\"]?.[0] || [];\n    return model_name as string[];\n  }\n\n  /**\n   * Retrieves the list of model names from the node definitions for the UpscaleModelLoader node.\n   *\n   * @return {Promise<string[]>} A promise that resolves to an array of strings representing the model names.\n   */\n  async getUpscaleModels() {\n    const node_config = await this.getNodeDefs();\n    // find UpscaleModelLoader node\n    const node = node_config[\"UpscaleModelLoader\"];\n    const model_name = node?.input?.required?.[\"model_name\"]?.[0] || [];\n    return model_name as string[];\n  }\n\n  /**\n   * Retrieves the list of hypernetwork names from the node definitions.\n   *\n   * @return {Promise<string[]>} A promise that resolves to an array of strings representing the hypernetwork names.\n   */\n  async getHyperNetworks() {\n    const node_config = await this.getNodeDefs();\n    // find HypernetworkLoader node\n    const node = node_config[\"HypernetworkLoader\"];\n    const model_name = node?.input?.required?.[\"hypernetwork_name\"]?.[0] || [];\n    return model_name as string[];\n  }\n\n  /**\n   * Retrieves the list of LoRAs from the node definitions.\n   *\n   * @return {Promise<string[]>} A promise that resolves to an array of strings representing the LoRAs.\n   */\n  async getLoRAs() {\n    const node_config = await this.getNodeDefs();\n    // find LoraLoader node\n    const node = node_config[\"LoraLoader\"];\n    const model_name = node?.input?.required?.[\"lora_name\"]?.[0] || [];\n    return model_name as string[];\n  }\n\n  /**\n   * Retrieves the list of VAE names from the node definitions.\n   *\n   * @return {Promise<string[]>} A promise that resolves to an array of strings representing the VAE names.\n   */\n  async getVAEs() {\n    const node_config = await this.getNodeDefs();\n    // find VAELoader node\n    const node = node_config[\"VAELoader\"];\n    const model_name = node?.input?.required?.[\"vae_name\"]?.[0] || [];\n    return model_name as string[];\n  }\n\n  // ----------------- Prompt ++ -----------------\n\n  /**\n   * Retrieves the status of a prompt based on the provided prompt ID.\n   *\n   * @param {string} prompt_id - The ID of the prompt to check status for.\n   * @return {Object} Object containing the running, pending, and done status of the prompt.\n   */\n  async getPromptStatus(prompt_id: string) {\n    const { Running, Pending } = await this.getQueue();\n    const running = Running.some(\n      (task: any) => task?.prompt?.[1] === prompt_id,\n    );\n    const pending = Pending.some(\n      (task: any) => task?.prompt?.[1] === prompt_id,\n    );\n    const done = !running && !pending;\n    return {\n      running,\n      pending,\n      done,\n    };\n  }\n\n  /**\n   * Retrieves the outputs of a prompt with the given ID from the history.\n   *\n   * @param {string} prompt_id - The ID of the prompt to retrieve the outputs for.\n   * @return {Promise<any>} A promise that resolves to the outputs of the prompt.\n   * @throws {Error} If the prompt with the given ID is not found in the history or if it failed with a non-\"success\" status.\n   */\n  async getPromptOutputs(prompt_id: string) {\n    const { History: history } = await this.getHistory();\n    const item = history.find((item) => item.prompt[1] === prompt_id);\n    if (!item) {\n      throw new Error(`Prompt [${prompt_id}] not found in history`);\n    }\n\n    const status = item.status.status_str;\n    if (status !== \"success\") {\n      throw new Error(`Prompt [${prompt_id}] failed with status: ${status}`);\n    }\n\n    return item.outputs;\n  }\n\n  /**\n   * Retrieves the result of a prompt with the given ID, resolved using the provided resolver.\n   *\n   * @param {string} prompt_id - The ID of the prompt to retrieve the result for.\n   * @param {WorkflowOutputResolver<T>} resolver - The resolver to use when resolving the prompt result.\n   * @return {Promise<WorkflowOutput<T>>} A promise that resolves to the result of the prompt.\n   */\n  async getPromptResult<T>(\n    prompt_id: string,\n    resolver: WorkflowOutputResolver<T>,\n  ): Promise<WorkflowOutput<T>>;\n  async getPromptResult(prompt_id: string): Promise<WorkflowOutput>;\n  async getPromptResult(\n    prompt_id: string,\n    resolver?: any,\n  ): Promise<WorkflowOutput> {\n    const outputs = await this.getPromptOutputs(prompt_id);\n    if (typeof resolver !== \"function\") {\n      resolver = RESOLVERS.image;\n    }\n    return Object.entries(outputs).reduce(\n      (acc, [node_id, output]) =>\n        resolver(acc, output, {\n          client: this,\n          prompt_id,\n          node_id,\n        }),\n      {\n        images: [],\n        prompt_id,\n        data: null,\n      } as WorkflowOutput,\n    );\n  }\n\n  /**\n   * Asynchronously waits for the prompt with the provided ID to be done.\n   *\n   * @param {string} prompt_id - The ID of the prompt to wait for.\n   * @param {number} [polling_ms=1000] - The number of milliseconds to wait between checks.\n   * @return {void}\n   */\n  async waitForPrompt(prompt_id: string, polling_ms = 1000) {\n    let prompt_status = await this.getPromptStatus(prompt_id);\n    while (!prompt_status.done) {\n      await new Promise((resolve) => setTimeout(resolve, polling_ms));\n      prompt_status = await this.getPromptStatus(prompt_id);\n    }\n  }\n\n  /**\n   * Asynchronously waits for the prompt with the provided ID to be done,\n   * using a WebSocket connection to receive updates.\n   *\n   * @param {string} prompt_id - The ID of the prompt to wait for.\n   * @param {WorkflowOutputResolver<T>} resolver - A function to resolve the output of the prompt.\n   * @return {Promise<WorkflowOutput<T>>} A promise that resolves with the output of the prompt.\n   */\n  async waitForPromptWebSocket<T>(\n    prompt_id: string,\n    resolver: WorkflowOutputResolver<T>,\n  ) {\n    const output: WorkflowOutput<T> = {\n      images: [],\n      prompt_id,\n      data: null as T,\n    };\n    return new Promise<WorkflowOutput<T>>((resolve, reject) => {\n      const offEvent2 = this.on(\"image_data\", (data) => {\n        // TODO: should hook web-socket resolver ?\n        output.images.push({ type: \"buff\", data: data.image, mime: data.mime });\n      });\n      const offEvent = this.on(\"executed\", (data) => {\n        const {\n          prompt_id: current_prompt_id,\n          output: executed_output,\n          node: node_id,\n        } = data;\n        if (current_prompt_id !== prompt_id) {\n          return;\n        }\n        const resolved = resolver(output, executed_output, {\n          client: this,\n          prompt_id,\n          node_id,\n        });\n        resolve(resolved);\n        offEvent();\n        offEvent2();\n      });\n    });\n  }\n\n  /**\n   * Asynchronously enqueues a prompt with optional workflow and random seed.\n   *\n   * @param {Record<string, unknown>} prompt - The prompt to enqueue.\n   * @param {Object} [options] - The options for enqueueing the prompt.\n   * @param {Record<string, unknown>} [options.workflow] - The workflow for the prompt.\n   * @return {Promise<{ prompt_id: string; number: number; node_errors: any; }>} A promise that resolves with the enqueued prompt response.\n   * @throws {Error} If there is an error in the response.\n   */\n  async _enqueue_prompt(\n    prompt: Record<string, unknown>,\n    options?: {\n      workflow?: Record<string, unknown>;\n    },\n  ) {\n    const resp = await this.queuePrompt(0, {\n      prompt,\n      workflow: options?.workflow,\n    });\n    if (\"error\" in resp) {\n      // TODO new Error class\n      throw new Error(resp.error);\n    }\n    return resp;\n  }\n\n  /**\n   * Asynchronously runs a prompt with the provided options.\n   *\n   * This function does not use WebSocket, but uses polling to get the result\n   * So if your workflow contains custom ws events, this function will not be able to get these events\n   *\n   * @param {Record<string, unknown>} prompt - The prompt to run.\n   * @param {Object} options - The options for running the prompt.\n   * @param {Record<string, unknown>} options.workflow - The workflow for the prompt, It will be added to the png info of the generated image.\n   * @param {number} [options.polling_ms=1000] - The number of milliseconds to polling query prompt result.\n   * @return {Promise<WorkflowOutput>} A promise that resolves with the prompt result.\n   *\n   * @deprecated Use `enqueue_polling` instead\n   */\n  async runPrompt(\n    prompt: Record<string, unknown>,\n    options?: {\n      workflow?: Record<string, unknown>;\n      polling_ms?: number;\n    },\n  ) {\n    const resp = await this._enqueue_prompt(prompt, options);\n    const prompt_id = resp.prompt_id;\n    await this.waitForPrompt(prompt_id, options?.polling_ms);\n    return await this.getPromptResult(prompt_id, RESOLVERS.image);\n  }\n\n  /**\n   * Asynchronously enqueues a prompt and waits for the corresponding prompt websocket.\n   *\n   * This function does not use WebSocket, but uses polling to get the result\n   * So if your workflow contains custom ws events, this function will not be able to get these events\n   *\n   * @param {Record<string, unknown>} prompt - The prompt to enqueue.\n   * @param {EnqueueOptions<T>} [options] - The options for enqueueing the prompt.\n   * @return {Promise<WorkflowOutput<T>>} A promise that resolves with the prompt result.\n   */\n  async enqueue_polling<T>(\n    prompt: Record<string, unknown>,\n    options?: EnqueueOptions<T>,\n  ): Promise<WorkflowOutput<T>>;\n  async enqueue_polling(\n    prompt: Record<string, unknown>,\n    options?: EnqueueOptions,\n  ): Promise<WorkflowOutput>;\n  async enqueue_polling(\n    prompt: Record<string, unknown>,\n    options?: any,\n  ): Promise<WorkflowOutput> {\n    if (typeof options?.progress === \"function\") {\n      throw new Error(\"progress option is not supported in polling mode\");\n    }\n\n    const resp = await this._enqueue_prompt(prompt, options);\n    const prompt_id = resp.prompt_id;\n    await this.waitForPrompt(prompt_id, options?.polling_ms);\n    return await this.getPromptResult(\n      prompt_id,\n      options?.resolver ?? RESOLVERS.image,\n    );\n  }\n\n  /**\n   * Enqueues a prompt and waits for the corresponding prompt websocket.\n   *\n   * @param {Record<string, unknown>} prompt - The prompt to enqueue.\n   * @param {{ workflow?: Record<string, unknown>; disable_random_seed?: boolean; }} [options] - The options for enqueueing the prompt.\n   * @param {Record<string, unknown>} [options.workflow] - This data for PNG info.\n   * @param {boolean} [options.disable_random_seed] - Whether to disable random seed.\n   * @return {Promise<WorkflowOutput>} A promise that resolves with the prompt result.\n   */\n  async enqueue<T>(\n    prompt: Record<string, unknown>,\n    options?: EnqueueOptions<T>,\n  ): Promise<WorkflowOutput<T>>;\n  async enqueue(\n    prompt: Record<string, unknown>,\n    options?: EnqueueOptions,\n  ): Promise<WorkflowOutput>;\n  async enqueue(prompt: Record<string, unknown>, options?: any) {\n    const resp = await this._enqueue_prompt(prompt, options);\n    const prompt_id = resp.prompt_id;\n\n    const off_progress = this.on_progress(options?.progress, prompt_id);\n    try {\n      return await this.waitForPromptWebSocket(\n        prompt_id,\n        options?.resolver ?? RESOLVERS.image,\n      );\n    } finally {\n      off_progress();\n    }\n  }\n\n  /**\n   * Listens for progress updates for a specific task.\n   *\n   * @param {EnqueueOptions[\"progress\"]} fn - The progress callback function.\n   * @param {string} task_id - The ID of the task to listen for progress updates.\n   * @return {Function} A function that can be used to remove the progress listener.\n   */\n  on_progress(fn: EnqueueOptions[\"progress\"], task_id: string) {\n    if (!fn) return () => {};\n    return this.on(\"progress\", (_data) => {\n      const data = {\n        // old api response type:\n        ...(\"progress\" in _data ? { ...(_data as any).progress } : {}),\n        // new api: https://github.com/StableCanvas/comfyui-client/issues/6\n        ..._data,\n      };\n      if (data.prompt_id === task_id) {\n        fn(data);\n      }\n    });\n  }\n}\n","export class Disposable {\n  protected _disposed = false;\n  protected _disposed_cbs = [] as any[];\n  public dispose() {\n    if (this._disposed) {\n      return;\n    }\n    this._disposed = true;\n\n    this._disposed_cbs.forEach((cb) => {\n      if (typeof cb === \"function\") {\n        cb();\n      }\n    });\n  }\n  public _connect(cb: () => void) {\n    if (this._disposed) {\n      cb();\n      return;\n    }\n    this._disposed_cbs.push(cb);\n  }\n}\n","import { Client } from \"../client/Client\";\nimport { WorkflowOutputResolver } from \"../client/types\";\nimport type { WorkflowOutput, IWorkflow } from \"./types\";\nimport { RESOLVERS } from \"../builtins\";\nimport { ComfyUIClientEvents, ComfyUiWsTypes } from \"../client/ws.types\";\nimport EventEmitter from \"eventemitter3\";\nimport { Disposable } from \"../utils/Disposable\";\n\nexport class InvokedWorkflow<T = unknown> extends Disposable {\n  protected task_id?: string;\n\n  protected _result: WorkflowOutput<T> = {\n    images: [],\n    prompt_id: \"\",\n  };\n\n  is_done = false;\n  enqueued = false;\n\n  workflow: IWorkflow;\n  client: Client;\n  resolver: WorkflowOutputResolver<T>;\n\n  constructor(\n    readonly options: {\n      workflow: IWorkflow;\n      client: Client;\n      resolver?: WorkflowOutputResolver<T>;\n      progress?: (p: ComfyUiWsTypes.Messages.Progress) => void;\n    },\n  ) {\n    super();\n    const { workflow, client, resolver } = options;\n    this.workflow = workflow;\n    this.client = client;\n    this.resolver = resolver || (RESOLVERS.image as any);\n  }\n\n  protected _enqueue_guard() {\n    if (this.enqueued) {\n      throw new Error(\"This workflow is already enqueued\");\n    }\n    this.enqueued = true;\n  }\n\n  protected _task_id_guard() {\n    if (!this.task_id) {\n      throw new Error(\n        \"This workflow is not enqueued and the execution status cannot be interrupt\",\n      );\n    }\n    return this.task_id;\n  }\n\n  protected _done_guard() {\n    if (this._disposed || this.is_done) {\n      throw new Error(\"This workflow has been disposed\");\n    }\n  }\n\n  protected _ws_guard() {\n    if (this.client.socket === null) {\n      throw new Error(\"WebSocket is not connected\");\n    }\n  }\n\n  protected is_owner_event(...args: any[]) {\n    const [data] = (args as any[]) || [];\n    const { task_id } = this;\n    if (!task_id) return false;\n    if (typeof data !== \"object\" || data === null) return false;\n    if (!(\"prompt_id\" in data) || data.prompt_id !== task_id) return false;\n    return true;\n  }\n\n  /**\n   * Adds an event listener for the specified event type.\n   */\n  on<T extends EventEmitter.EventNames<ComfyUIClientEvents>>(\n    type: T,\n    callback: EventEmitter.EventListener<ComfyUIClientEvents, T>,\n    options?: any,\n  ) {\n    this._done_guard();\n    const { client } = this;\n    const off = client.on(type, (...args) => {\n      if (!this.is_owner_event(...args)) return;\n      callback(...args);\n    });\n    this._connect(off);\n    return off;\n  }\n\n  /**\n   * Adds an once event listener for the specified event type.\n   */\n  once<T extends EventEmitter.EventNames<ComfyUIClientEvents>>(\n    type: T,\n    callback: EventEmitter.EventListener<ComfyUIClientEvents, T>,\n    options?: any,\n  ) {\n    this._done_guard();\n    const { client } = this;\n    const off = client.on(type, (...args) => {\n      if (!this.is_owner_event(...args)) return;\n      callback(...args);\n      off();\n    });\n    this._connect(off);\n    return off;\n  }\n\n  /**\n   * Initiates the workflow by enqueuing the prompt and setting up the task ID.\n   *\n   * @return {void}\n   */\n  public async enqueue() {\n    this._enqueue_guard();\n\n    const { client, workflow } = this;\n    const { prompt, workflow: wf } = workflow;\n\n    const { prompt_id } = await client._enqueue_prompt(prompt, {\n      workflow: wf,\n    });\n    this.task_id = prompt_id;\n\n    this.hook_progress();\n    this.hook_image_data();\n  }\n\n  protected async hook_progress() {\n    const { progress } = this.options;\n    const { task_id: _task_id } = this;\n    if (!progress) return;\n    if (typeof progress !== \"function\") {\n      throw new Error(\"progress hook must be a function\");\n    }\n    if (typeof _task_id !== \"string\") {\n      throw new Error(\"this workflow is not enqueued\");\n    }\n    const off_progress = this.client.on_progress(progress, _task_id);\n    this._connect(off_progress);\n  }\n\n  protected async hook_image_data() {\n    const { client } = this;\n\n    const off_event = client.on(\"image_data\", (data) => {\n      // NOTE: Actually, it is impossible to determine whether it is the image of the current workflow, so the internal value is_done is used to determine, because comfyui is non-concurrent by default\n      // TODO: Use message judgment, that is, use the last `executed` message to determine which workflow result it is\n      if (this.is_done) {\n        return;\n      }\n      this._result.images.push({\n        type: \"buff\",\n        data: data.image,\n        mime: data.mime,\n      });\n    });\n\n    this._connect(off_event);\n  }\n\n  protected resolve_to_result(data: ComfyUiWsTypes.Messages.Executed) {\n    const { client, resolver } = this;\n    const { output, prompt_id, node } = data;\n\n    this._result = resolver(this._result, output, {\n      client,\n      prompt_id: prompt_id,\n      node_id: node,\n    });\n  }\n\n  /**\n   * Retrieves the execution status of the workflow.\n   *\n   * @return {Promise<status>} A promise that resolves with the execution status of the workflow.\n   */\n  public async query() {\n    const task_id = this._task_id_guard();\n    return this.client.getPromptStatus(task_id);\n  }\n\n  /**\n   * Interrupts the execution of the workflow if it is currently enqueued.\n   * Throws an error if the workflow is not enqueued or if the execution status cannot be interrupted.\n   *\n   * @return {Promise<void>} A promise that resolves when the interrupt is successful or rejects with an error.\n   * @throws {Error} If the workflow is not enqueued or if the execution status cannot be interrupted.\n   */\n  public async interrupt() {\n    const id = this._task_id_guard();\n    const { pending, running, done } = await this.query();\n    if (done) return;\n    if (pending) {\n      this.client.deleteItem(\"queue\", id);\n      return;\n    }\n    if (running) {\n      return this.client.interrupt();\n    }\n    throw new Error(`wrong task status, id: ${id}`);\n  }\n\n  protected async collect_result() {\n    const { client, resolver } = this;\n    const task_id = this._task_id_guard();\n    const result = await client.getPromptResult(\n      task_id,\n      resolver ?? RESOLVERS.image,\n    );\n    this._result.images = [...this._result.images, ...result.images];\n    this._result.data = this._result.data ?? result.data;\n    return this._result;\n  }\n\n  protected when_interrupted(\n    cb: (data: ComfyUiWsTypes.Messages.ExecutionInterrupted) => any,\n  ) {\n    const task_id = this._task_id_guard();\n    this._connect(\n      this.client.on(\"execution_interrupted\", (data) => {\n        if (data.prompt_id === task_id) {\n          cb(data);\n        }\n      }),\n    );\n  }\n\n  /**\n   * Waits for the workflow to complete and returns the result.\n   *\n   * *This function does not rely on WebSocket Events, so it will lose events output by WebSocket node\n   *\n   * @param {Object} options - options for waiting\n   * @param {number} [options.polling_ms=1000] - polling interval in milliseconds\n   * @return {Promise} promise that resolves with the result of the workflow\n   */\n  public async wait_polling({ polling_ms }: { polling_ms?: number } = {}) {\n    this._done_guard();\n    const task_id = this._task_id_guard();\n\n    const { client } = this;\n    return new Promise<WorkflowOutput>(async (resolve, reject) => {\n      const done = () => {\n        this.is_done = true;\n        this.dispose();\n      };\n      this.when_interrupted((data) => {\n        reject(new Error(\"Execution Interrupted\"));\n        done();\n      });\n\n      try {\n        await client.waitForPrompt(task_id, polling_ms ?? 1000);\n        const result = await this.collect_result();\n        resolve(result);\n      } catch (error) {\n        reject(error);\n      } finally {\n        done();\n      }\n    });\n  }\n\n  /**\n   * Waits for the workflow to complete and returns the result.\n   *\n   * @return {Promise<WorkflowOutput>} promise that resolves with the result of the workflow\n   */\n  public async wait() {\n    this._done_guard();\n    this._ws_guard();\n\n    const task_id = this._task_id_guard();\n\n    return new Promise<WorkflowOutput>((resolve, reject) => {\n      const done = () => {\n        this.is_done = true;\n        this.dispose();\n      };\n      const maybe_done = async () => {\n        try {\n          const status = await this.query();\n          if (!status.done) {\n            return;\n          }\n          resolve(this._result);\n          done();\n        } catch (error) {\n          reject(error);\n          done();\n        }\n      };\n      this.when_interrupted((data) => {\n        reject(new Error(\"Execution Interrupted\"));\n        done();\n      });\n      // NOTE: 这里的意思是，如果其他地方导致 dispose ，那么也应该调用这个保证 promise resolve\n      this._connect(maybe_done);\n      this._connect(\n        this.client.on(\"executed\", async (data) => {\n          if (data.prompt_id !== task_id) {\n            return;\n          }\n          this.resolve_to_result(data);\n          maybe_done();\n        }),\n      );\n      this._connect(\n        this.client.on(\"execution_success\", async (data) => {\n          if (data.prompt_id !== task_id) {\n            return;\n          }\n          maybe_done();\n        }),\n      );\n    });\n  }\n}\n","import { Client } from \"../client/Client\";\n\nexport namespace NSPipeline {\n  // prettier-ignore\n  export const samplers = [\n    'euler',            'euler_cfg_pp',\n    'euler_ancestral',  'euler_ancestral_cfg_pp',\n    'heun',             'heunpp2',\n    'dpm_2',            'dpm_2_ancestral',\n    'lms',              'dpm_fast',\n    'dpm_adaptive',     'dpmpp_2s_ancestral',\n    'dpmpp_sde',        'dpmpp_sde_gpu',\n    'dpmpp_2m',         'dpmpp_2m_sde',\n    'dpmpp_2m_sde_gpu', 'dpmpp_3m_sde',\n    'dpmpp_3m_sde_gpu', 'ddpm',\n    'lcm',              'ipndm',\n    'ipndm_v',          'deis',\n    'ddim',             'uni_pc',\n    'uni_pc_bh2'\n  ] as const;\n  export const schedulers = [\n    \"normal\",\n    \"karras\",\n    \"exponential\",\n    \"sgm_uniform\",\n    \"simple\",\n    \"ddim_uniform\",\n    \"beta\",\n  ] as const;\n\n  export type PipeContext = {\n    seed: number;\n    steps: number;\n    cfg: number;\n    sampler_name: (typeof samplers)[number] | ({} & string);\n    scheduler: (typeof schedulers)[number] | ({} & string);\n    denoise: number;\n    width: number;\n    height: number;\n    batch_size: number;\n    ckpt_name: string;\n    positive: string;\n    negative: string;\n\n    /**\n     * NOTE: dependence custom node: `ETN_LoadImageBase64` and `ETN_LoadMaskBase64`\n     */\n    input_image: Buffer | null;\n    input_mask: Buffer | null;\n    grow_mask_by: number;\n\n    client: Client | null;\n  };\n}\n","import { Client } from \"../client/Client\";\nimport { InvokedWorkflow } from \"./InvokedWorkflow\";\nimport { WorkflowOutputResolver } from \"../client/types\";\nimport { ComfyUINodeTypes } from \"../schema/comfyui.node.types\";\nimport { WorkflowOutput, WorkflowPromptNode } from \"./types\";\nimport { IWorkflow } from \"./types\";\nimport { ComfyUiWsTypes } from \"../client/ws.types\";\n\nconst deepClone: <T>(obj: T) => T = globalThis.structuredClone\n  ? globalThis.structuredClone\n  : (x) => JSON.parse(JSON.stringify(x));\n\nexport type NodeOutput = [string, number];\n\nexport type NodeClassInputs = Record<\n  string,\n  string | boolean | number | null | undefined | NodeOutput\n>;\n\n// { k: { [k:string]: unknown } } => { k: any }\ntype InputsFormat<T> = {\n  [K in keyof T]: T[K] extends { [k: string]: unknown }\n    ? NodeOutput\n    : T[K] | NodeOutput;\n};\n\nexport interface ComfyUINodeClass<\n  INP extends NodeClassInputs = NodeClassInputs,\n> {\n  (inputs: INP): NodeOutput[];\n}\n\nexport type BuiltinNodeClasses = {\n  [K in keyof Required<ComfyUINodeTypes.NodeTypes>]: Required<\n    Required<ComfyUINodeTypes.NodeTypes>[K]\n  > extends {\n    inputs: infer INP;\n  }\n    ? ComfyUINodeClass<InputsFormat<INP> & NodeClassInputs>\n    : ComfyUINodeClass<NodeClassInputs>;\n};\n\nexport type InvokeOptions<T> = {\n  resolver?: WorkflowOutputResolver<T>;\n  progress?: (p: ComfyUiWsTypes.Messages.Progress) => void;\n  polling_ms?: number;\n};\n\n/**\n * A class for creating a workflow using a fluent API.\n *\n * @example\n * ```typescript\n  const workflow = new Workflow();\n  const {\n    KSampler,\n    CheckpointLoaderSimple,\n    EmptyLatentImage,\n    CLIPTextEncode,\n    VAEDecode,\n    SaveImage,\n    NODE1,\n  } = workflow.classes;\n\n  const seed = Math.floor(Math.random() * 2 ** 32);\n  const pos = \"best quality, 1girl\";\n  const neg = \"worst quality, bad anatomy, embedding:NG_DeepNegative_V1_75T\";\n  const model1_name = \"lofi_v5.baked.fp16.safetensors\";\n  const model2_name = \"case-h-beta.baked.fp16.safetensors\";\n  const sampler_settings = {\n    seed,\n    steps: 35,\n    cfg: 4,\n    sampler_name: \"dpmpp_2m_sde_gpu\",\n    scheduler: \"karras\",\n    denoise: 1,\n  };\n\n  const [model1, clip1, vae1] = CheckpointLoaderSimple({\n    ckpt_name: model1_name,\n  });\n  const [model2, clip2, vae2] = CheckpointLoaderSimple({\n    ckpt_name: model2_name,\n  });\n\n  const dress_case = [\n    \"white yoga\",\n    \"black office\",\n    \"pink sportswear\",\n    \"cosplay\",\n  ];\n\n  const generate_pipeline = (model, clip, vae, pos, neg) => {\n    const [latent_image] = EmptyLatentImage({\n      width: 640,\n      height: 960,\n      batch_size: 1,\n    });\n    const [positive] = CLIPTextEncode({ text: pos, clip });\n    const [negative] = CLIPTextEncode({ text: neg, clip });\n    const [samples] = KSampler({\n      ...sampler_settings,\n      model,\n      positive,\n      negative,\n      latent_image,\n    });\n    const [image] = VAEDecode({ samples, vae });\n    return image;\n  };\n\n  for (const cloth of dress_case) {\n    const input_pos = `${pos}, ${cloth} dress`;\n    const image = generate_pipeline(model1, clip1, vae1, input_pos, neg);\n    SaveImage({\n      images: image,\n      filename_prefix: `${cloth}-lofi-v5`,\n    });\n\n    const input_pos2 = `${pos}, ${cloth} dress`;\n    const image2 = generate_pipeline(model2, clip2, vae2, input_pos2, neg);\n    SaveImage({\n      images: image2,\n      filename_prefix: `${cloth}-case-h-beta`,\n    });\n  }\n\n  return workflow;\n * ```\n */\nexport class Workflow {\n  protected _workflow: IWorkflow = {\n    prompt: {},\n  };\n  protected _last_node_id = 0;\n\n  public classes = this._createClassesProxy() as BuiltinNodeClasses &\n    Record<string, ComfyUINodeClass>;\n\n  protected _createClassesProxy() {\n    const source = {};\n    return new Proxy(source, {\n      get: (target, p, receiver) => {\n        if (p in target) {\n          return (target as any)[p];\n        }\n        return (inputs: Record<string, any>) => {\n          return this.node(p as any, inputs);\n        };\n      },\n    });\n  }\n\n  public node<\n    T extends keyof ComfyUINodeTypes.NodeTypes | (string & {}),\n    C extends T extends keyof ComfyUINodeTypes.NodeTypes\n      ? Required<Required<ComfyUINodeTypes.NodeTypes>[T]>\n      : unknown,\n  >(\n    node_name: T,\n    inputs: C extends { inputs: infer INP } ? INP : Record<string, unknown>,\n  ): Iterable<NodeOutput>;\n  public node(\n    node_name: string,\n    inputs: Record<string, unknown>,\n  ): Iterable<NodeOutput> {\n    const node: WorkflowPromptNode = {\n      class_type: node_name,\n      inputs,\n    } as any;\n    const id = (++this._last_node_id).toString();\n    this._workflow.prompt[id] = node;\n\n    function* outputs() {\n      let i = 0;\n      while (true) {\n        yield [id, i++] as NodeOutput;\n      }\n    }\n\n    const gen = outputs() as any;\n\n    for (let index = 0; index < 24; index++) {\n      gen[index] = [id, index] as NodeOutput;\n    }\n\n    return gen;\n  }\n\n  /**\n   * Resets the workflow by clearing the prompt and setting the workflow to undefined.\n   */\n  public reset() {\n    this._workflow.prompt = {};\n    this._workflow.workflow = undefined;\n    this._last_node_id = 0;\n  }\n\n  /**\n   * Returns the current workflow object.\n   *\n   * @return {IWorkflow} The current workflow object.\n   *\n   * @deprecated use `workflow` instead\n   */\n  public end() {\n    return this.workflow();\n  }\n\n  /**\n   * Returns the current workflow object.\n   *\n   * @return {IWorkflow} The current workflow object.\n   */\n  public workflow() {\n    return deepClone(this._workflow);\n  }\n\n  /**\n   * Guard function to check if the client's WebSocket is connected before attempting to invoke the workflow.\n   *\n   * @throws {Error} If the WebSocket is not connected.\n   *\n   * @param {Client} client - The client to check.\n   *\n   * @private\n   */\n  protected _ws_connected_guard(client: Client) {\n    if (!client.socket || client.socket.readyState !== client.WebSocket.OPEN) {\n      const current_state = {\n        [client.WebSocket.CLOSED]: \"CLOSED\",\n        [client.WebSocket.CONNECTING]: \"CONNECTING\",\n        [client.WebSocket.OPEN]: \"OPEN\",\n        [client.WebSocket.CLOSING]: \"CLOSING\",\n        [-1]: \"UNKNOWN\",\n      }[client.socket?.readyState ?? -1];\n      throw new Error(\n        `WebSocket is not connected, cannot invoke workflow. readyState=${current_state}`,\n      );\n    }\n  }\n\n  /**\n   * Invokes the workflow with the provided client and options.\n   *\n   * @param {Client} client - The client to use for the invocation.\n   * @param {InvokeOptions<T>} [options] - Optional invoke options.\n   * @return {Promise<WorkflowOutput<T>>} A promise resolving to the workflow output.\n   */\n  public invoke<T>(\n    client: Client,\n    options?: InvokeOptions<T>,\n  ): Promise<WorkflowOutput<T>>;\n  public invoke(\n    client: Client,\n    options?: InvokeOptions<unknown>,\n  ): Promise<WorkflowOutput<unknown>>;\n  public async invoke(\n    client: Client,\n    options?: InvokeOptions<unknown>,\n  ): Promise<WorkflowOutput<unknown>> {\n    this._ws_connected_guard(client);\n    const invoked = this.instance(client, options);\n    await invoked.enqueue();\n    const result = invoked.wait();\n    return result;\n  }\n\n  /**\n   * Creates a new invoked workflow instance.\n   *\n   * @param {Client} client - The client used to run the prompt.\n   * @param {InvokeOptions<T>} [options] - Optional invoke options.\n   * @return {InvokedWorkflow<T>} The invoked workflow instance.\n   */\n  public instance<T>(\n    client: Client,\n    options?: InvokeOptions<T>,\n  ): InvokedWorkflow<T>;\n  public instance(\n    client: Client,\n    options?: InvokeOptions<unknown>,\n  ): InvokedWorkflow;\n  public instance(\n    client: Client,\n    options?: InvokeOptions<unknown>,\n  ): InvokedWorkflow {\n    const workflow = this.workflow();\n    const invoked = new InvokedWorkflow({\n      workflow,\n      client,\n      resolver: options?.resolver,\n      progress: options?.progress,\n    });\n    return invoked;\n  }\n\n  /**\n   * Invokes a workflow using the provided client with polling.\n   *\n   * @param {Client} client - The client used to run the prompt.\n   * @param {InvokeOptions<T>} [options] - The options for invoking the workflow.\n   * @return {Promise<WorkflowOutput<T>>} A promise that resolves with the result of the prompt.\n   */\n  public invoke_polling<T>(\n    client: Client,\n    options?: InvokeOptions<T>,\n  ): Promise<WorkflowOutput<T>>;\n  public invoke_polling(\n    client: Client,\n    options?: InvokeOptions<unknown>,\n  ): Promise<WorkflowOutput>;\n  public invoke_polling(client: Client, options?: InvokeOptions<unknown>) {\n    if (typeof options?.progress === \"function\") {\n      throw new Error(\"progress option is not supported in polling mode\");\n    }\n    const { prompt, workflow } = this.workflow();\n    return client.enqueue_polling(prompt, {\n      workflow,\n      resolver: options?.resolver,\n      polling_ms: options?.polling_ms,\n    });\n  }\n}\n","import { Client } from \"../client/Client\";\n\ntype FnHook<\n  N extends keyof Client = keyof Client,\n  Fn extends Client[N] = Client[N],\n> = Fn extends (...args: any) => any\n  ? {\n      type: \"function\";\n      name: N;\n      fn: (original: Fn, ...args: Parameters<Fn>) => ReturnType<Fn>;\n    }\n  : never;\n\ntype PluginHook<\n  N extends keyof Client = keyof Client,\n  Fn extends Client[N] = Client[N],\n> = FnHook<N, Fn>;\n\nexport class Plugin {\n  private hooks = [] as PluginHook[];\n\n  public install(instance: Client) {\n    for (const hook of this.hooks) {\n      const ins = instance as any;\n      const original = ins[hook.name].bind(instance);\n      ins[hook.name] = (...args: Parameters<typeof original>) => {\n        return (hook.fn as any).bind(instance)(original, ...args);\n      };\n    }\n  }\n\n  protected addHook<\n    N extends keyof Client = keyof Client,\n    Fn extends Client[N] = Client[N],\n  >(hook: PluginHook<N, Fn>) {\n    this.hooks.push(hook);\n  }\n}\n","import { Plugin } from \"./Plugin\";\n\n/**\n * Provide api-auth support for this https://github.com/liusida/ComfyUI-Login/tree/main extension\n */\nexport class LoginAuthPlugin extends Plugin {\n  constructor(\n    readonly options: {\n      token: string;\n    },\n  ) {\n    super();\n\n    this.addHook({\n      type: \"function\",\n      name: \"apiURL\",\n      fn: (original, ...args) => {\n        const url = original(...args);\n        const urlObj = new URL(url);\n        urlObj.searchParams.set(\"token\", this.options.token);\n        return urlObj.toString();\n      },\n    });\n\n    this.addHook({\n      type: \"function\",\n      name: \"wsURL\",\n      fn: (original, ...args) => {\n        const url = original(...args);\n        const urlObj = new URL(url);\n        urlObj.searchParams.set(\"token\", this.options.token);\n        return urlObj.toString();\n      },\n    });\n  }\n}\n","import EventEmitter from \"eventemitter3\";\nimport { Client } from \"../client/Client\";\nimport { Workflow } from \"../workflow/Workflow\";\nimport { WorkflowOutput } from \"../workflow/types\";\nimport { NSPipeline } from \"./types\";\nimport { ComfyUIClientEvents } from \"../client/ws.types\";\nimport { Disposable } from \"../utils/Disposable\";\nimport { InvokedWorkflow } from \"../workflow/InvokedWorkflow\";\n\ntype PipeContext = NSPipeline.PipeContext;\n\n/**\n * pipe to create a workflow\n */\nexport class BasePipe<\n  CTX extends PipeContext = PipeContext,\n> extends Disposable {\n  /**\n   * Generates a random seed value.\n   *\n   * @return {number} A random integer seed value between 0 and 2^32 - 1.\n   */\n  static nextSeed() {\n    return Math.floor(Math.random() * 2 ** 32);\n  }\n  static defaultContext: PipeContext = {\n    seed: BasePipe.nextSeed(),\n    steps: 35,\n    cfg: 4,\n    sampler_name: \"dpmpp_2m_sde_gpu\",\n    scheduler: \"karras\",\n    denoise: 1,\n    width: 512,\n    height: 512,\n    batch_size: 1,\n    ckpt_name: \"\",\n\n    input_image: null,\n    input_mask: null,\n    grow_mask_by: 6,\n\n    positive: \"\",\n    negative: \"\",\n\n    client: null,\n  };\n  protected context: CTX;\n  protected _workflow = new Workflow();\n  protected _invoked?: Promise<InvokedWorkflow>;\n\n  constructor(context?: Partial<CTX>) {\n    super();\n    this.context = {\n      ...BasePipe.defaultContext,\n      ...context,\n    } as CTX;\n  }\n\n  protected update(ctx: Record<string, any>) {\n    Object.assign(this.context, ctx);\n  }\n\n  /**\n   * Updates the context with the provided image buffer.\n   *\n   * @param {Buffer} image - The image buffer to update the context with.\n   * @return {this} The current instance of the class for method chaining.\n   */\n  image(image: Buffer) {\n    this.update({\n      input_image: image,\n    });\n    return this;\n  }\n\n  /**\n   * Updates the context with the provided mask buffer.\n   *\n   * @param {Buffer} image - The mask buffer to update the context with.\n   * @return {this} The current instance of the class for method chaining.\n   */\n  mask(image: Buffer) {\n    this.update({\n      input_mask: image,\n    });\n    return this;\n  }\n\n  /**\n   * Updates the context with the provided model checkpoint name.\n   *\n   * @param {string} ckpt_name - The name of the model checkpoint to update the context with.\n   * @return {this} The current instance of the class for method chaining.\n   */\n  model(ckpt_name: string) {\n    this.update({\n      ckpt_name,\n    });\n    return this;\n  }\n\n  /**\n   * Updates the context with the provided width and height, and returns the current instance of the class for method chaining.\n   *\n   * @param {number} w - The width to update the context with.\n   * @param {number} h - The height to update the context with.\n   * @return {this} The current instance of the class for method chaining.\n   */\n  size(w: number, h: number) {\n    this.update({\n      width: w,\n      height: h,\n    });\n    return this;\n  }\n\n  /**\n   * Updates the context with the provided text as the positive prompt.\n   *\n   * @param {string} text - The text to update the context with.\n   * @return {this} The current instance of the class for method chaining.\n   */\n  prompt(text: string) {\n    this.update({\n      positive: text,\n    });\n    return this;\n  }\n\n  /**\n   * Updates the context with the provided text as the negative prompt.\n   *\n   * @param {string} text - The text to update the context with.\n   * @return {this} The current instance of the class for method chaining.\n   */\n  negative(text: string) {\n    this.update({\n      negative: text,\n    });\n    return this;\n  }\n\n  /**\n   * Updates the context with the provided steps and returns the current instance of the class for method chaining.\n   *\n   * @param {number} steps - The number of steps to update the context with.\n   * @return {this} The current instance of the class for method chaining.\n   */\n  steps(steps: number) {\n    this.update({\n      steps,\n    });\n    return this;\n  }\n\n  /**\n   * Updates the context with the provided cfg value.\n   *\n   * @param {number} cfg - The cfg value to update the context with.\n   * @return {this} The current instance of the class for method chaining.\n   */\n  cfg(cfg: number) {\n    this.update({\n      cfg,\n    });\n    return this;\n  }\n\n  /**\n   * Updates the context with the provided seed value or generates a random seed value if none is provided.\n   *\n   * @param {number} [seed=BasePipe.nextSeed()] - The seed value to update the context with. If not provided, a random seed value will be generated.\n   * @return {this} The current instance of the class for method chaining.\n   */\n  seed(seed = BasePipe.nextSeed()) {\n    this.update({\n      seed,\n    });\n    return this;\n  }\n\n  /**\n   * Updates the context with the provided denoise value and returns the current instance of the class for method chaining.\n   *\n   * @param {number} denoise - The denoise value to update the context with.\n   * @return {this} The current instance of the class for method chaining.\n   */\n  denoise(denoise: number) {\n    this.update({\n      denoise,\n    });\n    return this;\n  }\n\n  /**\n   * Updates the context with the provided scheduler value and returns the current instance of the class for method chaining.\n   *\n   * @param {PipeContext[\"scheduler\"]} scheduler - The scheduler value to update the context with.\n   * @return {this} The current instance of the class for method chaining.\n   */\n  scheduler(scheduler: PipeContext[\"scheduler\"]) {\n    this.update({\n      scheduler,\n    });\n    return this;\n  }\n\n  /**\n   * Updates the context with the provided sampler name and returns the current instance of the class for method chaining.\n   *\n   * @param {PipeContext[\"sampler_name\"]} sampler_name - The sampler name to update the context with.\n   * @return {this} The current instance of the class for method chaining.\n   */\n  sampler(sampler_name: PipeContext[\"sampler_name\"]) {\n    this.update({\n      sampler_name,\n    });\n    return this;\n  }\n\n  /**\n   * Updates the context with the provided batch size and returns the current instance of the class for method chaining.\n   *\n   * @param {number} batch_size - The batch size to update the context with.\n   * @return {this} The current instance of the class for method chaining.\n   */\n  batch_size(batch_size: number) {\n    this.update({\n      batch_size,\n    });\n    return this;\n  }\n\n  /**\n   * Updates the context with the provided client and returns the current instance of the class for method chaining.\n   *\n   * @param {Client} client - The client to update the context with.\n   * @return {this} The current instance of the class for method chaining.\n   */\n  with(client: Client) {\n    this.update({\n      client,\n    });\n    return this;\n  }\n\n  /**\n   * Adds an event listener for the specified event type.\n   */\n  on<T extends EventEmitter.EventNames<ComfyUIClientEvents>>(\n    type: T,\n    callback: EventEmitter.EventListener<ComfyUIClientEvents, T>,\n    options?: any,\n  ) {\n    const { _invoked: invoked } = this;\n    if (!invoked) {\n      throw new Error(\"workflow not invoked\");\n    }\n    invoked.then((instance) => {\n      instance.on(type, callback, options);\n    });\n    return this;\n  }\n\n  /**\n   * Adds an once event listener for the specified event type.\n   */\n  once<T extends EventEmitter.EventNames<ComfyUIClientEvents>>(\n    type: T,\n    callback: EventEmitter.EventListener<ComfyUIClientEvents, T>,\n    options?: any,\n  ) {\n    const { _invoked: invoked } = this;\n    if (!invoked) {\n      throw new Error(\"workflow not invoked\");\n    }\n    invoked.then((instance) => {\n      instance.once(type, callback, options);\n    });\n    return this;\n  }\n\n  protected build_latent(vae: any) {\n    const { context, _workflow: workflow } = this;\n    const cls = workflow.classes;\n    const { width, height, batch_size } = context;\n    const { input_image, input_mask, grow_mask_by } = this.context;\n    if (!input_image) {\n      return cls.EmptyLatentImage({\n        width,\n        height,\n        batch_size,\n      })[0];\n    }\n    const pixels = cls.ETN_LoadImageBase64({\n      image: input_image.toString(\"base64\"),\n    })[0];\n    if (!input_mask) {\n      return cls.VAEEncode({\n        pixels,\n        vae,\n      })[0];\n    }\n    const mask = cls.ETN_LoadMaskBase64({\n      mask: input_mask.toString(\"base64\"),\n    })[0];\n    return cls.VAEEncodeForInpaint({\n      pixels,\n      vae,\n      mask,\n      grow_mask_by,\n    })[0];\n  }\n\n  protected build() {\n    const { context, _workflow: workflow } = this;\n    const cls = workflow.classes;\n    const {\n      seed,\n      steps,\n      cfg,\n      scheduler,\n      denoise,\n      ckpt_name,\n      positive,\n      negative,\n      sampler_name,\n    } = context;\n    const [model, clip, vae] = cls.CheckpointLoaderSimple({\n      ckpt_name,\n    });\n    const enc = (text: string) => cls.CLIPTextEncode({ text, clip })[0];\n    const [samples] = cls.KSampler({\n      seed,\n      steps,\n      cfg,\n      sampler_name,\n      scheduler,\n      denoise,\n      model,\n      positive: enc(positive),\n      negative: enc(negative),\n      latent_image: this.build_latent(vae),\n    });\n\n    return { samples, vae, cls };\n  }\n\n  protected _save(filename_prefix?: string) {\n    const { samples, vae, cls } = this.build();\n\n    const images = cls.VAEDecode({ samples, vae })[0];\n    if (filename_prefix) {\n      cls.SaveImage({\n        filename_prefix,\n        images,\n      });\n    } else {\n      cls.SaveImageWebsocket({\n        images,\n      });\n    }\n  }\n\n  protected async read_response(res: WorkflowOutput<unknown>) {\n    const images = [] as {\n      data: ArrayBuffer;\n      mime: string;\n    }[];\n    for (const img of res.images) {\n      switch (img.type) {\n        case \"buff\": {\n          images.push({\n            data: img.data,\n            mime: img.mime,\n          });\n          break;\n        }\n        case \"url\": {\n          const { data: url } = img;\n          const resp = await fetch(url);\n          const mime = resp.headers.get(\"content-type\") ?? \"image/png\";\n          const blob = await resp.blob();\n          images.push({\n            data: await blob.arrayBuffer(),\n            mime,\n          });\n          break;\n        }\n      }\n    }\n    return images;\n  }\n\n  /**\n   * Saves the workflow by invoking the workflow instance and enqueuing it.\n   *\n   * @param {string} [filename_prefix] - The prefix for the saved filename. if not provided, the workflow will be saved as a websocket connection.\n   * @return {this} - Returns the instance of the class for method chaining.\n   * @throws {Error} - Throws an error if the client is not defined.\n   */\n  save(filename_prefix?: string) {\n    const {\n      context: { client },\n      _workflow: workflow,\n    } = this;\n    if (!client) {\n      throw new Error(\"client is not defined\");\n    }\n    this._save(filename_prefix);\n    this._invoked = (async () => {\n      const instance = workflow.instance(client);\n      instance._connect(() => this.dispose());\n      await instance.enqueue();\n      return instance;\n    })();\n    return this;\n  }\n\n  /**\n   * Waits for the workflow to complete and returns the result and the images.\n   *\n   * @return {Promise<{result: WorkflowOutput<unknown>, images: {data: ArrayBuffer, mime: string}[]}>} - A promise that resolves to an object containing the result of the workflow and the images.\n   * @throws {Error} - Throws an error if the workflow has not been invoked.\n   */\n  async wait() {\n    const { _invoked: invoked } = this;\n    if (!invoked) {\n      throw new Error(\"workflow not invoked\");\n    }\n    const result = await (await invoked).wait();\n    const images = await this.read_response(result);\n    return {\n      result,\n      images,\n    };\n  }\n\n  /**\n   * Waits for the workflow to complete and returns the result and the images.\n   *\n   * *This function does not rely on WebSocket Events, so it maybe will lose events output by WebSocket node\n   *\n   * @return {Promise<{result: WorkflowOutput<unknown>, images: {data: ArrayBuffer, mime: string}[]}>} - A promise that resolves to an object containing the result of the workflow and the images.\n   * @throws {Error} - Throws an error if the workflow has not been invoked.\n   */\n  async wait_polling() {\n    const { _invoked: invoked } = this;\n    if (!invoked) {\n      throw new Error(\"workflow not invoked\");\n    }\n    const result = await (await invoked).wait_polling();\n    const images = await this.read_response(result);\n    return {\n      result,\n      images,\n    };\n  }\n}\n","import { BasePipe } from \"./base\";\nimport { NSPipeline } from \"./types\";\n\ninterface EfficientPipeContext extends NSPipeline.PipeContext {\n  vae_name: string;\n  clip_skip: number;\n  token_normalization: \"none\" | \"mean\" | \"length\" | \"length+mean\";\n  weight_interpretation:\n    | \"comfy\"\n    | \"A1111\"\n    | \"compel\"\n    | \"comfy++\"\n    | \"down_weight\";\n\n  loras: {\n    name: string;\n    weight: number;\n    model_strength: number;\n    clip_strength: number;\n  }[];\n  control_net_blocks: {\n    image: Buffer;\n    name: string;\n    strength: number;\n    start: number;\n    end: number;\n  }[];\n}\n\n/**\n * pipe to create a workflow\n *\n * required https://github.com/jags111/efficiency-nodes-comfyui\n */\nexport class EfficientPipe extends BasePipe<EfficientPipeContext> {\n  static defaultContext: EfficientPipeContext = {\n    ...BasePipe.defaultContext,\n    vae_name: \"Baked VAE\",\n    clip_skip: -2,\n    token_normalization: \"none\",\n    weight_interpretation: \"A1111\",\n\n    loras: [],\n    control_net_blocks: [],\n  };\n\n  constructor(context?: Partial<EfficientPipeContext>) {\n    super();\n    this.context = {\n      ...EfficientPipe.defaultContext,\n      ...context,\n    } as EfficientPipeContext;\n  }\n\n  /**\n   * Adds a LoRA (Low-Rank Adaptation) to the EfficientPipe context.\n   *\n   * @param {string} name - The name of the LoRA.\n   * @param {object} options - Optional configuration for the LoRA.\n   * @param {number} [options.weight=1] - The weight of the LoRA.\n   * @param {number} [options.strength=1] - The strength of the LoRA.\n   * @param {number} [options.clip_strength=1] - The clip strength of the LoRA.\n   * @return {EfficientPipe} The EfficientPipe instance for chaining.\n   */\n  lora(\n    name: string,\n    {\n      weight = 1,\n      strength = 1,\n      clip_strength = 1,\n    }: { weight?: number; strength?: number; clip_strength?: number } = {},\n  ) {\n    this.context.loras.push({\n      name,\n      weight,\n      model_strength: strength,\n      clip_strength,\n    });\n    return this;\n  }\n\n  /**\n   * Adds a control net block to the EfficientPipe context.\n   *\n   * @param {string} name - The name of the control net block.\n   * @param {Buffer} image - The image data of the control net block.\n   * @param {object} options - Optional configuration for the control net block.\n   * @param {number} [options.strength=1] - The strength of the control net block.\n   * @param {number} [options.start=0] - The start value of the control net block.\n   * @param {number} [options.end=1] - The end value of the control net block.\n   * @return {EfficientPipe} The EfficientPipe instance for chaining.\n   */\n  cnet(\n    name: string,\n    image: Buffer,\n    {\n      strength = 1,\n      start = 0,\n      end = 1,\n    }: {\n      strength?: number;\n      start?: number;\n      end?: number;\n    } = {},\n  ) {\n    this.context.control_net_blocks.push({\n      image,\n      name,\n      strength,\n      start,\n      end,\n    });\n    return this;\n  }\n\n  protected build_lora_stack() {\n    const { loras } = this.context;\n    if (loras.length === 0) {\n      return undefined;\n    }\n    const { _workflow: workflow } = this;\n    const cls = workflow.classes;\n    const params: any = {\n      lora_count: loras.length,\n    };\n    for (let idx = 0; idx < 50; idx++) {\n      const lora = loras[idx];\n      if (!lora) {\n        params[`lora_name_${idx}`] = \"None\";\n        params[`lora_wt_${idx}`] = 1;\n        params[`model_str_${idx}`] = 1;\n        params[`clip_str_${idx}`] = 1;\n        continue;\n      }\n      const { name, weight, model_strength, clip_strength } = lora;\n      params[`lora_name_${idx}`] = name;\n      params[`lora_wt_${idx}`] = weight;\n      params[`model_str_${idx}`] = model_strength;\n      params[`clip_str_${idx}`] = clip_strength;\n    }\n\n    const [stack] = cls[\"LoRA Stacker\"]({\n      input_mode: \"advanced\",\n      ...params,\n    });\n    return stack;\n  }\n\n  protected build_cnet_block(\n    {\n      image,\n      name,\n      strength,\n      start,\n      end,\n    }: EfficientPipeContext[\"control_net_blocks\"][number],\n    stack: any,\n  ) {\n    const { _workflow: workflow } = this;\n    const { ControlNetLoader, ETN_LoadImageBase64 } = workflow.classes;\n    const cls = workflow.classes;\n    const [model] = ControlNetLoader({\n      control_net_name: name,\n    });\n    const [img] = ETN_LoadImageBase64({\n      image: image.toString(\"base64\"),\n    });\n    const [stack_out] = cls[\"Control Net Stacker\"]({\n      control_net: model,\n      image: img,\n      strength,\n      start_percent: start,\n      end_percent: end,\n      cnet_stack: stack,\n    });\n    return stack_out;\n  }\n\n  protected build_cnet_stack() {\n    const { control_net_blocks } = this.context;\n    if (control_net_blocks.length === 0) {\n      return undefined;\n    }\n    let stack = undefined as any;\n    for (const cnet of control_net_blocks) {\n      stack = this.build_cnet_block(cnet, stack);\n    }\n    return stack;\n  }\n\n  protected build() {\n    const { context, _workflow: workflow } = this;\n    const cls = workflow.classes;\n    const {\n      seed,\n      steps,\n      cfg,\n      scheduler,\n      denoise,\n      ckpt_name,\n      positive,\n      negative,\n      sampler_name,\n      vae_name,\n      clip_skip,\n      token_normalization,\n      weight_interpretation,\n      width,\n      height,\n      batch_size,\n    } = context;\n    const [model, cond_pos, cond_neg, latent, vae, clip, deps] = cls[\n      \"Efficient Loader\"\n    ]({\n      ckpt_name,\n      vae_name,\n      clip_skip,\n      token_normalization,\n      weight_interpretation,\n      empty_latent_height: height,\n      empty_latent_width: width,\n      batch_size,\n      positive,\n      negative,\n\n      lora_stack: this.build_lora_stack(),\n      cnet_stack: this.build_cnet_stack(),\n\n      // NOTE: All lora loads use stack instead of here\n      lora_name: \"None\",\n      lora_model_strength: 1,\n      lora_clip_strength: 1,\n    });\n\n    const [samples] = cls.KSampler({\n      seed,\n      steps,\n      cfg,\n      sampler_name,\n      scheduler,\n      denoise,\n      model,\n      positive: cond_pos,\n      negative: cond_neg,\n      latent_image: this.build_latent(vae),\n    });\n\n    return { samples, vae, cls };\n  }\n}\n","export * from \"./client/WsClient\";\nexport * from \"./client/Client\";\nexport * from \"./workflow/Workflow\";\nexport * from \"./plugins/Plugin\";\nexport * as plugins from \"./plugins\";\nexport * as builtins from \"./builtins\";\nexport * from \"./pipeline\";\n\nexport * from \"./client/types\";\nexport * from \"./client/ws.types\";\nexport * from \"./client/response.types\";\n\nexport * from \"./workflow/types\";\nexport * from \"./pipeline/types\";\n\nimport { WsClient } from \"./client/WsClient\";\nimport { Client } from \"./client/Client\";\nimport { Workflow } from \"./workflow/Workflow\";\nimport { Plugin } from \"./plugins/Plugin\";\n\n/**\n * @deprecated use `Client` instead\n */\nexport const ComfyUIApiClient = Client;\n\n/**\n * @deprecated use `WsClient` instead\n */\nexport const ComfyUIWsClient = WsClient;\n\n/**\n * @deprecated use `Workflow` instead\n */\nexport const ComfyUIWorkflow = Workflow;\n\n/**\n * @deprecated use `Plugin` instead\n */\nexport const ClientPlugin = Plugin;\n"],"names":["Errors","has","Object","prototype","hasOwnProperty","prefix","Events","EE","fn","context","once","this","addListener","emitter","event","TypeError","listener","evt","_events","push","_eventsCount","clearEvent","EventEmitter","create","__proto__","eventNames","events","name","names","call","slice","getOwnPropertySymbols","concat","listeners","handlers","i","l","length","ee","Array","listenerCount","emit","a1","a2","a3","a4","a5","args","len","arguments","removeListener","undefined","apply","j","on","removeAllListeners","off","prefixed","module","exports","isNone","x","HttpError","_Error","message","status","json","_this","_inheritsLoose","_wrapNativeSuper","Error","WsClient","config","_config$api_host","_config$api_base","_config$clientId","_config$WebSocket","_config$ssl","_config$user","_config$fetch","api_host","api_base","clientId","socket","WebSocket","ssl","user","fetch","socket_callbacks","_polling_timer","_polling_interval","closed","DEFAULT_API_HOST","DEFAULT_API_BASE","replace","c","r","Math","random","toString","globalThis","DEFAULT_USER","bind","console","warn","loadImageData","buf","view","DataView","eventType","getUint32","imageType","mime","image","_proto","apiHeaders","options","_options$headers","_extends","Accept","headers","apiURL","route","url","URL","_split","split","query","pathname","search","searchParams","set","viewURL","filename","subfolder","type","URLSearchParams","wsURL","fetchApi","Promise","resolve","then","res","statusText","_temp","_res$json","_result","e","reject","addEventListener","callback","_this2","_this3","startPollingQueue","_this4","setInterval","_temp2","resp","_catch","addSocketCallback","_this5","removeEventListener","removeSocketCallbacks","createSocket","isReconnect","_this6","opened","binaryType","ev","_err$message","err","is404Error","includes","close","setTimeout","data","ArrayBuffer","Buffer","isBuffer","isImageMessage","msg","JSON","parse","sid","registered","init","disconnect","connect","_temp3","_this8","_polling$interval","_this7","_ref","_ref$polling","polling","enabled","_ref$websocket","websocket","_ref$timeout_ms","timeout_ms","interval","timer","ok","clearTimeout","_disconnectSocket","process","nextTick","_disconnectPolling","readyState","OPEN","error","clearInterval","key","get","IS_BROWSER","window","GlobalCacheHub","_cached","KEY","Map","clear","value","CachedFn","ns","_options$expire_time","_options$enabled","expire_time_ms","cache_ns","expire_time","_defaultExpire","_proto2","reset","_hashArgs","stringify","warp","now","Date","argsHash","cacheKey","hit_cached","expire","result","RESOLVERS","acc","output","client","images","map","filter","Boolean","body","recover","pact","s","_Pact","o","_settle","state","v","observer","onFulfilled","onRejected","_isSettledPact","thenable","Client","_WsClient","_cached_fn","_plugins","cache","use","plugin","install","getExtensions","cached","getEmbeddings","getNodeDefs","resetCache","queuePrompt","queue_index","prompt","workflow","client_id","extra_data","extra_pnginfo","front","number","method","text","error_resp","response","getItems","getQueue","getHistory","Running","queue_running","remove","cb","interrupt","Pending","queue_pending","max_items","_res$json2","History","values","getSystemStats","postApi","deleteItem","id","delete","clearItems","free","params","getUserConfig","_this13$fetchApi","createUser","username","getSettings","_this15$fetchApi","getSetting","encodeURIComponent","_this16$fetchApi","storeSettings","settings","storeSetting","getUserData","file","storeUserData","getSamplers","node_config","_node$input","node","input","required","getSchedulers","_node$input2","getSDModels","_node$input3","getCNetModels","_node$input4","getUpscaleModels","_node$input5","getHyperNetworks","_node$input6","getLoRAs","_node$input7","getVAEs","_node$input8","getPromptStatus","prompt_id","_ref2","running","some","task","_task$prompt","pending","_task$prompt2","done","getPromptOutputs","_ref3","item","find","status_str","outputs","getPromptResult","resolver","_this31","entries","reduce","_ref4","node_id","waitForPrompt","polling_ms","_this32","prompt_status","test","update","stage","shouldContinue","_resumeAfterTest","_resumeAfterBody","_for","_this32$getPromptStat","waitForPromptWebSocket","_this33","offEvent2","offEvent","resolved","_enqueue_prompt","runPrompt","_this35","enqueue_polling","_this36","progress","_options$resolver","enqueue","_this37","off_progress","on_progress","finalizer","_options$resolver2","_finallyRethrows","_wasThrown","_result3","task_id","_data","Disposable","_disposed","_disposed_cbs","dispose","forEach","_connect","NSPipeline","InvokedWorkflow","_Disposable","is_done","enqueued","_enqueue_guard","_task_id_guard","_done_guard","_ws_guard","is_owner_event","hook_progress","hook_image_data","_task_id","off_event","resolve_to_result","collect_result","_this9","_this9$_result$data","when_interrupted","wait_polling","_this0","wait","_this1","maybe_done","deepClone","structuredClone","Workflow","_workflow","_last_node_id","classes","_createClassesProxy","Proxy","target","p","receiver","inputs","node_name","_marked","_regeneratorRuntime","mark","class_type","wrap","_context","prev","next","stop","gen","index","end","_ws_connected_guard","_client$WebSocket$CLO","_client$socket$readyS","_client$socket","current_state","CLOSED","CONNECTING","CLOSING","invoke","invoked","instance","invoke_polling","_this$workflow","Plugin","hooks","_loop","_step","hook","ins","original","_iterator","_createForOfIteratorHelperLoose","addHook","_Plugin","LoginAuthPlugin","urlObj","token","samplers","schedulers","_iteratorSymbol","Symbol","iterator","BasePipe","_invoked","defaultContext","nextSeed","floor","pow","ctx","assign","input_image","mask","input_mask","model","ckpt_name","size","w","h","width","height","positive","negative","steps","cfg","seed","denoise","scheduler","sampler","sampler_name","batch_size","build_latent","vae","cls","_this$context","grow_mask_by","EmptyLatentImage","pixels","ETN_LoadImageBase64","VAEEncode","ETN_LoadMaskBase64","VAEEncodeForInpaint","build","_cls$CheckpointLoader","CheckpointLoaderSimple","clip","enc","CLIPTextEncode","samples","KSampler","latent_image","_save","filename_prefix","_this$build","VAEDecode","SaveImage","SaveImageWebsocket","read_response","step","_cycle","_fixup","array","_forTo","_forOf","img","_switch","_resp$headers$get","blob","_push","arrayBuffer","_blob$arrayBuffer","save","_invoked2","EfficientPipe","_BasePipe","lora","_ref$weight","weight","_ref$strength","strength","_ref$clip_strength","clip_strength","loras","model_strength","cnet","_ref2$strength","_ref2$start","start","_ref2$end","control_net_blocks","build_lora_stack","lora_count","idx","input_mode","build_cnet_block","stack","_workflow$classes","ControlNetLoader","control_net_name","_ETN_LoadImageBase","control_net","start_percent","end_percent","cnet_stack","build_cnet_stack","_cls$EfficientLoader","vae_name","clip_skip","token_normalization","weight_interpretation","empty_latent_height","empty_latent_width","lora_stack","lora_name","lora_model_strength","lora_clip_strength","cond_pos","cond_neg","ComfyUIApiClient","ComfyUIWsClient","ComfyUIWorkflow","ClientPlugin"],"mappings":"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"}