/* COPYRIGHT Esri - https://js.arcgis.com/5.0/LICENSE.txt */
import{remove as e}from"../arrayUtils.js";import{makeHandle as t}from"../handleUtils.js";import s from"../Logger.js";import{throwIfAborted as r}from"../promiseUtils.js";import{open as i}from"../workers.js";class o{constructor(e,t,r,o,h={}){this._mainMethod=t,this._transferLists=r,this._listeners=[],this._promise=i(e,{...h,schedule:o}).then(e=>{if(void 0===this._thread){this._thread=e,this._promise=null,h.hasInitialize&&this.broadcast({},"initialize");for(const e of this._listeners)this._connectListener(e)}else e.close()}),this._promise.catch(t=>s.getLogger("esri.core.workers.WorkerHandle").error(`Failed to initialize ${e} worker: ${t}`))}on(s,r){const i={removed:!1,eventName:s,callback:r,threadHandle:null};return this._listeners.push(i),this._connectListener(i),t(()=>{i.removed=!0,e(this._listeners,i),this._thread&&null!=i.threadHandle&&i.threadHandle.remove()})}[Symbol.dispose](){this.destroy()}destroy(){this._thread&&(this._thread.close(),this._thread=null),this._promise=null,this._listeners.length=0,this._transferLists={}}invoke(e,t,s){return this.invokeMethod(this._mainMethod,e,t,s)}invokeMethod(e,t,s,i){if(this._thread){const r=this._transferLists[e],o=r?r(t):[];return this._thread.invoke(e,t,{transferList:o,signal:s,jobPriority:i})}return this._promise?this._promise.then(()=>(r(s),this.invokeMethod(e,t,s))):Promise.reject(null)}broadcast(e,t){return this._thread?Promise.all(this._thread.broadcast(t,e)).then(h):this._promise?this._promise.then(()=>this.broadcast(e,t)):Promise.reject()}get promise(){return this._promise}_connectListener(e){this._thread&&this._thread.on(e.eventName,e.callback).then(t=>{e.removed||(e.threadHandle=t)})}}function h(){}export{o as WorkerHandle};
