import {Worker} from 'node:worker_threads';
// Loading the SDK from a cold filesystem is a separate phase from executing
// the bounded CPU task. The worker explicitly announces readiness after SDK init.
export function runWorkerTask(url,workerData,{startupMs=15000,taskMs=5000}={}){
 return new Promise((resolve,reject)=>{
  const worker=new Worker(url,{workerData});let done=false,ready=false;
  const finish=(error,result)=>{if(done)return;done=true;clearTimeout(timer);worker.off('message',onMessage);worker.off('error',onError);worker.off('exit',onExit);error?reject(error):resolve(result);};
  const timeout=phase=>{void worker.terminate().catch(()=>{});finish(Error('Worker '+phase+' timeout'));};
  let timer=setTimeout(()=>timeout('startup'),startupMs);
  const onMessage=message=>{if(message?.type==='ready'){if(ready)return;ready=true;clearTimeout(timer);timer=setTimeout(()=>timeout('task'),taskMs);return;}if(!ready){void worker.terminate().catch(()=>{});finish(Error('Worker result before ready'));return;}message?.ok?finish(null,message):finish(Error(message?.error||'Worker failed'));};
  const onError=error=>finish(error);
  const onExit=code=>finish(Error('Worker exited before result: '+code));
  worker.on('message',onMessage);worker.once('error',onError);worker.once('exit',onExit);
 });
}
