const e=require(`../../constants/vite.constants.cjs`),t=require(`../crypto-keys/keys.cjs`),n=require(`../utxo/Utxo.cjs`),r=require(`../../webworker/worker.registry.cjs`),i=require(`../../webworker/performTaskWithWorker.cjs`),a=require(`../../webworker/utxoWorker/utxoWorker.types.cjs`);var o=16,s=class{NUM_WORKERS;NUM_WORKERS_BATCH_PROCESS;constructor(){e.isNode?(this.NUM_WORKERS=1,this.NUM_WORKERS_BATCH_PROCESS=1):(this.NUM_WORKERS=3,this.NUM_WORKERS_BATCH_PROCESS=Math.min(o,Math.ceil(navigator.deviceMemory??4)))}async createUtxoPromise(e){return await i.performTaskWithWorker({type:r.WorkerVariant.UTXO,payload:e})}async batchFilterUtxosWithNullifier(e,r){let i=this.sliceArrayIntoParts(e,this.NUM_WORKERS).map(e=>this.createUtxoPromise({type:a.UtxoWorkerActionType.BATCH_FILTER_UTXOS_WITH_NULLIFIER,data:{utxos:e.map(e=>e.getConstructableParams()),nullifiers:r}})),o=await Promise.all(i);return o.forEach(e=>{t.stealthPairCacheDevice.mergeWithSerialized(e.stealthPairCache),t.stealthAddressCacheDevice.mergeWithSerialized(e.stealthAddressCache)}),o.flatMap(e=>e.utxoConstructors).map(e=>new n.Utxo(e))}async buildBatchProcess(e,t,r){let i=this.sliceArrayIntoParts(e,this.NUM_WORKERS).map(e=>this.createUtxoPromise({type:a.UtxoWorkerActionType.BUILD_UTXOS,data:{signature:t.getSignature(),encryptedOutputs:e,chainId:r}}));return(await Promise.all(i)).flat().map(e=>new n.Utxo(e))}sliceArrayIntoParts(e,t){let n=Math.ceil(e.length/t);return Array.from({length:t},(t,r)=>e.slice(n*r,n*(r+1))).filter(e=>e.length>0)}findLastOutput(e,t){let n=t;return e.forEach(e=>{e!==t&&(n=e)}),n}async batchProcess(e,t,n,r){let i=this.sliceArrayIntoParts(e,this.NUM_WORKERS_BATCH_PROCESS),o=n.getSignature(),s=i.map(e=>{let n={type:a.UtxoWorkerActionType.DECIPHER_OUTPUTS,data:{encryptedOutputs:e,lastOutput:t,signature:o,chainId:r}};return this.createUtxoPromise(n)}),c=await Promise.all(s),l=c.map(({additionalEncryptedOutputs:e})=>e).flat(),u=new Set;return{additionalEncryptedOutputs:l.reduce((e,t)=>u.has(t.value)?e:(u.add(t.value),[...e,t]),[]),lastOutput:this.findLastOutput(c.map(e=>e.lastOutput),t)??t}}};exports.MultiThreadedUtxoUtils=s;