Files
AlekPet-ComfyUI_Custom_Node…/IDENode/ide_node.py
T
AlekPet 8a2f21f3d7 implemented IDE Node
Add IDE node, avaiables run Python and JavaScript code inside node
Small fix Preview Text Node
Rewrite code inside utils from function createModalWindow, add themes
modal window.
Add preiview image showing sizes image
2024-07-10 13:19:36 +03:00

140 lines
3.8 KiB
Python

import types
from server import PromptServer
from aiohttp import web
from asyncio import sleep, run
import json
class AnyType(str):
def __ne__(self, __value: object) -> bool:
return False
PY_CODE = AnyType("*")
IDEs_DICT = {}
@PromptServer.instance.routes.post("/alekpet/check_js_complete")
async def check_js_complete(request):
json_data = await request.json()
unique_id = json_data.get("unique_id", None)
result_code = json_data.get("result_code", None)
if (
unique_id is not None
and unique_id in IDEs_DICT
and result_code
and result_code is not None
):
IDEs_DICT[unique_id].js_result = result_code
IDEs_DICT[unique_id].js_complete = True
return web.json_response({"status": "Ok"})
return web.json_response({"status": "Error"})
async def wait_js_complete(unique_id, time_out=40):
for _ in range(time_out):
if (
hasattr(IDEs_DICT[unique_id], "js_complete")
and IDEs_DICT[unique_id].js_complete == True
and IDEs_DICT[unique_id].js_result is not None
):
IDEs_DICT[unique_id].js_complete = False
return True
await sleep(0.1)
return False
class IDENode:
def __init__(self):
self.js_complete = False
self.js_result = None
@classmethod
def INPUT_TYPES(s):
return {
"optional": {
"var1": (PY_CODE, {"default": ""}),
"var2": (PY_CODE, {"default": ""}),
"var3": (PY_CODE, {"default": ""}),
},
"required": {
"language": (
(["python", "javascript"]),
{"default": "python"},
),
"pycode": (
"PYCODE",
{
"default": """# !!! Attention, do not insert unverified code !!!
# ---- Example code ----
# Globals inputs variables: var1, var2, var3, user variables ...
from time import strftime
def runCode():
nowDataTime = strftime("%Y-%m-%d %H:%M:%S")
return f"Hello ComfyUI with us today {nowDataTime}!"
result = runCode()"""
},
),
},
"hidden": {"unique_id": "UNIQUE_ID"},
}
RETURN_TYPES = (PY_CODE,)
RETURN_NAMES = ("any",)
FUNCTION = "exec_py"
CATEGORY = "AlekPet Nodes/experiments"
def typesCheck(self, v):
result = None
if isinstance(v, str):
result = f'"{v}"'
elif isinstance(
v, (float, int, complex, bool, list, dict, tuple, range, set, frozenset)
):
result = v
elif v is None:
result = f'""'
return result
def exec_py(self, pycode, language, unique_id, **kwargs):
if unique_id not in IDEs_DICT:
IDEs_DICT[unique_id] = self
if language == "python":
# Set variable correct type
pycode_ = ""
for perem in kwargs:
kwargs[perem] = self.typesCheck(kwargs[perem])
pycode_ += f"{perem} = {kwargs[perem]}\n"
pycode_ += pycode
my_namespace = types.SimpleNamespace()
exec(pycode_, my_namespace.__dict__)
return (my_namespace.result,)
else:
IDEs_DICT[unique_id].js_complete = False
IDEs_DICT[unique_id].js_result = None
PromptServer.instance.send_sync(
"alekpet_js_result",
{"unique_id": unique_id, "vars": json.dumps(kwargs)},
)
if not run(wait_js_complete(unique_id)):
print(f"IDENode_{unique_id}: Failed to get data!")
else:
print(f"IDENode_{unique_id}: Data received successful!")
print(IDEs_DICT[unique_id].js_result)
return (IDEs_DICT[unique_id].js_result,)