tricu

An interpreted language for exploring Tree Calculus
Log | Files | Refs | README | LICENSE

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 };