@vielzeug/clockwork 2.2.1 → 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/interpret.js CHANGED
@@ -3,13 +3,26 @@ import { isContextRecord as t } from "./_context.js";
3
3
  import "./_dev.js";
4
4
  import { compileDefinition as n } from "./definition.js";
5
5
  //#region src/interpret.ts
6
- var r = (e, t) => ({
7
- context: t,
8
- state: e
9
- }), i = (t) => {
6
+ var r = (e, t) => {
7
+ let n = Object.assign(Object.create(Object.getPrototypeOf(t)), t);
8
+ return Object.freeze({
9
+ context: Object.freeze(n),
10
+ state: e
11
+ });
12
+ }, i = (e) => Object.isFrozen(e) && Object.isFrozen(e.context) ? e : r(e.state, e.context), a = (t) => {
10
13
  throw new e("INVALID_SNAPSHOT_STATE", `snapshot state "${String(t)}" is not declared`, { state: t });
11
- }, a = (e) => typeof e == "object" && !!e && typeof e.type == "string", o = (e, t) => e.states.get(t) ?? i(t), s = (e, t, n) => {
12
- let r = o(e, t.state);
14
+ }, o = (e) => {
15
+ try {
16
+ return typeof e == "object" && !!e && typeof e.type == "string";
17
+ } catch {
18
+ return !1;
19
+ }
20
+ }, s = (e, t) => e.states.get(t) ?? a(t), c = (n, r) => {
21
+ if (!t(r.context)) throw new e("INVALID_CONTEXT", "snapshot context must be a non-array object record", {});
22
+ s(n, r.state);
23
+ }, l = (e, t, n) => {
24
+ c(e, t);
25
+ let r = s(e, t.state);
13
26
  if (n.kind === "after") {
14
27
  if (!r.after.includes(n.after)) return;
15
28
  let { definition: e } = n.after;
@@ -32,131 +45,128 @@ var r = (e, t) => ({
32
45
  transition: e
33
46
  };
34
47
  }
35
- }, c = (n, i, a) => {
36
- let o = s(n, i, a);
37
- if (!o) return {
38
- event: a.kind === "event" ? a.event : void 0,
48
+ }, u = (n, a, o) => {
49
+ let s = l(n, a, o);
50
+ if (!s) return {
51
+ event: o.kind === "event" ? o.event : void 0,
39
52
  result: {
40
- snapshot: i,
53
+ snapshot: i(a),
41
54
  type: "ignored"
42
55
  }
43
56
  };
44
- let c = o.transition.reduce, l = c ? c({
45
- context: i.context,
46
- event: o.event
47
- }) : i.context;
48
- if (!t(l)) throw new e("INVALID_CONTEXT", "a reducer must return a non-array object record", { state: i.state });
57
+ let c = s.transition.reduce, u = c ? c({
58
+ context: a.context,
59
+ event: s.event
60
+ }) : a.context;
61
+ if (!t(u)) throw new e("INVALID_CONTEXT", "a reducer must return a non-array object record", { state: a.state });
49
62
  return {
50
- event: o.event,
63
+ event: s.event,
51
64
  result: {
52
- snapshot: r(o.transition.target, l),
65
+ snapshot: r(s.transition.target, u),
53
66
  type: "transition"
54
67
  },
55
- transition: o.transition
68
+ transition: s.transition
56
69
  };
57
- }, l = (e, t, n) => s(e, t, {
70
+ }, d = (e, t, n) => l(e, t, {
58
71
  event: n,
59
72
  kind: "event"
60
- }) !== void 0, u = (n, r, s = {}) => {
61
- if (s.maxTransitions !== void 0 && (!Number.isInteger(s.maxTransitions) || s.maxTransitions < 1)) throw new e("INVALID_MAX_TRANSITIONS", "maxTransitions must be a positive integer", { maxTransitions: s.maxTransitions });
62
- let u = s.snapshot ?? r;
63
- if (!t(u.context)) throw new e("INVALID_CONTEXT", "snapshot context must be a non-array object record", {});
64
- n.states.has(u.state) || i(u.state);
65
- let d = /* @__PURE__ */ new Set(), f = new AbortController(), p = /* @__PURE__ */ new Set(), m = /* @__PURE__ */ new Set(), h = [], g = s.maxTransitions ?? 1e3, _ = !1, v = !1, y = () => {
66
- for (let e of p) clearTimeout(e);
67
- p.clear();
68
- for (let e of m) e.abort();
73
+ }) !== void 0, f = (t, n, i = {}) => {
74
+ if (i.maxTransitions !== void 0 && (!Number.isInteger(i.maxTransitions) || i.maxTransitions < 1)) throw new e("INVALID_MAX_TRANSITIONS", "maxTransitions must be a positive integer", { maxTransitions: i.maxTransitions });
75
+ let a = i.snapshot ?? n;
76
+ c(t, a);
77
+ let l = r(a.state, a.context), f = /* @__PURE__ */ new Set(), p = new AbortController(), m = /* @__PURE__ */ new Set(), h = /* @__PURE__ */ new Set(), g = [], _ = i.maxTransitions ?? 1e3, v = !1, y = !1, b = () => {
78
+ for (let e of m) clearTimeout(e);
69
79
  m.clear();
70
- }, b = () => {
71
- _ || (_ = !0, h.length = 0, y(), d.clear(), f.abort());
72
- }, x = (e, t) => {
73
- let n = "dispose";
74
- if (s.onError) try {
75
- n = s.onError(e, t);
76
- } catch (e) {
77
- throw b(), e;
78
- }
79
- n !== "continue" && b();
80
- }, S = (e) => {
81
- if (!_) {
82
- if (v) {
83
- h.push(e);
80
+ for (let e of h) e.abort();
81
+ h.clear();
82
+ }, x = () => {
83
+ v || (v = !0, g.length = 0, b(), f.clear(), p.abort());
84
+ }, S = (e, t) => {
85
+ try {
86
+ i.onError?.(e, t);
87
+ } catch {}
88
+ }, C = (e, t) => {
89
+ S(e, t), x();
90
+ }, w = (e) => {
91
+ if (!v) {
92
+ if (y) {
93
+ g.push(e);
84
94
  return;
85
95
  }
86
- v = !0;
96
+ y = !0;
87
97
  try {
88
- D(e), O();
98
+ k(e), A();
89
99
  } finally {
90
- v = !1;
100
+ y = !1;
91
101
  }
92
102
  }
93
- }, C = (e) => {
94
- _ || a(e) && S({
103
+ }, T = (e) => {
104
+ v || o(e) && w({
95
105
  event: e,
96
106
  kind: "event"
97
107
  });
98
- }, w = (e, t, n) => {
108
+ }, E = (e, t, n) => {
99
109
  for (let r of e) {
100
- if (_) return;
110
+ if (v) return;
101
111
  try {
102
112
  r({
103
- context: u.context,
113
+ context: l.context,
104
114
  event: n,
105
- send: C,
106
- signal: f.signal
115
+ send: T,
116
+ signal: p.signal
107
117
  });
108
118
  } catch (e) {
109
- x(e, {
119
+ C(e, {
110
120
  event: n,
111
121
  phase: "effect",
112
122
  state: t
113
123
  });
114
124
  }
115
125
  }
116
- }, T = (e, t) => {
117
- let r = o(n, e);
126
+ }, D = (e, n) => {
127
+ let r = s(t, e);
118
128
  for (let e of r.after) {
119
129
  let t = setTimeout(() => {
120
- p.delete(t), S({
130
+ m.delete(t), w({
121
131
  after: e,
122
132
  kind: "after"
123
133
  });
124
134
  }, e.definition.delay);
125
- p.add(t);
135
+ m.add(t);
126
136
  }
127
- for (let n of r.invoke) {
137
+ for (let t of r.invoke) {
128
138
  let r = new AbortController();
129
- m.add(r);
130
- let i = u.context, a = t;
131
- Promise.resolve().then(() => n.src({
139
+ h.add(r);
140
+ let i = l.context, a = n;
141
+ Promise.resolve().then(() => t.src({
132
142
  context: i,
133
143
  event: a,
134
144
  signal: r.signal
135
- })).then((t) => {
136
- if (m.delete(r), !(_ || r.signal.aborted || !n.onDone)) try {
137
- C(n.onDone({
145
+ })).then((n) => {
146
+ if (h.delete(r), !(v || r.signal.aborted || !t.onDone)) try {
147
+ T(t.onDone({
138
148
  context: i,
139
- result: t
149
+ result: n
140
150
  }));
141
151
  } catch (t) {
142
- x(t, {
152
+ C(t, {
143
153
  event: a,
144
154
  phase: "invoke",
145
155
  state: e
146
156
  });
147
157
  }
148
- }, (t) => {
149
- if (m.delete(r), !(_ || r.signal.aborted)) try {
150
- n.onError ? C(n.onError({
158
+ }, (n) => {
159
+ if (h.delete(r), !(v || r.signal.aborted)) try {
160
+ t.onError ? T(t.onError({
151
161
  context: i,
152
- error: t
153
- })) : x(t, {
162
+ error: n
163
+ })) : C(n, {
154
164
  event: a,
155
165
  phase: "invoke",
156
166
  state: e
157
167
  });
158
168
  } catch (t) {
159
- x(t, {
169
+ C(t, {
160
170
  event: a,
161
171
  phase: "invoke",
162
172
  state: e
@@ -164,79 +174,90 @@ var r = (e, t) => ({
164
174
  }
165
175
  });
166
176
  }
167
- }, E = (e) => {
168
- for (let t of d) {
169
- if (_) return;
177
+ }, O = (e) => {
178
+ for (let t of [...f]) {
179
+ if (v) return;
170
180
  try {
171
- t(u);
181
+ t(l);
172
182
  } catch (t) {
173
- x(t, {
183
+ S(t, {
174
184
  event: e,
175
185
  phase: "subscriber",
176
- state: u.state
186
+ state: l.state
177
187
  });
178
188
  }
179
189
  }
180
- }, D = (e) => {
181
- let t = u, r;
190
+ }, k = (e) => {
191
+ let n = l, r;
182
192
  try {
183
- r = c(n, u, e);
193
+ r = u(t, l, e);
184
194
  } catch (t) {
185
- x(t, {
195
+ C(t, {
186
196
  event: e.kind === "event" ? e.event : void 0,
187
197
  phase: "transition",
188
- state: u.state
198
+ state: l.state
189
199
  });
190
200
  return;
191
201
  }
192
202
  if (r.result.type === "ignored" || !r.transition) return;
193
- let i = o(n, t.state);
194
- u = r.result.snapshot, y(), T(u.state, r.event), E(r.event), w(i.exit, t.state, r.event), w(r.transition.effects ?? [], t.state, r.event), w(o(n, u.state).entry, u.state, r.event);
195
- }, O = () => {
203
+ let i = s(t, n.state);
204
+ l = r.result.snapshot, b(), D(l.state, r.event), O(r.event), E(i.exit, n.state, r.event), E(r.transition.effects ?? [], n.state, r.event), E(s(t, l.state).entry, l.state, r.event);
205
+ }, A = () => {
196
206
  let t = 0;
197
- for (; h.length > 0 && !_;) {
198
- if (t += 1, t > g) {
199
- x(new e("INVALID_TRANSITION_LIMIT", "maximum queued transitions exceeded", { maxTransitions: g }), {
207
+ for (; g.length > 0 && !v;) {
208
+ if (t += 1, t > _) {
209
+ C(new e("INVALID_TRANSITION_LIMIT", "maximum queued transitions exceeded", { maxTransitions: _ }), {
200
210
  phase: "transition",
201
- state: u.state
211
+ state: l.state
202
212
  });
203
213
  return;
204
214
  }
205
- let n = h.shift();
206
- n && D(n);
215
+ let n = g.shift();
216
+ n && k(n);
207
217
  }
208
218
  };
209
- return T(u.state, void 0), s.snapshot || w(o(n, u.state).entry, u.state, void 0), {
210
- can: (e) => !_ && l(n, u, e),
219
+ return D(l.state, void 0), i.snapshot || E(s(t, l.state).entry, l.state, void 0), {
220
+ can: (e) => {
221
+ if (v) return !1;
222
+ try {
223
+ return o(e) ? d(t, l, e) : !1;
224
+ } catch (t) {
225
+ return C(t, {
226
+ event: e,
227
+ phase: "transition",
228
+ state: l.state
229
+ }), !1;
230
+ }
231
+ },
211
232
  get disposalSignal() {
212
- return f.signal;
233
+ return p.signal;
213
234
  },
214
- dispose: b,
235
+ dispose: x,
215
236
  get disposed() {
216
- return _;
237
+ return v;
217
238
  },
218
- send: C,
239
+ send: T,
219
240
  get snapshot() {
220
- return u;
241
+ return l;
221
242
  },
222
243
  subscribe(e) {
223
- return _ ? () => void 0 : (d.add(e), () => d.delete(e));
244
+ return v ? () => void 0 : (f.add(e), () => f.delete(e));
224
245
  },
225
- [Symbol.dispose]: b
246
+ [Symbol.dispose]: x
226
247
  };
227
- }, d = () => (e) => {
248
+ }, p = () => (e) => {
228
249
  let t = n(e), i = r(t.initial, t.context);
229
250
  return {
230
- can: (e, n) => l(t, e, n),
231
- createActor: (e) => u(t, i, e),
251
+ can: (e, n) => d(t, e, n),
252
+ createActor: (e) => f(t, i, e),
232
253
  initialSnapshot: i,
233
- transition: (e, n) => c(t, e, {
254
+ transition: (e, n) => u(t, e, {
234
255
  event: n,
235
256
  kind: "event"
236
257
  }).result
237
258
  };
238
259
  };
239
260
  //#endregion
240
- export { d as defineMachine };
261
+ export { p as defineMachine };
241
262
 
242
263
  //# sourceMappingURL=interpret.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"interpret.js","names":[],"sources":["../src/interpret.ts"],"sourcesContent":["import { isContextRecord } from './_context.js';\nimport { warn } from './_dev.js';\nimport { type CompiledAfter, type CompiledMachine, type CompiledState, compileDefinition } from './definition.js';\nimport { ClockworkError } from './errors.js';\nimport type {\n Actor,\n ActorErrorContext,\n ActorOptions,\n Effect,\n Machine,\n MachineConfig,\n MachineEvent,\n MachineSnapshot,\n Transition,\n TransitionResult,\n} from './types.js';\n\ntype InternalEvent<State extends string, Context extends Record<string, unknown>, Event extends MachineEvent> = {\n readonly after: CompiledAfter<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\ntype SelectedTransition<State extends string, Context extends Record<string, unknown>, Event extends MachineEvent> = {\n readonly event: Event | undefined;\n readonly transition: Transition<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?: Transition<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> => ({ context, state });\n\nconst invalidSnapshot = (state: unknown): never => {\n throw new ClockworkError('INVALID_SNAPSHOT_STATE', `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\nconst stateNode = <State extends string, Context extends Record<string, unknown>, Event extends MachineEvent>(\n machine: CompiledMachine<State, Context, Event>,\n state: State,\n): CompiledState<State, Context, Event> => machine.states.get(state) ?? invalidSnapshot(state);\n\nconst selectTransition = <State extends string, Context extends Record<string, unknown>, Event extends MachineEvent>(\n machine: CompiledMachine<State, Context, Event>,\n snapshot: MachineSnapshot<State, Context>,\n runtimeEvent: RuntimeEvent<State, Context, Event>,\n): SelectedTransition<State, Context, Event> | undefined => {\n const state = stateNode(machine, snapshot.state);\n\n if (runtimeEvent.kind === 'after') {\n if (!state.after.includes(runtimeEvent.after)) return undefined;\n\n const { definition } = runtimeEvent.after;\n\n if (!definition.guard || definition.guard({ context: snapshot.context, event: undefined })) {\n return { event: undefined, transition: definition };\n }\n\n return undefined;\n }\n\n const candidates = state.on.get(runtimeEvent.event.type);\n\n if (!candidates) return undefined;\n\n for (const candidate of candidates) {\n const guard = candidate.guard as\n | ((args: { readonly context: Readonly<Context>; readonly event: Event }) => boolean)\n | undefined;\n\n if (!guard || guard({ context: snapshot.context, event: runtimeEvent.event })) {\n return { event: runtimeEvent.event, transition: candidate };\n }\n }\n\n return undefined;\n};\n\nconst transition = <State extends string, Context extends Record<string, unknown>, Event extends MachineEvent>(\n machine: CompiledMachine<State, Context, Event>,\n snapshot: MachineSnapshot<State, Context>,\n runtimeEvent: RuntimeEvent<State, Context, Event>,\n): TransitionOutcome<State, Context, Event> => {\n const selected = selectTransition(machine, snapshot, runtimeEvent);\n\n if (!selected) {\n return {\n event: runtimeEvent.kind === 'event' ? runtimeEvent.event : undefined,\n result: { snapshot, type: 'ignored' },\n };\n }\n\n const reducer = selected.transition.reduce as\n | ((args: { readonly context: Readonly<Context>; readonly event: Event | undefined }) => Context)\n | undefined;\n const nextContext = reducer ? reducer({ context: snapshot.context, event: selected.event }) : snapshot.context;\n\n if (!isContextRecord(nextContext)) {\n throw new ClockworkError('INVALID_CONTEXT', '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 machine: CompiledMachine<State, Context, Event>,\n snapshot: MachineSnapshot<State, Context>,\n event: Event,\n): boolean => selectTransition(machine, snapshot, { event, kind: 'event' }) !== undefined;\n\nconst createActor = <State extends string, Context extends Record<string, unknown>, Event extends MachineEvent>(\n machine: CompiledMachine<State, Context, Event>,\n initialSnapshot: MachineSnapshot<State, Context>,\n options: ActorOptions<State, Context, Event> = {},\n): Actor<State, Context, Event> => {\n if (\n options.maxTransitions !== undefined &&\n (!Number.isInteger(options.maxTransitions) || options.maxTransitions < 1)\n ) {\n throw new ClockworkError('INVALID_MAX_TRANSITIONS', 'maxTransitions must be a positive integer', {\n maxTransitions: options.maxTransitions,\n });\n }\n\n let current = options.snapshot ?? initialSnapshot;\n\n if (!isContextRecord(current.context)) {\n throw new ClockworkError('INVALID_CONTEXT', 'snapshot context must be a non-array object record', {});\n }\n\n if (!machine.states.has(current.state)) invalidSnapshot(current.state);\n\n const listeners = new Set<(snapshot: MachineSnapshot<State, Context>) => void>();\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 const maxTransitions = options.maxTransitions ?? 1_000;\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 disposal.abort();\n };\n\n const report = (error: unknown, context: ActorErrorContext<State, Event>): void => {\n let disposition: unknown = 'dispose';\n\n if (options.onError) {\n try {\n disposition = options.onError(error, context);\n } catch (handlerError) {\n dispose();\n throw handlerError;\n }\n }\n\n if (disposition !== 'continue') 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 report(error, { event, phase: 'effect', state });\n }\n }\n };\n\n const establishStateResources = (state: State, event: Event | undefined): void => {\n const node = stateNode(machine, state);\n\n for (const after of node.after) {\n const timer = setTimeout(() => {\n timers.delete(timer);\n run({ after, kind: 'after' });\n }, after.definition.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 report(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 report(error, { event: capturedEvent, phase: 'invoke', state });\n }\n } catch (callbackError) {\n report(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 report(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(machine, current, runtimeEvent);\n } catch (error) {\n report(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) return;\n\n const source = stateNode(machine, previous.state);\n\n current = outcome.result.snapshot;\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(stateNode(machine, 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 > maxTransitions) {\n report(\n new ClockworkError('INVALID_TRANSITION_LIMIT', 'maximum queued transitions exceeded', { maxTransitions }),\n { phase: 'transition', state: current.state },\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(stateNode(machine, current.state).entry, current.state, undefined);\n }\n\n return {\n can: (event) => !disposed && canTransition(machine, current, event),\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 [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 const compiled = compileDefinition(definition);\n const initialSnapshot = createSnapshot(compiled.initial, compiled.context);\n\n return {\n can: (snapshot, event) => canTransition(compiled, snapshot, event),\n createActor: (options) => createActor(compiled, initialSnapshot, options),\n initialSnapshot,\n transition: (snapshot, event) => transition(compiled, snapshot, { event, kind: 'event' }).result,\n };\n };\n"],"mappings":"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"}
1
+ {"version":3,"file":"interpret.js","names":[],"sources":["../src/interpret.ts"],"sourcesContent":["import { isContextRecord } from './_context.js';\nimport { warn } from './_dev.js';\nimport { type CompiledAfter, type CompiledMachine, type CompiledState, compileDefinition } from './definition.js';\nimport { ClockworkError } from './errors.js';\nimport type {\n Actor,\n ActorErrorContext,\n ActorOptions,\n Effect,\n Machine,\n MachineConfig,\n MachineEvent,\n MachineSnapshot,\n TransitionResult,\n} from './types.js';\n\ntype InternalEvent<State extends string, Context extends Record<string, unknown>, Event extends MachineEvent> = {\n readonly after: CompiledAfter<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\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 ClockworkError('INVALID_SNAPSHOT_STATE', `snapshot state \"${String(state)}\" is not declared`, { state });\n};\n\nconst isMachineEvent = (event: unknown): event is MachineEvent => {\n try {\n return typeof event === 'object' && event !== null && typeof (event as { type?: unknown }).type === 'string';\n } catch {\n return false;\n }\n};\n\nconst stateNode = <State extends string, Context extends Record<string, unknown>, Event extends MachineEvent>(\n machine: CompiledMachine<State, Context, Event>,\n state: State,\n): CompiledState<State, Context, Event> => machine.states.get(state) ?? invalidSnapshot(state);\n\nconst assertSnapshot = <State extends string, Context extends Record<string, unknown>, Event extends MachineEvent>(\n machine: CompiledMachine<State, Context, Event>,\n snapshot: MachineSnapshot<State, Context>,\n): void => {\n if (!isContextRecord(snapshot.context)) {\n throw new ClockworkError('INVALID_CONTEXT', 'snapshot context must be a non-array object record', {});\n }\n\n stateNode(machine, snapshot.state);\n};\n\nconst selectTransition = <State extends string, Context extends Record<string, unknown>, Event extends MachineEvent>(\n machine: CompiledMachine<State, Context, Event>,\n snapshot: MachineSnapshot<State, Context>,\n runtimeEvent: RuntimeEvent<State, Context, Event>,\n): SelectedTransition<State, Context, Event> | undefined => {\n assertSnapshot(machine, snapshot);\n const state = stateNode(machine, snapshot.state);\n\n if (runtimeEvent.kind === 'after') {\n if (!state.after.includes(runtimeEvent.after)) return undefined;\n\n const { definition } = runtimeEvent.after;\n\n if (!definition.guard || definition.guard({ context: snapshot.context, event: undefined })) {\n return { event: undefined, transition: definition as ExecutableTransition<State, Context, Event> };\n }\n\n return undefined;\n }\n\n const candidates = state.on.get(runtimeEvent.event.type);\n\n if (!candidates) return undefined;\n\n for (const candidate of candidates) {\n const guard = candidate.guard as\n | ((args: { readonly context: Readonly<Context>; readonly event: Event }) => boolean)\n | undefined;\n\n if (!guard || guard({ context: snapshot.context, event: runtimeEvent.event })) {\n return {\n event: runtimeEvent.event,\n transition: candidate as unknown as ExecutableTransition<State, Context, Event>,\n };\n }\n }\n\n return undefined;\n};\n\nconst transition = <State extends string, Context extends Record<string, unknown>, Event extends MachineEvent>(\n machine: CompiledMachine<State, Context, Event>,\n snapshot: MachineSnapshot<State, Context>,\n runtimeEvent: RuntimeEvent<State, Context, Event>,\n): TransitionOutcome<State, Context, Event> => {\n const selected = selectTransition(machine, 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 reducer = selected.transition.reduce as\n | ((args: { readonly context: Readonly<Context>; readonly event: Event | undefined }) => Context)\n | undefined;\n const nextContext = reducer ? reducer({ context: snapshot.context, event: selected.event }) : snapshot.context;\n\n if (!isContextRecord(nextContext)) {\n throw new ClockworkError('INVALID_CONTEXT', '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 machine: CompiledMachine<State, Context, Event>,\n snapshot: MachineSnapshot<State, Context>,\n event: Event,\n): boolean => selectTransition(machine, snapshot, { event, kind: 'event' }) !== undefined;\n\nconst createActor = <State extends string, Context extends Record<string, unknown>, Event extends MachineEvent>(\n machine: CompiledMachine<State, Context, Event>,\n initialSnapshot: MachineSnapshot<State, Context>,\n options: ActorOptions<State, Context, Event> = {},\n): Actor<State, Context, Event> => {\n if (\n options.maxTransitions !== undefined &&\n (!Number.isInteger(options.maxTransitions) || options.maxTransitions < 1)\n ) {\n throw new ClockworkError('INVALID_MAX_TRANSITIONS', 'maxTransitions must be a positive integer', {\n maxTransitions: options.maxTransitions,\n });\n }\n\n const restored = options.snapshot ?? initialSnapshot;\n\n assertSnapshot(machine, restored);\n let current = createSnapshot(restored.state, restored.context as Context);\n\n const listeners = new Set<(snapshot: MachineSnapshot<State, Context>) => void>();\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 const maxTransitions = options.maxTransitions ?? 1_000;\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 disposal.abort();\n };\n\n const observeError = (error: unknown, context: ActorErrorContext<State, Event>): void => {\n try {\n options.onError?.(error, context);\n } catch {}\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 = stateNode(machine, state);\n\n for (const after of node.after) {\n const timer = setTimeout(() => {\n timers.delete(timer);\n run({ after, kind: 'after' });\n }, after.definition.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(machine, 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) return;\n\n const source = stateNode(machine, previous.state);\n\n current = outcome.result.snapshot;\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(stateNode(machine, 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 > maxTransitions) {\n fail(\n new ClockworkError('INVALID_TRANSITION_LIMIT', 'maximum queued transitions exceeded', { maxTransitions }),\n { phase: 'transition', state: current.state },\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(stateNode(machine, 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(machine, 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 [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 const compiled = compileDefinition(definition);\n const initialSnapshot = createSnapshot(compiled.initial, compiled.context);\n\n return {\n can: (snapshot, event) => canTransition(compiled, snapshot, event),\n createActor: (options) => createActor(compiled, initialSnapshot, options),\n initialSnapshot,\n transition: (snapshot, event) => transition(compiled, snapshot, { event, kind: 'event' }).result,\n };\n };\n"],"mappings":"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"}
package/dist/types.d.ts CHANGED
@@ -36,8 +36,8 @@ export type TransitionInput<State extends string, Context extends Record<string,
36
36
  export type After<State extends string, Context extends Record<string, unknown>, Event extends MachineEvent> = {
37
37
  readonly delay: number;
38
38
  readonly effects?: readonly Effect<Context, Event>[];
39
- readonly guard?: Guard<Context, Event | undefined>;
40
- readonly reduce?: Reducer<Context, Event | undefined>;
39
+ readonly guard?: Guard<Context, undefined>;
40
+ readonly reduce?: Reducer<Context, undefined>;
41
41
  readonly target: State;
42
42
  };
43
43
  export type InvokeArgs<Context extends Record<string, unknown>, Event extends MachineEvent> = {
@@ -84,10 +84,9 @@ export type ActorErrorContext<State extends string, Event extends MachineEvent>
84
84
  readonly phase: 'effect' | 'invoke' | 'subscriber' | 'transition';
85
85
  readonly state: State;
86
86
  };
87
- export type ActorErrorDisposition = 'continue' | 'dispose';
88
87
  export type ActorOptions<State extends string, Context extends Record<string, unknown>, Event extends MachineEvent> = {
89
88
  readonly maxTransitions?: number;
90
- readonly onError?: (error: unknown, context: ActorErrorContext<State, Event>) => ActorErrorDisposition;
89
+ readonly onError?: (error: unknown, context: ActorErrorContext<State, Event>) => void;
91
90
  readonly snapshot?: MachineSnapshot<State, Context>;
92
91
  };
93
92
  export type Actor<State extends string, Context extends Record<string, unknown>, Event extends MachineEvent> = {
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vielzeug/clockwork",
3
- "version": "2.2.1",
3
+ "version": "3.0.0",
4
4
  "description": "Framework-neutral typed finite state machines with pure transitions and actors",
5
5
  "repository": {
6
6
  "type": "git",
@@ -30,18 +30,19 @@
30
30
  "registry": "https://registry.npmjs.org/"
31
31
  },
32
32
  "scripts": {
33
- "build": "vite build && pnpm run build:bundle && pnpm run build:types",
33
+ "build": "vite build && pnpm --silent run build:bundle && pnpm --silent run build:types && pnpm --silent run verify:exports",
34
34
  "build:bundle": "vite build --config vite.bundle.config.ts",
35
35
  "build:types": "tsc -p tsconfig.declarations.json",
36
36
  "fix": "biome check --write src",
37
37
  "lint": "biome ci src",
38
- "prepublishOnly": "pnpm run build",
39
- "test": "vitest"
38
+ "prepublishOnly": "pnpm --silent run build",
39
+ "test": "vitest",
40
+ "verify:exports": "node verify-exports.mjs"
40
41
  },
41
42
  "devDependencies": {
42
- "@types/node": "^26.2.0",
43
+ "@types/node": "^26.4.1",
43
44
  "typescript": "^6.0.3",
44
- "vite": "^8.2.1",
45
- "vitest": "^4.1.10"
45
+ "vite": "^8.2.2",
46
+ "vitest": "^5.0.0"
46
47
  }
47
48
  }