@little-bonsai/ingrates
Version:
An isomorphic actor system
3 lines (2 loc) • 2.66 kB
JavaScript
import{customAlphabet as n}from"nanoid";function t(){const n={};return{kill:async function({self:t,parent:e}){const{nickname:s}=n[t];return delete n[t],delete n[e].children[s],!0},get:async function(t){return n[t]||null},set:async function(t){return n[t.self]=Object.assign({},n[t.self],t),!0}}}const e=n("23456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnpqrstuvwxyz",14);function s(){}async function r(n){for(const t of n){const n=await t();if(n)return n}}function a({enhancers:n=[],realizers:c=[t],transports:i=[],addressFn:o=e,onErr:l=console.error}={}){let u={};const f={},m={},p={},g=i.map(n=>n(y,a)),h=c.map(n=>n(a));function d(n,t,{name:e},...s){if(!f[e])return l("StartError",e,"unregistered actor"),null;const r=o();return(p[n]||[]).unshift({special:"ADD_CHILD",nickname:t,child:r}),setTimeout(b,0,r),p[r]=[{type:"Start",src:null},{type:"Mount",src:null}],m[r]=!0,Promise.all(h.map(a=>a.set({children:{},name:e,parent:n,nickname:t,self:r,args:s,state:void 0},f))).then(()=>{m[r]=!1,setTimeout(b,0,r)}).catch(n=>l("StartError",n,{self:r,name:e})),r}function y(n,t,e){const s=Object.assign({src:n},e);return p[t]?p[t].push(s):p[t]=[{type:"Mount",src:null},s],setTimeout(b,0,t),t}async function b(n){if(u[n]||0===p[n].length||m[n])return;u[n]=!0;const t=p[n].shift();"ADD_CHILD"===t.special?await r(h.map(t=>()=>t.get(n,f))).then(n=>Promise.all(h.map(e=>e.set(Object.assign({},n,{children:Object.assign({},n.children,{[t.nickname]:t.child})}))))):await Promise.resolve(g.some(e=>e(n,t))||r(h.map(t=>()=>t.get(n,f))).then(n=>n?async function(n){const{args:t,children:e,msg:r,name:a,parent:c,self:i,state:o}=n,u=O({children:e,msg:r,name:a,parent:c,self:i,state:o});try{const n=await f[a](u,...t);return"function"==typeof n?n(o):n}catch(t){l("RunError",t,{self:i,name:a,msg:r,state:o,parent:c});const e=1,u=5;switch((f[a].supervision||s)(t,n,{escalate:e,restart:2,resume:3,retry:4,stop:u})){case e:y(i,c,{error:t,msg:r});case u:j(c,i)}}}(Object.assign({msg:t},n)).then(t=>Object.assign({},n,{state:void 0===t?n.state:t})).then(n=>Promise.all(h.map(t=>t.set(n)))):null)),setTimeout(b,0,n),u[n]=!1}function j(n,t){h.forEach(e=>e.kill({self:t,parent:n},f))}function O(t){const{self:e}=t,s=j.bind(null,e),r=y.bind(null,e),a=new Proxy(function(){return d(e,o(),...arguments)},{get:(n,t,s)=>d.bind(null,e,t)}),c=Object.assign(t,{dispatch:r,spawn:a,kill:s});return Object.assign(t,n.reduce((n,t)=>Object.assign(t(n),n),c))}return O({register:function(n){f[n.name]=n},self:null,parent:null,mount:n=>{p[n]=[{type:"Mount",src:null}],setTimeout(b,0,n)}})}export{a as createActorSystem,t as createDefaultRAMRealizer,e as makeAddress};
//# sourceMappingURL=index.modern.js.map