@vielzeug/clockwork 26.10.15 → 26.10.17
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/LICENSE +21 -0
- package/dist/_dev.cjs.map +1 -1
- package/dist/_dev.js +5 -1
- package/dist/_dev.js.map +1 -1
- package/dist/clockwork.cjs +1 -1
- package/dist/clockwork.cjs.map +1 -1
- package/dist/clockwork.iife.js +1 -1
- package/dist/clockwork.iife.js.map +1 -1
- package/dist/clockwork.js +288 -1
- package/dist/clockwork.js.map +1 -1
- package/dist/errors.cjs.map +1 -1
- package/dist/errors.js +10 -1
- package/dist/errors.js.map +1 -1
- package/dist/index.js +3 -1
- package/dist/interpret.cjs +1 -1
- package/dist/interpret.cjs.map +1 -1
- package/dist/interpret.js +285 -1
- package/dist/interpret.js.map +1 -1
- package/package.json +6 -5
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2025 Helmuth Saatkamp
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/dist/_dev.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"_dev.cjs","names":[],"sources":["../src/_dev.ts"],"sourcesContent":["const isDev = !(globalThis as { __CLOCKWORK_PROD__?: boolean }).__CLOCKWORK_PROD__;\n\nexport function warn(msg: string): void {\n if (isDev) console.warn(`[@vielzeug/clockwork] ${msg}`);\n}\n"],"mappings":"AAEA,SAAgB,KAAK,EAAmB,CAExC"}
|
|
1
|
+
{"version":3,"file":"_dev.cjs","names":[],"sources":["../src/_dev.ts"],"sourcesContent":["const isDev = !(globalThis as { __CLOCKWORK_PROD__?: boolean }).__CLOCKWORK_PROD__;\n\nexport function warn(msg: string): void {\n if (isDev) console.warn(`[@vielzeug/clockwork] ${msg}`);\n}\n"],"mappings":"AAEA,SAAgB,KAAK,EAAmB,CAExC,C"}
|
package/dist/_dev.js
CHANGED
package/dist/_dev.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"_dev.js","names":[],"sources":["../src/_dev.ts"],"sourcesContent":["const isDev = !(globalThis as { __CLOCKWORK_PROD__?: boolean }).__CLOCKWORK_PROD__;\n\nexport function warn(msg: string): void {\n if (isDev) console.warn(`[@vielzeug/clockwork] ${msg}`);\n}\n"],"mappings":"AAEA,SAAgB,KAAK,
|
|
1
|
+
{"version":3,"file":"_dev.js","names":[],"sources":["../src/_dev.ts"],"sourcesContent":["const isDev = !(globalThis as { __CLOCKWORK_PROD__?: boolean }).__CLOCKWORK_PROD__;\n\nexport function warn(msg: string): void {\n if (isDev) console.warn(`[@vielzeug/clockwork] ${msg}`);\n}\n"],"mappings":";AAEA,SAAgB,KAAK,GAAmB,CAExC"}
|
package/dist/clockwork.cjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});let e=require("@vielzeug/arsenal");var ClockworkError=class extends Error{details;constructor(e,t={},n){super(e,n),this.name=new.target.name,this.details=Object.freeze({...t}),Object.setPrototypeOf(this,new.target.prototype)}},ClockworkDefinitionError=class extends ClockworkError{},ClockworkSnapshotError=class extends ClockworkError{},ClockworkTransitionLimitError=class extends ClockworkError{},t=2147483647,n=1e3,isContextRecord=e=>{if(typeof e!=`object`||!e||Array.isArray(e))return!1;let t=Object.getPrototypeOf(e);return t===null||t===Object.prototype},assertDefinition=e=>{let n=e.context;if(n!==void 0&&!isContextRecord(n))throw new ClockworkDefinitionError(`machine context must be a non-array object record`,{});for(let[n,r]of Object.entries(e.states)){for(let[e,t]of Object.entries(r.on??{}))if(Array.isArray(t)&&t.length===0)throw new ClockworkDefinitionError(`a transition array must not be empty`,{state:n,type:e});for(let[e,i]of(r.after??[]).entries())if(!Number.isFinite(i.delay)||i.delay<0||i.delay>t)throw new ClockworkDefinitionError(`state "${n}" after delay must be between 0 and ${t}`,{delay:i.delay,index:e,state:n})}},createSnapshot=(e,t)=>{let n=Object.assign(Object.create(Object.getPrototypeOf(t)),t);return Object.freeze({context:Object.freeze(n),state:e})},normalizeSnapshot=e=>Object.isFrozen(e)&&Object.isFrozen(e.context)?e:createSnapshot(e.state,e.context),invalidSnapshot=e=>{throw new ClockworkSnapshotError(`snapshot state "${String(e)}" is not declared`,{state:e})},isMachineEvent=e=>typeof e==`object`&&!!e&&typeof e.type==`string`,nodeFor=(e,t)=>Object.hasOwn(e.states,t)?e.states[t]:invalidSnapshot(t),assertSnapshot=(e,t)=>{if(!isContextRecord(t.context))throw new ClockworkSnapshotError(`snapshot context must be a non-array object record`,{});nodeFor(e,t.state)},selectTransition=(e,t,n)=>{assertSnapshot(e,t);let r=nodeFor(e,t.state);if(n.kind===`after`)return!r.after||!r.after.includes(n.after)?void 0:!n.after.guard||n.after.guard({context:t.context,event:void 0})?{event:void 0,transition:n.after}:void 0;let i=r.on;if(!i||!Object.hasOwn(i,n.event.type))return;let a=i[n.event.type],o=Array.isArray(a)?a:[a];for(let e of o)if(!e.guard||e.guard({context:t.context,event:n.event}))return{event:n.event,transition:e}},transition=(e,t,n)=>{let r=selectTransition(e,t,n);if(!r)return{event:n.kind===`event`?n.event:void 0,result:{snapshot:normalizeSnapshot(t),type:`ignored`}};let i=r.transition.reduce?r.transition.reduce({context:t.context,event:r.event}):t.context;if(!isContextRecord(i))throw new ClockworkSnapshotError(`a reducer must return a non-array object record`,{state:t.state});return{event:r.event,result:{snapshot:createSnapshot(r.transition.target,i),type:`transition`},transition:r.transition}},canTransition=(e,t,n)=>selectTransition(e,t,{event:n,kind:`event`})!==void 0,createActor=(t,r,i={})=>{let a=i.snapshot??r;assertSnapshot(t,a);let o=createSnapshot(a.state,a.context),s=new Set,c=(0,e.tapper)(),l=new AbortController,u=new Set,d=new Set,f=[],p=!1,m=!1,cancelStateResources=()=>{for(let e of u)clearTimeout(e);u.clear();for(let e of d)e.abort();d.clear()},dispose=()=>{p||(p=!0,f.length=0,cancelStateResources(),s.clear(),c.emit({type:`dispose`}),c.clear(),l.abort())},observeError=(e,t)=>{c.emit({error:e,event:t.event,phase:t.phase,state:t.state,type:`error`})},fail=(e,t)=>{observeError(e,t),dispose()},run=e=>{if(!p){if(m)
|
|
1
|
+
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});let e=require("@vielzeug/arsenal");var ClockworkError=class extends Error{details;constructor(e,t={},n){super(e,n),this.name=new.target.name,this.details=Object.freeze({...t}),Object.setPrototypeOf(this,new.target.prototype)}},ClockworkDefinitionError=class extends ClockworkError{},ClockworkSnapshotError=class extends ClockworkError{},ClockworkTransitionLimitError=class extends ClockworkError{},t=2147483647,n=1e3,isContextRecord=e=>{if(typeof e!=`object`||!e||Array.isArray(e))return!1;let t=Object.getPrototypeOf(e);return t===null||t===Object.prototype},assertDefinition=e=>{let n=e.context;if(n!==void 0&&!isContextRecord(n))throw new ClockworkDefinitionError(`machine context must be a non-array object record`,{});for(let[n,r]of Object.entries(e.states)){for(let[e,t]of Object.entries(r.on??{}))if(Array.isArray(t)&&t.length===0)throw new ClockworkDefinitionError(`a transition array must not be empty`,{state:n,type:e});for(let[e,i]of(r.after??[]).entries())if(!Number.isFinite(i.delay)||i.delay<0||i.delay>t)throw new ClockworkDefinitionError(`state "${n}" after delay must be between 0 and ${t}`,{delay:i.delay,index:e,state:n})}},createSnapshot=(e,t)=>{let n=Object.assign(Object.create(Object.getPrototypeOf(t)),t);return Object.freeze({context:Object.freeze(n),state:e})},normalizeSnapshot=e=>Object.isFrozen(e)&&Object.isFrozen(e.context)?e:createSnapshot(e.state,e.context),invalidSnapshot=e=>{throw new ClockworkSnapshotError(`snapshot state "${String(e)}" is not declared`,{state:e})},isMachineEvent=e=>typeof e==`object`&&!!e&&typeof e.type==`string`,nodeFor=(e,t)=>Object.hasOwn(e.states,t)?e.states[t]:invalidSnapshot(t),assertSnapshot=(e,t)=>{if(!isContextRecord(t.context))throw new ClockworkSnapshotError(`snapshot context must be a non-array object record`,{});nodeFor(e,t.state)},selectTransition=(e,t,n)=>{assertSnapshot(e,t);let r=nodeFor(e,t.state);if(n.kind===`after`)return!r.after||!r.after.includes(n.after)?void 0:!n.after.guard||n.after.guard({context:t.context,event:void 0})?{event:void 0,transition:n.after}:void 0;let i=r.on;if(!i||!Object.hasOwn(i,n.event.type))return;let a=i[n.event.type],o=Array.isArray(a)?a:[a];for(let e of o)if(!e.guard||e.guard({context:t.context,event:n.event}))return{event:n.event,transition:e}},transition=(e,t,n)=>{let r=selectTransition(e,t,n);if(!r)return{event:n.kind===`event`?n.event:void 0,result:{snapshot:normalizeSnapshot(t),type:`ignored`}};let i=r.transition.reduce?r.transition.reduce({context:t.context,event:r.event}):t.context;if(!isContextRecord(i))throw new ClockworkSnapshotError(`a reducer must return a non-array object record`,{state:t.state});return{event:r.event,result:{snapshot:createSnapshot(r.transition.target,i),type:`transition`},transition:r.transition}},canTransition=(e,t,n)=>selectTransition(e,t,{event:n,kind:`event`})!==void 0,createActor=(t,r,i={})=>{let a=i.snapshot??r;assertSnapshot(t,a);let o=createSnapshot(a.state,a.context),s=new Set,c=(0,e.tapper)(),l=new AbortController,u=new Set,d=new Set,f=[],p=!1,m=!1,cancelStateResources=()=>{for(let e of u)clearTimeout(e);u.clear();for(let e of d)e.abort();d.clear()},dispose=()=>{p||(p=!0,f.length=0,cancelStateResources(),s.clear(),c.emit({type:`dispose`}),c.clear(),l.abort())},observeError=(e,t)=>{c.emit({error:e,event:t.event,phase:t.phase,state:t.state,type:`error`})},fail=(e,t)=>{observeError(e,t),dispose()},run=e=>{if(!p){if(m)f.push(e);else{m=!0;try{process(e),flush()}finally{m=!1}}}},send=e=>{p||isMachineEvent(e)&&run({event:e,kind:`event`})},runEffects=(e,t,n)=>{for(let r of e){if(p)return;try{r({context:o.context,event:n,send,signal:l.signal})}catch(e){fail(e,{event:n,phase:`effect`,state:t})}}},establishStateResources=(e,n)=>{let r=nodeFor(t,e);for(let e of r.after??[]){let t=setTimeout(()=>{u.delete(t),run({after:e,kind:`after`})},e.delay);u.add(t)}for(let t of r.invoke??[]){let r=new AbortController;d.add(r);let i=o.context,a=n;Promise.resolve().then(()=>t.src({context:i,event:a,signal:r.signal})).then(n=>{if(d.delete(r),!(p||r.signal.aborted||!t.onDone))try{send(t.onDone({context:i,result:n}))}catch(t){fail(t,{event:a,phase:`invoke`,state:e})}},n=>{if(d.delete(r),!(p||r.signal.aborted))try{t.onError?send(t.onError({context:i,error:n})):fail(n,{event:a,phase:`invoke`,state:e})}catch(t){fail(t,{event:a,phase:`invoke`,state:e})}})}},notify=e=>{for(let t of[...s]){if(p)return;try{t(o)}catch(t){observeError(t,{event:e,phase:`subscriber`,state:o.state})}}},process=e=>{let n=o,r;try{r=transition(t,o,e)}catch(t){fail(t,{event:e.kind===`event`?e.event:void 0,phase:`transition`,state:o.state});return}if(r.result.type===`ignored`||!r.transition){c.emit({event:r.event,snapshot:r.result.snapshot,type:`ignored`});return}let i=nodeFor(t,n.state);o=r.result.snapshot,c.emit({event:r.event,snapshot:o,type:`transition`}),cancelStateResources(),establishStateResources(o.state,r.event),notify(r.event),runEffects(i.exit??[],n.state,r.event),runEffects(r.transition.effects??[],n.state,r.event),runEffects(nodeFor(t,o.state).entry??[],o.state,r.event)},flush=()=>{let e=0;for(;f.length>0&&!p;){if(e+=1,e>n){fail(new ClockworkTransitionLimitError(`maximum queued transitions exceeded`,{maxTransitions:n}),{phase:`transition`,state:o.state});return}let t=f.shift();t&&process(t)}};return establishStateResources(o.state,void 0),i.snapshot||runEffects(nodeFor(t,o.state).entry??[],o.state,void 0),{can:e=>{if(p)return!1;try{return isMachineEvent(e)?canTransition(t,o,e):!1}catch(t){return fail(t,{event:e,phase:`transition`,state:o.state}),!1}},get disposalSignal(){return l.signal},dispose,get disposed(){return p},send,get snapshot(){return o},subscribe(e){return p?()=>void 0:(s.add(e),()=>s.delete(e))},tap(e,t){return p?()=>void 0:c.tap(e,t)},[Symbol.dispose]:dispose}},defineMachine=()=>e=>{assertDefinition(e);let t=e.context??{},n=createSnapshot(e.initial,t);return{can:(t,n)=>canTransition(e,t,n),createActor:t=>createActor(e,n,t),initialSnapshot:n,transition:(t,n)=>transition(e,t,{event:n,kind:`event`}).result}};exports.ClockworkDefinitionError=ClockworkDefinitionError,exports.ClockworkError=ClockworkError,exports.ClockworkSnapshotError=ClockworkSnapshotError,exports.ClockworkTransitionLimitError=ClockworkTransitionLimitError,exports.defineMachine=defineMachine;
|
|
2
2
|
//# sourceMappingURL=clockwork.cjs.map
|
package/dist/clockwork.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"clockwork.cjs","names":[],"sources":["../src/errors.ts","../src/_dev.ts","../src/interpret.ts"],"sourcesContent":["/** Base class for every Clockwork failure. */\nexport class ClockworkError extends Error {\n readonly details: Readonly<Record<string, unknown>>;\n\n constructor(message: string, details: Record<string, unknown> = {}, opts?: ErrorOptions) {\n super(message, opts);\n this.name = new.target.name;\n this.details = Object.freeze({ ...details });\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\n/** The machine definition failed validation at `defineMachine()` time. */\nexport class ClockworkDefinitionError extends ClockworkError {}\n\n/** A snapshot, its context, or a reducer result failed validation. */\nexport class ClockworkSnapshotError extends ClockworkError {}\n\n/** An actor exceeded the fixed queued-transition limit and disposed itself. */\nexport class ClockworkTransitionLimitError extends ClockworkError {}\n","const isDev = !(globalThis as { __CLOCKWORK_PROD__?: boolean }).__CLOCKWORK_PROD__;\n\nexport function warn(msg: string): void {\n if (isDev) console.warn(`[@vielzeug/clockwork] ${msg}`);\n}\n","import { tapper } from '@vielzeug/arsenal';\nimport { warn } from './_dev.js';\nimport { ClockworkDefinitionError, ClockworkSnapshotError, ClockworkTransitionLimitError } from './errors.js';\nimport type {\n Actor,\n ActorErrorContext,\n ActorOptions,\n ActorTapEvent,\n After,\n Effect,\n EventType,\n Machine,\n MachineConfig,\n MachineEvent,\n MachineSnapshot,\n StateNode,\n TransitionResult,\n} from './types.js';\n\nconst MAX_TIMER_MS = 2_147_483_647;\nconst MAX_TRANSITIONS = 1_000;\n\nconst isContextRecord = (value: unknown): value is Record<string, unknown> => {\n if (typeof value !== 'object' || value === null || Array.isArray(value)) return false;\n\n const prototype = Object.getPrototypeOf(value);\n\n return prototype === null || prototype === Object.prototype;\n};\n\n/** Fails fast on the definition footguns the type system cannot express: out-of-range\n * timer delays (platform timers fire immediately above 2^31 ms), empty transition\n * arrays, and a context that is not a plain record. Everything else: declared\n * targets, callback shapes, state keys: is compiler-checked in the typed definition. */\nconst assertDefinition = <State extends string, Context extends Record<string, unknown>, Event extends MachineEvent>(\n definition: MachineConfig<State, Context, Event>,\n): void => {\n const context = (definition as { readonly context?: Context }).context;\n\n if (context !== undefined && !isContextRecord(context)) {\n throw new ClockworkDefinitionError('machine context must be a non-array object record', {});\n }\n\n for (const [state, node] of Object.entries(definition.states) as [string, StateNode<State, Context, Event>][]) {\n for (const [type, input] of Object.entries(node.on ?? {})) {\n if (Array.isArray(input) && input.length === 0) {\n throw new ClockworkDefinitionError('a transition array must not be empty', { state, type });\n }\n }\n\n for (const [index, after] of (node.after ?? []).entries()) {\n if (!Number.isFinite(after.delay) || after.delay < 0 || after.delay > MAX_TIMER_MS) {\n throw new ClockworkDefinitionError(`state \"${state}\" after delay must be between 0 and ${MAX_TIMER_MS}`, {\n delay: after.delay,\n index,\n state,\n });\n }\n }\n }\n};\n\ntype InternalEvent<State extends string, Context extends Record<string, unknown>, Event extends MachineEvent> = {\n readonly after: After<State, Context, Event>;\n readonly kind: 'after';\n};\n\ntype RuntimeEvent<State extends string, Context extends Record<string, unknown>, Event extends MachineEvent> =\n | { readonly event: Event; readonly kind: 'event' }\n | InternalEvent<State, Context, Event>;\n\n/** A transition or delayed transition selected for execution. The reducer's event\n * parameter is whatever the selector matched: the event for a user transition,\n * `undefined` for a timer, which the declared per-type signatures cannot express. */\ntype ExecutableTransition<State extends string, Context extends Record<string, unknown>, Event extends MachineEvent> = {\n readonly effects?: readonly Effect<Context, Event>[];\n readonly reduce?: (args: { readonly context: Readonly<Context>; readonly event: Event | undefined }) => Context;\n readonly target: State;\n};\n\ntype SelectedTransition<State extends string, Context extends Record<string, unknown>, Event extends MachineEvent> = {\n readonly event: Event | undefined;\n readonly transition: ExecutableTransition<State, Context, Event>;\n};\n\ntype TransitionOutcome<State extends string, Context extends Record<string, unknown>, Event extends MachineEvent> = {\n readonly event: Event | undefined;\n readonly result: TransitionResult<State, Context>;\n readonly transition?: ExecutableTransition<State, Context, Event>;\n};\n\nconst createSnapshot = <State extends string, Context extends Record<string, unknown>>(\n state: State,\n context: Context,\n): MachineSnapshot<State, Context> => {\n const cloned = Object.assign(Object.create(Object.getPrototypeOf(context)) as Context, context);\n\n return Object.freeze({ context: Object.freeze(cloned), state });\n};\n\nconst normalizeSnapshot = <State extends string, Context extends Record<string, unknown>>(\n snapshot: MachineSnapshot<State, Context>,\n): MachineSnapshot<State, Context> =>\n Object.isFrozen(snapshot) && Object.isFrozen(snapshot.context)\n ? snapshot\n : createSnapshot(snapshot.state, snapshot.context as Context);\n\nconst invalidSnapshot = (state: unknown): never => {\n throw new ClockworkSnapshotError(`snapshot state \"${String(state)}\" is not declared`, { state });\n};\n\nconst isMachineEvent = (event: unknown): event is MachineEvent =>\n typeof event === 'object' && event !== null && typeof (event as { type?: unknown }).type === 'string';\n\n/** Reads a declared state node. The own-property guard keeps prototype keys such as\n * `constructor` or `__proto__` from reading as declared states. */\nconst nodeFor = <State extends string, Context extends Record<string, unknown>, Event extends MachineEvent>(\n definition: MachineConfig<State, Context, Event>,\n state: State,\n) => (Object.hasOwn(definition.states, state) ? definition.states[state] : invalidSnapshot(state));\n\nconst assertSnapshot = <State extends string, Context extends Record<string, unknown>, Event extends MachineEvent>(\n definition: MachineConfig<State, Context, Event>,\n snapshot: MachineSnapshot<State, Context>,\n): void => {\n if (!isContextRecord(snapshot.context)) {\n throw new ClockworkSnapshotError('snapshot context must be a non-array object record', {});\n }\n\n nodeFor(definition, snapshot.state);\n};\n\nconst selectTransition = <State extends string, Context extends Record<string, unknown>, Event extends MachineEvent>(\n definition: MachineConfig<State, Context, Event>,\n snapshot: MachineSnapshot<State, Context>,\n runtimeEvent: RuntimeEvent<State, Context, Event>,\n): SelectedTransition<State, Context, Event> | undefined => {\n assertSnapshot(definition, snapshot);\n const node = nodeFor(definition, snapshot.state);\n\n if (runtimeEvent.kind === 'after') {\n if (!node.after || !node.after.includes(runtimeEvent.after)) return undefined;\n\n if (!runtimeEvent.after.guard || runtimeEvent.after.guard({ context: snapshot.context, event: undefined })) {\n return { event: undefined, transition: runtimeEvent.after as ExecutableTransition<State, Context, Event> };\n }\n\n return undefined;\n }\n\n const on = node.on;\n\n if (!on || !Object.hasOwn(on, runtimeEvent.event.type)) return undefined;\n\n const input = on[runtimeEvent.event.type as EventType<Event>];\n const candidates = Array.isArray(input) ? input : [input];\n\n for (const candidate of candidates) {\n if (!candidate.guard || candidate.guard({ context: snapshot.context, event: runtimeEvent.event })) {\n return { event: runtimeEvent.event, transition: candidate as ExecutableTransition<State, Context, Event> };\n }\n }\n\n return undefined;\n};\n\nconst transition = <State extends string, Context extends Record<string, unknown>, Event extends MachineEvent>(\n definition: MachineConfig<State, Context, Event>,\n snapshot: MachineSnapshot<State, Context>,\n runtimeEvent: RuntimeEvent<State, Context, Event>,\n): TransitionOutcome<State, Context, Event> => {\n const selected = selectTransition(definition, snapshot, runtimeEvent);\n\n if (!selected) {\n return {\n event: runtimeEvent.kind === 'event' ? runtimeEvent.event : undefined,\n result: { snapshot: normalizeSnapshot(snapshot), type: 'ignored' },\n };\n }\n\n const nextContext = selected.transition.reduce\n ? selected.transition.reduce({ context: snapshot.context, event: selected.event })\n : snapshot.context;\n\n if (!isContextRecord(nextContext)) {\n throw new ClockworkSnapshotError('a reducer must return a non-array object record', {\n state: snapshot.state,\n });\n }\n\n return {\n event: selected.event,\n result: { snapshot: createSnapshot(selected.transition.target, nextContext as Context), type: 'transition' },\n transition: selected.transition,\n };\n};\n\nconst canTransition = <State extends string, Context extends Record<string, unknown>, Event extends MachineEvent>(\n definition: MachineConfig<State, Context, Event>,\n snapshot: MachineSnapshot<State, Context>,\n event: Event,\n): boolean => selectTransition(definition, snapshot, { event, kind: 'event' }) !== undefined;\n\nconst createActor = <State extends string, Context extends Record<string, unknown>, Event extends MachineEvent>(\n definition: MachineConfig<State, Context, Event>,\n initialSnapshot: MachineSnapshot<State, Context>,\n options: ActorOptions<State, Context> = {},\n): Actor<State, Context, Event> => {\n const restored = options.snapshot ?? initialSnapshot;\n\n assertSnapshot(definition, restored);\n let current = createSnapshot(restored.state, restored.context as Context);\n\n const listeners = new Set<(snapshot: MachineSnapshot<State, Context>) => void>();\n const tappers = tapper<ActorTapEvent<State, Context, Event>>();\n const disposal = new AbortController();\n const timers = new Set<ReturnType<typeof setTimeout>>();\n const invokes = new Set<AbortController>();\n const queue: RuntimeEvent<State, Context, Event>[] = [];\n let disposed = false;\n let processing = false;\n\n const cancelStateResources = (): void => {\n for (const timer of timers) clearTimeout(timer);\n timers.clear();\n\n for (const controller of invokes) controller.abort();\n invokes.clear();\n };\n\n const dispose = (): void => {\n if (disposed) return;\n\n disposed = true;\n queue.length = 0;\n cancelStateResources();\n listeners.clear();\n tappers.emit({ type: 'dispose' });\n tappers.clear();\n disposal.abort();\n };\n\n const observeError = (error: unknown, context: ActorErrorContext<State, Event>): void => {\n tappers.emit({ error, event: context.event, phase: context.phase, state: context.state, type: 'error' });\n };\n\n const fail = (error: unknown, context: ActorErrorContext<State, Event>): void => {\n observeError(error, context);\n dispose();\n };\n\n const run = (runtimeEvent: RuntimeEvent<State, Context, Event>): void => {\n if (disposed) return;\n\n if (processing) {\n queue.push(runtimeEvent);\n\n return;\n }\n\n processing = true;\n\n try {\n process(runtimeEvent);\n flush();\n } finally {\n processing = false;\n }\n };\n\n const send = (event: Event): void => {\n if (disposed) return;\n\n if (!isMachineEvent(event)) {\n warn('ignored malformed event; expected an object with a string `type`');\n\n return;\n }\n\n run({ event, kind: 'event' });\n };\n\n const runEffects = (effects: readonly Effect<Context, Event>[], state: State, event: Event | undefined): void => {\n for (const effect of effects) {\n if (disposed) return;\n\n try {\n effect({ context: current.context, event, send, signal: disposal.signal });\n } catch (error) {\n fail(error, { event, phase: 'effect', state });\n }\n }\n };\n\n const establishStateResources = (state: State, event: Event | undefined): void => {\n const node = nodeFor(definition, state);\n\n for (const after of node.after ?? []) {\n const timer = setTimeout(() => {\n timers.delete(timer);\n run({ after, kind: 'after' });\n }, after.delay);\n\n timers.add(timer);\n }\n\n for (const invoke of node.invoke ?? []) {\n const controller = new AbortController();\n\n invokes.add(controller);\n\n const capturedContext = current.context;\n const capturedEvent = event;\n\n void Promise.resolve()\n .then(() => invoke.src({ context: capturedContext, event: capturedEvent, signal: controller.signal }))\n .then(\n (result) => {\n invokes.delete(controller);\n\n if (disposed || controller.signal.aborted || !invoke.onDone) return;\n\n try {\n send(invoke.onDone({ context: capturedContext, result }));\n } catch (error) {\n fail(error, { event: capturedEvent, phase: 'invoke', state });\n }\n },\n (error: unknown) => {\n invokes.delete(controller);\n\n if (disposed || controller.signal.aborted) return;\n\n try {\n if (invoke.onError) {\n send(invoke.onError({ context: capturedContext, error }));\n } else {\n fail(error, { event: capturedEvent, phase: 'invoke', state });\n }\n } catch (callbackError) {\n fail(callbackError, { event: capturedEvent, phase: 'invoke', state });\n }\n },\n );\n }\n };\n\n const notify = (event: Event | undefined): void => {\n for (const listener of [...listeners]) {\n if (disposed) return;\n\n try {\n listener(current);\n } catch (error) {\n observeError(error, { event, phase: 'subscriber', state: current.state });\n }\n }\n };\n\n const process = (runtimeEvent: RuntimeEvent<State, Context, Event>): void => {\n const previous = current;\n let outcome: TransitionOutcome<State, Context, Event>;\n\n try {\n outcome = transition(definition, current, runtimeEvent);\n } catch (error) {\n fail(error, {\n event: runtimeEvent.kind === 'event' ? runtimeEvent.event : undefined,\n phase: 'transition',\n state: current.state,\n });\n\n return;\n }\n\n if (outcome.result.type === 'ignored' || !outcome.transition) {\n tappers.emit({ event: outcome.event, snapshot: outcome.result.snapshot, type: 'ignored' });\n return;\n }\n\n const source = nodeFor(definition, previous.state);\n\n current = outcome.result.snapshot;\n tappers.emit({ event: outcome.event, snapshot: current, type: 'transition' });\n cancelStateResources();\n establishStateResources(current.state, outcome.event);\n notify(outcome.event);\n runEffects(source.exit ?? [], previous.state, outcome.event);\n runEffects(outcome.transition.effects ?? [], previous.state, outcome.event);\n runEffects(nodeFor(definition, current.state).entry ?? [], current.state, outcome.event);\n };\n\n const flush = (): void => {\n let transitions = 0;\n\n while (queue.length > 0 && !disposed) {\n transitions += 1;\n\n if (transitions > MAX_TRANSITIONS) {\n fail(\n new ClockworkTransitionLimitError('maximum queued transitions exceeded', { maxTransitions: MAX_TRANSITIONS }),\n {\n phase: 'transition',\n state: current.state,\n },\n );\n\n return;\n }\n\n const next = queue.shift();\n\n if (next) process(next);\n }\n };\n\n establishStateResources(current.state, undefined);\n\n if (!options.snapshot) {\n runEffects(nodeFor(definition, current.state).entry ?? [], current.state, undefined);\n }\n\n return {\n can: (event) => {\n if (disposed) return false;\n\n try {\n if (!isMachineEvent(event)) {\n warn('ignored malformed event; expected an object with a string `type`');\n return false;\n }\n\n return canTransition(definition, current, event);\n } catch (error) {\n fail(error, { event, phase: 'transition', state: current.state });\n return false;\n }\n },\n get disposalSignal() {\n return disposal.signal;\n },\n dispose,\n get disposed() {\n return disposed;\n },\n send,\n get snapshot() {\n return current;\n },\n subscribe(listener) {\n if (disposed) return () => undefined;\n\n listeners.add(listener);\n\n return () => listeners.delete(listener);\n },\n tap(handler, tapOptions) {\n if (disposed) return () => undefined;\n\n return tappers.tap(handler, tapOptions);\n },\n [Symbol.dispose]: dispose,\n };\n};\n\n/** Defines a typed flat finite-state machine. */\nexport const defineMachine =\n <Context extends Record<string, unknown> = Record<string, never>, Event extends MachineEvent = MachineEvent>() =>\n <State extends string>(definition: MachineConfig<State, Context, Event>): Machine<State, Context, Event> => {\n assertDefinition(definition);\n const context = (definition as { readonly context?: Context }).context ?? ({} as Context);\n const initialSnapshot = createSnapshot(definition.initial, context);\n\n return {\n can: (snapshot, event) => canTransition(definition, snapshot, event),\n createActor: (options) => createActor(definition, initialSnapshot, options),\n initialSnapshot,\n transition: (snapshot, event) => transition(definition, snapshot, { event, kind: 'event' }).result,\n };\n };\n"],"mappings":"sGACA,IAAa,eAAb,cAAoC,KAAM,CACxC,QAEA,YAAY,EAAiB,EAAmC,CAAC,EAAG,EAAqB,CACvF,MAAM,EAAS,CAAI,EACnB,KAAK,KAAO,WAAW,KACvB,KAAK,QAAU,OAAO,OAAO,CAAE,GAAG,CAAQ,CAAC,EAC3C,OAAO,eAAe,KAAM,WAAW,SAAS,CAClD,CACF,EAGa,yBAAb,cAA8C,cAAe,CAAC,EAGjD,uBAAb,cAA4C,cAAe,CAAC,EAG/C,8BAAb,cAAmD,cAAe,CAAC,EEA7D,EAAe,WACf,EAAkB,IAElB,gBAAmB,GAAqD,CAC5E,GAAI,OAAO,GAAU,WAAY,GAAkB,MAAM,QAAQ,CAAK,EAAG,MAAO,GAEhF,IAAM,EAAY,OAAO,eAAe,CAAK,EAE7C,OAAO,IAAc,MAAQ,IAAc,OAAO,SACpD,EAMM,iBACJ,GACS,CACT,IAAM,EAAW,EAA8C,QAE/D,GAAI,IAAY,IAAA,IAAa,CAAC,gBAAgB,CAAO,EACnD,MAAM,IAAI,yBAAyB,oDAAqD,CAAC,CAAC,EAG5F,IAAK,GAAM,CAAC,EAAO,KAAS,OAAO,QAAQ,EAAW,MAAM,EAAmD,CAC7G,IAAK,GAAM,CAAC,EAAM,KAAU,OAAO,QAAQ,EAAK,IAAM,CAAC,CAAC,EACtD,GAAI,MAAM,QAAQ,CAAK,GAAK,EAAM,SAAW,EAC3C,MAAM,IAAI,yBAAyB,uCAAwC,CAAE,QAAO,MAAK,CAAC,EAI9F,IAAK,GAAM,CAAC,EAAO,KAAW,EAAK,OAAS,CAAC,EAAA,CAAG,QAAQ,EACtD,GAAI,CAAC,OAAO,SAAS,EAAM,KAAK,GAAK,EAAM,MAAQ,GAAK,EAAM,MAAQ,EACpE,MAAM,IAAI,yBAAyB,UAAU,EAAM,sCAAsC,IAAgB,CACvG,MAAO,EAAM,MACb,QACA,OACF,CAAC,CAGP,CACF,EA+BM,gBACJ,EACA,IACoC,CACpC,IAAM,EAAS,OAAO,OAAO,OAAO,OAAO,OAAO,eAAe,CAAO,CAAC,EAAc,CAAO,EAE9F,OAAO,OAAO,OAAO,CAAE,QAAS,OAAO,OAAO,CAAM,EAAG,OAAM,CAAC,CAChE,EAEM,kBACJ,GAEA,OAAO,SAAS,CAAQ,GAAK,OAAO,SAAS,EAAS,OAAO,EACzD,EACA,eAAe,EAAS,MAAO,EAAS,OAAkB,EAE1D,gBAAmB,GAA0B,CACjD,MAAM,IAAI,uBAAuB,mBAAmB,OAAO,CAAK,EAAE,mBAAoB,CAAE,OAAM,CAAC,CACjG,EAEM,eAAkB,GACtB,OAAO,GAAU,YAAY,GAAkB,OAAQ,EAA6B,MAAS,SAIzF,SACJ,EACA,IACI,OAAO,OAAO,EAAW,OAAQ,CAAK,EAAI,EAAW,OAAO,GAAS,gBAAgB,CAAK,EAE1F,gBACJ,EACA,IACS,CACT,GAAI,CAAC,gBAAgB,EAAS,OAAO,EACnC,MAAM,IAAI,uBAAuB,qDAAsD,CAAC,CAAC,EAG3F,QAAQ,EAAY,EAAS,KAAK,CACpC,EAEM,kBACJ,EACA,EACA,IAC0D,CAC1D,eAAe,EAAY,CAAQ,EACnC,IAAM,EAAO,QAAQ,EAAY,EAAS,KAAK,EAE/C,GAAI,EAAa,OAAS,QAOxB,MANI,CAAC,EAAK,OAAS,CAAC,EAAK,MAAM,SAAS,EAAa,KAAK,EAAG,OAEzD,CAAC,EAAa,MAAM,OAAS,EAAa,MAAM,MAAM,CAAE,QAAS,EAAS,QAAS,MAAO,IAAA,EAAU,CAAC,EAChG,CAAE,MAAO,IAAA,GAAW,WAAY,EAAa,KAAqD,EAG3G,OAGF,IAAM,EAAK,EAAK,GAEhB,GAAI,CAAC,GAAM,CAAC,OAAO,OAAO,EAAI,EAAa,MAAM,IAAI,EAAG,OAExD,IAAM,EAAQ,EAAG,EAAa,MAAM,MAC9B,EAAa,MAAM,QAAQ,CAAK,EAAI,EAAQ,CAAC,CAAK,EAExD,IAAK,IAAM,KAAa,EACtB,GAAI,CAAC,EAAU,OAAS,EAAU,MAAM,CAAE,QAAS,EAAS,QAAS,MAAO,EAAa,KAAM,CAAC,EAC9F,MAAO,CAAE,MAAO,EAAa,MAAO,WAAY,CAAyD,CAK/G,EAEM,YACJ,EACA,EACA,IAC6C,CAC7C,IAAM,EAAW,iBAAiB,EAAY,EAAU,CAAY,EAEpE,GAAI,CAAC,EACH,MAAO,CACL,MAAO,EAAa,OAAS,QAAU,EAAa,MAAQ,IAAA,GAC5D,OAAQ,CAAE,SAAU,kBAAkB,CAAQ,EAAG,KAAM,SAAU,CACnE,EAGF,IAAM,EAAc,EAAS,WAAW,OACpC,EAAS,WAAW,OAAO,CAAE,QAAS,EAAS,QAAS,MAAO,EAAS,KAAM,CAAC,EAC/E,EAAS,QAEb,GAAI,CAAC,gBAAgB,CAAW,EAC9B,MAAM,IAAI,uBAAuB,kDAAmD,CAClF,MAAO,EAAS,KAClB,CAAC,EAGH,MAAO,CACL,MAAO,EAAS,MAChB,OAAQ,CAAE,SAAU,eAAe,EAAS,WAAW,OAAQ,CAAsB,EAAG,KAAM,YAAa,EAC3G,WAAY,EAAS,UACvB,CACF,EAEM,eACJ,EACA,EACA,IACY,iBAAiB,EAAY,EAAU,CAAE,QAAO,KAAM,OAAQ,CAAC,IAAM,IAAA,GAE7E,aACJ,EACA,EACA,EAAwC,CAAC,IACR,CACjC,IAAM,EAAW,EAAQ,UAAY,EAErC,eAAe,EAAY,CAAQ,EACnC,IAAI,EAAU,eAAe,EAAS,MAAO,EAAS,OAAkB,EAElE,EAAY,IAAI,IAChB,GAAA,EAAU,EAAA,OAAA,CAA6C,EACvD,EAAW,IAAI,gBACf,EAAS,IAAI,IACb,EAAU,IAAI,IACd,EAA+C,CAAC,EAClD,EAAW,GACX,EAAa,GAEX,yBAAmC,CACvC,IAAK,IAAM,KAAS,EAAQ,aAAa,CAAK,EAC9C,EAAO,MAAM,EAEb,IAAK,IAAM,KAAc,EAAS,EAAW,MAAM,EACnD,EAAQ,MAAM,CAChB,EAEM,YAAsB,CACtB,IAEJ,EAAW,GACX,EAAM,OAAS,EACf,qBAAqB,EACrB,EAAU,MAAM,EAChB,EAAQ,KAAK,CAAE,KAAM,SAAU,CAAC,EAChC,EAAQ,MAAM,EACd,EAAS,MAAM,EACjB,EAEM,cAAgB,EAAgB,IAAmD,CACvF,EAAQ,KAAK,CAAE,QAAO,MAAO,EAAQ,MAAO,MAAO,EAAQ,MAAO,MAAO,EAAQ,MAAO,KAAM,OAAQ,CAAC,CACzG,EAEM,MAAQ,EAAgB,IAAmD,CAC/E,aAAa,EAAO,CAAO,EAC3B,QAAQ,CACV,EAEM,IAAO,GAA4D,CACnE,MAEJ,IAAI,EAAY,CACd,EAAM,KAAK,CAAY,EAEvB,MACF,CAEA,EAAa,GAEb,GAAI,CACF,QAAQ,CAAY,EACpB,MAAM,CACR,QAAU,CACR,EAAa,EACf,CATA,CAUF,EAEM,KAAQ,GAAuB,CAC/B,GAEC,eAAe,CAAK,GAMzB,IAAI,CAAE,QAAO,KAAM,OAAQ,CAAC,CAC9B,EAEM,YAAc,EAA4C,EAAc,IAAmC,CAC/G,IAAK,IAAM,KAAU,EAAS,CAC5B,GAAI,EAAU,OAEd,GAAI,CACF,EAAO,CAAE,QAAS,EAAQ,QAAS,QAAO,KAAM,OAAQ,EAAS,MAAO,CAAC,CAC3E,OAAS,EAAO,CACd,KAAK,EAAO,CAAE,QAAO,MAAO,SAAU,OAAM,CAAC,CAC/C,CACF,CACF,EAEM,yBAA2B,EAAc,IAAmC,CAChF,IAAM,EAAO,QAAQ,EAAY,CAAK,EAEtC,IAAK,IAAM,KAAS,EAAK,OAAS,CAAC,EAAG,CACpC,IAAM,EAAQ,eAAiB,CAC7B,EAAO,OAAO,CAAK,EACnB,IAAI,CAAE,QAAO,KAAM,OAAQ,CAAC,CAC9B,EAAG,EAAM,KAAK,EAEd,EAAO,IAAI,CAAK,CAClB,CAEA,IAAK,IAAM,KAAU,EAAK,QAAU,CAAC,EAAG,CACtC,IAAM,EAAa,IAAI,gBAEvB,EAAQ,IAAI,CAAU,EAEtB,IAAM,EAAkB,EAAQ,QAC1B,EAAgB,EAEtB,QAAa,QAAQ,CAAC,CACnB,SAAW,EAAO,IAAI,CAAE,QAAS,EAAiB,MAAO,EAAe,OAAQ,EAAW,MAAO,CAAC,CAAC,CAAC,CACrG,KACE,GAAW,CACV,KAAQ,OAAO,CAAU,EAErB,KAAY,EAAW,OAAO,SAAW,CAAC,EAAO,QAErD,GAAI,CACF,KAAK,EAAO,OAAO,CAAE,QAAS,EAAiB,QAAO,CAAC,CAAC,CAC1D,OAAS,EAAO,CACd,KAAK,EAAO,CAAE,MAAO,EAAe,MAAO,SAAU,OAAM,CAAC,CAC9D,CACF,EACC,GAAmB,CAClB,KAAQ,OAAO,CAAU,EAErB,KAAY,EAAW,OAAO,SAElC,GAAI,CACE,EAAO,QACT,KAAK,EAAO,QAAQ,CAAE,QAAS,EAAiB,OAAM,CAAC,CAAC,EAExD,KAAK,EAAO,CAAE,MAAO,EAAe,MAAO,SAAU,OAAM,CAAC,CAEhE,OAAS,EAAe,CACtB,KAAK,EAAe,CAAE,MAAO,EAAe,MAAO,SAAU,OAAM,CAAC,CACtE,CACF,CACF,CACJ,CACF,EAEM,OAAU,GAAmC,CACjD,IAAK,IAAM,IAAY,CAAC,GAAG,CAAS,EAAG,CACrC,GAAI,EAAU,OAEd,GAAI,CACF,EAAS,CAAO,CAClB,OAAS,EAAO,CACd,aAAa,EAAO,CAAE,QAAO,MAAO,aAAc,MAAO,EAAQ,KAAM,CAAC,CAC1E,CACF,CACF,EAEM,QAAW,GAA4D,CAC3E,IAAM,EAAW,EACb,EAEJ,GAAI,CACF,EAAU,WAAW,EAAY,EAAS,CAAY,CACxD,OAAS,EAAO,CACd,KAAK,EAAO,CACV,MAAO,EAAa,OAAS,QAAU,EAAa,MAAQ,IAAA,GAC5D,MAAO,aACP,MAAO,EAAQ,KACjB,CAAC,EAED,MACF,CAEA,GAAI,EAAQ,OAAO,OAAS,WAAa,CAAC,EAAQ,WAAY,CAC5D,EAAQ,KAAK,CAAE,MAAO,EAAQ,MAAO,SAAU,EAAQ,OAAO,SAAU,KAAM,SAAU,CAAC,EACzF,MACF,CAEA,IAAM,EAAS,QAAQ,EAAY,EAAS,KAAK,EAEjD,EAAU,EAAQ,OAAO,SACzB,EAAQ,KAAK,CAAE,MAAO,EAAQ,MAAO,SAAU,EAAS,KAAM,YAAa,CAAC,EAC5E,qBAAqB,EACrB,wBAAwB,EAAQ,MAAO,EAAQ,KAAK,EACpD,OAAO,EAAQ,KAAK,EACpB,WAAW,EAAO,MAAQ,CAAC,EAAG,EAAS,MAAO,EAAQ,KAAK,EAC3D,WAAW,EAAQ,WAAW,SAAW,CAAC,EAAG,EAAS,MAAO,EAAQ,KAAK,EAC1E,WAAW,QAAQ,EAAY,EAAQ,KAAK,CAAC,CAAC,OAAS,CAAC,EAAG,EAAQ,MAAO,EAAQ,KAAK,CACzF,EAEM,UAAoB,CACxB,IAAI,EAAc,EAElB,KAAO,EAAM,OAAS,GAAK,CAAC,GAAU,CAGpC,GAFA,GAAe,EAEX,EAAc,EAAiB,CACjC,KACE,IAAI,8BAA8B,sCAAuC,CAAE,eAAgB,CAAgB,CAAC,EAC5G,CACE,MAAO,aACP,MAAO,EAAQ,KACjB,CACF,EAEA,MACF,CAEA,IAAM,EAAO,EAAM,MAAM,EAErB,GAAM,QAAQ,CAAI,CACxB,CACF,EAQA,OANA,wBAAwB,EAAQ,MAAO,IAAA,EAAS,EAE3C,EAAQ,UACX,WAAW,QAAQ,EAAY,EAAQ,KAAK,CAAC,CAAC,OAAS,CAAC,EAAG,EAAQ,MAAO,IAAA,EAAS,EAG9E,CACL,IAAM,GAAU,CACd,GAAI,EAAU,MAAO,GAErB,GAAI,CAMF,OALK,eAAe,CAAK,EAKlB,cAAc,EAAY,EAAS,CAAK,EAHtC,EAIX,OAAS,EAAO,CAEd,OADA,KAAK,EAAO,CAAE,QAAO,MAAO,aAAc,MAAO,EAAQ,KAAM,CAAC,EACzD,EACT,CACF,EACA,IAAI,gBAAiB,CACnB,OAAO,EAAS,MAClB,EACA,QACA,IAAI,UAAW,CACb,OAAO,CACT,EACA,KACA,IAAI,UAAW,CACb,OAAO,CACT,EACA,UAAU,EAAU,CAKlB,OAJI,MAAuB,IAAA,IAE3B,EAAU,IAAI,CAAQ,MAET,EAAU,OAAO,CAAQ,EACxC,EACA,IAAI,EAAS,EAAY,CAGvB,OAFI,MAAuB,IAAA,GAEpB,EAAQ,IAAI,EAAS,CAAU,CACxC,GACC,OAAO,SAAU,OACpB,CACF,EAGa,kBAEY,GAAqF,CAC1G,iBAAiB,CAAU,EAC3B,IAAM,EAAW,EAA8C,SAAY,CAAC,EACtE,EAAkB,eAAe,EAAW,QAAS,CAAO,EAElE,MAAO,CACL,KAAM,EAAU,IAAU,cAAc,EAAY,EAAU,CAAK,EACnE,YAAc,GAAY,YAAY,EAAY,EAAiB,CAAO,EAC1E,kBACA,YAAa,EAAU,IAAU,WAAW,EAAY,EAAU,CAAE,QAAO,KAAM,OAAQ,CAAC,CAAC,CAAC,MAC9F,CACF"}
|
|
1
|
+
{"version":3,"file":"clockwork.cjs","names":["tapper","_vielzeug_arsenal","message","opts","details","MAX_TIMER_MS","MAX_TRANSITIONS","value","prototype","context","definition","state","node","type","input","index","after","cloned","snapshot","event","runtimeEvent","on","candidates","candidate","selected","nextContext","restored","options","initialSnapshot","current","listeners","tappers","disposal","timers","invokes","queue","disposed","processing","timer","controller","error","effect","effects","invoke","capturedContext","capturedEvent","callbackError","listener","previous","outcome","source","transitions","next","handler","tapOptions"],"sources":["../src/errors.ts","../src/_dev.ts","../src/interpret.ts"],"sourcesContent":["/** Base class for every Clockwork failure. */\nexport class ClockworkError extends Error {\n readonly details: Readonly<Record<string, unknown>>;\n\n constructor(message: string, details: Record<string, unknown> = {}, opts?: ErrorOptions) {\n super(message, opts);\n this.name = new.target.name;\n this.details = Object.freeze({ ...details });\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\n/** The machine definition failed validation at `defineMachine()` time. */\nexport class ClockworkDefinitionError extends ClockworkError {}\n\n/** A snapshot, its context, or a reducer result failed validation. */\nexport class ClockworkSnapshotError extends ClockworkError {}\n\n/** An actor exceeded the fixed queued-transition limit and disposed itself. */\nexport class ClockworkTransitionLimitError extends ClockworkError {}\n","const isDev = !(globalThis as { __CLOCKWORK_PROD__?: boolean }).__CLOCKWORK_PROD__;\n\nexport function warn(msg: string): void {\n if (isDev) console.warn(`[@vielzeug/clockwork] ${msg}`);\n}\n","import { tapper } from '@vielzeug/arsenal';\nimport { warn } from './_dev.js';\nimport { ClockworkDefinitionError, ClockworkSnapshotError, ClockworkTransitionLimitError } from './errors.js';\nimport type {\n Actor,\n ActorErrorContext,\n ActorOptions,\n ActorTapEvent,\n After,\n Effect,\n EventType,\n Machine,\n MachineConfig,\n MachineEvent,\n MachineSnapshot,\n StateNode,\n TransitionResult,\n} from './types.js';\n\nconst MAX_TIMER_MS = 2_147_483_647;\nconst MAX_TRANSITIONS = 1_000;\n\nconst isContextRecord = (value: unknown): value is Record<string, unknown> => {\n if (typeof value !== 'object' || value === null || Array.isArray(value)) return false;\n\n const prototype = Object.getPrototypeOf(value);\n\n return prototype === null || prototype === Object.prototype;\n};\n\n/** Fails fast on the definition footguns the type system cannot express: out-of-range\n * timer delays (platform timers fire immediately above 2^31 ms), empty transition\n * arrays, and a context that is not a plain record. Everything else: declared\n * targets, callback shapes, state keys: is compiler-checked in the typed definition. */\nconst assertDefinition = <State extends string, Context extends Record<string, unknown>, Event extends MachineEvent>(\n definition: MachineConfig<State, Context, Event>,\n): void => {\n const context = (definition as { readonly context?: Context }).context;\n\n if (context !== undefined && !isContextRecord(context)) {\n throw new ClockworkDefinitionError('machine context must be a non-array object record', {});\n }\n\n for (const [state, node] of Object.entries(definition.states) as [string, StateNode<State, Context, Event>][]) {\n for (const [type, input] of Object.entries(node.on ?? {})) {\n if (Array.isArray(input) && input.length === 0) {\n throw new ClockworkDefinitionError('a transition array must not be empty', { state, type });\n }\n }\n\n for (const [index, after] of (node.after ?? []).entries()) {\n if (!Number.isFinite(after.delay) || after.delay < 0 || after.delay > MAX_TIMER_MS) {\n throw new ClockworkDefinitionError(`state \"${state}\" after delay must be between 0 and ${MAX_TIMER_MS}`, {\n delay: after.delay,\n index,\n state,\n });\n }\n }\n }\n};\n\ntype InternalEvent<State extends string, Context extends Record<string, unknown>, Event extends MachineEvent> = {\n readonly after: After<State, Context, Event>;\n readonly kind: 'after';\n};\n\ntype RuntimeEvent<State extends string, Context extends Record<string, unknown>, Event extends MachineEvent> =\n | { readonly event: Event; readonly kind: 'event' }\n | InternalEvent<State, Context, Event>;\n\n/** A transition or delayed transition selected for execution. The reducer's event\n * parameter is whatever the selector matched: the event for a user transition,\n * `undefined` for a timer, which the declared per-type signatures cannot express. */\ntype ExecutableTransition<State extends string, Context extends Record<string, unknown>, Event extends MachineEvent> = {\n readonly effects?: readonly Effect<Context, Event>[];\n readonly reduce?: (args: { readonly context: Readonly<Context>; readonly event: Event | undefined }) => Context;\n readonly target: State;\n};\n\ntype SelectedTransition<State extends string, Context extends Record<string, unknown>, Event extends MachineEvent> = {\n readonly event: Event | undefined;\n readonly transition: ExecutableTransition<State, Context, Event>;\n};\n\ntype TransitionOutcome<State extends string, Context extends Record<string, unknown>, Event extends MachineEvent> = {\n readonly event: Event | undefined;\n readonly result: TransitionResult<State, Context>;\n readonly transition?: ExecutableTransition<State, Context, Event>;\n};\n\nconst createSnapshot = <State extends string, Context extends Record<string, unknown>>(\n state: State,\n context: Context,\n): MachineSnapshot<State, Context> => {\n const cloned = Object.assign(Object.create(Object.getPrototypeOf(context)) as Context, context);\n\n return Object.freeze({ context: Object.freeze(cloned), state });\n};\n\nconst normalizeSnapshot = <State extends string, Context extends Record<string, unknown>>(\n snapshot: MachineSnapshot<State, Context>,\n): MachineSnapshot<State, Context> =>\n Object.isFrozen(snapshot) && Object.isFrozen(snapshot.context)\n ? snapshot\n : createSnapshot(snapshot.state, snapshot.context as Context);\n\nconst invalidSnapshot = (state: unknown): never => {\n throw new ClockworkSnapshotError(`snapshot state \"${String(state)}\" is not declared`, { state });\n};\n\nconst isMachineEvent = (event: unknown): event is MachineEvent =>\n typeof event === 'object' && event !== null && typeof (event as { type?: unknown }).type === 'string';\n\n/** Reads a declared state node. The own-property guard keeps prototype keys such as\n * `constructor` or `__proto__` from reading as declared states. */\nconst nodeFor = <State extends string, Context extends Record<string, unknown>, Event extends MachineEvent>(\n definition: MachineConfig<State, Context, Event>,\n state: State,\n) => (Object.hasOwn(definition.states, state) ? definition.states[state] : invalidSnapshot(state));\n\nconst assertSnapshot = <State extends string, Context extends Record<string, unknown>, Event extends MachineEvent>(\n definition: MachineConfig<State, Context, Event>,\n snapshot: MachineSnapshot<State, Context>,\n): void => {\n if (!isContextRecord(snapshot.context)) {\n throw new ClockworkSnapshotError('snapshot context must be a non-array object record', {});\n }\n\n nodeFor(definition, snapshot.state);\n};\n\nconst selectTransition = <State extends string, Context extends Record<string, unknown>, Event extends MachineEvent>(\n definition: MachineConfig<State, Context, Event>,\n snapshot: MachineSnapshot<State, Context>,\n runtimeEvent: RuntimeEvent<State, Context, Event>,\n): SelectedTransition<State, Context, Event> | undefined => {\n assertSnapshot(definition, snapshot);\n const node = nodeFor(definition, snapshot.state);\n\n if (runtimeEvent.kind === 'after') {\n if (!node.after || !node.after.includes(runtimeEvent.after)) return undefined;\n\n if (!runtimeEvent.after.guard || runtimeEvent.after.guard({ context: snapshot.context, event: undefined })) {\n return { event: undefined, transition: runtimeEvent.after as ExecutableTransition<State, Context, Event> };\n }\n\n return undefined;\n }\n\n const on = node.on;\n\n if (!on || !Object.hasOwn(on, runtimeEvent.event.type)) return undefined;\n\n const input = on[runtimeEvent.event.type as EventType<Event>];\n const candidates = Array.isArray(input) ? input : [input];\n\n for (const candidate of candidates) {\n if (!candidate.guard || candidate.guard({ context: snapshot.context, event: runtimeEvent.event })) {\n return { event: runtimeEvent.event, transition: candidate as ExecutableTransition<State, Context, Event> };\n }\n }\n\n return undefined;\n};\n\nconst transition = <State extends string, Context extends Record<string, unknown>, Event extends MachineEvent>(\n definition: MachineConfig<State, Context, Event>,\n snapshot: MachineSnapshot<State, Context>,\n runtimeEvent: RuntimeEvent<State, Context, Event>,\n): TransitionOutcome<State, Context, Event> => {\n const selected = selectTransition(definition, snapshot, runtimeEvent);\n\n if (!selected) {\n return {\n event: runtimeEvent.kind === 'event' ? runtimeEvent.event : undefined,\n result: { snapshot: normalizeSnapshot(snapshot), type: 'ignored' },\n };\n }\n\n const nextContext = selected.transition.reduce\n ? selected.transition.reduce({ context: snapshot.context, event: selected.event })\n : snapshot.context;\n\n if (!isContextRecord(nextContext)) {\n throw new ClockworkSnapshotError('a reducer must return a non-array object record', {\n state: snapshot.state,\n });\n }\n\n return {\n event: selected.event,\n result: { snapshot: createSnapshot(selected.transition.target, nextContext as Context), type: 'transition' },\n transition: selected.transition,\n };\n};\n\nconst canTransition = <State extends string, Context extends Record<string, unknown>, Event extends MachineEvent>(\n definition: MachineConfig<State, Context, Event>,\n snapshot: MachineSnapshot<State, Context>,\n event: Event,\n): boolean => selectTransition(definition, snapshot, { event, kind: 'event' }) !== undefined;\n\nconst createActor = <State extends string, Context extends Record<string, unknown>, Event extends MachineEvent>(\n definition: MachineConfig<State, Context, Event>,\n initialSnapshot: MachineSnapshot<State, Context>,\n options: ActorOptions<State, Context> = {},\n): Actor<State, Context, Event> => {\n const restored = options.snapshot ?? initialSnapshot;\n\n assertSnapshot(definition, restored);\n let current = createSnapshot(restored.state, restored.context as Context);\n\n const listeners = new Set<(snapshot: MachineSnapshot<State, Context>) => void>();\n const tappers = tapper<ActorTapEvent<State, Context, Event>>();\n const disposal = new AbortController();\n const timers = new Set<ReturnType<typeof setTimeout>>();\n const invokes = new Set<AbortController>();\n const queue: RuntimeEvent<State, Context, Event>[] = [];\n let disposed = false;\n let processing = false;\n\n const cancelStateResources = (): void => {\n for (const timer of timers) clearTimeout(timer);\n timers.clear();\n\n for (const controller of invokes) controller.abort();\n invokes.clear();\n };\n\n const dispose = (): void => {\n if (disposed) return;\n\n disposed = true;\n queue.length = 0;\n cancelStateResources();\n listeners.clear();\n tappers.emit({ type: 'dispose' });\n tappers.clear();\n disposal.abort();\n };\n\n const observeError = (error: unknown, context: ActorErrorContext<State, Event>): void => {\n tappers.emit({ error, event: context.event, phase: context.phase, state: context.state, type: 'error' });\n };\n\n const fail = (error: unknown, context: ActorErrorContext<State, Event>): void => {\n observeError(error, context);\n dispose();\n };\n\n const run = (runtimeEvent: RuntimeEvent<State, Context, Event>): void => {\n if (disposed) return;\n\n if (processing) {\n queue.push(runtimeEvent);\n\n return;\n }\n\n processing = true;\n\n try {\n process(runtimeEvent);\n flush();\n } finally {\n processing = false;\n }\n };\n\n const send = (event: Event): void => {\n if (disposed) return;\n\n if (!isMachineEvent(event)) {\n warn('ignored malformed event; expected an object with a string `type`');\n\n return;\n }\n\n run({ event, kind: 'event' });\n };\n\n const runEffects = (effects: readonly Effect<Context, Event>[], state: State, event: Event | undefined): void => {\n for (const effect of effects) {\n if (disposed) return;\n\n try {\n effect({ context: current.context, event, send, signal: disposal.signal });\n } catch (error) {\n fail(error, { event, phase: 'effect', state });\n }\n }\n };\n\n const establishStateResources = (state: State, event: Event | undefined): void => {\n const node = nodeFor(definition, state);\n\n for (const after of node.after ?? []) {\n const timer = setTimeout(() => {\n timers.delete(timer);\n run({ after, kind: 'after' });\n }, after.delay);\n\n timers.add(timer);\n }\n\n for (const invoke of node.invoke ?? []) {\n const controller = new AbortController();\n\n invokes.add(controller);\n\n const capturedContext = current.context;\n const capturedEvent = event;\n\n void Promise.resolve()\n .then(() => invoke.src({ context: capturedContext, event: capturedEvent, signal: controller.signal }))\n .then(\n (result) => {\n invokes.delete(controller);\n\n if (disposed || controller.signal.aborted || !invoke.onDone) return;\n\n try {\n send(invoke.onDone({ context: capturedContext, result }));\n } catch (error) {\n fail(error, { event: capturedEvent, phase: 'invoke', state });\n }\n },\n (error: unknown) => {\n invokes.delete(controller);\n\n if (disposed || controller.signal.aborted) return;\n\n try {\n if (invoke.onError) {\n send(invoke.onError({ context: capturedContext, error }));\n } else {\n fail(error, { event: capturedEvent, phase: 'invoke', state });\n }\n } catch (callbackError) {\n fail(callbackError, { event: capturedEvent, phase: 'invoke', state });\n }\n },\n );\n }\n };\n\n const notify = (event: Event | undefined): void => {\n for (const listener of [...listeners]) {\n if (disposed) return;\n\n try {\n listener(current);\n } catch (error) {\n observeError(error, { event, phase: 'subscriber', state: current.state });\n }\n }\n };\n\n const process = (runtimeEvent: RuntimeEvent<State, Context, Event>): void => {\n const previous = current;\n let outcome: TransitionOutcome<State, Context, Event>;\n\n try {\n outcome = transition(definition, current, runtimeEvent);\n } catch (error) {\n fail(error, {\n event: runtimeEvent.kind === 'event' ? runtimeEvent.event : undefined,\n phase: 'transition',\n state: current.state,\n });\n\n return;\n }\n\n if (outcome.result.type === 'ignored' || !outcome.transition) {\n tappers.emit({ event: outcome.event, snapshot: outcome.result.snapshot, type: 'ignored' });\n return;\n }\n\n const source = nodeFor(definition, previous.state);\n\n current = outcome.result.snapshot;\n tappers.emit({ event: outcome.event, snapshot: current, type: 'transition' });\n cancelStateResources();\n establishStateResources(current.state, outcome.event);\n notify(outcome.event);\n runEffects(source.exit ?? [], previous.state, outcome.event);\n runEffects(outcome.transition.effects ?? [], previous.state, outcome.event);\n runEffects(nodeFor(definition, current.state).entry ?? [], current.state, outcome.event);\n };\n\n const flush = (): void => {\n let transitions = 0;\n\n while (queue.length > 0 && !disposed) {\n transitions += 1;\n\n if (transitions > MAX_TRANSITIONS) {\n fail(\n new ClockworkTransitionLimitError('maximum queued transitions exceeded', { maxTransitions: MAX_TRANSITIONS }),\n {\n phase: 'transition',\n state: current.state,\n },\n );\n\n return;\n }\n\n const next = queue.shift();\n\n if (next) process(next);\n }\n };\n\n establishStateResources(current.state, undefined);\n\n if (!options.snapshot) {\n runEffects(nodeFor(definition, current.state).entry ?? [], current.state, undefined);\n }\n\n return {\n can: (event) => {\n if (disposed) return false;\n\n try {\n if (!isMachineEvent(event)) {\n warn('ignored malformed event; expected an object with a string `type`');\n return false;\n }\n\n return canTransition(definition, current, event);\n } catch (error) {\n fail(error, { event, phase: 'transition', state: current.state });\n return false;\n }\n },\n get disposalSignal() {\n return disposal.signal;\n },\n dispose,\n get disposed() {\n return disposed;\n },\n send,\n get snapshot() {\n return current;\n },\n subscribe(listener) {\n if (disposed) return () => undefined;\n\n listeners.add(listener);\n\n return () => listeners.delete(listener);\n },\n tap(handler, tapOptions) {\n if (disposed) return () => undefined;\n\n return tappers.tap(handler, tapOptions);\n },\n [Symbol.dispose]: dispose,\n };\n};\n\n/** Defines a typed flat finite-state machine. */\nexport const defineMachine =\n <Context extends Record<string, unknown> = Record<string, never>, Event extends MachineEvent = MachineEvent>() =>\n <State extends string>(definition: MachineConfig<State, Context, Event>): Machine<State, Context, Event> => {\n assertDefinition(definition);\n const context = (definition as { readonly context?: Context }).context ?? ({} as Context);\n const initialSnapshot = createSnapshot(definition.initial, context);\n\n return {\n can: (snapshot, event) => canTransition(definition, snapshot, event),\n createActor: (options) => createActor(definition, initialSnapshot, options),\n initialSnapshot,\n transition: (snapshot, event) => transition(definition, snapshot, { event, kind: 'event' }).result,\n };\n };\n"],"mappings":"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"}
|
package/dist/clockwork.iife.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
var Clockwork=(function(e,t){Object.defineProperty(e,Symbol.toStringTag,{value:`Module`});var ClockworkError=class extends Error{details;constructor(e,t={},n){super(e,n),this.name=new.target.name,this.details=Object.freeze({...t}),Object.setPrototypeOf(this,new.target.prototype)}},ClockworkDefinitionError=class extends ClockworkError{},ClockworkSnapshotError=class extends ClockworkError{},ClockworkTransitionLimitError=class extends ClockworkError{},n=2147483647,r=1e3,isContextRecord=e=>{if(typeof e!=`object`||!e||Array.isArray(e))return!1;let t=Object.getPrototypeOf(e);return t===null||t===Object.prototype},assertDefinition=e=>{let t=e.context;if(t!==void 0&&!isContextRecord(t))throw new ClockworkDefinitionError(`machine context must be a non-array object record`,{});for(let[t,r]of Object.entries(e.states)){for(let[e,n]of Object.entries(r.on??{}))if(Array.isArray(n)&&n.length===0)throw new ClockworkDefinitionError(`a transition array must not be empty`,{state:t,type:e});for(let[e,i]of(r.after??[]).entries())if(!Number.isFinite(i.delay)||i.delay<0||i.delay>n)throw new ClockworkDefinitionError(`state "${t}" after delay must be between 0 and ${n}`,{delay:i.delay,index:e,state:t})}},createSnapshot=(e,t)=>{let n=Object.assign(Object.create(Object.getPrototypeOf(t)),t);return Object.freeze({context:Object.freeze(n),state:e})},normalizeSnapshot=e=>Object.isFrozen(e)&&Object.isFrozen(e.context)?e:createSnapshot(e.state,e.context),invalidSnapshot=e=>{throw new ClockworkSnapshotError(`snapshot state "${String(e)}" is not declared`,{state:e})},isMachineEvent=e=>typeof e==`object`&&!!e&&typeof e.type==`string`,nodeFor=(e,t)=>Object.hasOwn(e.states,t)?e.states[t]:invalidSnapshot(t),assertSnapshot=(e,t)=>{if(!isContextRecord(t.context))throw new ClockworkSnapshotError(`snapshot context must be a non-array object record`,{});nodeFor(e,t.state)},selectTransition=(e,t,n)=>{assertSnapshot(e,t);let r=nodeFor(e,t.state);if(n.kind===`after`)return!r.after||!r.after.includes(n.after)?void 0:!n.after.guard||n.after.guard({context:t.context,event:void 0})?{event:void 0,transition:n.after}:void 0;let i=r.on;if(!i||!Object.hasOwn(i,n.event.type))return;let a=i[n.event.type],o=Array.isArray(a)?a:[a];for(let e of o)if(!e.guard||e.guard({context:t.context,event:n.event}))return{event:n.event,transition:e}},transition=(e,t,n)=>{let r=selectTransition(e,t,n);if(!r)return{event:n.kind===`event`?n.event:void 0,result:{snapshot:normalizeSnapshot(t),type:`ignored`}};let i=r.transition.reduce?r.transition.reduce({context:t.context,event:r.event}):t.context;if(!isContextRecord(i))throw new ClockworkSnapshotError(`a reducer must return a non-array object record`,{state:t.state});return{event:r.event,result:{snapshot:createSnapshot(r.transition.target,i),type:`transition`},transition:r.transition}},canTransition=(e,t,n)=>selectTransition(e,t,{event:n,kind:`event`})!==void 0,createActor=(e,n,i={})=>{let a=i.snapshot??n;assertSnapshot(e,a);let o=createSnapshot(a.state,a.context),s=new Set,c=(0,t.tapper)(),l=new AbortController,u=new Set,d=new Set,f=[],p=!1,m=!1,cancelStateResources=()=>{for(let e of u)clearTimeout(e);u.clear();for(let e of d)e.abort();d.clear()},dispose=()=>{p||(p=!0,f.length=0,cancelStateResources(),s.clear(),c.emit({type:`dispose`}),c.clear(),l.abort())},observeError=(e,t)=>{c.emit({error:e,event:t.event,phase:t.phase,state:t.state,type:`error`})},fail=(e,t)=>{observeError(e,t),dispose()},run=e=>{if(!p){if(m)
|
|
1
|
+
var Clockwork=(function(e,t){Object.defineProperty(e,Symbol.toStringTag,{value:`Module`});var ClockworkError=class extends Error{details;constructor(e,t={},n){super(e,n),this.name=new.target.name,this.details=Object.freeze({...t}),Object.setPrototypeOf(this,new.target.prototype)}},ClockworkDefinitionError=class extends ClockworkError{},ClockworkSnapshotError=class extends ClockworkError{},ClockworkTransitionLimitError=class extends ClockworkError{},n=2147483647,r=1e3,isContextRecord=e=>{if(typeof e!=`object`||!e||Array.isArray(e))return!1;let t=Object.getPrototypeOf(e);return t===null||t===Object.prototype},assertDefinition=e=>{let t=e.context;if(t!==void 0&&!isContextRecord(t))throw new ClockworkDefinitionError(`machine context must be a non-array object record`,{});for(let[t,r]of Object.entries(e.states)){for(let[e,n]of Object.entries(r.on??{}))if(Array.isArray(n)&&n.length===0)throw new ClockworkDefinitionError(`a transition array must not be empty`,{state:t,type:e});for(let[e,i]of(r.after??[]).entries())if(!Number.isFinite(i.delay)||i.delay<0||i.delay>n)throw new ClockworkDefinitionError(`state "${t}" after delay must be between 0 and ${n}`,{delay:i.delay,index:e,state:t})}},createSnapshot=(e,t)=>{let n=Object.assign(Object.create(Object.getPrototypeOf(t)),t);return Object.freeze({context:Object.freeze(n),state:e})},normalizeSnapshot=e=>Object.isFrozen(e)&&Object.isFrozen(e.context)?e:createSnapshot(e.state,e.context),invalidSnapshot=e=>{throw new ClockworkSnapshotError(`snapshot state "${String(e)}" is not declared`,{state:e})},isMachineEvent=e=>typeof e==`object`&&!!e&&typeof e.type==`string`,nodeFor=(e,t)=>Object.hasOwn(e.states,t)?e.states[t]:invalidSnapshot(t),assertSnapshot=(e,t)=>{if(!isContextRecord(t.context))throw new ClockworkSnapshotError(`snapshot context must be a non-array object record`,{});nodeFor(e,t.state)},selectTransition=(e,t,n)=>{assertSnapshot(e,t);let r=nodeFor(e,t.state);if(n.kind===`after`)return!r.after||!r.after.includes(n.after)?void 0:!n.after.guard||n.after.guard({context:t.context,event:void 0})?{event:void 0,transition:n.after}:void 0;let i=r.on;if(!i||!Object.hasOwn(i,n.event.type))return;let a=i[n.event.type],o=Array.isArray(a)?a:[a];for(let e of o)if(!e.guard||e.guard({context:t.context,event:n.event}))return{event:n.event,transition:e}},transition=(e,t,n)=>{let r=selectTransition(e,t,n);if(!r)return{event:n.kind===`event`?n.event:void 0,result:{snapshot:normalizeSnapshot(t),type:`ignored`}};let i=r.transition.reduce?r.transition.reduce({context:t.context,event:r.event}):t.context;if(!isContextRecord(i))throw new ClockworkSnapshotError(`a reducer must return a non-array object record`,{state:t.state});return{event:r.event,result:{snapshot:createSnapshot(r.transition.target,i),type:`transition`},transition:r.transition}},canTransition=(e,t,n)=>selectTransition(e,t,{event:n,kind:`event`})!==void 0,createActor=(e,n,i={})=>{let a=i.snapshot??n;assertSnapshot(e,a);let o=createSnapshot(a.state,a.context),s=new Set,c=(0,t.tapper)(),l=new AbortController,u=new Set,d=new Set,f=[],p=!1,m=!1,cancelStateResources=()=>{for(let e of u)clearTimeout(e);u.clear();for(let e of d)e.abort();d.clear()},dispose=()=>{p||(p=!0,f.length=0,cancelStateResources(),s.clear(),c.emit({type:`dispose`}),c.clear(),l.abort())},observeError=(e,t)=>{c.emit({error:e,event:t.event,phase:t.phase,state:t.state,type:`error`})},fail=(e,t)=>{observeError(e,t),dispose()},run=e=>{if(!p){if(m)f.push(e);else{m=!0;try{process(e),flush()}finally{m=!1}}}},send=e=>{p||isMachineEvent(e)&&run({event:e,kind:`event`})},runEffects=(e,t,n)=>{for(let r of e){if(p)return;try{r({context:o.context,event:n,send,signal:l.signal})}catch(e){fail(e,{event:n,phase:`effect`,state:t})}}},establishStateResources=(t,n)=>{let r=nodeFor(e,t);for(let e of r.after??[]){let t=setTimeout(()=>{u.delete(t),run({after:e,kind:`after`})},e.delay);u.add(t)}for(let e of r.invoke??[]){let r=new AbortController;d.add(r);let i=o.context,a=n;Promise.resolve().then(()=>e.src({context:i,event:a,signal:r.signal})).then(n=>{if(d.delete(r),!(p||r.signal.aborted||!e.onDone))try{send(e.onDone({context:i,result:n}))}catch(e){fail(e,{event:a,phase:`invoke`,state:t})}},n=>{if(d.delete(r),!(p||r.signal.aborted))try{e.onError?send(e.onError({context:i,error:n})):fail(n,{event:a,phase:`invoke`,state:t})}catch(e){fail(e,{event:a,phase:`invoke`,state:t})}})}},notify=e=>{for(let t of[...s]){if(p)return;try{t(o)}catch(t){observeError(t,{event:e,phase:`subscriber`,state:o.state})}}},process=t=>{let n=o,r;try{r=transition(e,o,t)}catch(e){fail(e,{event:t.kind===`event`?t.event:void 0,phase:`transition`,state:o.state});return}if(r.result.type===`ignored`||!r.transition){c.emit({event:r.event,snapshot:r.result.snapshot,type:`ignored`});return}let i=nodeFor(e,n.state);o=r.result.snapshot,c.emit({event:r.event,snapshot:o,type:`transition`}),cancelStateResources(),establishStateResources(o.state,r.event),notify(r.event),runEffects(i.exit??[],n.state,r.event),runEffects(r.transition.effects??[],n.state,r.event),runEffects(nodeFor(e,o.state).entry??[],o.state,r.event)},flush=()=>{let e=0;for(;f.length>0&&!p;){if(e+=1,e>r){fail(new ClockworkTransitionLimitError(`maximum queued transitions exceeded`,{maxTransitions:r}),{phase:`transition`,state:o.state});return}let t=f.shift();t&&process(t)}};return establishStateResources(o.state,void 0),i.snapshot||runEffects(nodeFor(e,o.state).entry??[],o.state,void 0),{can:t=>{if(p)return!1;try{return isMachineEvent(t)?canTransition(e,o,t):!1}catch(e){return fail(e,{event:t,phase:`transition`,state:o.state}),!1}},get disposalSignal(){return l.signal},dispose,get disposed(){return p},send,get snapshot(){return o},subscribe(e){return p?()=>void 0:(s.add(e),()=>s.delete(e))},tap(e,t){return p?()=>void 0:c.tap(e,t)},[Symbol.dispose]:dispose}},defineMachine=()=>e=>{assertDefinition(e);let t=e.context??{},n=createSnapshot(e.initial,t);return{can:(t,n)=>canTransition(e,t,n),createActor:t=>createActor(e,n,t),initialSnapshot:n,transition:(t,n)=>transition(e,t,{event:n,kind:`event`}).result}};return e.ClockworkDefinitionError=ClockworkDefinitionError,e.ClockworkError=ClockworkError,e.ClockworkSnapshotError=ClockworkSnapshotError,e.ClockworkTransitionLimitError=ClockworkTransitionLimitError,e.defineMachine=defineMachine,e})({},Arsenal);
|
|
2
2
|
//# sourceMappingURL=clockwork.iife.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"clockwork.iife.js","names":[],"sources":["../src/errors.ts","../src/_dev.ts","../src/interpret.ts"],"sourcesContent":["/** Base class for every Clockwork failure. */\nexport class ClockworkError extends Error {\n readonly details: Readonly<Record<string, unknown>>;\n\n constructor(message: string, details: Record<string, unknown> = {}, opts?: ErrorOptions) {\n super(message, opts);\n this.name = new.target.name;\n this.details = Object.freeze({ ...details });\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\n/** The machine definition failed validation at `defineMachine()` time. */\nexport class ClockworkDefinitionError extends ClockworkError {}\n\n/** A snapshot, its context, or a reducer result failed validation. */\nexport class ClockworkSnapshotError extends ClockworkError {}\n\n/** An actor exceeded the fixed queued-transition limit and disposed itself. */\nexport class ClockworkTransitionLimitError extends ClockworkError {}\n","const isDev = !(globalThis as { __CLOCKWORK_PROD__?: boolean }).__CLOCKWORK_PROD__;\n\nexport function warn(msg: string): void {\n if (isDev) console.warn(`[@vielzeug/clockwork] ${msg}`);\n}\n","import { tapper } from '@vielzeug/arsenal';\nimport { warn } from './_dev.js';\nimport { ClockworkDefinitionError, ClockworkSnapshotError, ClockworkTransitionLimitError } from './errors.js';\nimport type {\n Actor,\n ActorErrorContext,\n ActorOptions,\n ActorTapEvent,\n After,\n Effect,\n EventType,\n Machine,\n MachineConfig,\n MachineEvent,\n MachineSnapshot,\n StateNode,\n TransitionResult,\n} from './types.js';\n\nconst MAX_TIMER_MS = 2_147_483_647;\nconst MAX_TRANSITIONS = 1_000;\n\nconst isContextRecord = (value: unknown): value is Record<string, unknown> => {\n if (typeof value !== 'object' || value === null || Array.isArray(value)) return false;\n\n const prototype = Object.getPrototypeOf(value);\n\n return prototype === null || prototype === Object.prototype;\n};\n\n/** Fails fast on the definition footguns the type system cannot express: out-of-range\n * timer delays (platform timers fire immediately above 2^31 ms), empty transition\n * arrays, and a context that is not a plain record. Everything else: declared\n * targets, callback shapes, state keys: is compiler-checked in the typed definition. */\nconst assertDefinition = <State extends string, Context extends Record<string, unknown>, Event extends MachineEvent>(\n definition: MachineConfig<State, Context, Event>,\n): void => {\n const context = (definition as { readonly context?: Context }).context;\n\n if (context !== undefined && !isContextRecord(context)) {\n throw new ClockworkDefinitionError('machine context must be a non-array object record', {});\n }\n\n for (const [state, node] of Object.entries(definition.states) as [string, StateNode<State, Context, Event>][]) {\n for (const [type, input] of Object.entries(node.on ?? {})) {\n if (Array.isArray(input) && input.length === 0) {\n throw new ClockworkDefinitionError('a transition array must not be empty', { state, type });\n }\n }\n\n for (const [index, after] of (node.after ?? []).entries()) {\n if (!Number.isFinite(after.delay) || after.delay < 0 || after.delay > MAX_TIMER_MS) {\n throw new ClockworkDefinitionError(`state \"${state}\" after delay must be between 0 and ${MAX_TIMER_MS}`, {\n delay: after.delay,\n index,\n state,\n });\n }\n }\n }\n};\n\ntype InternalEvent<State extends string, Context extends Record<string, unknown>, Event extends MachineEvent> = {\n readonly after: After<State, Context, Event>;\n readonly kind: 'after';\n};\n\ntype RuntimeEvent<State extends string, Context extends Record<string, unknown>, Event extends MachineEvent> =\n | { readonly event: Event; readonly kind: 'event' }\n | InternalEvent<State, Context, Event>;\n\n/** A transition or delayed transition selected for execution. The reducer's event\n * parameter is whatever the selector matched: the event for a user transition,\n * `undefined` for a timer, which the declared per-type signatures cannot express. */\ntype ExecutableTransition<State extends string, Context extends Record<string, unknown>, Event extends MachineEvent> = {\n readonly effects?: readonly Effect<Context, Event>[];\n readonly reduce?: (args: { readonly context: Readonly<Context>; readonly event: Event | undefined }) => Context;\n readonly target: State;\n};\n\ntype SelectedTransition<State extends string, Context extends Record<string, unknown>, Event extends MachineEvent> = {\n readonly event: Event | undefined;\n readonly transition: ExecutableTransition<State, Context, Event>;\n};\n\ntype TransitionOutcome<State extends string, Context extends Record<string, unknown>, Event extends MachineEvent> = {\n readonly event: Event | undefined;\n readonly result: TransitionResult<State, Context>;\n readonly transition?: ExecutableTransition<State, Context, Event>;\n};\n\nconst createSnapshot = <State extends string, Context extends Record<string, unknown>>(\n state: State,\n context: Context,\n): MachineSnapshot<State, Context> => {\n const cloned = Object.assign(Object.create(Object.getPrototypeOf(context)) as Context, context);\n\n return Object.freeze({ context: Object.freeze(cloned), state });\n};\n\nconst normalizeSnapshot = <State extends string, Context extends Record<string, unknown>>(\n snapshot: MachineSnapshot<State, Context>,\n): MachineSnapshot<State, Context> =>\n Object.isFrozen(snapshot) && Object.isFrozen(snapshot.context)\n ? snapshot\n : createSnapshot(snapshot.state, snapshot.context as Context);\n\nconst invalidSnapshot = (state: unknown): never => {\n throw new ClockworkSnapshotError(`snapshot state \"${String(state)}\" is not declared`, { state });\n};\n\nconst isMachineEvent = (event: unknown): event is MachineEvent =>\n typeof event === 'object' && event !== null && typeof (event as { type?: unknown }).type === 'string';\n\n/** Reads a declared state node. The own-property guard keeps prototype keys such as\n * `constructor` or `__proto__` from reading as declared states. */\nconst nodeFor = <State extends string, Context extends Record<string, unknown>, Event extends MachineEvent>(\n definition: MachineConfig<State, Context, Event>,\n state: State,\n) => (Object.hasOwn(definition.states, state) ? definition.states[state] : invalidSnapshot(state));\n\nconst assertSnapshot = <State extends string, Context extends Record<string, unknown>, Event extends MachineEvent>(\n definition: MachineConfig<State, Context, Event>,\n snapshot: MachineSnapshot<State, Context>,\n): void => {\n if (!isContextRecord(snapshot.context)) {\n throw new ClockworkSnapshotError('snapshot context must be a non-array object record', {});\n }\n\n nodeFor(definition, snapshot.state);\n};\n\nconst selectTransition = <State extends string, Context extends Record<string, unknown>, Event extends MachineEvent>(\n definition: MachineConfig<State, Context, Event>,\n snapshot: MachineSnapshot<State, Context>,\n runtimeEvent: RuntimeEvent<State, Context, Event>,\n): SelectedTransition<State, Context, Event> | undefined => {\n assertSnapshot(definition, snapshot);\n const node = nodeFor(definition, snapshot.state);\n\n if (runtimeEvent.kind === 'after') {\n if (!node.after || !node.after.includes(runtimeEvent.after)) return undefined;\n\n if (!runtimeEvent.after.guard || runtimeEvent.after.guard({ context: snapshot.context, event: undefined })) {\n return { event: undefined, transition: runtimeEvent.after as ExecutableTransition<State, Context, Event> };\n }\n\n return undefined;\n }\n\n const on = node.on;\n\n if (!on || !Object.hasOwn(on, runtimeEvent.event.type)) return undefined;\n\n const input = on[runtimeEvent.event.type as EventType<Event>];\n const candidates = Array.isArray(input) ? input : [input];\n\n for (const candidate of candidates) {\n if (!candidate.guard || candidate.guard({ context: snapshot.context, event: runtimeEvent.event })) {\n return { event: runtimeEvent.event, transition: candidate as ExecutableTransition<State, Context, Event> };\n }\n }\n\n return undefined;\n};\n\nconst transition = <State extends string, Context extends Record<string, unknown>, Event extends MachineEvent>(\n definition: MachineConfig<State, Context, Event>,\n snapshot: MachineSnapshot<State, Context>,\n runtimeEvent: RuntimeEvent<State, Context, Event>,\n): TransitionOutcome<State, Context, Event> => {\n const selected = selectTransition(definition, snapshot, runtimeEvent);\n\n if (!selected) {\n return {\n event: runtimeEvent.kind === 'event' ? runtimeEvent.event : undefined,\n result: { snapshot: normalizeSnapshot(snapshot), type: 'ignored' },\n };\n }\n\n const nextContext = selected.transition.reduce\n ? selected.transition.reduce({ context: snapshot.context, event: selected.event })\n : snapshot.context;\n\n if (!isContextRecord(nextContext)) {\n throw new ClockworkSnapshotError('a reducer must return a non-array object record', {\n state: snapshot.state,\n });\n }\n\n return {\n event: selected.event,\n result: { snapshot: createSnapshot(selected.transition.target, nextContext as Context), type: 'transition' },\n transition: selected.transition,\n };\n};\n\nconst canTransition = <State extends string, Context extends Record<string, unknown>, Event extends MachineEvent>(\n definition: MachineConfig<State, Context, Event>,\n snapshot: MachineSnapshot<State, Context>,\n event: Event,\n): boolean => selectTransition(definition, snapshot, { event, kind: 'event' }) !== undefined;\n\nconst createActor = <State extends string, Context extends Record<string, unknown>, Event extends MachineEvent>(\n definition: MachineConfig<State, Context, Event>,\n initialSnapshot: MachineSnapshot<State, Context>,\n options: ActorOptions<State, Context> = {},\n): Actor<State, Context, Event> => {\n const restored = options.snapshot ?? initialSnapshot;\n\n assertSnapshot(definition, restored);\n let current = createSnapshot(restored.state, restored.context as Context);\n\n const listeners = new Set<(snapshot: MachineSnapshot<State, Context>) => void>();\n const tappers = tapper<ActorTapEvent<State, Context, Event>>();\n const disposal = new AbortController();\n const timers = new Set<ReturnType<typeof setTimeout>>();\n const invokes = new Set<AbortController>();\n const queue: RuntimeEvent<State, Context, Event>[] = [];\n let disposed = false;\n let processing = false;\n\n const cancelStateResources = (): void => {\n for (const timer of timers) clearTimeout(timer);\n timers.clear();\n\n for (const controller of invokes) controller.abort();\n invokes.clear();\n };\n\n const dispose = (): void => {\n if (disposed) return;\n\n disposed = true;\n queue.length = 0;\n cancelStateResources();\n listeners.clear();\n tappers.emit({ type: 'dispose' });\n tappers.clear();\n disposal.abort();\n };\n\n const observeError = (error: unknown, context: ActorErrorContext<State, Event>): void => {\n tappers.emit({ error, event: context.event, phase: context.phase, state: context.state, type: 'error' });\n };\n\n const fail = (error: unknown, context: ActorErrorContext<State, Event>): void => {\n observeError(error, context);\n dispose();\n };\n\n const run = (runtimeEvent: RuntimeEvent<State, Context, Event>): void => {\n if (disposed) return;\n\n if (processing) {\n queue.push(runtimeEvent);\n\n return;\n }\n\n processing = true;\n\n try {\n process(runtimeEvent);\n flush();\n } finally {\n processing = false;\n }\n };\n\n const send = (event: Event): void => {\n if (disposed) return;\n\n if (!isMachineEvent(event)) {\n warn('ignored malformed event; expected an object with a string `type`');\n\n return;\n }\n\n run({ event, kind: 'event' });\n };\n\n const runEffects = (effects: readonly Effect<Context, Event>[], state: State, event: Event | undefined): void => {\n for (const effect of effects) {\n if (disposed) return;\n\n try {\n effect({ context: current.context, event, send, signal: disposal.signal });\n } catch (error) {\n fail(error, { event, phase: 'effect', state });\n }\n }\n };\n\n const establishStateResources = (state: State, event: Event | undefined): void => {\n const node = nodeFor(definition, state);\n\n for (const after of node.after ?? []) {\n const timer = setTimeout(() => {\n timers.delete(timer);\n run({ after, kind: 'after' });\n }, after.delay);\n\n timers.add(timer);\n }\n\n for (const invoke of node.invoke ?? []) {\n const controller = new AbortController();\n\n invokes.add(controller);\n\n const capturedContext = current.context;\n const capturedEvent = event;\n\n void Promise.resolve()\n .then(() => invoke.src({ context: capturedContext, event: capturedEvent, signal: controller.signal }))\n .then(\n (result) => {\n invokes.delete(controller);\n\n if (disposed || controller.signal.aborted || !invoke.onDone) return;\n\n try {\n send(invoke.onDone({ context: capturedContext, result }));\n } catch (error) {\n fail(error, { event: capturedEvent, phase: 'invoke', state });\n }\n },\n (error: unknown) => {\n invokes.delete(controller);\n\n if (disposed || controller.signal.aborted) return;\n\n try {\n if (invoke.onError) {\n send(invoke.onError({ context: capturedContext, error }));\n } else {\n fail(error, { event: capturedEvent, phase: 'invoke', state });\n }\n } catch (callbackError) {\n fail(callbackError, { event: capturedEvent, phase: 'invoke', state });\n }\n },\n );\n }\n };\n\n const notify = (event: Event | undefined): void => {\n for (const listener of [...listeners]) {\n if (disposed) return;\n\n try {\n listener(current);\n } catch (error) {\n observeError(error, { event, phase: 'subscriber', state: current.state });\n }\n }\n };\n\n const process = (runtimeEvent: RuntimeEvent<State, Context, Event>): void => {\n const previous = current;\n let outcome: TransitionOutcome<State, Context, Event>;\n\n try {\n outcome = transition(definition, current, runtimeEvent);\n } catch (error) {\n fail(error, {\n event: runtimeEvent.kind === 'event' ? runtimeEvent.event : undefined,\n phase: 'transition',\n state: current.state,\n });\n\n return;\n }\n\n if (outcome.result.type === 'ignored' || !outcome.transition) {\n tappers.emit({ event: outcome.event, snapshot: outcome.result.snapshot, type: 'ignored' });\n return;\n }\n\n const source = nodeFor(definition, previous.state);\n\n current = outcome.result.snapshot;\n tappers.emit({ event: outcome.event, snapshot: current, type: 'transition' });\n cancelStateResources();\n establishStateResources(current.state, outcome.event);\n notify(outcome.event);\n runEffects(source.exit ?? [], previous.state, outcome.event);\n runEffects(outcome.transition.effects ?? [], previous.state, outcome.event);\n runEffects(nodeFor(definition, current.state).entry ?? [], current.state, outcome.event);\n };\n\n const flush = (): void => {\n let transitions = 0;\n\n while (queue.length > 0 && !disposed) {\n transitions += 1;\n\n if (transitions > MAX_TRANSITIONS) {\n fail(\n new ClockworkTransitionLimitError('maximum queued transitions exceeded', { maxTransitions: MAX_TRANSITIONS }),\n {\n phase: 'transition',\n state: current.state,\n },\n );\n\n return;\n }\n\n const next = queue.shift();\n\n if (next) process(next);\n }\n };\n\n establishStateResources(current.state, undefined);\n\n if (!options.snapshot) {\n runEffects(nodeFor(definition, current.state).entry ?? [], current.state, undefined);\n }\n\n return {\n can: (event) => {\n if (disposed) return false;\n\n try {\n if (!isMachineEvent(event)) {\n warn('ignored malformed event; expected an object with a string `type`');\n return false;\n }\n\n return canTransition(definition, current, event);\n } catch (error) {\n fail(error, { event, phase: 'transition', state: current.state });\n return false;\n }\n },\n get disposalSignal() {\n return disposal.signal;\n },\n dispose,\n get disposed() {\n return disposed;\n },\n send,\n get snapshot() {\n return current;\n },\n subscribe(listener) {\n if (disposed) return () => undefined;\n\n listeners.add(listener);\n\n return () => listeners.delete(listener);\n },\n tap(handler, tapOptions) {\n if (disposed) return () => undefined;\n\n return tappers.tap(handler, tapOptions);\n },\n [Symbol.dispose]: dispose,\n };\n};\n\n/** Defines a typed flat finite-state machine. */\nexport const defineMachine =\n <Context extends Record<string, unknown> = Record<string, never>, Event extends MachineEvent = MachineEvent>() =>\n <State extends string>(definition: MachineConfig<State, Context, Event>): Machine<State, Context, Event> => {\n assertDefinition(definition);\n const context = (definition as { readonly context?: Context }).context ?? ({} as Context);\n const initialSnapshot = createSnapshot(definition.initial, context);\n\n return {\n can: (snapshot, event) => canTransition(definition, snapshot, event),\n createActor: (options) => createActor(definition, initialSnapshot, options),\n initialSnapshot,\n transition: (snapshot, event) => transition(definition, snapshot, { event, kind: 'event' }).result,\n };\n };\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"clockwork.iife.js","names":["tapper","exports","message","opts","details","MAX_TIMER_MS","MAX_TRANSITIONS","value","prototype","context","definition","state","node","type","input","index","after","cloned","snapshot","event","runtimeEvent","on","candidates","candidate","selected","nextContext","restored","options","initialSnapshot","current","listeners","tappers","_vielzeug_arsenal","disposal","timers","invokes","queue","disposed","processing","timer","controller","error","effect","effects","invoke","capturedContext","capturedEvent","callbackError","listener","previous","outcome","source","transitions","next","handler","tapOptions"],"sources":["../src/errors.ts","../src/_dev.ts","../src/interpret.ts"],"sourcesContent":["/** Base class for every Clockwork failure. */\nexport class ClockworkError extends Error {\n readonly details: Readonly<Record<string, unknown>>;\n\n constructor(message: string, details: Record<string, unknown> = {}, opts?: ErrorOptions) {\n super(message, opts);\n this.name = new.target.name;\n this.details = Object.freeze({ ...details });\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\n/** The machine definition failed validation at `defineMachine()` time. */\nexport class ClockworkDefinitionError extends ClockworkError {}\n\n/** A snapshot, its context, or a reducer result failed validation. */\nexport class ClockworkSnapshotError extends ClockworkError {}\n\n/** An actor exceeded the fixed queued-transition limit and disposed itself. */\nexport class ClockworkTransitionLimitError extends ClockworkError {}\n","const isDev = !(globalThis as { __CLOCKWORK_PROD__?: boolean }).__CLOCKWORK_PROD__;\n\nexport function warn(msg: string): void {\n if (isDev) console.warn(`[@vielzeug/clockwork] ${msg}`);\n}\n","import { tapper } from '@vielzeug/arsenal';\nimport { warn } from './_dev.js';\nimport { ClockworkDefinitionError, ClockworkSnapshotError, ClockworkTransitionLimitError } from './errors.js';\nimport type {\n Actor,\n ActorErrorContext,\n ActorOptions,\n ActorTapEvent,\n After,\n Effect,\n EventType,\n Machine,\n MachineConfig,\n MachineEvent,\n MachineSnapshot,\n StateNode,\n TransitionResult,\n} from './types.js';\n\nconst MAX_TIMER_MS = 2_147_483_647;\nconst MAX_TRANSITIONS = 1_000;\n\nconst isContextRecord = (value: unknown): value is Record<string, unknown> => {\n if (typeof value !== 'object' || value === null || Array.isArray(value)) return false;\n\n const prototype = Object.getPrototypeOf(value);\n\n return prototype === null || prototype === Object.prototype;\n};\n\n/** Fails fast on the definition footguns the type system cannot express: out-of-range\n * timer delays (platform timers fire immediately above 2^31 ms), empty transition\n * arrays, and a context that is not a plain record. Everything else: declared\n * targets, callback shapes, state keys: is compiler-checked in the typed definition. */\nconst assertDefinition = <State extends string, Context extends Record<string, unknown>, Event extends MachineEvent>(\n definition: MachineConfig<State, Context, Event>,\n): void => {\n const context = (definition as { readonly context?: Context }).context;\n\n if (context !== undefined && !isContextRecord(context)) {\n throw new ClockworkDefinitionError('machine context must be a non-array object record', {});\n }\n\n for (const [state, node] of Object.entries(definition.states) as [string, StateNode<State, Context, Event>][]) {\n for (const [type, input] of Object.entries(node.on ?? {})) {\n if (Array.isArray(input) && input.length === 0) {\n throw new ClockworkDefinitionError('a transition array must not be empty', { state, type });\n }\n }\n\n for (const [index, after] of (node.after ?? []).entries()) {\n if (!Number.isFinite(after.delay) || after.delay < 0 || after.delay > MAX_TIMER_MS) {\n throw new ClockworkDefinitionError(`state \"${state}\" after delay must be between 0 and ${MAX_TIMER_MS}`, {\n delay: after.delay,\n index,\n state,\n });\n }\n }\n }\n};\n\ntype InternalEvent<State extends string, Context extends Record<string, unknown>, Event extends MachineEvent> = {\n readonly after: After<State, Context, Event>;\n readonly kind: 'after';\n};\n\ntype RuntimeEvent<State extends string, Context extends Record<string, unknown>, Event extends MachineEvent> =\n | { readonly event: Event; readonly kind: 'event' }\n | InternalEvent<State, Context, Event>;\n\n/** A transition or delayed transition selected for execution. The reducer's event\n * parameter is whatever the selector matched: the event for a user transition,\n * `undefined` for a timer, which the declared per-type signatures cannot express. */\ntype ExecutableTransition<State extends string, Context extends Record<string, unknown>, Event extends MachineEvent> = {\n readonly effects?: readonly Effect<Context, Event>[];\n readonly reduce?: (args: { readonly context: Readonly<Context>; readonly event: Event | undefined }) => Context;\n readonly target: State;\n};\n\ntype SelectedTransition<State extends string, Context extends Record<string, unknown>, Event extends MachineEvent> = {\n readonly event: Event | undefined;\n readonly transition: ExecutableTransition<State, Context, Event>;\n};\n\ntype TransitionOutcome<State extends string, Context extends Record<string, unknown>, Event extends MachineEvent> = {\n readonly event: Event | undefined;\n readonly result: TransitionResult<State, Context>;\n readonly transition?: ExecutableTransition<State, Context, Event>;\n};\n\nconst createSnapshot = <State extends string, Context extends Record<string, unknown>>(\n state: State,\n context: Context,\n): MachineSnapshot<State, Context> => {\n const cloned = Object.assign(Object.create(Object.getPrototypeOf(context)) as Context, context);\n\n return Object.freeze({ context: Object.freeze(cloned), state });\n};\n\nconst normalizeSnapshot = <State extends string, Context extends Record<string, unknown>>(\n snapshot: MachineSnapshot<State, Context>,\n): MachineSnapshot<State, Context> =>\n Object.isFrozen(snapshot) && Object.isFrozen(snapshot.context)\n ? snapshot\n : createSnapshot(snapshot.state, snapshot.context as Context);\n\nconst invalidSnapshot = (state: unknown): never => {\n throw new ClockworkSnapshotError(`snapshot state \"${String(state)}\" is not declared`, { state });\n};\n\nconst isMachineEvent = (event: unknown): event is MachineEvent =>\n typeof event === 'object' && event !== null && typeof (event as { type?: unknown }).type === 'string';\n\n/** Reads a declared state node. The own-property guard keeps prototype keys such as\n * `constructor` or `__proto__` from reading as declared states. */\nconst nodeFor = <State extends string, Context extends Record<string, unknown>, Event extends MachineEvent>(\n definition: MachineConfig<State, Context, Event>,\n state: State,\n) => (Object.hasOwn(definition.states, state) ? definition.states[state] : invalidSnapshot(state));\n\nconst assertSnapshot = <State extends string, Context extends Record<string, unknown>, Event extends MachineEvent>(\n definition: MachineConfig<State, Context, Event>,\n snapshot: MachineSnapshot<State, Context>,\n): void => {\n if (!isContextRecord(snapshot.context)) {\n throw new ClockworkSnapshotError('snapshot context must be a non-array object record', {});\n }\n\n nodeFor(definition, snapshot.state);\n};\n\nconst selectTransition = <State extends string, Context extends Record<string, unknown>, Event extends MachineEvent>(\n definition: MachineConfig<State, Context, Event>,\n snapshot: MachineSnapshot<State, Context>,\n runtimeEvent: RuntimeEvent<State, Context, Event>,\n): SelectedTransition<State, Context, Event> | undefined => {\n assertSnapshot(definition, snapshot);\n const node = nodeFor(definition, snapshot.state);\n\n if (runtimeEvent.kind === 'after') {\n if (!node.after || !node.after.includes(runtimeEvent.after)) return undefined;\n\n if (!runtimeEvent.after.guard || runtimeEvent.after.guard({ context: snapshot.context, event: undefined })) {\n return { event: undefined, transition: runtimeEvent.after as ExecutableTransition<State, Context, Event> };\n }\n\n return undefined;\n }\n\n const on = node.on;\n\n if (!on || !Object.hasOwn(on, runtimeEvent.event.type)) return undefined;\n\n const input = on[runtimeEvent.event.type as EventType<Event>];\n const candidates = Array.isArray(input) ? input : [input];\n\n for (const candidate of candidates) {\n if (!candidate.guard || candidate.guard({ context: snapshot.context, event: runtimeEvent.event })) {\n return { event: runtimeEvent.event, transition: candidate as ExecutableTransition<State, Context, Event> };\n }\n }\n\n return undefined;\n};\n\nconst transition = <State extends string, Context extends Record<string, unknown>, Event extends MachineEvent>(\n definition: MachineConfig<State, Context, Event>,\n snapshot: MachineSnapshot<State, Context>,\n runtimeEvent: RuntimeEvent<State, Context, Event>,\n): TransitionOutcome<State, Context, Event> => {\n const selected = selectTransition(definition, snapshot, runtimeEvent);\n\n if (!selected) {\n return {\n event: runtimeEvent.kind === 'event' ? runtimeEvent.event : undefined,\n result: { snapshot: normalizeSnapshot(snapshot), type: 'ignored' },\n };\n }\n\n const nextContext = selected.transition.reduce\n ? selected.transition.reduce({ context: snapshot.context, event: selected.event })\n : snapshot.context;\n\n if (!isContextRecord(nextContext)) {\n throw new ClockworkSnapshotError('a reducer must return a non-array object record', {\n state: snapshot.state,\n });\n }\n\n return {\n event: selected.event,\n result: { snapshot: createSnapshot(selected.transition.target, nextContext as Context), type: 'transition' },\n transition: selected.transition,\n };\n};\n\nconst canTransition = <State extends string, Context extends Record<string, unknown>, Event extends MachineEvent>(\n definition: MachineConfig<State, Context, Event>,\n snapshot: MachineSnapshot<State, Context>,\n event: Event,\n): boolean => selectTransition(definition, snapshot, { event, kind: 'event' }) !== undefined;\n\nconst createActor = <State extends string, Context extends Record<string, unknown>, Event extends MachineEvent>(\n definition: MachineConfig<State, Context, Event>,\n initialSnapshot: MachineSnapshot<State, Context>,\n options: ActorOptions<State, Context> = {},\n): Actor<State, Context, Event> => {\n const restored = options.snapshot ?? initialSnapshot;\n\n assertSnapshot(definition, restored);\n let current = createSnapshot(restored.state, restored.context as Context);\n\n const listeners = new Set<(snapshot: MachineSnapshot<State, Context>) => void>();\n const tappers = tapper<ActorTapEvent<State, Context, Event>>();\n const disposal = new AbortController();\n const timers = new Set<ReturnType<typeof setTimeout>>();\n const invokes = new Set<AbortController>();\n const queue: RuntimeEvent<State, Context, Event>[] = [];\n let disposed = false;\n let processing = false;\n\n const cancelStateResources = (): void => {\n for (const timer of timers) clearTimeout(timer);\n timers.clear();\n\n for (const controller of invokes) controller.abort();\n invokes.clear();\n };\n\n const dispose = (): void => {\n if (disposed) return;\n\n disposed = true;\n queue.length = 0;\n cancelStateResources();\n listeners.clear();\n tappers.emit({ type: 'dispose' });\n tappers.clear();\n disposal.abort();\n };\n\n const observeError = (error: unknown, context: ActorErrorContext<State, Event>): void => {\n tappers.emit({ error, event: context.event, phase: context.phase, state: context.state, type: 'error' });\n };\n\n const fail = (error: unknown, context: ActorErrorContext<State, Event>): void => {\n observeError(error, context);\n dispose();\n };\n\n const run = (runtimeEvent: RuntimeEvent<State, Context, Event>): void => {\n if (disposed) return;\n\n if (processing) {\n queue.push(runtimeEvent);\n\n return;\n }\n\n processing = true;\n\n try {\n process(runtimeEvent);\n flush();\n } finally {\n processing = false;\n }\n };\n\n const send = (event: Event): void => {\n if (disposed) return;\n\n if (!isMachineEvent(event)) {\n warn('ignored malformed event; expected an object with a string `type`');\n\n return;\n }\n\n run({ event, kind: 'event' });\n };\n\n const runEffects = (effects: readonly Effect<Context, Event>[], state: State, event: Event | undefined): void => {\n for (const effect of effects) {\n if (disposed) return;\n\n try {\n effect({ context: current.context, event, send, signal: disposal.signal });\n } catch (error) {\n fail(error, { event, phase: 'effect', state });\n }\n }\n };\n\n const establishStateResources = (state: State, event: Event | undefined): void => {\n const node = nodeFor(definition, state);\n\n for (const after of node.after ?? []) {\n const timer = setTimeout(() => {\n timers.delete(timer);\n run({ after, kind: 'after' });\n }, after.delay);\n\n timers.add(timer);\n }\n\n for (const invoke of node.invoke ?? []) {\n const controller = new AbortController();\n\n invokes.add(controller);\n\n const capturedContext = current.context;\n const capturedEvent = event;\n\n void Promise.resolve()\n .then(() => invoke.src({ context: capturedContext, event: capturedEvent, signal: controller.signal }))\n .then(\n (result) => {\n invokes.delete(controller);\n\n if (disposed || controller.signal.aborted || !invoke.onDone) return;\n\n try {\n send(invoke.onDone({ context: capturedContext, result }));\n } catch (error) {\n fail(error, { event: capturedEvent, phase: 'invoke', state });\n }\n },\n (error: unknown) => {\n invokes.delete(controller);\n\n if (disposed || controller.signal.aborted) return;\n\n try {\n if (invoke.onError) {\n send(invoke.onError({ context: capturedContext, error }));\n } else {\n fail(error, { event: capturedEvent, phase: 'invoke', state });\n }\n } catch (callbackError) {\n fail(callbackError, { event: capturedEvent, phase: 'invoke', state });\n }\n },\n );\n }\n };\n\n const notify = (event: Event | undefined): void => {\n for (const listener of [...listeners]) {\n if (disposed) return;\n\n try {\n listener(current);\n } catch (error) {\n observeError(error, { event, phase: 'subscriber', state: current.state });\n }\n }\n };\n\n const process = (runtimeEvent: RuntimeEvent<State, Context, Event>): void => {\n const previous = current;\n let outcome: TransitionOutcome<State, Context, Event>;\n\n try {\n outcome = transition(definition, current, runtimeEvent);\n } catch (error) {\n fail(error, {\n event: runtimeEvent.kind === 'event' ? runtimeEvent.event : undefined,\n phase: 'transition',\n state: current.state,\n });\n\n return;\n }\n\n if (outcome.result.type === 'ignored' || !outcome.transition) {\n tappers.emit({ event: outcome.event, snapshot: outcome.result.snapshot, type: 'ignored' });\n return;\n }\n\n const source = nodeFor(definition, previous.state);\n\n current = outcome.result.snapshot;\n tappers.emit({ event: outcome.event, snapshot: current, type: 'transition' });\n cancelStateResources();\n establishStateResources(current.state, outcome.event);\n notify(outcome.event);\n runEffects(source.exit ?? [], previous.state, outcome.event);\n runEffects(outcome.transition.effects ?? [], previous.state, outcome.event);\n runEffects(nodeFor(definition, current.state).entry ?? [], current.state, outcome.event);\n };\n\n const flush = (): void => {\n let transitions = 0;\n\n while (queue.length > 0 && !disposed) {\n transitions += 1;\n\n if (transitions > MAX_TRANSITIONS) {\n fail(\n new ClockworkTransitionLimitError('maximum queued transitions exceeded', { maxTransitions: MAX_TRANSITIONS }),\n {\n phase: 'transition',\n state: current.state,\n },\n );\n\n return;\n }\n\n const next = queue.shift();\n\n if (next) process(next);\n }\n };\n\n establishStateResources(current.state, undefined);\n\n if (!options.snapshot) {\n runEffects(nodeFor(definition, current.state).entry ?? [], current.state, undefined);\n }\n\n return {\n can: (event) => {\n if (disposed) return false;\n\n try {\n if (!isMachineEvent(event)) {\n warn('ignored malformed event; expected an object with a string `type`');\n return false;\n }\n\n return canTransition(definition, current, event);\n } catch (error) {\n fail(error, { event, phase: 'transition', state: current.state });\n return false;\n }\n },\n get disposalSignal() {\n return disposal.signal;\n },\n dispose,\n get disposed() {\n return disposed;\n },\n send,\n get snapshot() {\n return current;\n },\n subscribe(listener) {\n if (disposed) return () => undefined;\n\n listeners.add(listener);\n\n return () => listeners.delete(listener);\n },\n tap(handler, tapOptions) {\n if (disposed) return () => undefined;\n\n return tappers.tap(handler, tapOptions);\n },\n [Symbol.dispose]: dispose,\n };\n};\n\n/** Defines a typed flat finite-state machine. */\nexport const defineMachine =\n <Context extends Record<string, unknown> = Record<string, never>, Event extends MachineEvent = MachineEvent>() =>\n <State extends string>(definition: MachineConfig<State, Context, Event>): Machine<State, Context, Event> => {\n assertDefinition(definition);\n const context = (definition as { readonly context?: Context }).context ?? ({} as Context);\n const initialSnapshot = createSnapshot(definition.initial, context);\n\n return {\n can: (snapshot, event) => canTransition(definition, snapshot, event),\n createActor: (options) => createActor(definition, initialSnapshot, options),\n initialSnapshot,\n transition: (snapshot, event) => transition(definition, snapshot, { event, kind: 'event' }).result,\n };\n };\n"],"mappings":"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"}
|