worker.mjs (1834B)
1 // Experimental session Worker, not the deployed site's IO protocol. Backend 2 // selection is explicit and immutable for this Worker; switching needs a new one. 3 import {openSession} from './backends.mjs'; 4 let session,busy=false; 5 self.onmessage=async({data:m})=>{ 6 if(busy){postMessage({type:'error',id:m.id,message:'Worker busy'});return;} 7 busy=true; 8 try { 9 if(m.type==='init') { 10 if(session)throw new Error('Already initialized'); 11 session=await openSession(m); 12 postMessage({type:'ready',id:m.id,backend:m.backend,stats:await session.stats()}); 13 } else { 14 if(!session)throw new Error('Worker not initialized'); 15 const start=performance.now(); 16 if(m.type==='text') { 17 const value=await session.runText(m.value); 18 postMessage({type:'text',id:m.id,value,ms:performance.now()-start}); 19 } else if(m.type==='compile') { 20 const names=await session.compile(m.source); 21 postMessage({type:'compiled',id:m.id,names,ms:performance.now()-start}); 22 } else if(m.type==='inspect') { 23 postMessage({type:'result',id:m.id,value:await session.inspect(m.name,m.arguments)}); 24 } else if(m.type==='preview') { 25 const value=await session.preview(m.name,m.limit); 26 postMessage({type:'preview',id:m.id,value,ms:performance.now()-start}); 27 } else if(m.type==='collect') { 28 await session.collect(); 29 postMessage({type:'collected',id:m.id,stats:await session.stats()}); 30 } else if(m.type==='diverge') { 31 postMessage({type:'running',id:m.id}); 32 await session.runTree('212110021100',['212110021100']); 33 throw new Error('Divergence unexpectedly returned'); 34 } else throw new Error('Unknown message'); 35 } 36 } catch(error){postMessage({type:'error',id:m.id,message:String(error)});} 37 finally{busy=false;} 38 };