UNPKG

@xuda.io/runtime-bundle

Version:

The Xuda Runtime Bundle refers to a collection of scripts and libraries packaged together to provide the necessary runtime environment for executing plugins or components in the Xuda platform.

195 lines (166 loc) • 4.45 kB
console.log("================================================="); console.log(" Xuda UI Worker started..." + new Date().getTime()); console.log("================================================="); var UI_WORKER_OBJ = { jobs: [], num: 9000 }; const init_queue = async function () { let last_job_in_queue = 0; const job_iterator = async function () { let from_job_num_to_run = last_job_in_queue; last_job_in_queue = UI_WORKER_OBJ.num - from_job_num_to_run; if ( typeof UI_WORKER_OBJ.stat === "undefined" || UI_WORKER_OBJ.stat === "undefined" || UI_WORKER_OBJ.stat === null ) { // idle this.attempt = 0; if (UI_WORKER_OBJ.jobs.length) { // clearInterval(this._interval); for await (const [key, val] of Object.entries(UI_WORKER_OBJ.jobs)) { if (val.job_num < from_job_num_to_run) continue; if (val.stat) { break; } if (!UI_WORKER_OBJ.jobs[Number(key)] || val.job_num === 9999999) continue; // if (val.dsSessionP && !_session.DS_GLB[val.dsSessionP]) { // delete_job(val.job_num); // continue; // } await execute(val); } } } else { //busy this.attempt++; } }; let interval = setInterval(job_iterator, 1); }; const add_to_queue = async function (params) { var obj = ({ SESSION_ID, source, functionP, paramsP, calling_job, xu_ui_id, dsSession, calling_trigger_prop, job_num: UI_WORKER_OBJ.num, } = params); if (functionP === "execute_xu_all_attributes") { const queue_key = source + "_" + functionP + "_" + (xu_ui_id || "") + "_" + (paramsP?.fields_arr?.toString() || ""); obj.queue_key = queue_key; let exist_job = UI_WORKER_OBJ.jobs.find((e) => { if (e.queue_key === queue_key) { return e; } }); if (exist_job) { exist_job.paramsP = paramsP; exist_job.calling_trigger_prop = calling_trigger_prop; return; } } if (calling_job) { var job_index = find_job_index(calling_job); if (job_index === null || typeof job_index === "undefined") return; try { if (!UI_WORKER_OBJ.jobs[job_index].splice_count) { UI_WORKER_OBJ.jobs[job_index].splice_count = 0; } UI_WORKER_OBJ.jobs[job_index].splice_count++; UI_WORKER_OBJ.jobs.splice( job_index + UI_WORKER_OBJ.jobs[job_index].splice_count, 0, obj ); // } } catch (e) { console.error("bug"); } } else { UI_WORKER_OBJ.jobs.push(obj); } UI_WORKER_OBJ.num++; return UI_WORKER_OBJ.num - 1; }; const delete_job = async function (jobNoP) { var job_index = find_job_index(jobNoP); if (!UI_WORKER_OBJ.jobs[job_index]) { UI_WORKER_OBJ.stat = null; return; } var dsSession = UI_WORKER_OBJ.jobs[job_index].dsSession; // TBD // if ( // dsSession && // ds_obj?.loops_limit && // ds_obj?.loops_count < ds_obj?.loops_limit - 1 // ) { // return; // } UI_WORKER_OBJ.stat = null; UI_WORKER_OBJ.jobs.splice(job_index, 1); }; const find_job_index = function (jobNoP) { var ret = null; if (!UI_WORKER_OBJ) return ret; for (let [key, val] of Object.entries(UI_WORKER_OBJ.jobs)) { if (val && val.job_num == jobNoP) { ret = Number(key); break; } } return ret; }; const execute = async function (queue_obj) { try { var job_index = find_job_index(queue_obj.job_num); if (UI_WORKER_OBJ.jobs?.[job_index]?.stat === "busy") { if (queue_obj.jobNoP) UI_WORKER_OBJ.stat = job_index; return; } if (queue_obj.jobNoP && !UI_WORKER_OBJ.jobs[job_index]) { UI_WORKER_OBJ.stat = null; return; } if (queue_obj.jobNoP) UI_WORKER_OBJ.stat = job_index; if (UI_WORKER_OBJ.jobs[job_index]) { UI_WORKER_OBJ.jobs[job_index].stat = "busy"; } postMessage(queue_obj); } catch (error) { debugger; } }; self.addEventListener( "message", async function (e) { switch (e.data.method) { case "init": { init_queue(); break; } case "add_to_queue": { add_to_queue(e.data.params); break; } case "delete_job": { delete_job(e.data.params.job_num); break; } default: break; } }, false );