var myWebSocket; // simple states var isConnected = false; var isModalOpen = false; var isBusy = false; var activeIndex = 0; var queueCollection = []; var statusCollection = []; var COMFTY_URL = "http://127.0.0.1:8188"; var clientId = generateId(); //can be windows name function initializeApp(){ const queueList = localStorage.getItem("queueList"); const statusList = localStorage.getItem("statusList"); if(queueList){ parsedQC = JSON.parse(queueList); parsedQC.forEach((item)=>{ queueCollection.push(JSON.stringify(item, null, 2)); }) statusCollection = JSON.parse(statusList); console.log("statusList:",statusCollection); setNewActiveIndex(); refreshList(); }; } // utils function clearStorage(){ localStorage.removeItem("queueList"); localStorage.removeItem("statusList"); } function generateId(){ return 'xxxxxyxxxxxxxxxxxxyxxxxxxx' .replace(/[xy]/g, function (c) { const r = Math.random() * 16 | 0, v = c == 'x' ? r : (r & 0x3 | 0x8); return v.toString(16); }); } function setNewActiveIndex(){ setCurrentIndex(queueCollection.length); } function setCurrentIndex(ind){ console.log("** activeIndex->",ind); activeIndex = ind; } function toggleConnection(con){ isConnected = con; var cb = document.getElementById("connectBtnContainer"); var fb = document.getElementById("footerBtn"); if(isConnected){ cb.innerHTML = ``; fb.classList.remove("hidden"); }else{ cb.innerHTML = ``; fb.classList.add("hidden"); } } function connectToWS(){ if (myWebSocket !== undefined) { myWebSocket.close() } myWebSocket = new WebSocket(`ws://127.0.0.1:8188/ws?clientId=${clientId}`); myWebSocket.onmessage = function(event) { var leng; if (event.data.size === undefined) { leng = event.data.length } else { leng = event.data.size } console.log("onmessage. size: " + leng + ", content: " + event.data); const message = JSON.parse(event.data); if(!isBusy){ return; } if (message['type'] == 'progress'){ const data = message['data'] if(data['value'] && data['max']){ statusCollection[activeIndex]['progress'] = parseInt(100*(Number(data['value'])/Number(data['max']))); refreshAll(); } }else if (message['type'] == 'executed'){ const data = message['data'] if(data['output'] && data['output']['images'] && data['output']['images'][0] && data['output']['images'][0]['filename']){ statusCollection[activeIndex]['output'] = `${COMFTY_URL}/view?filename=${data['output']['images'][0]['filename']}&subfolder=${data['output']['images'][0]['subfolder']}&type=${data['output']['images'][0]['type']}&rand=${Math.random()}`; refreshAll(); } }else if (message['type'] == 'status'){ const data = message['data'] if(data['status'] && data['status']['exec_info'] && data['status']['exec_info']['queue_remaining'] == 0){ //check next processing statusCollection[activeIndex]['progress'] = 100; setCurrentIndex(activeIndex+1); if(activeIndex < queueCollection.length){ queue_prompt(); }else{ //Done with batch processing! pauseQueues(); } } } } myWebSocket.onopen = function(evt) { toggleConnection(true); console.log("onopen."); }; myWebSocket.onclose = function(evt) { toggleConnection(false); console.log("onclose."); }; myWebSocket.onerror = function(evt) { toggleConnection(false); console.error("Error!"); }; } function sendMsg() { var message = document.getElementById("myMessage").value; myWebSocket.send(message); } function closeConn() { myWebSocket.close(); } // API request async function queue_prompt(){ let prompt = queueCollection[activeIndex]; let payload = `{"client_id":"${clientId}", "prompt":${prompt}}`; const response = await fetch(COMFTY_URL+"/prompt", { method: "POST", mode: "cors", // no-cors, *cors, same-origin credentials: "same-origin", // include, *same-origin, omit headers: {"Content-Type": "application/json"}, // referrerPolicy: "strict-origin-when-cross-origin", // no-referrer, *no-referrer-when-downgrade, origin, origin-when-cross-origin, same-origin, strict-origin, strict-origin-when-cross-origin, unsafe-ur body: payload, // body data type must match "Content-Type" header }); const responseJson = await response.json(); if(response['error']){ //alert and pause pauseQueues(); } statusCollection[activeIndex] = ({"progress":0,"promptId":responseJson['prompt_id'],"output":""}); isBusy = true; } // modal control function toggleModal(con){ isModalOpen = con; var modal = document.getElementById("defaultModal"); if(isModalOpen){ modal.classList.remove('hidden'); }else{ modal.classList.add('hidden'); } } function openModal(){ toggleModal(true); let workflowTxtArea = document.getElementById("workflowTxtArea"); let workflowTitle = document.getElementById("workflowTitle"); if(activeIndex < queueCollection.length){ workflowTxtArea.value = queueCollection[activeIndex]; workflowTitle.innerHTML = `API Format Workflow - Queue No. ${activeIndex + 1}`; }else{ workflowTxtArea.value = ""; workflowTitle.innerHTML = `API Format Workflow - New Queue`; } } function closeModal(){ toggleModal(false); } // prompt creation function processPrompt(){ queue_prompt(queueCollection[activeIndex]) } // Queue list function saveItem(){ const activePrompt = document.getElementById("workflowTxtArea").value; if(!activePrompt){ //error, don't close } closeModal(); if(queueCollection.length == activeIndex){ queueCollection.push(activePrompt); statusCollection.push({"progress":0,"promptId":"","output":""}); }else{ queueCollection[activeIndex] = activePrompt; } refreshAll(); } function removeItem(index){ queueCollection.splice(index,1); statusCollection.splice(index,1); refreshAll(); } function refreshAll(){ refreshLocalStore(); refreshList(); } function refreshLocalStore(){ let t1 = "[" queueCollection.forEach((item,index)=>{ if(index == (queueCollection.length-1)){ t1 += `${item.toString()}` }else{ t1 += `${item.toString()},` } }) localStorage.setItem("queueList",`${t1}]`); //status list let t2 = "[" statusCollection.forEach((item,index)=>{ console.log(item); if(index == (queueCollection.length-1)){ t2 += `${JSON.stringify(item)}` }else{ t2 += `${JSON.stringify(item)},` } }) localStorage.setItem("statusList",`${t2}]`); console.log(`-- saving ${t2}]`); } function refreshList(){ let dom = "" if(isBusy){ queueCollection.forEach((item,index)=>{ dom += `
  • Queue No. ${index + 1}

  • `; }); }else{ queueCollection.forEach((item,index)=>{ dom += `
  • Queue No. ${index + 1}

  • `; }); } var container = document.getElementById("notifContainer"); container.innerHTML = dom; } //Running Queues function runQueues(){ isBusy = true; setCurrentIndex(0); refreshList(); queue_prompt(); } function pauseQueues(){ isBusy = false; setNewActiveIndex(); refreshList(); } function continueQueues(){ isBusy = true; statusCollection.every((item,index)=>{ if(item['progress'] < 100){ setCurrentIndex(index); queue_prompt(); return false; } return true; }); } //Image display function closeImgModal(){ const imgModal = document.getElementById("imgModal"); imgModal.classList.add("hidden"); } function displayImg(imgURL){ const imgContainer = document.getElementById("imgContainer"); imgContainer.innerHTML = `gallery` const imgModal = document.getElementById("imgModal"); imgModal.classList.remove("hidden"); }