| export function sleep(ms = 100, value) { |
| return new Promise((resolve) => { |
| setTimeout(() => { |
| resolve(value); |
| }, ms); |
| }); |
| } |
| export function addPreconnect(href, crossorigin=false){ |
| const preconnect = document.createElement("link"); |
| preconnect.rel = 'preconnect' |
| preconnect.href = href |
| if(crossorigin) preconnect.crossorigin = '' |
| document.head.appendChild(preconnect); |
| } |
| export function addCss(href, base=true) { |
| const link = document.createElement("link"); |
| link.rel = "stylesheet"; |
| link.type = "text/css"; |
| link.href = base ? "extensions/ComfyUI-Easy-Use/"+href : href; |
| document.head.appendChild(link); |
| } |
|
|
| export function addMeta(name, content) { |
| const meta = document.createElement("meta"); |
| meta.setAttribute("name", name); |
| meta.setAttribute('content', content); |
| document.head.appendChild(meta); |
| } |
|
|
| export function deepEqual(obj1, obj2) { |
| if (typeof obj1 !== typeof obj2) { |
| return false |
| } |
| if (typeof obj1 !== 'object' || obj1 === null || obj2 === null) { |
| return obj1 === obj2 |
| } |
| const keys1 = Object.keys(obj1) |
| const keys2 = Object.keys(obj2) |
| if (keys1.length !== keys2.length) { |
| return false |
| } |
| for (let key of keys1) { |
| if (!deepEqual(obj1[key], obj2[key])) { |
| return false |
| } |
| } |
| return true |
| } |
|
|
|
|
| export function getLocale(){ |
| const locale = localStorage['AGL.Locale'] || localStorage['Comfy.Settings.AGL.Locale'] || 'en-US' |
| return locale |
| } |
|
|
| export function spliceExtension(fileName){ |
| return fileName.substring(0,fileName.lastIndexOf('.')) |
| } |
| export function getExtension(fileName){ |
| return fileName.substring(fileName.lastIndexOf('.') + 1) |
| } |
|
|
| export function formatTime(time, format) { |
| time = typeof (time) === "number" ? time : (time instanceof Date ? time.getTime() : parseInt(time)); |
| if (isNaN(time)) return null; |
| if (typeof (format) !== 'string' || !format) format = 'yyyy-MM-dd hh:mm:ss'; |
| let _time = new Date(time); |
| time = _time.toString().split(/[\s\:]/g).slice(0, -2); |
| time[1] = ['01', '02', '03', '04', '05', '06', '07', '08', '09', '10', '11', '12'][_time.getMonth()]; |
| let _mapping = { |
| MM: 1, |
| dd: 2, |
| yyyy: 3, |
| hh: 4, |
| mm: 5, |
| ss: 6 |
| }; |
| return format.replace(/([Mmdhs]|y{2})\1/g, (key) => time[_mapping[key]]); |
| } |
|
|
|
|
| let origProps = {}; |
| export const findWidgetByName = (node, name) => node.widgets.find((w) => w.name === name); |
|
|
| export const doesInputWithNameExist = (node, name) => node.inputs ? node.inputs.some((input) => input.name === name) : false; |
|
|
| export function updateNodeHeight(node) {node.setSize([node.size[0], node.computeSize()[1]]);} |
|
|
| export function toggleWidget(node, widget, show = false, suffix = "") { |
| if (!widget || doesInputWithNameExist(node, widget.name)) return; |
| if (!origProps[widget.name]) { |
| origProps[widget.name] = { origType: widget.type, origComputeSize: widget.computeSize }; |
| } |
| const origSize = node.size; |
|
|
| widget.type = show ? origProps[widget.name].origType : "easyHidden" + suffix; |
| widget.computeSize = show ? origProps[widget.name].origComputeSize : () => [0, -4]; |
|
|
| widget.linkedWidgets?.forEach(w => toggleWidget(node, w, ":" + widget.name, show)); |
|
|
| const height = show ? Math.max(node.computeSize()[1], origSize[1]) : node.size[1]; |
| node.setSize([node.size[0], height]); |
| } |
|
|
| export function isLocalNetwork(ip) { |
| const localNetworkRanges = [ |
| '192.168.', |
| '10.', |
| '127.', |
| /^172\.((1[6-9]|2[0-9]|3[0-1])\.)/ |
| ]; |
|
|
| return localNetworkRanges.some(range => { |
| if (typeof range === 'string') { |
| return ip.startsWith(range); |
| } else { |
| return range.test(ip); |
| } |
| }); |
| } |
|
|
|
|
| |
| |
| |
| |
| |
| |
| |
| export function accAdd(arg1, arg2) { |
| let r1, r2, s1, s2,max; |
| s1 = typeof arg1 == 'string' ? arg1 : arg1.toString() |
| s2 = typeof arg2 == 'string' ? arg2 : arg2.toString() |
| try { r1 = s1.split(".")[1].length } catch (e) { r1 = 0 } |
| try { r2 = s2.split(".")[1].length } catch (e) { r2 = 0 } |
| max = Math.pow(10, Math.max(r1, r2)) |
| return (arg1 * max + arg2 * max) / max |
| } |
| |
| |
| |
| |
| |
| |
| |
| export function accSub(arg1, arg2) { |
| let r1, r2, max, min,s1,s2; |
| s1 = typeof arg1 == 'string' ? arg1 : arg1.toString() |
| s2 = typeof arg2 == 'string' ? arg2 : arg2.toString() |
| try { r1 = s1.split(".")[1].length } catch (e) { r1 = 0 } |
| try { r2 = s2.split(".")[1].length } catch (e) { r2 = 0 } |
| max = Math.pow(10, Math.max(r1, r2)); |
| |
| min = (r1 >= r2) ? r1 : r2; |
| return ((arg1 * max - arg2 * max) / max).toFixed(min) |
| } |
| |
| |
| |
| |
| |
| |
| |
| export function accMul(arg1, arg2) { |
| let max = 0, s1 = typeof arg1 == 'string' ? arg1 : arg1.toString(), s2 = typeof arg2 == 'string' ? arg2 : arg2.toString(); |
| try { max += s1.split(".")[1].length } catch (e) { } |
| try { max += s2.split(".")[1].length } catch (e) { } |
| return Number(s1.replace(".", "")) * Number(s2.replace(".", "")) / Math.pow(10, max) |
| } |
| |
| |
| |
| |
| |
| |
| |
| export function accDiv(arg1, arg2) { |
| let t1 = 0, t2 = 0, r1, r2,s1 = typeof arg1 == 'string' ? arg1 : arg1.toString(), s2 = typeof arg2 == 'string' ? arg2 : arg2.toString(); |
| try { t1 = s1.toString().split(".")[1].length } catch (e) { } |
| try { t2 = s2.toString().split(".")[1].length } catch (e) { } |
| r1 = Number(s1.toString().replace(".", "")) |
| r2 = Number(s2.toString().replace(".", "")) |
| return (r1 / r2) * Math.pow(10, t2 - t1) |
| } |
| Number.prototype.div = function (arg) { |
| return accDiv(this, arg); |
| } |