import { app } from "../../scripts/app.js"; import { api } from "../../scripts/api.js"; export function show_message(msg) { app.ui.dialog.show(msg); app.ui.dialog.element.style.zIndex = 10010; } export async function sleep(ms) { return new Promise(resolve => setTimeout(resolve, ms)); } export function rebootAPI() { if (confirm("Are you sure you'd like to reboot the server?")) { try { api.fetchApi("/manager/reboot"); } catch(exception) { } return true; } return false; } export var manager_instance = null; export function setManagerInstance(obj) { manager_instance = obj; } function isValidURL(url) { if(url.includes('&')) return false; const pattern = /^(https?|ftp):\/\/[^\s/$.?#].[^\s]*$/; return pattern.test(url); } export async function install_pip(packages) { if(packages.includes('&')) app.ui.dialog.show(`Invalid PIP package enumeration: '${packages}'`); const res = await api.fetchApi("/customnode/install/pip", { method: "POST", body: packages, }); if(res.status == 403) { show_message('This action is not allowed with this security level configuration.'); return; } if(res.status == 200) { show_message(`PIP package installation is processed.
To apply the pip packages, please click the button in ComfyUI.`); const rebootButton = document.getElementById('cm-reboot-button3'); const self = this; rebootButton.addEventListener("click", rebootAPI); } else { show_message(`Failed to install '${packages}'
See terminal log.`); } } export async function install_via_git_url(url, manager_dialog) { if(!url) { return; } if(!isValidURL(url)) { show_message(`Invalid Git url '${url}'`); return; } show_message(`Wait...

Installing '${url}'`); const res = await api.fetchApi("/customnode/install/git_url", { method: "POST", body: url, }); if(res.status == 403) { show_message('This action is not allowed with this security level configuration.'); return; } if(res.status == 200) { show_message(`'${url}' is installed
To apply the installed custom node, please ComfyUI.`); const rebootButton = document.getElementById('cm-reboot-button4'); const self = this; rebootButton.addEventListener("click", function() { if(rebootAPI()) { manager_dialog.close(); } }); } else { show_message(`Failed to install '${url}'
See terminal log.`); } } export async function free_models() { let res = await api.fetchApi(`/free`, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: '{"unload_models": true}' }); if(res.status == 200) { show_message('Models have been unloaded.') } else { show_message('Unloading of models failed.

Installed ComfyUI may be an outdated version.') } } export function md5(inputString) { const hc = '0123456789abcdef'; const rh = n => {let j,s='';for(j=0;j<=3;j++) s+=hc.charAt((n>>(j*8+4))&0x0F)+hc.charAt((n>>(j*8))&0x0F);return s;} const ad = (x,y) => {let l=(x&0xFFFF)+(y&0xFFFF);let m=(x>>16)+(y>>16)+(l>>16);return (m<<16)|(l&0xFFFF);} const rl = (n,c) => (n<>>(32-c)); const cm = (q,a,b,x,s,t) => ad(rl(ad(ad(a,q),ad(x,t)),s),b); const ff = (a,b,c,d,x,s,t) => cm((b&c)|((~b)&d),a,b,x,s,t); const gg = (a,b,c,d,x,s,t) => cm((b&d)|(c&(~d)),a,b,x,s,t); const hh = (a,b,c,d,x,s,t) => cm(b^c^d,a,b,x,s,t); const ii = (a,b,c,d,x,s,t) => cm(c^(b|(~d)),a,b,x,s,t); const sb = x => { let i;const nblk=((x.length+8)>>6)+1;const blks=[];for(i=0;i>2]|=x.charCodeAt(i)<<((i%4)*8);} blks[i>>2]|=0x80<<((i%4)*8);blks[nblk*16-2]=x.length*8;return blks; } let i,x=sb(inputString),a=1732584193,b=-271733879,c=-1732584194,d=271733878,olda,oldb,oldc,oldd; for(i=0;i { err = e; }); if (!res) { return { status: 400, error: new Error("Unknown Error") } } const { status, statusText } = res; if (err) { return { status, error: err } } if (status !== 200) { return { status, error: new Error(statusText || "Unknown Error") } } const data = await res.json(); if (!data) { return { status, error: new Error(`Failed to load data: ${route}`) } } return { status, data } } export const icons = { search: '', extensions: '', conflicts: '', passed: '', download: '' }