Added dynamic loading of extensions
This commit is contained in:
parent
c23af92baf
commit
592b377ac4
|
@ -5,6 +5,7 @@ import nodes
|
||||||
import execution
|
import execution
|
||||||
import uuid
|
import uuid
|
||||||
import json
|
import json
|
||||||
|
import glob
|
||||||
|
|
||||||
try:
|
try:
|
||||||
import aiohttp
|
import aiohttp
|
||||||
|
@ -52,6 +53,11 @@ class PromptServer():
|
||||||
async def get_root(request):
|
async def get_root(request):
|
||||||
return web.FileResponse(os.path.join(self.web_root, "index.html"))
|
return web.FileResponse(os.path.join(self.web_root, "index.html"))
|
||||||
|
|
||||||
|
@routes.get("/extensions")
|
||||||
|
async def get_extensions(request):
|
||||||
|
files = glob.glob(os.path.join(self.web_root, 'extensions/**/*.js'), recursive=True)
|
||||||
|
return web.json_response(list(map(lambda f: "/" + os.path.relpath(f, self.web_root).replace("\\", "/"), files)))
|
||||||
|
|
||||||
@routes.get("/view/{file}")
|
@routes.get("/view/{file}")
|
||||||
async def view_image(request):
|
async def view_image(request):
|
||||||
if "file" in request.match_info:
|
if "file" in request.match_info:
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
import { app } from "../scripts/app.js";
|
import { app } from "../scripts/app.js";
|
||||||
|
|
||||||
const ext = {
|
const ext = {
|
||||||
|
// Unique name for the extension
|
||||||
name: "Example.LoggingExtension",
|
name: "Example.LoggingExtension",
|
||||||
async init(app) {
|
async init(app) {
|
||||||
// Any initial setup to run as soon as the page loads
|
// Any initial setup to run as soon as the page loads
|
||||||
|
|
|
@ -6,9 +6,6 @@
|
||||||
<script type="text/javascript" src="lib/litegraph.core.js"></script>
|
<script type="text/javascript" src="lib/litegraph.core.js"></script>
|
||||||
|
|
||||||
<script type="module">
|
<script type="module">
|
||||||
import "/extensions/core/dynamicPrompts.js";
|
|
||||||
import "/extensions/core/rerouteNode.js";
|
|
||||||
|
|
||||||
import { app } from "/scripts/app.js";
|
import { app } from "/scripts/app.js";
|
||||||
await app.setup();
|
await app.setup();
|
||||||
window.app = app;
|
window.app = app;
|
||||||
|
|
|
@ -88,6 +88,15 @@ class ComfyApi extends EventTarget {
|
||||||
this.#createSocket();
|
this.#createSocket();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets a list of extension urls
|
||||||
|
* @returns An array of script urls to import
|
||||||
|
*/
|
||||||
|
async getExtensions() {
|
||||||
|
const resp = await fetch("/extensions", { cache: "no-store" });
|
||||||
|
return await resp.json();
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Loads node object definitions for the graph
|
* Loads node object definitions for the graph
|
||||||
* @returns The node definitions
|
* @returns The node definitions
|
||||||
|
|
|
@ -11,14 +11,6 @@ class ComfyApp {
|
||||||
this.nodeOutputs = {};
|
this.nodeOutputs = {};
|
||||||
}
|
}
|
||||||
|
|
||||||
#log(message, ...other) {
|
|
||||||
console.log("[comfy]", message, ...other);
|
|
||||||
}
|
|
||||||
|
|
||||||
#error(message, ...other) {
|
|
||||||
console.error("[comfy]", message, ...other);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Invoke an extension callback
|
* Invoke an extension callback
|
||||||
* @param {string} method The extension callback to execute
|
* @param {string} method The extension callback to execute
|
||||||
|
@ -32,7 +24,7 @@ class ComfyApp {
|
||||||
try {
|
try {
|
||||||
results.push(ext[method](...args, this));
|
results.push(ext[method](...args, this));
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
this.#error(
|
console.error(
|
||||||
`Error calling extension '${ext.name}' method '${method}'`,
|
`Error calling extension '${ext.name}' method '${method}'`,
|
||||||
{ error },
|
{ error },
|
||||||
{ extension: ext },
|
{ extension: ext },
|
||||||
|
@ -58,7 +50,7 @@ class ComfyApp {
|
||||||
try {
|
try {
|
||||||
return await ext[method](...args, this);
|
return await ext[method](...args, this);
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
this.#error(
|
console.error(
|
||||||
`Error calling extension '${ext.name}' method '${method}'`,
|
`Error calling extension '${ext.name}' method '${method}'`,
|
||||||
{ error },
|
{ error },
|
||||||
{ extension: ext },
|
{ extension: ext },
|
||||||
|
@ -413,10 +405,26 @@ class ComfyApp {
|
||||||
api.init();
|
api.init();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Loads all extensions from the API into the window
|
||||||
|
*/
|
||||||
|
async #loadExtensions() {
|
||||||
|
const extensions = await api.getExtensions();
|
||||||
|
for (const ext of extensions) {
|
||||||
|
try {
|
||||||
|
await import(ext);
|
||||||
|
} catch (error) {
|
||||||
|
console.error("Error loading extension", ext, error);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Set up the app on the page
|
* Set up the app on the page
|
||||||
*/
|
*/
|
||||||
async setup() {
|
async setup() {
|
||||||
|
await this.#loadExtensions();
|
||||||
|
|
||||||
// Create and mount the LiteGraph in the DOM
|
// Create and mount the LiteGraph in the DOM
|
||||||
const canvasEl = Object.assign(document.createElement("canvas"), { id: "graph-canvas" });
|
const canvasEl = Object.assign(document.createElement("canvas"), { id: "graph-canvas" });
|
||||||
document.body.prepend(canvasEl);
|
document.body.prepend(canvasEl);
|
||||||
|
|
Loading…
Reference in New Issue