"use strict";self.inputPort=null,self.jobQueue=[],self.jobWorkers=[],self.sentBlobs=[],self.sentBuffers=[],self.importedScripts=[],self.lastBroadcasts=new Map;class JobWorker{constructor(e,s){this._port=e,this._number=s,this._isReady=!1,this._isBusy=!1,this._port.onmessage=e=>this._OnMessage(e.data)}ImportScripts(e){this._port.postMessage({type:"_import_scripts",scripts:e})}SendBlob(e,s){this._port.postMessage({type:"_send_blob",blob:e,id:s})}SendBuffer(e,s){this._port.postMessage({type:"_send_buffer",buffer:e,id:s})}SendJob(e){if(this._isBusy||!this._isReady)throw new Error("cannot take job");this._isBusy=!0,this._port.postMessage(e,e.transferables)}_InitBroadcast(e){this._port.postMessage(e,e.transferables)}SendReady(){this._port.postMessage({type:"_ready"})}IsReady(){return this._isReady}_OnReady(){this._isReady=!0,this.MaybeStartNextJob()}IsBusy(){return this._isBusy}GetNumber(){return this._number}_OnMessage(e){const s=e.type;switch(s){case"ready":return void this._OnReady();case"done":return void this._OnJobDone();default:return void console.error("unknown message from worker '"+s+"'")}}_OnJobDone(){this._isBusy=!1,this.MaybeStartNextJob()}MaybeStartNextJob(){if(this._isBusy||!this._isReady)return;const e=this._FindAvailableJob();if(-1===e)return;const s=self.jobQueue[e];s.isBroadcast?(s.doneFlags[this._number]=!0,s.doneFlags.every((e=>e))&&self.jobQueue.splice(e,1)):self.jobQueue.splice(e,1),this.SendJob(s)}_FindAvailableJob(){for(let e=0,s=self.jobQueue.length;e{const s=e.data,t=s.type;"_init"===t?(self.inputPort=s["in-port"],self.inputPort.onmessage=OnInputPortMessage):"_addJobWorker"===t&&AddJobWorker(s.port)}));