@lite-fsm/core 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js ADDED
@@ -0,0 +1 @@
1
+ var vt=Object.defineProperty;var kt=(e,t,n)=>t in e?vt(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n;var _e=(e,t,n)=>kt(e,typeof t!="symbol"?t+"":t,n);var Y=Symbol.for("lite-fsm.late-dispatch"),Z=Symbol.for("lite-fsm.registerBagDispose");function ee(...e){return e.length===0?t=>t:e.reduce((t,n)=>(...r)=>t(n(...r)))}var ge="*",Nt="@@lite-fsm/",be="@@lite-fsm/HYDRATE",Ot="__liteFsmAllowVoidReducer",X="Reducer returned undefined. Return the next state, or use immerMiddleware to mutate draft state without return.",te=e=>typeof e=="function"&&Ot in e,T=class extends Error{constructor(n,r){super(r);_e(this,"code",n);this.name="LiteFsmError"}},fe=(e,t)=>{if(typeof e!="string"||e.length===0)throw new T("LITE_FSM_INVALID_GENERATED_ID",`[lite-fsm] generate${t==="actor"?"Actor":"Group"}Id must return a non-empty string.`);return e},ne=e=>typeof e.type=="string"&&e.type.startsWith(Nt),O=globalThis.process?.env?.NODE_ENV!=="production",H=e=>{if(e===null||typeof e!="object"||Object.isFrozen(e))return e;Object.freeze(e);for(let t of Object.keys(e))H(Reflect.get(e,t));return e};var $=Object.freeze({}),Lt=new Set(["__RESOLVED","__REJECTED","__CANCELLED"]),Bt=["senderActorId","senderGroupId","senderGroupTag"],Ft=["actorId","groupId","groupTag"],V=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),N=e=>e!==null&&typeof e=="object"&&!Array.isArray(e),j=e=>typeof e=="string"&&Lt.has(e),Ne=e=>N(e)&&typeof e.state=="string"&&N(e.context),q=e=>Object.freeze({actorId:e.actorId,groupId:e.groupId,groupTag:e.groupTag}),J=e=>V(e.config,"__INIT"),oe=(e,t,n,r)=>{let o=e[t]?.[n];if(o!==void 0)return o;if(!(r&&t==="__INIT"))return e["*"]?.[n]},Oe=(e,t,n,r)=>{if(n==="__INIT")throw new T("LITE_FSM_INVALID_ACTOR_CONFIG",`[lite-fsm] actor '${e}' remained in __INIT after spawn.`);if(!j(n)&&!r(t,n))throw new T("LITE_FSM_INVALID_ACTOR_CONFIG",`[lite-fsm] actor '${e}' has invalid state.`)},Le=(e,t)=>{if(t.initialState!=="__INIT")throw new T("LITE_FSM_INVALID_ACTOR_CONFIG",`[lite-fsm] actor template '${e}' must use __INIT as initialState.`);if(t.persistence!==void 0&&t.persistence!=="runtime"&&t.persistence!=="snapshot")throw new T("LITE_FSM_INVALID_ACTOR_CONFIG",`[lite-fsm] actor template '${e}' has invalid persistence mode.`);if(t.persistence!=="snapshot"&&(t.hydrate||t.dehydrate))throw new T("LITE_FSM_INVALID_ACTOR_CONFIG",`[lite-fsm] actor template '${e}' cannot define hydrate/dehydrate hooks without snapshot persistence.`);let n=t.config;for(let r of Object.keys(n)){if(j(r)||r.startsWith("__")&&r!=="__INIT")throw new T("LITE_FSM_INVALID_ACTOR_CONFIG",`[lite-fsm] actor template '${e}' has reserved state '${r}'.`);for(let o of Object.values(n[r])){if(r==="__INIT"&&o===null)throw new T("LITE_FSM_INVALID_ACTOR_CONFIG",`[lite-fsm] actor template '${e}' cannot spawn with a null __INIT target.`);if(o==="__INIT"||typeof o=="string"&&o.startsWith("__")&&!j(o))throw new T("LITE_FSM_INVALID_ACTOR_CONFIG",`[lite-fsm] actor template '${e}' has invalid target '${String(o)}'.`)}}},Be=e=>{let t={};return e&&(e.actorId!==void 0&&(t.actorId=e.actorId),e.groupId!==void 0&&(t.groupId=e.groupId),e.groupTag!==void 0&&(t.groupTag=e.groupTag),e.senderActorId!==void 0&&(t.senderActorId=e.senderActorId),e.senderGroupId!==void 0&&(t.senderGroupId=e.senderGroupId),e.senderGroupTag!==void 0&&(t.senderGroupTag=e.senderGroupTag)),t},Fe=e=>{let t=Be(e);for(let n of Bt)delete t[n];return t},Ve=e=>{let t=Be(e);for(let n of Ft)delete t[n];return t},me=(e,t)=>{if(Object.keys(t).length===0){let{meta:n,...r}=e;return r}return{...e,meta:t}},ye=e=>Array.isArray(e)?e:[e],le=e=>[...new Set(e)],Ge=e=>e?e.actorId!==void 0?{scope:"actor",targetSet:le(ye(e.actorId))}:e.groupId!==void 0?{scope:"group",targetSet:le(ye(e.groupId))}:e.groupTag!==void 0?{scope:"tag",targetSet:le(ye(e.groupTag))}:{scope:"unscoped",targetSet:[]}:{scope:"unscoped",targetSet:[]},W="#",Se=e=>{let t=e.indexOf(W);return t===-1?{owner:null,tail:e}:{owner:e.slice(0,t),tail:e.slice(t+1)}},ve=(e,t)=>{let{owner:n}=Se(e);return t===void 0?n===null:n===t},Q=e=>({actor:e.actor,groupByTag:new Map(e.groupByTag)}),Ke=(e,t)=>{let n=Q(e);n.actor=Math.max(n.actor,t.actor);for(let[r,o]of t.groupByTag)n.groupByTag.set(r,Math.max(n.groupByTag.get(r)??0,o));return n},ke=e=>{let t=e.lastIndexOf("/");if(t<0)return null;let n=Number(e.slice(t+1));return Number.isInteger(n)&&n>=0?n:null},He=(e,t,n,r)=>{if(ve(t,r)){let o=ke(Se(t).tail);o!==null&&(e.actor=Math.max(e.actor,o+1))}if(ve(n,r)){let o=Se(n).tail,c=o.lastIndexOf("/"),a=ke(o);if(a===null)return;let i=o.slice(0,c);e.groupByTag.set(i,Math.max(e.groupByTag.get(i)??0,a+1))}};var re=(e,t={})=>{let n=J(e);return{config:e.config,transition:(r,o)=>{if(n&&!t.allowActorTemplate)throw new T("LITE_FSM_STANDALONE_ACTOR_TEMPLATE","[lite-fsm] actor templates can only be used inside MachineManager.");let c=e.config,a=oe(c,r.state,o.type,n);if(a===void 0)return r;if(e.reducer){let u=a||r.state,l=e.reducer(r,o,{nextState:u,config:e.config});if(l===void 0){if(t.allowVoidReducer?.())return r;throw new Error(X)}return l}let i="payload"in o?o.payload:{};return{state:a||r.state,context:{...r.context,...i}}},invokeEffect:async(r,o,c)=>{if(!e.effects)return;let a=e.effects;if(r!==o&&a[o]){let i=a[o];await i?.(c)}else if(a[ge]){let i=a[ge];await i?.(c)}}}},Vt=(e,t={})=>{let n,r=[],o=!1,c=y=>{o=!!y?.some(te)},a=re(e,{allowVoidReducer:()=>o}),i=[],u={context:e.initialContext,state:e.initialState};O&&H(u);let l=(y,M)=>a.transition(y,M),A=y=>{l=y(l)},R=y=>new Promise((M,D)=>{let _=m((G,K,P)=>{try{y(P)&&(_(),M(!0))}catch(v){_(),D(v)}})}),p=(y,M,D)=>{a.invokeEffect(y.state,M.state,{...t.dependencies,transition:n,action:D,condition:R}).catch(_=>{t?.onError?.(_)})},m=y=>(i.push(y),()=>{i=i.filter(M=>M!==y)}),b=(y,M,D)=>{i.forEach(_=>_(y,M,D))},f=y=>{let M=u,D=l(M,y);if(D===void 0)throw new Error(X);return u=D,O&&H(u),b(M,u,y),y},S=y=>{if(c(y),!y?.length)return f;let M=y.map(D=>D({getState:E,transition:_=>n(_),replaceReducer:A,onTransition:m,condition:R}));return ee(...M)(f)},h=S(r);n=y=>{let M=u,D=h(y);return p(M,u,D),D};let E=()=>u;return{transition:n,getState:E,onTransition:m,addMiddleware:(...y)=>{r=[...r,...y],h=S(r)}}},Gt=(e={})=>({create:t=>Vt(t,e)});var je=e=>{let{sidecar:t,machines:n,domainKeys:r,refs:o,onTransition:c,onError:a}=e,i=(f,S,h)=>{t.actorById.get(f)?.bag.set(S,h)},u=(f,S)=>{t.actorById.get(f)?.bag.delete(S)},l=(f,S)=>new Promise((h,E)=>{let x=()=>S!==void 0&&!t.actorById.has(S.actorId),y=()=>new T("LITE_FSM_ACTOR_DISPOSED","Actor was disposed before condition resolved.");if(x())return E(y());let M,D=()=>{_(),S&&M&&u(S.actorId,M)},_=c((G,K,P)=>{if(!ne(P)){if(x())return _();try{if(!f(P))return;if(x())return _();D(),h(!0)}catch(v){D(),E(v)}}});S&&(M=Symbol("condition"),i(S.actorId,M,()=>{_(),E(y())}))}),A=f=>l(f),R=f=>{let S=(h=>o.transition(h,{sender:f}));return S.unscoped=h=>o.transition(h,{sender:f,forceUnscoped:!0}),S.actor=(h,E)=>o.transition({...E,meta:{actorId:h}},{sender:f}),S.group=(h,E)=>o.transition({...E,meta:{groupId:h}},{sender:f}),S.tag=(h,E)=>o.transition({...E,meta:{groupTag:h}},{sender:f}),S},p=(f,S,h)=>{let E=x=>o.transition(x);for(let x of r){let y=n[x],M=f[x],D=S[x];y.invokeEffect(M.state,D.state,{...o.userDeps,transition:E,action:h,condition:A}).catch(_=>a?.(_))}},m=(f,S,h,E)=>{for(let x of E){let{actorId:y,groupId:M,groupTag:D}=x.meta,_=n[x.templateKey],G=f[x.templateKey],K=S[x.templateKey],P=G?.[y],v=K?.[y];if(!v)continue;let F={actorId:y,groupId:M,groupTag:D};_.invokeEffect(P?.state??"__INIT",v.state,{...o.userDeps,transition:R(F),action:h,condition:U=>l(U,F),self:F,[Z]:i}).catch(U=>a?.(U))}};return{condition:A,invokeEffects:(f,S,h,E)=>{p(f,S,h),m(f,S,h,E)}}};var $e=(e,t)=>({normalizeOpts:e,countersBase:t,pendingSpawned:[],pendingDelivered:[],pendingDeleted:[],touchedActorRecords:new Map,effectsTargets:[]}),ze=e=>(e.countersDraft||(e.countersDraft=Q(e.countersBase)),e.countersDraft),We=(e,t,n)=>e?`${e}${W}${t}/${n}`:`${t}/${n}`,Ue=(e,t,n,r,o)=>{let c=ze(e),a=c.groupByTag.get(t)??0;c.groupByTag.set(t,a+1);let i=r.generateGroupId?fe(r.generateGroupId({templateKey:t,groupTag:t,counter:a,originId:r.originId,action:n}),"group"):We(r.originId,t,a);if(o(i))throw new T("LITE_FSM_INVALID_GENERATED_ID",`[lite-fsm] groupId '${i}' is already in use.`);return i},Ye=(e,t,n,r,o,c)=>{let a=ze(e),i=a.actor;a.actor=i+1;let u=o.generateActorId?fe(o.generateActorId({templateKey:t,groupTag:n,counter:i,originId:o.originId,action:r}),"actor"):We(o.originId,t,i);if(c(u))throw new T("LITE_FSM_INVALID_GENERATED_ID",`[lite-fsm] actorId '${u}' is already in use.`);return u},ae=(e,t,n)=>{let r=e.touchedActorRecords.get(n);if(r)return{root:t,record:r};let o=t[n],c=o===$?{}:{...o},a={...t,[n]:c};return e.touchedActorRecords.set(n,c),{root:a,record:c}};var Kt=e=>{if(!N(e))throw new T("LITE_FSM_INVALID_HYDRATION_ENVELOPE","[lite-fsm] hydrate: snapshot must be an object envelope.");if(!N(e.machines))throw new T("LITE_FSM_INVALID_HYDRATION_ENVELOPE","[lite-fsm] hydrate: snapshot.machines must be an object.");return{schemaVersion:typeof e.schemaVersion=="number"?e.schemaVersion:void 0,machines:e.machines}},Ae=e=>({state:e.state,context:e.context}),Ht=e=>N(e)&&V(e,"snapshot")?{snapshot:e.snapshot,meta:e.meta}:{snapshot:e},Xe=(e,t)=>N(e)?{...e,meta:t}:e,jt=(e,t,n)=>e&&N(t)&&t.state===e.state&&t.context===e.context?e:Xe(t,n),$t=(e,t,n,r,o)=>{if(!N(n))throw new T("LITE_FSM_INVALID_ACTOR_SLICE",`Invalid actor record '${t}'.`);let c=e[t],i=o.config[t].hydrate,u=r==="replace"?{}:{...c},l=!1;for(let[A,R]of Object.entries(n)){let p=c[A],m=Ht(R),b=i?i(p?Ae(p):void 0,m.snapshot,{strategy:r}):m.snapshot,f=jt(p,b,p?.meta??m.meta);c[A]!==f&&(l=!0),u[A]=f}if(r==="replace"&&!l){for(let A of Object.keys(c))if(!(A in u)){l=!0;break}}return{record:l?u:c,changed:l}},se=(e,t,n,r,o,c="commit")=>{let a=Kt(t);c==="commit"&&a.schemaVersion!==o.schemaVersion&&o.onSchemaVersionMismatch?.(a.schemaVersion,o.schemaVersion);let i,u=[];for(let l of Object.keys(a.machines)){if(!V(o.config,l)){c==="commit"&&(O&&console.warn(`[lite-fsm] hydrate: unknown machine key '${l}', skipped.`),o.onUnknownMachineKey?.(l,r));continue}let A=l;if(o.runtimeActorTemplateKeys.includes(A)){O&&console.warn(`[lite-fsm] hydrate: runtime actor template '${A}' was skipped \u2014 runtime actor templates do not participate in hydrate/dehydrate.`);continue}if(o.snapshotActorTemplateKeys.includes(A)){let f=$t(e,A,a.machines[l],n,o);if(!f.changed)continue;i=i??{...e},i[A]=f.record,u.push(A);continue}let R=e[A],p=a.machines[l],m=o.config[A].hydrate,b=m?m(R,p,{strategy:n}):p;b!==R&&(i=i??{...e},i[A]=b)}return{nextState:i??e,changedActorTemplateKeys:u}},qe=(e,t,n,r,o,c,a,i)=>{let u=i?.machines;if(u)for(let p of u){if(!V(t,p))throw new T("LITE_FSM_INVALID_HYDRATION_ENVELOPE",`[lite-fsm] dehydrate: unknown machine key '${p}'.`);if(o.includes(p))throw new T("LITE_FSM_INVALID_HYDRATION_ENVELOPE",`[lite-fsm] dehydrate: runtime actor template '${p}' cannot be dehydrated.`)}let l=p=>{let m=e[p];if(!N(m))throw new T("LITE_FSM_INVALID_ACTOR_SLICE",`Invalid actor record '${p}'.`);let f=t[p].dehydrate,S={};for(let[h,E]of Object.entries(m)){let x=n.actorById.get(h);if(!x)throw new T("LITE_FSM_INVALID_ACTOR_SLICE",`Actor '${h}' has no runtime identity.`);S[h]={snapshot:f?f(Ae(E)):Ae(E),meta:x.meta}}return S},A=u??[...c,...r],R={};for(let p of A){if(r.includes(p)){R[p]=l(p);continue}let b=t[p].dehydrate;R[p]=b?b(e[p]):e[p]}return{schemaVersion:a,machines:R}};var Je=(e,t,n)=>{let r=new Map,o=[];for(let a of e){let i=!1;for(let[u,l]of Object.entries(t(a)))if(!(!l||!n(u)))for(let A of Object.keys(l)){i=!0;let R=r.get(A);R||r.set(A,R=new Set),R.add(a)}i||o.push(a)}let c=new Map;for(let[a,i]of r)c.set(a,[...i]);return{index:c,keysWithoutEdges:o}},zt=(e,t,n)=>{let r=new Map;for(let o of e){let c=n(o);for(let a of Object.keys(t(o).__INIT??{})){let i=r.get(a);i||r.set(a,i=new Map);let u=i.get(c);u||i.set(c,u=[]),u.push(o)}}return r},Qe=(e,t,n,r)=>{let o=u=>e[u].config,c=Je(n,o,()=>!0),a=Je(t,o,u=>u!=="__INIT"),i=zt(t,o,r);return{domainReduceIndex:c.index,domainAlwaysReduce:c.keysWithoutEdges,actorReduceIndex:a.index,actorSpawnIndex:i}},Ze=e=>{let t=a=>e[a],n=a=>t(a).config;return{groupTagForTemplate:a=>t(a).groupTag??a,hasActorTransition:(a,i,u)=>oe(n(a),i,u.type,!0)!==void 0,isPublicActorState:(a,i)=>i==="__INIT"||j(i)?!1:V(t(a).config,i)}};var et=e=>{if(ne(e))throw new Error(`[lite-fsm] reserved system action '${e.type}' cannot be dispatched.`)},tt=e=>{let{sidecar:t}=e,n=(o,{sender:c,forceUnscoped:a=!1}={})=>{if(!c&&!a&&!("meta"in o))return o;if(c&&!t.actorById.has(c.actorId))return Y;let i=Fe(o.meta);return c&&(i.senderActorId=c.actorId,i.senderGroupId=c.groupId,i.senderGroupTag=c.groupTag),a?me(o,Ve(i)):(c&&i.actorId===void 0&&i.groupId===void 0&&i.groupTag===void 0&&(i.groupId=c.groupId,i.groupTag=c.groupTag),me(o,i))};return{normalizeAction:n,applyPostNormalize:(o,c)=>{let a=n(c,o.normalizeOpts);a!==Y&&(o.committed=a)}}};var Wt=(e,t)=>{let n=[];for(let r of t){let o=e.groupIdsByTag.get(r);if(o)for(let c of o)n.push(c)}return n},Ut=e=>{let t=new Map;for(let n of e){let r=t.get(n.templateKey);r?r.push(n):t.set(n.templateKey,[n])}return t},nt=(e,t,n,r)=>{if(n===null){for(let o of e.actorIdsByTemplate.get(t)??[])r(o);return}for(let o of n){let c=e.groupById.get(o)?.actorIdsByTemplate.get(t);if(c)for(let a of c)r(a)}},ot=e=>{let{sidecar:t,actorTemplateKeys:n,actorSpawnIndex:r,actorReduceIndex:o,spawnIdConfig:c}=e;return{resolveSpawnGroups:(u,l,A,R)=>{if(u==="group"){let f=[];for(let S of l){let h=t.groupById.get(S);h&&f.push({groupId:S,groupTag:h.groupTag})}return f}if(u==="tag"){let f=[];for(let S of l)for(let h of t.groupIdsByTag.get(S)??[])f.push({groupId:h,groupTag:S});return f}let p=[],m=new Set,b=f=>t.groupById.has(f)||m.has(f);for(let f of r.get(R.type)?.keys()??[]){let S=Ue(A,f,R,c,b);m.add(S),p.push({groupId:S,groupTag:f})}return p},forEachRoutedIdentity:(u,l,A,R,p)=>{if(u==="actor"){for(let x of l){let y=t.actorById.get(x);y&&p(y)}return}let m=u==="group"?l:u==="tag"?Wt(t,l):null;if(A.length===0){for(let x of o.get(R.type)??[])nt(t,x,m,y=>{let M=t.actorById.get(y);M&&p(M)});return}let b=new Set(o.get(R.type)??[]),f=Ut(A),S=new Set(l),h=x=>u==="unscoped"?!0:u==="group"?S.has(x.meta.groupId):S.has(x.meta.groupTag),E=new Set;for(let x of n){b.has(x)&&nt(t,x,m,y=>{if(E.has(y))return;let M=t.actorById.get(y);M&&(E.add(y),p(M))});for(let y of f.get(x)??[]){let M=y.meta.actorId;E.has(M)||h(y)&&(E.add(M),p(y))}}}}};var st=()=>({actorById:new Map,groupById:new Map,groupIdsByTag:new Map,actorIdsByTemplate:new Map,counters:{actor:0,groupByTag:new Map}}),Yt=()=>({groupById:new Map,groupIdsByTag:new Map,actorIdsByTemplate:new Map}),rt=(e,t,n)=>{let r=e.get(t);r||(r=new Set,e.set(t,r)),r.add(n)},at=(e,t,n)=>{let r=e.get(t);r?.delete(n),r?.size===0&&e.delete(t)},it=(e,t)=>{let{actorId:n,groupId:r,groupTag:o}=t.meta,c=e.groupById.get(r);c||(c={groupTag:o,actorIds:new Set,actorIdsByTemplate:new Map},e.groupById.set(r,c)),c.actorIds.add(n),rt(c.actorIdsByTemplate,t.templateKey,n),rt(e.actorIdsByTemplate,t.templateKey,n);let a=e.groupIdsByTag.get(o);a||(a=new Set,e.groupIdsByTag.set(o,a)),a.add(r)},Xt=(e,t)=>{let{actorId:n,groupId:r,groupTag:o}=t.meta;at(e.actorIdsByTemplate,t.templateKey,n);let c=e.groupById.get(r);if(!c||(c.actorIds.delete(n),at(c.actorIdsByTemplate,t.templateKey,n),c.actorIds.size>0))return;e.groupById.delete(r);let a=e.groupIdsByTag.get(o);a?.delete(r),a?.size===0&&e.groupIdsByTag.delete(o)},ct=e=>{for(let t of e.bag.values())t();e.bag.clear()},qt=(e,t,n,r,o)=>{if(r.length===0)throw new T("LITE_FSM_INVALID_ACTOR_SLICE",`Actor id for template '${n}' must be non-empty.`);if(!Ne(o)||!t.isPublicActorState(n,o.state))throw new T("LITE_FSM_INVALID_ACTOR_SLICE",`Invalid actor slice '${n}.${r}'.`);let c=e.actorById.get(r);if(c){if(c.templateKey!==n)throw new T("LITE_FSM_INVALID_ACTOR_SLICE",`Actor '${r}' cannot move between actor template records.`);return{identity:c,isNew:!1}}let a=o.meta;if(!N(a))throw new T("LITE_FSM_INVALID_ACTOR_SLICE",`Actor '${r}' cannot be created by state replacement without actor meta.`);let{groupId:i,groupTag:u}=a;if(a.actorId!==r||typeof u!="string"||u!==t.groupTagForTemplate(n)||typeof i!="string"||i.length===0)throw new T("LITE_FSM_INVALID_ACTOR_SLICE",`Actor '${r}' has invalid actor meta.`);return{identity:{templateKey:n,meta:q({actorId:r,groupId:i,groupTag:u})},isNew:!0}},Jt=e=>{let t=Yt();for(let n of e.values())it(t,n);return t},he=(e,t,n,r)=>{let o=new Set,c=new Map,a=new Map(e.actorById),i=new Map,u=[];for(let p of n){let m=r[p];if(!N(m))throw new T("LITE_FSM_INVALID_ACTOR_SLICE",`Invalid actor record '${p}'.`);let b={};for(let[f,S]of Object.entries(m)){if(o.has(f))throw new T("LITE_FSM_INVALID_ACTOR_SLICE",`Duplicate actorId '${f}'.`);o.add(f);let{identity:h,isNew:E}=qt(e,t,p,f,S);b[f]={...S,meta:h.meta},E&&c.set(f,h)}i.set(p,b)}for(let[p,m]of c)a.set(p,{...m,bag:new Map});let l=new Set(n);for(let[p,m]of a)l.has(m.templateKey)&&(o.has(p)||(u.push(m),a.delete(p)));let A=Jt(a),R=Q(e.counters);for(let[p,m]of c)He(R,p,m.meta.groupId,t.originId);return{nextActorById:a,nextGroupById:A.groupById,nextGroupIdsByTag:A.groupIdsByTag,nextActorIdsByTemplate:A.actorIdsByTemplate,nextCounters:R,canonicalActorRecords:i,actorsToCleanup:u,touchedTemplateKeys:n}},Qt=(e,t)=>{e.actorById=t.nextActorById,e.groupById=t.nextGroupById,e.groupIdsByTag=t.nextGroupIdsByTag,e.actorIdsByTemplate=t.nextActorIdsByTemplate,e.counters=t.nextCounters;for(let n of t.actorsToCleanup)ct(n)},Zt=(e,t)=>{let n=new Set(t.pendingDeleted.map(r=>r.meta.actorId));for(let r of t.pendingSpawned){if(n.has(r.meta.actorId))continue;let o={...r,bag:new Map};e.actorById.set(r.meta.actorId,o),it(e,o)}for(let r of t.pendingDeleted){let o=e.actorById.get(r.meta.actorId);o&&(e.actorById.delete(r.meta.actorId),Xt(e,o),ct(o))}},dt=(e,t)=>{let n=e;for(let r of t){let o=n[r];o&&o!==$&&Object.keys(o).length===0&&(n={...n,[r]:$})}return n},pt=(e,t,n)=>(t.countersDraft&&(e.counters=Ke(e.counters,t.countersDraft)),Zt(e,t),dt(n,t.touchedActorRecords.keys())),Ie=(e,t,n)=>{for(let[r,o]of t.canonicalActorRecords)n={...n,[r]:o};return Qt(e,t),dt(n,t.touchedTemplateKeys)},Te=(e,t)=>{let n=[];for(let r of t){let o=e.actorById.get(r.meta.actorId);o&&n.push(o)}return n};var en=(e,t)=>{let n=t?.originId;if(n!==void 0&&(n.length===0||n.includes(W)))throw new T("LITE_FSM_INVALID_OPTIONS",`[lite-fsm] originId must be a non-empty string without '${W}'.`);let r={originId:n,generateActorId:t?.generateActorId,generateGroupId:t?.generateGroupId},o=Object.keys(e),c=(s,g)=>s[g],a=o.filter(s=>J(e[s])),i=o.filter(s=>!J(e[s]));for(let s of a)Le(s,e[s]);for(let s of i)if(V(e[s],"persistence"))throw new T("LITE_FSM_INVALID_ACTOR_CONFIG",`[lite-fsm] domain machine '${s}' cannot define actor persistence.`);let u=a.filter(s=>e[s].persistence==="snapshot"),l=a.filter(s=>e[s].persistence!=="snapshot"),A=!!t?.middleware?.some(te),R=t?.schemaVersion,{groupTagForTemplate:p,hasActorTransition:m,isPublicActorState:b}=Ze(e),{domainReduceIndex:f,domainAlwaysReduce:S,actorReduceIndex:h,actorSpawnIndex:E}=Qe(e,a,i,p),x=s=>!!e[s].effects,y=i.filter(x),M=a.some(x),D=y.length>0||M;if(O)for(let s of i)e[s].groupTag&&console.warn(`[lite-fsm] groupTag on domain machine '${s}' is ignored.`);let _=Object.fromEntries(o.map(s=>[s,re(e[s],{allowActorTemplate:!0,allowVoidReducer:()=>A})])),G={transition:void 0,userDeps:{}},K=[],P=Object.fromEntries(o.map(s=>[s,a.includes(s)?$:{state:e[s].initialState,context:e[s].initialContext}])),v=st(),F=null,{normalizeAction:U,applyPostNormalize:ut}=tt({sidecar:v}),{resolveSpawnGroups:gt,forEachRoutedIdentity:ft}=ot({sidecar:v,actorTemplateKeys:a,actorSpawnIndex:E,actorReduceIndex:h,spawnIdConfig:r}),yt=(s,g)=>{let d=s,I=C=>{let w=_[C],k=s[C],L=w.transition(k,g);L!==k&&(d=d===s?{...s}:d,d[C]=L)};for(let C of S)I(C);for(let C of f.get(g.type)??[])I(C);return d},lt=(s,g,d,I,C)=>{let w=g,k=E.get(d.type);if(!k)return w;let L=B=>v.actorById.has(B)||s.pendingSpawned.some(z=>z.meta.actorId===B);for(let B of gt(I,C,s,d))for(let z of k.get(B.groupTag)??[]){let Pt=e[z],_t=q({actorId:Ye(s,z,B.groupTag,d,r,L),groupId:B.groupId,groupTag:B.groupTag}),ue={templateKey:z,meta:_t},bt={state:"__INIT",context:{...Pt.initialContext},meta:ue.meta},Pe=ae(s,w,z);Pe.record[ue.meta.actorId]=bt,w=Pe.root,s.pendingSpawned.push(ue)}return w},St=(s,g,d,I)=>{let w=c(g,d.templateKey)?.[d.meta.actorId];if(!w||!m(d.templateKey,w.state,I))return{root:g,delivered:!1};let k=ae(s,g,d.templateKey),B=_[d.templateKey].transition(w,I);return O&&Oe(d.meta.actorId,d.templateKey,B.state,b),k.record[d.meta.actorId]={...B,meta:d.meta},{root:k.root,delivered:!0}},mt=(s,g)=>{let d=g,I=new Set;for(let C of[...s.pendingSpawned,...s.pendingDelivered]){if(I.has(C.meta.actorId))continue;I.add(C.meta.actorId);let k=c(d,C.templateKey)?.[C.meta.actorId];if(!k||!j(k.state))continue;let L=ae(s,d,C.templateKey);delete L.record[C.meta.actorId],d=L.root,s.pendingDeleted.push(C)}return d},ie=(s,g)=>{let d=F,{scope:I,targetSet:C}=Ge(g.meta),w=yt(s,g);return I!=="actor"&&(w=lt(d,w,g,I,C)),ft(I,C,d.pendingSpawned,g,k=>{let L=St(d,w,k,g);w=L.root,L.delivered&&d.pendingDelivered.push(k)}),mt(d,w)},Re=s=>{ie=s(ie)},Me={actorTemplateKeys:a,groupTagForTemplate:p,isPublicActorState:b,originId:n},At=s=>{let g=[],d=new Set,I=C=>{for(let w of C){let k=w.meta.actorId;d.has(k)||(d.add(k),g.push(w))}};I(Te(v,s.pendingSpawned)),I(Te(v,s.pendingDelivered)),s.effectsTargets=g},ht=(s,g,d)=>a.filter(I=>s[I]===g[I]?!1:d.touchedActorRecords.get(I)!==g[I]),It=(s,g,d)=>{let I=ht(g,d,s),C=I.length?he(v,Me,I,d):void 0,w=C?Ie(v,C,d):d;return pt(v,s,w)},ce=s=>(K.push(s),()=>{K=K.filter(g=>g!==s)}),Ce=(s,g,d)=>{for(let I of K)I(s,g,d)},{condition:Tt,invokeEffects:Rt}=je({sidecar:v,machines:_,domainKeys:y,refs:G,onTransition:ce,onError:t?.onError}),xe=()=>P,Mt=()=>({schemaVersion:R,machines:{...P}}),de={config:e,snapshotActorTemplateKeys:u,runtimeActorTemplateKeys:l,schemaVersion:R,groupTagForTemplate:p,onSchemaVersionMismatch:t?.onSchemaVersionMismatch,onUnknownMachineKey:t?.onUnknownMachineKey},Ee=(s,g)=>{if(s.changedActorTemplateKeys.length===0)return g;let d=he(v,Me,s.changedActorTemplateKeys,g);return Ie(v,d,g)},Ct=(s,{strategy:g="merge",baseState:d=P}={})=>se(d,s,g,"hydrate",de,"preview").nextState,we=t?.snapshot;if(we){let s=se(P,we,"replace","opts.snapshot",de);P=Ee(s,s.nextState)}O&&H(P);let xt=(s,{strategy:g="merge"}={})=>{let d=P,I=se(d,s,g,"hydrate",de),C=I.nextState;C!==d&&(P=Ee(I,C),O&&H(P),Ce(d,P,{type:be,payload:{strategy:g,snapshot:s}}))},Et=(s=>qe(P,e,v,u,l,i,R,s)),De=s=>{let g=F;if(g.committed)throw new Error("[lite-fsm] middleware called next() more than once for a single transition.");let d=P;if(ut(g,s),!g.committed)return s;g.committedPrevState=d;let I=ie(d,g.committed);if(I===void 0)throw new Error(X);return P=It(g,d,I),M&&At(g),O&&H(P),Ce(d,P,g.committed),g.committed},wt=(()=>{let s=t?.middleware;if(!s?.length)return De;let g={getState:xe,transition:I=>pe(I),replaceReducer:Re,onTransition:ce,condition:Tt},d=s.map(I=>I(g));return ee(...d)(De)})();function pe(s,g={}){et(s);let d=U(s,g);if(d===Y)return s;let I=F,C=$e(g,v.counters);F=C;let w;try{w=wt(d)}finally{F=I}return C.committed?(D&&Rt(C.committedPrevState,P,C.committed,C.effectsTargets),C.committed):w}let Dt=s=>{let g=G.userDeps,d=typeof s=="function"?s(g):s;G.userDeps=d};return G.transition=pe,{getState:xe,getSnapshot:Mt,getHydratedState:Ct,hydrate:xt,dehydrate:Et,transition:pe,setDependencies:Dt,onTransition:ce,replaceReducer:Re}};function tn(e){return e}var ro=e=>e,ao=e=>e,nn=Symbol.for("lite-fsm.owner.domain"),on=({type:e,effect:t,cancelFn:n})=>{let r=new Map;return o=>{let c=o,a=c.self?.actorId??nn,i=r.get(a)??{lastId:0};i.lastId+=1,i.cancel=n?.(o),r.set(a,i);let u=i.lastId;c.self&&!i.dispose&&(i.dispose=()=>r.delete(a),c[Z]?.(c.self.actorId,Symbol("createEffect"),i.dispose));let l=()=>e==="latest"&&u!==r.get(a)?.lastId?!1:!i.cancel?.(),A=Object.assign(R=>l()?o.transition(R):R,o.transition);if(c.self){let R=o.transition;A.unscoped=p=>l()?R.unscoped(p):p,A.actor=(p,m)=>l()?R.actor(p,m):m,A.group=(p,m)=>l()?R.group(p,m):m,A.tag=(p,m)=>l()?R.tag(p,m):m}return t({...o,transition:A})}},so=e=>on(e);export{T as LiteFsmError,re as Machine,en as MachineManager,q as createActorMeta,ao as createConfig,so as createEffect,tn as createMachine,ro as createReducer,Gt as defineMachine};
@@ -0,0 +1,44 @@
1
+ import { AnyEvent, AnyRecord, DefaultDeps, GenerateSpawnIdFn, MachineConfig, MachineManagerDehydrateFn, MachineManagerRuntimeSnapshot, MachineManagerSnapshot, MachineStore, MachinesState, Reducer, StateName, StateType, TransitionSubscriber, HydrateOptions, HydratePreviewOptions, UnknownMachineKeyContext, Middleware, WILDCARD, ManagerAction } from "./types";
2
+ type UnionToIntersection<U> = (U extends unknown ? (value: U) => void : never) extends (value: infer I) => void ? I : never;
3
+ type ConfigDependencies<E> = E extends MachineConfig<object, AnyRecord, AnyEvent, infer D> ? D : never;
4
+ type EffectDependencies<E> = "effects" extends keyof E ? keyof NonNullable<E["effects"]> extends never ? {} : [ConfigDependencies<E>] extends [never] ? UnionToIntersection<{
5
+ [key in keyof NonNullable<E["effects"]>]: NonNullable<E["effects"]>[key] extends (deps: infer D) => unknown ? Omit<D, keyof DefaultDeps | "self"> : {};
6
+ }[keyof NonNullable<E["effects"]>]> : ConfigDependencies<E> : {};
7
+ export type MachineDependencies<S extends MachineStore> = keyof S extends never ? {} : UnionToIntersection<{
8
+ [key in keyof S]: EffectDependencies<S[key]>;
9
+ }[keyof S]>;
10
+ type EventFromReducer<M> = M extends {
11
+ reducer: MachineConfig<infer C, infer T, infer P, infer D>["reducer"];
12
+ } ? [C, T, D] extends [object, AnyRecord, AnyRecord] ? P : never : never;
13
+ type EventFromMachineConfig<M> = M extends MachineConfig<infer C, infer T, infer P, infer D> ? [C, T, D] extends [object, AnyRecord, AnyRecord] ? P : never : never;
14
+ export type MachineEvents<S extends MachineStore> = {
15
+ [key in keyof S]: EventFromReducer<S[key]> extends never ? EventFromMachineConfig<S[key]> extends never ? AnyEvent : EventFromMachineConfig<S[key]> : EventFromReducer<S[key]>;
16
+ }[keyof S];
17
+ export type MachineManagerOptions<S extends MachineStore, P extends AnyEvent = MachineEvents<S>> = {
18
+ onError?: (err: unknown) => void;
19
+ middleware?: Middleware<MachinesState<S>, P>[];
20
+ snapshot?: MachineManagerSnapshot<S>;
21
+ schemaVersion?: number;
22
+ onUnknownMachineKey?: (key: string, context: UnknownMachineKeyContext) => void;
23
+ onSchemaVersionMismatch?: (incoming: number | undefined, current: number | undefined) => void;
24
+ originId?: string;
25
+ generateActorId?: GenerateSpawnIdFn<P>;
26
+ generateGroupId?: GenerateSpawnIdFn<P>;
27
+ };
28
+ export type IMachine<C extends object, T extends AnyRecord = {}, P extends AnyEvent = AnyEvent, D extends AnyRecord = {}> = {
29
+ transition: (state: StateType<C, T>, action: P) => StateType<C, T>;
30
+ invokeEffect: (prevState: StateName<C>, currentState: StateName<C>, deps: D & DefaultDeps<StateName<C> | WILDCARD, C, P>) => Promise<void>;
31
+ config: C;
32
+ };
33
+ export type IMachineManager<S extends MachineStore, P extends AnyEvent = MachineEvents<S>> = {
34
+ transition: (payload: ManagerAction<P>) => ManagerAction<P>;
35
+ getState: () => MachinesState<S>;
36
+ getSnapshot: () => MachineManagerRuntimeSnapshot<S>;
37
+ getHydratedState: (snapshot: MachineManagerSnapshot<S>, opts?: HydratePreviewOptions<S>) => MachinesState<S>;
38
+ hydrate: (snapshot: MachineManagerSnapshot<S>, opts?: HydrateOptions) => void;
39
+ dehydrate: MachineManagerDehydrateFn<S>;
40
+ onTransition: (cb: TransitionSubscriber<S, P>) => () => void;
41
+ replaceReducer: (cb: (reducer: Reducer<MachinesState<S>, ManagerAction<P>>) => Reducer<MachinesState<S>, ManagerAction<P>>) => void;
42
+ setDependencies: (d: MachineDependencies<S> | ((deps: MachineDependencies<S>) => MachineDependencies<S>)) => void;
43
+ };
44
+ export {};
@@ -0,0 +1,44 @@
1
+ import { AnyEvent, AnyRecord, DefaultDeps, GenerateSpawnIdFn, MachineConfig, MachineManagerDehydrateFn, MachineManagerRuntimeSnapshot, MachineManagerSnapshot, MachineStore, MachinesState, Reducer, StateName, StateType, TransitionSubscriber, HydrateOptions, HydratePreviewOptions, UnknownMachineKeyContext, Middleware, WILDCARD, ManagerAction } from "./types";
2
+ type UnionToIntersection<U> = (U extends unknown ? (value: U) => void : never) extends (value: infer I) => void ? I : never;
3
+ type ConfigDependencies<E> = E extends MachineConfig<object, AnyRecord, AnyEvent, infer D> ? D : never;
4
+ type EffectDependencies<E> = "effects" extends keyof E ? keyof NonNullable<E["effects"]> extends never ? {} : [ConfigDependencies<E>] extends [never] ? UnionToIntersection<{
5
+ [key in keyof NonNullable<E["effects"]>]: NonNullable<E["effects"]>[key] extends (deps: infer D) => unknown ? Omit<D, keyof DefaultDeps | "self"> : {};
6
+ }[keyof NonNullable<E["effects"]>]> : ConfigDependencies<E> : {};
7
+ export type MachineDependencies<S extends MachineStore> = keyof S extends never ? {} : UnionToIntersection<{
8
+ [key in keyof S]: EffectDependencies<S[key]>;
9
+ }[keyof S]>;
10
+ type EventFromReducer<M> = M extends {
11
+ reducer: MachineConfig<infer C, infer T, infer P, infer D>["reducer"];
12
+ } ? [C, T, D] extends [object, AnyRecord, AnyRecord] ? P : never : never;
13
+ type EventFromMachineConfig<M> = M extends MachineConfig<infer C, infer T, infer P, infer D> ? [C, T, D] extends [object, AnyRecord, AnyRecord] ? P : never : never;
14
+ export type MachineEvents<S extends MachineStore> = {
15
+ [key in keyof S]: EventFromReducer<S[key]> extends never ? EventFromMachineConfig<S[key]> extends never ? AnyEvent : EventFromMachineConfig<S[key]> : EventFromReducer<S[key]>;
16
+ }[keyof S];
17
+ export type MachineManagerOptions<S extends MachineStore, P extends AnyEvent = MachineEvents<S>> = {
18
+ onError?: (err: unknown) => void;
19
+ middleware?: Middleware<MachinesState<S>, P>[];
20
+ snapshot?: MachineManagerSnapshot<S>;
21
+ schemaVersion?: number;
22
+ onUnknownMachineKey?: (key: string, context: UnknownMachineKeyContext) => void;
23
+ onSchemaVersionMismatch?: (incoming: number | undefined, current: number | undefined) => void;
24
+ originId?: string;
25
+ generateActorId?: GenerateSpawnIdFn<P>;
26
+ generateGroupId?: GenerateSpawnIdFn<P>;
27
+ };
28
+ export type IMachine<C extends object, T extends AnyRecord = {}, P extends AnyEvent = AnyEvent, D extends AnyRecord = {}> = {
29
+ transition: (state: StateType<C, T>, action: P) => StateType<C, T>;
30
+ invokeEffect: (prevState: StateName<C>, currentState: StateName<C>, deps: D & DefaultDeps<StateName<C> | WILDCARD, C, P>) => Promise<void>;
31
+ config: C;
32
+ };
33
+ export type IMachineManager<S extends MachineStore, P extends AnyEvent = MachineEvents<S>> = {
34
+ transition: (payload: ManagerAction<P>) => ManagerAction<P>;
35
+ getState: () => MachinesState<S>;
36
+ getSnapshot: () => MachineManagerRuntimeSnapshot<S>;
37
+ getHydratedState: (snapshot: MachineManagerSnapshot<S>, opts?: HydratePreviewOptions<S>) => MachinesState<S>;
38
+ hydrate: (snapshot: MachineManagerSnapshot<S>, opts?: HydrateOptions) => void;
39
+ dehydrate: MachineManagerDehydrateFn<S>;
40
+ onTransition: (cb: TransitionSubscriber<S, P>) => () => void;
41
+ replaceReducer: (cb: (reducer: Reducer<MachinesState<S>, ManagerAction<P>>) => Reducer<MachinesState<S>, ManagerAction<P>>) => void;
42
+ setDependencies: (d: MachineDependencies<S> | ((deps: MachineDependencies<S>) => MachineDependencies<S>)) => void;
43
+ };
44
+ export {};
@@ -0,0 +1,2 @@
1
+ export declare const LATE_DISPATCH: unique symbol;
2
+ export declare const REGISTER_BAG_DISPOSE: unique symbol;
@@ -0,0 +1,2 @@
1
+ export declare const LATE_DISPATCH: unique symbol;
2
+ export declare const REGISTER_BAG_DISPOSE: unique symbol;
@@ -0,0 +1,18 @@
1
+ import type { MachineStore } from "./types";
2
+ type ManagerConfig<S extends MachineStore> = S;
3
+ export type ManagerIndexes = {
4
+ domainReduceIndex: Map<string, string[]>;
5
+ domainAlwaysReduce: string[];
6
+ actorReduceIndex: Map<string, string[]>;
7
+ actorSpawnIndex: Map<string, Map<string, string[]>>;
8
+ };
9
+ export type ConfigHelpers = {
10
+ groupTagForTemplate: (templateKey: string) => string;
11
+ hasActorTransition: (templateKey: string, source: string, action: {
12
+ type: string;
13
+ }) => boolean;
14
+ isPublicActorState: (templateKey: string, actorState: string) => boolean;
15
+ };
16
+ export declare const buildManagerIndexes: <S extends MachineStore>(config: ManagerConfig<S>, actorTemplateKeys: readonly string[], domainKeys: readonly string[], groupTagForTemplate: (templateKey: string) => string) => ManagerIndexes;
17
+ export declare const createConfigHelpers: <S extends MachineStore>(config: ManagerConfig<S>) => ConfigHelpers;
18
+ export {};
@@ -0,0 +1,18 @@
1
+ import type { MachineStore } from "./types";
2
+ type ManagerConfig<S extends MachineStore> = S;
3
+ export type ManagerIndexes = {
4
+ domainReduceIndex: Map<string, string[]>;
5
+ domainAlwaysReduce: string[];
6
+ actorReduceIndex: Map<string, string[]>;
7
+ actorSpawnIndex: Map<string, Map<string, string[]>>;
8
+ };
9
+ export type ConfigHelpers = {
10
+ groupTagForTemplate: (templateKey: string) => string;
11
+ hasActorTransition: (templateKey: string, source: string, action: {
12
+ type: string;
13
+ }) => boolean;
14
+ isPublicActorState: (templateKey: string, actorState: string) => boolean;
15
+ };
16
+ export declare const buildManagerIndexes: <S extends MachineStore>(config: ManagerConfig<S>, actorTemplateKeys: readonly string[], domainKeys: readonly string[], groupTagForTemplate: (templateKey: string) => string) => ManagerIndexes;
17
+ export declare const createConfigHelpers: <S extends MachineStore>(config: ManagerConfig<S>) => ConfigHelpers;
18
+ export {};
@@ -0,0 +1,15 @@
1
+ import { type NormalizeOptions } from "./actor";
2
+ import type { DispatchContext } from "./dispatchContext";
3
+ import { LATE_DISPATCH } from "./internal";
4
+ import type { SidecarState } from "./sidecar";
5
+ import type { AnyEvent, ManagerAction, MachineStore } from "./types";
6
+ export type Normalizer<S extends MachineStore, P extends AnyEvent> = {
7
+ normalizeAction: (raw: ManagerAction<P>, opts?: NormalizeOptions) => ManagerAction<P> | typeof LATE_DISPATCH;
8
+ applyPostNormalize: (ctx: DispatchContext<S, P>, action: ManagerAction<P>) => void;
9
+ };
10
+ export declare const assertUserAction: (action: {
11
+ type: string;
12
+ }) => void;
13
+ export declare const createNormalizer: <S extends MachineStore, P extends AnyEvent>(deps: {
14
+ sidecar: SidecarState;
15
+ }) => Normalizer<S, P>;
@@ -0,0 +1,15 @@
1
+ import { type NormalizeOptions } from "./actor";
2
+ import type { DispatchContext } from "./dispatchContext";
3
+ import { LATE_DISPATCH } from "./internal";
4
+ import type { SidecarState } from "./sidecar";
5
+ import type { AnyEvent, ManagerAction, MachineStore } from "./types";
6
+ export type Normalizer<S extends MachineStore, P extends AnyEvent> = {
7
+ normalizeAction: (raw: ManagerAction<P>, opts?: NormalizeOptions) => ManagerAction<P> | typeof LATE_DISPATCH;
8
+ applyPostNormalize: (ctx: DispatchContext<S, P>, action: ManagerAction<P>) => void;
9
+ };
10
+ export declare const assertUserAction: (action: {
11
+ type: string;
12
+ }) => void;
13
+ export declare const createNormalizer: <S extends MachineStore, P extends AnyEvent>(deps: {
14
+ sidecar: SidecarState;
15
+ }) => Normalizer<S, P>;
@@ -0,0 +1,18 @@
1
+ import type { ActorIdentity, RoutingScope } from "./actor";
2
+ import { type DispatchContext, type SpawnIdConfig } from "./dispatchContext";
3
+ import type { SidecarState } from "./sidecar";
4
+ import type { AnyEvent, ManagerAction, MachineStore } from "./types";
5
+ export type RoutingResolver<S extends MachineStore, P extends AnyEvent> = {
6
+ resolveSpawnGroups: (scope: Exclude<RoutingScope, "actor">, targetSet: string[], ctx: DispatchContext<S, P>, action: ManagerAction<P>) => Array<{
7
+ groupId: string;
8
+ groupTag: string;
9
+ }>;
10
+ forEachRoutedIdentity: (scope: RoutingScope, targetSet: string[], pendingSpawned: ActorIdentity[], action: ManagerAction<P>, visit: (identity: ActorIdentity) => void) => void;
11
+ };
12
+ export declare const createRoutingResolver: <S extends MachineStore, P extends AnyEvent>(deps: {
13
+ sidecar: SidecarState;
14
+ actorTemplateKeys: readonly string[];
15
+ actorSpawnIndex: Map<string, Map<string, string[]>>;
16
+ actorReduceIndex: Map<string, string[]>;
17
+ spawnIdConfig: SpawnIdConfig<P>;
18
+ }) => RoutingResolver<S, P>;
@@ -0,0 +1,18 @@
1
+ import type { ActorIdentity, RoutingScope } from "./actor";
2
+ import { type DispatchContext, type SpawnIdConfig } from "./dispatchContext";
3
+ import type { SidecarState } from "./sidecar";
4
+ import type { AnyEvent, ManagerAction, MachineStore } from "./types";
5
+ export type RoutingResolver<S extends MachineStore, P extends AnyEvent> = {
6
+ resolveSpawnGroups: (scope: Exclude<RoutingScope, "actor">, targetSet: string[], ctx: DispatchContext<S, P>, action: ManagerAction<P>) => Array<{
7
+ groupId: string;
8
+ groupTag: string;
9
+ }>;
10
+ forEachRoutedIdentity: (scope: RoutingScope, targetSet: string[], pendingSpawned: ActorIdentity[], action: ManagerAction<P>, visit: (identity: ActorIdentity) => void) => void;
11
+ };
12
+ export declare const createRoutingResolver: <S extends MachineStore, P extends AnyEvent>(deps: {
13
+ sidecar: SidecarState;
14
+ actorTemplateKeys: readonly string[];
15
+ actorSpawnIndex: Map<string, Map<string, string[]>>;
16
+ actorReduceIndex: Map<string, string[]>;
17
+ spawnIdConfig: SpawnIdConfig<P>;
18
+ }) => RoutingResolver<S, P>;
@@ -0,0 +1,42 @@
1
+ import { ActorIdentity, ActorRuntime, Counters, GroupIndex, RuntimeActorSlice } from "./actor";
2
+ import type { DispatchContext } from "./dispatchContext";
3
+ export type SidecarState = {
4
+ actorById: Map<string, ActorRuntime>;
5
+ groupById: Map<string, GroupIndex>;
6
+ groupIdsByTag: Map<string, Set<string>>;
7
+ actorIdsByTemplate: Map<string, Set<string>>;
8
+ counters: Counters;
9
+ };
10
+ export type ReplacementReconcilePlan = {
11
+ nextActorById: Map<string, ActorRuntime>;
12
+ nextGroupById: Map<string, GroupIndex>;
13
+ nextGroupIdsByTag: Map<string, Set<string>>;
14
+ nextActorIdsByTemplate: Map<string, Set<string>>;
15
+ nextCounters: Counters;
16
+ canonicalActorRecords: Map<string, ActorRecord>;
17
+ actorsToCleanup: ActorRuntime[];
18
+ touchedTemplateKeys: string[];
19
+ };
20
+ export type SidecarValidationDeps = {
21
+ actorTemplateKeys: readonly string[];
22
+ groupTagForTemplate: (templateKey: string) => string;
23
+ isPublicActorState: (templateKey: string, state: string) => boolean;
24
+ originId: string | undefined;
25
+ };
26
+ type RootStateView = Record<string, unknown>;
27
+ type ActorRecord = Record<string, RuntimeActorSlice>;
28
+ export declare const createSidecarState: () => SidecarState;
29
+ type IndexBundle = {
30
+ groupById: Map<string, GroupIndex>;
31
+ groupIdsByTag: Map<string, Set<string>>;
32
+ actorIdsByTemplate: Map<string, Set<string>>;
33
+ };
34
+ export declare const addActorToGroupIndexes: (indexes: IndexBundle, actor: ActorRuntime) => void;
35
+ export declare const removeActorFromGroupIndexes: (sidecar: SidecarState, actor: ActorRuntime) => void;
36
+ export declare const cleanupDisposedActor: (actor: ActorRuntime) => void;
37
+ export declare const buildReplacementReconcilePlan: (sidecar: SidecarState, deps: SidecarValidationDeps, changedTemplateKeys: string[], nextRoot: RootStateView) => ReplacementReconcilePlan;
38
+ export declare const canonicalizeEmptyActorRecords: <S extends RootStateView>(state: S, templateKeys: Iterable<string>) => S;
39
+ export declare const commitDispatchSidecar: <S extends RootStateView>(sidecar: SidecarState, ctx: DispatchContext, nextState: S) => S;
40
+ export declare const commitReplacementSidecar: <S extends RootStateView>(sidecar: SidecarState, plan: ReplacementReconcilePlan, nextState: S) => S;
41
+ export declare const resolveLiveActors: (sidecar: SidecarState, ids: readonly ActorIdentity[]) => ActorRuntime[];
42
+ export {};
@@ -0,0 +1,42 @@
1
+ import { ActorIdentity, ActorRuntime, Counters, GroupIndex, RuntimeActorSlice } from "./actor";
2
+ import type { DispatchContext } from "./dispatchContext";
3
+ export type SidecarState = {
4
+ actorById: Map<string, ActorRuntime>;
5
+ groupById: Map<string, GroupIndex>;
6
+ groupIdsByTag: Map<string, Set<string>>;
7
+ actorIdsByTemplate: Map<string, Set<string>>;
8
+ counters: Counters;
9
+ };
10
+ export type ReplacementReconcilePlan = {
11
+ nextActorById: Map<string, ActorRuntime>;
12
+ nextGroupById: Map<string, GroupIndex>;
13
+ nextGroupIdsByTag: Map<string, Set<string>>;
14
+ nextActorIdsByTemplate: Map<string, Set<string>>;
15
+ nextCounters: Counters;
16
+ canonicalActorRecords: Map<string, ActorRecord>;
17
+ actorsToCleanup: ActorRuntime[];
18
+ touchedTemplateKeys: string[];
19
+ };
20
+ export type SidecarValidationDeps = {
21
+ actorTemplateKeys: readonly string[];
22
+ groupTagForTemplate: (templateKey: string) => string;
23
+ isPublicActorState: (templateKey: string, state: string) => boolean;
24
+ originId: string | undefined;
25
+ };
26
+ type RootStateView = Record<string, unknown>;
27
+ type ActorRecord = Record<string, RuntimeActorSlice>;
28
+ export declare const createSidecarState: () => SidecarState;
29
+ type IndexBundle = {
30
+ groupById: Map<string, GroupIndex>;
31
+ groupIdsByTag: Map<string, Set<string>>;
32
+ actorIdsByTemplate: Map<string, Set<string>>;
33
+ };
34
+ export declare const addActorToGroupIndexes: (indexes: IndexBundle, actor: ActorRuntime) => void;
35
+ export declare const removeActorFromGroupIndexes: (sidecar: SidecarState, actor: ActorRuntime) => void;
36
+ export declare const cleanupDisposedActor: (actor: ActorRuntime) => void;
37
+ export declare const buildReplacementReconcilePlan: (sidecar: SidecarState, deps: SidecarValidationDeps, changedTemplateKeys: string[], nextRoot: RootStateView) => ReplacementReconcilePlan;
38
+ export declare const canonicalizeEmptyActorRecords: <S extends RootStateView>(state: S, templateKeys: Iterable<string>) => S;
39
+ export declare const commitDispatchSidecar: <S extends RootStateView>(sidecar: SidecarState, ctx: DispatchContext, nextState: S) => S;
40
+ export declare const commitReplacementSidecar: <S extends RootStateView>(sidecar: SidecarState, plan: ReplacementReconcilePlan, nextState: S) => S;
41
+ export declare const resolveLiveActors: (sidecar: SidecarState, ids: readonly ActorIdentity[]) => ActorRuntime[];
42
+ export {};