@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/README.md +14 -82
- 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 +1 -1
- package/dist/clockwork.js.map +1 -1
- package/dist/definition.cjs +1 -1
- package/dist/definition.cjs.map +1 -1
- package/dist/definition.d.ts.map +1 -1
- package/dist/definition.js +71 -63
- package/dist/definition.js.map +1 -1
- package/dist/errors.cjs +1 -1
- package/dist/errors.cjs.map +1 -1
- package/dist/errors.d.ts +1 -0
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +4 -3
- package/dist/errors.js.map +1 -1
- package/dist/index.d.ts +2 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/interpret.cjs +1 -1
- package/dist/interpret.cjs.map +1 -1
- package/dist/interpret.d.ts.map +1 -1
- package/dist/interpret.js +128 -107
- package/dist/interpret.js.map +1 -1
- package/dist/types.d.ts +3 -4
- package/dist/types.d.ts.map +1 -1
- package/package.json +8 -7
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
|
-
|
|
8
|
-
|
|
9
|
-
|
|
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
|
-
},
|
|
12
|
-
|
|
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
|
-
},
|
|
36
|
-
let
|
|
37
|
-
if (!
|
|
38
|
-
event:
|
|
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 =
|
|
45
|
-
context:
|
|
46
|
-
event:
|
|
47
|
-
}) :
|
|
48
|
-
if (!t(
|
|
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:
|
|
63
|
+
event: s.event,
|
|
51
64
|
result: {
|
|
52
|
-
snapshot: r(
|
|
65
|
+
snapshot: r(s.transition.target, u),
|
|
53
66
|
type: "transition"
|
|
54
67
|
},
|
|
55
|
-
transition:
|
|
68
|
+
transition: s.transition
|
|
56
69
|
};
|
|
57
|
-
},
|
|
70
|
+
}, d = (e, t, n) => l(e, t, {
|
|
58
71
|
event: n,
|
|
59
72
|
kind: "event"
|
|
60
|
-
}) !== void 0,
|
|
61
|
-
if (
|
|
62
|
-
let
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
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
|
-
|
|
71
|
-
|
|
72
|
-
}, x = (
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
},
|
|
81
|
-
if (!
|
|
82
|
-
if (
|
|
83
|
-
|
|
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
|
-
|
|
96
|
+
y = !0;
|
|
87
97
|
try {
|
|
88
|
-
|
|
98
|
+
k(e), A();
|
|
89
99
|
} finally {
|
|
90
|
-
|
|
100
|
+
y = !1;
|
|
91
101
|
}
|
|
92
102
|
}
|
|
93
|
-
},
|
|
94
|
-
|
|
103
|
+
}, T = (e) => {
|
|
104
|
+
v || o(e) && w({
|
|
95
105
|
event: e,
|
|
96
106
|
kind: "event"
|
|
97
107
|
});
|
|
98
|
-
},
|
|
108
|
+
}, E = (e, t, n) => {
|
|
99
109
|
for (let r of e) {
|
|
100
|
-
if (
|
|
110
|
+
if (v) return;
|
|
101
111
|
try {
|
|
102
112
|
r({
|
|
103
|
-
context:
|
|
113
|
+
context: l.context,
|
|
104
114
|
event: n,
|
|
105
|
-
send:
|
|
106
|
-
signal:
|
|
115
|
+
send: T,
|
|
116
|
+
signal: p.signal
|
|
107
117
|
});
|
|
108
118
|
} catch (e) {
|
|
109
|
-
|
|
119
|
+
C(e, {
|
|
110
120
|
event: n,
|
|
111
121
|
phase: "effect",
|
|
112
122
|
state: t
|
|
113
123
|
});
|
|
114
124
|
}
|
|
115
125
|
}
|
|
116
|
-
},
|
|
117
|
-
let r =
|
|
126
|
+
}, D = (e, n) => {
|
|
127
|
+
let r = s(t, e);
|
|
118
128
|
for (let e of r.after) {
|
|
119
129
|
let t = setTimeout(() => {
|
|
120
|
-
|
|
130
|
+
m.delete(t), w({
|
|
121
131
|
after: e,
|
|
122
132
|
kind: "after"
|
|
123
133
|
});
|
|
124
134
|
}, e.definition.delay);
|
|
125
|
-
|
|
135
|
+
m.add(t);
|
|
126
136
|
}
|
|
127
|
-
for (let
|
|
137
|
+
for (let t of r.invoke) {
|
|
128
138
|
let r = new AbortController();
|
|
129
|
-
|
|
130
|
-
let i =
|
|
131
|
-
Promise.resolve().then(() =>
|
|
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((
|
|
136
|
-
if (
|
|
137
|
-
|
|
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:
|
|
149
|
+
result: n
|
|
140
150
|
}));
|
|
141
151
|
} catch (t) {
|
|
142
|
-
|
|
152
|
+
C(t, {
|
|
143
153
|
event: a,
|
|
144
154
|
phase: "invoke",
|
|
145
155
|
state: e
|
|
146
156
|
});
|
|
147
157
|
}
|
|
148
|
-
}, (
|
|
149
|
-
if (
|
|
150
|
-
|
|
158
|
+
}, (n) => {
|
|
159
|
+
if (h.delete(r), !(v || r.signal.aborted)) try {
|
|
160
|
+
t.onError ? T(t.onError({
|
|
151
161
|
context: i,
|
|
152
|
-
error:
|
|
153
|
-
})) :
|
|
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
|
-
|
|
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
|
-
},
|
|
168
|
-
for (let t of
|
|
169
|
-
if (
|
|
177
|
+
}, O = (e) => {
|
|
178
|
+
for (let t of [...f]) {
|
|
179
|
+
if (v) return;
|
|
170
180
|
try {
|
|
171
|
-
t(
|
|
181
|
+
t(l);
|
|
172
182
|
} catch (t) {
|
|
173
|
-
|
|
183
|
+
S(t, {
|
|
174
184
|
event: e,
|
|
175
185
|
phase: "subscriber",
|
|
176
|
-
state:
|
|
186
|
+
state: l.state
|
|
177
187
|
});
|
|
178
188
|
}
|
|
179
189
|
}
|
|
180
|
-
},
|
|
181
|
-
let
|
|
190
|
+
}, k = (e) => {
|
|
191
|
+
let n = l, r;
|
|
182
192
|
try {
|
|
183
|
-
r =
|
|
193
|
+
r = u(t, l, e);
|
|
184
194
|
} catch (t) {
|
|
185
|
-
|
|
195
|
+
C(t, {
|
|
186
196
|
event: e.kind === "event" ? e.event : void 0,
|
|
187
197
|
phase: "transition",
|
|
188
|
-
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 =
|
|
194
|
-
|
|
195
|
-
},
|
|
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 (;
|
|
198
|
-
if (t += 1, t >
|
|
199
|
-
|
|
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:
|
|
211
|
+
state: l.state
|
|
202
212
|
});
|
|
203
213
|
return;
|
|
204
214
|
}
|
|
205
|
-
let n =
|
|
206
|
-
n &&
|
|
215
|
+
let n = g.shift();
|
|
216
|
+
n && k(n);
|
|
207
217
|
}
|
|
208
218
|
};
|
|
209
|
-
return
|
|
210
|
-
can: (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
|
|
233
|
+
return p.signal;
|
|
213
234
|
},
|
|
214
|
-
dispose:
|
|
235
|
+
dispose: x,
|
|
215
236
|
get disposed() {
|
|
216
|
-
return
|
|
237
|
+
return v;
|
|
217
238
|
},
|
|
218
|
-
send:
|
|
239
|
+
send: T,
|
|
219
240
|
get snapshot() {
|
|
220
|
-
return
|
|
241
|
+
return l;
|
|
221
242
|
},
|
|
222
243
|
subscribe(e) {
|
|
223
|
-
return
|
|
244
|
+
return v ? () => void 0 : (f.add(e), () => f.delete(e));
|
|
224
245
|
},
|
|
225
|
-
[Symbol.dispose]:
|
|
246
|
+
[Symbol.dispose]: x
|
|
226
247
|
};
|
|
227
|
-
},
|
|
248
|
+
}, p = () => (e) => {
|
|
228
249
|
let t = n(e), i = r(t.initial, t.context);
|
|
229
250
|
return {
|
|
230
|
-
can: (e, n) =>
|
|
231
|
-
createActor: (e) =>
|
|
251
|
+
can: (e, n) => d(t, e, n),
|
|
252
|
+
createActor: (e) => f(t, i, e),
|
|
232
253
|
initialSnapshot: i,
|
|
233
|
-
transition: (e, n) =>
|
|
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 {
|
|
261
|
+
export { p as defineMachine };
|
|
241
262
|
|
|
242
263
|
//# sourceMappingURL=interpret.js.map
|
package/dist/interpret.js.map
CHANGED
|
@@ -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":";;;;;AAqCA,IAAM,KACJ,GACA,OACqC;CAAE;CAAS;AAAM,IAElD,KAAmB,MAA0B;CACjD,MAAM,IAAI,EAAe,0BAA0B,mBAAmB,OAAO,CAAK,EAAE,oBAAoB,EAAE,SAAM,CAAC;AACnH,GAEM,KAAkB,MACtB,OAAO,KAAU,cAAY,KAAkB,OAAQ,EAA6B,QAAS,UAEzF,KACJ,GACA,MACyC,EAAQ,OAAO,IAAI,CAAK,KAAK,EAAgB,CAAK,GAEvF,KACJ,GACA,GACA,MAC0D;CAC1D,IAAM,IAAQ,EAAU,GAAS,EAAS,KAAK;CAE/C,IAAI,EAAa,SAAS,SAAS;EACjC,IAAI,CAAC,EAAM,MAAM,SAAS,EAAa,KAAK,GAAG;EAE/C,IAAM,EAAE,kBAAe,EAAa;EAMpC,OAJI,CAAC,EAAW,SAAS,EAAW,MAAM;GAAE,SAAS,EAAS;GAAS,OAAO,KAAA;EAAU,CAAC,IAChF;GAAE,OAAO,KAAA;GAAW,YAAY;EAAW,IAGpD;CACF;CAEA,IAAM,IAAa,EAAM,GAAG,IAAI,EAAa,MAAM,IAAI;CAElD,OAEL,KAAK,IAAM,KAAa,GAAY;EAClC,IAAM,IAAQ,EAAU;EAIxB,IAAI,CAAC,KAAS,EAAM;GAAE,SAAS,EAAS;GAAS,OAAO,EAAa;EAAM,CAAC,GAC1E,OAAO;GAAE,OAAO,EAAa;GAAO,YAAY;EAAU;CAE9D;AAGF,GAEM,KACJ,GACA,GACA,MAC6C;CAC7C,IAAM,IAAW,EAAiB,GAAS,GAAU,CAAY;CAEjE,IAAI,CAAC,GACH,OAAO;EACL,OAAO,EAAa,SAAS,UAAU,EAAa,QAAQ,KAAA;EAC5D,QAAQ;GAAE;GAAU,MAAM;EAAU;CACtC;CAGF,IAAM,IAAU,EAAS,WAAW,QAG9B,IAAc,IAAU,EAAQ;EAAE,SAAS,EAAS;EAAS,OAAO,EAAS;CAAM,CAAC,IAAI,EAAS;CAEvG,IAAI,CAAC,EAAgB,CAAW,GAC9B,MAAM,IAAI,EAAe,mBAAmB,mDAAmD,EAC7F,OAAO,EAAS,MAClB,CAAC;CAGH,OAAO;EACL,OAAO,EAAS;EAChB,QAAQ;GAAE,UAAU,EAAe,EAAS,WAAW,QAAQ,CAAsB;GAAG,MAAM;EAAa;EAC3G,YAAY,EAAS;CACvB;AACF,GAEM,KACJ,GACA,GACA,MACY,EAAiB,GAAS,GAAU;CAAE;CAAO,MAAM;AAAQ,CAAC,MAAM,KAAA,GAE1E,KACJ,GACA,GACA,IAA+C,CAAC,MACf;CACjC,IACE,EAAQ,mBAAmB,KAAA,MAC1B,CAAC,OAAO,UAAU,EAAQ,cAAc,KAAK,EAAQ,iBAAiB,IAEvE,MAAM,IAAI,EAAe,2BAA2B,6CAA6C,EAC/F,gBAAgB,EAAQ,eAC1B,CAAC;CAGH,IAAI,IAAU,EAAQ,YAAY;CAElC,IAAI,CAAC,EAAgB,EAAQ,OAAO,GAClC,MAAM,IAAI,EAAe,mBAAmB,sDAAsD,CAAC,CAAC;CAGtG,AAAK,EAAQ,OAAO,IAAI,EAAQ,KAAK,KAAG,EAAgB,EAAQ,KAAK;CAErE,IAAM,oBAAY,IAAI,IAAyD,GACzE,IAAW,IAAI,gBAAgB,GAC/B,oBAAS,IAAI,IAAmC,GAChD,oBAAU,IAAI,IAAqB,GACnC,IAA+C,CAAC,GAChD,IAAiB,EAAQ,kBAAkB,KAC7C,IAAW,IACX,IAAa,IAEX,UAAmC;EACvC,KAAK,IAAM,KAAS,GAAQ,aAAa,CAAK;EAC9C,EAAO,MAAM;EAEb,KAAK,IAAM,KAAc,GAAS,EAAW,MAAM;EACnD,EAAQ,MAAM;CAChB,GAEM,UAAsB;EACtB,MAEJ,IAAW,IACX,EAAM,SAAS,GACf,EAAqB,GACrB,EAAU,MAAM,GAChB,EAAS,MAAM;CACjB,GAEM,KAAU,GAAgB,MAAmD;EACjF,IAAI,IAAuB;EAE3B,IAAI,EAAQ,SACV,IAAI;GACF,IAAc,EAAQ,QAAQ,GAAO,CAAO;EAC9C,SAAS,GAAc;GAErB,MADA,EAAQ,GACF;EACR;EAGF,AAAI,MAAgB,cAAY,EAAQ;CAC1C,GAEM,KAAO,MAA4D;EACnE,QAEJ;OAAI,GAAY;IACd,EAAM,KAAK,CAAY;IAEvB;GACF;GAEA,IAAa;GAEb,IAAI;IAEF,AADA,EAAQ,CAAY,GACpB,EAAM;GACR,UAAU;IACR,IAAa;GACf;EATA;CAUF,GAEM,KAAQ,MAAuB;EAC/B,KAEC,EAAe,CAAK,KAMzB,EAAI;GAAE;GAAO,MAAM;EAAQ,CAAC;CAC9B,GAEM,KAAc,GAA4C,GAAc,MAAmC;EAC/G,KAAK,IAAM,KAAU,GAAS;GAC5B,IAAI,GAAU;GAEd,IAAI;IACF,EAAO;KAAE,SAAS,EAAQ;KAAS;KAAO;KAAM,QAAQ,EAAS;IAAO,CAAC;GAC3E,SAAS,GAAO;IACd,EAAO,GAAO;KAAE;KAAO,OAAO;KAAU;IAAM,CAAC;GACjD;EACF;CACF,GAEM,KAA2B,GAAc,MAAmC;EAChF,IAAM,IAAO,EAAU,GAAS,CAAK;EAErC,KAAK,IAAM,KAAS,EAAK,OAAO;GAC9B,IAAM,IAAQ,iBAAiB;IAE7B,AADA,EAAO,OAAO,CAAK,GACnB,EAAI;KAAE;KAAO,MAAM;IAAQ,CAAC;GAC9B,GAAG,EAAM,WAAW,KAAK;GAEzB,EAAO,IAAI,CAAK;EAClB;EAEA,KAAK,IAAM,KAAU,EAAK,QAAQ;GAChC,IAAM,IAAa,IAAI,gBAAgB;GAEvC,EAAQ,IAAI,CAAU;GAEtB,IAAM,IAAkB,EAAQ,SAC1B,IAAgB;GAEtB,QAAa,QAAQ,CAAC,CACnB,WAAW,EAAO,IAAI;IAAE,SAAS;IAAiB,OAAO;IAAe,QAAQ,EAAW;GAAO,CAAC,CAAC,CAAC,CACrG,MACE,MAAW;IACV,MAAQ,OAAO,CAAU,GAErB,OAAY,EAAW,OAAO,WAAW,CAAC,EAAO,SAErD,IAAI;KACF,EAAK,EAAO,OAAO;MAAE,SAAS;MAAiB;KAAO,CAAC,CAAC;IAC1D,SAAS,GAAO;KACd,EAAO,GAAO;MAAE,OAAO;MAAe,OAAO;MAAU;KAAM,CAAC;IAChE;GACF,IACC,MAAmB;IAClB,MAAQ,OAAO,CAAU,GAErB,OAAY,EAAW,OAAO,UAElC,IAAI;KACF,AAAI,EAAO,UACT,EAAK,EAAO,QAAQ;MAAE,SAAS;MAAiB;KAAM,CAAC,CAAC,IAExD,EAAO,GAAO;MAAE,OAAO;MAAe,OAAO;MAAU;KAAM,CAAC;IAElE,SAAS,GAAe;KACtB,EAAO,GAAe;MAAE,OAAO;MAAe,OAAO;MAAU;KAAM,CAAC;IACxE;GACF,CACF;EACJ;CACF,GAEM,KAAU,MAAmC;EACjD,KAAK,IAAM,KAAY,GAAW;GAChC,IAAI,GAAU;GAEd,IAAI;IACF,EAAS,CAAO;GAClB,SAAS,GAAO;IACd,EAAO,GAAO;KAAE;KAAO,OAAO;KAAc,OAAO,EAAQ;IAAM,CAAC;GACpE;EACF;CACF,GAEM,KAAW,MAA4D;EAC3E,IAAM,IAAW,GACb;EAEJ,IAAI;GACF,IAAU,EAAW,GAAS,GAAS,CAAY;EACrD,SAAS,GAAO;GACd,EAAO,GAAO;IACZ,OAAO,EAAa,SAAS,UAAU,EAAa,QAAQ,KAAA;IAC5D,OAAO;IACP,OAAO,EAAQ;GACjB,CAAC;GAED;EACF;EAEA,IAAI,EAAQ,OAAO,SAAS,aAAa,CAAC,EAAQ,YAAY;EAE9D,IAAM,IAAS,EAAU,GAAS,EAAS,KAAK;EAQhD,AANA,IAAU,EAAQ,OAAO,UACzB,EAAqB,GACrB,EAAwB,EAAQ,OAAO,EAAQ,KAAK,GACpD,EAAO,EAAQ,KAAK,GACpB,EAAW,EAAO,MAAM,EAAS,OAAO,EAAQ,KAAK,GACrD,EAAW,EAAQ,WAAW,WAAW,CAAC,GAAG,EAAS,OAAO,EAAQ,KAAK,GAC1E,EAAW,EAAU,GAAS,EAAQ,KAAK,CAAC,CAAC,OAAO,EAAQ,OAAO,EAAQ,KAAK;CAClF,GAEM,UAAoB;EACxB,IAAI,IAAc;EAElB,OAAO,EAAM,SAAS,KAAK,CAAC,IAAU;GAGpC,IAFA,KAAe,GAEX,IAAc,GAAgB;IAChC,EACE,IAAI,EAAe,4BAA4B,uCAAuC,EAAE,kBAAe,CAAC,GACxG;KAAE,OAAO;KAAc,OAAO,EAAQ;IAAM,CAC9C;IAEA;GACF;GAEA,IAAM,IAAO,EAAM,MAAM;GAEzB,AAAI,KAAM,EAAQ,CAAI;EACxB;CACF;CAQA,OANA,EAAwB,EAAQ,OAAO,KAAA,CAAS,GAE3C,EAAQ,YACX,EAAW,EAAU,GAAS,EAAQ,KAAK,CAAC,CAAC,OAAO,EAAQ,OAAO,KAAA,CAAS,GAGvE;EACL,MAAM,MAAU,CAAC,KAAY,EAAc,GAAS,GAAS,CAAK;EAClE,IAAI,iBAAiB;GACnB,OAAO,EAAS;EAClB;EACA;EACA,IAAI,WAAW;GACb,OAAO;EACT;EACA;EACA,IAAI,WAAW;GACb,OAAO;EACT;EACA,UAAU,GAAU;GAKlB,OAJI,UAAuB,KAAA,KAE3B,EAAU,IAAI,CAAQ,SAET,EAAU,OAAO,CAAQ;EACxC;GACC,OAAO,UAAU;CACpB;AACF,GAGa,WAEY,MAAqF;CAC1G,IAAM,IAAW,EAAkB,CAAU,GACvC,IAAkB,EAAe,EAAS,SAAS,EAAS,OAAO;CAEzE,OAAO;EACL,MAAM,GAAU,MAAU,EAAc,GAAU,GAAU,CAAK;EACjE,cAAc,MAAY,EAAY,GAAU,GAAiB,CAAO;EACxE;EACA,aAAa,GAAU,MAAU,EAAW,GAAU,GAAU;GAAE;GAAO,MAAM;EAAQ,CAAC,CAAC,CAAC;CAC5F;AACF"}
|
|
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,
|
|
40
|
-
readonly reduce?: Reducer<Context,
|
|
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>) =>
|
|
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> = {
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,YAAY,GAAG;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAErD,MAAM,MAAM,SAAS,CAAC,KAAK,SAAS,YAAY,IAAI,KAAK,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC;AAE3E,MAAM,MAAM,WAAW,CAAC,KAAK,SAAS,YAAY,EAAE,IAAI,SAAS,SAAS,CAAC,KAAK,CAAC,IAAI,OAAO,CAAC,KAAK,EAAE;IAAE,IAAI,EAAE,IAAI,CAAA;CAAE,CAAC,CAAC;AAEpH,MAAM,MAAM,eAAe,CAAC,KAAK,SAAS,MAAM,EAAE,OAAO,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI;IAC3F,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC;IACpC,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;CACvB,CAAC;AAEF,MAAM,MAAM,KAAK,CAAC,OAAO,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,KAAK,IAAI,CAAC,IAAI,EAAE;IACzE,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC;IACpC,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;CACvB,KAAK,OAAO,CAAC;AAEd,0FAA0F;AAC1F,MAAM,MAAM,OAAO,CAAC,OAAO,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,KAAK,IAAI,CAAC,IAAI,EAAE;IAC3E,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC;IACpC,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;CACvB,KAAK,OAAO,CAAC;AAEd,MAAM,MAAM,UAAU,CAAC,OAAO,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,KAAK,SAAS,YAAY,IAAI;IAC5F,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC;IACpC,QAAQ,CAAC,KAAK,EAAE,KAAK,GAAG,SAAS,CAAC;IAClC,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IACtC,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC;CAC9B,CAAC;AAEF,wEAAwE;AACxE,MAAM,MAAM,MAAM,CAAC,OAAO,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,KAAK,SAAS,YAAY,IAAI,CACxF,IAAI,EAAE,UAAU,CAAC,OAAO,EAAE,KAAK,CAAC,KAC7B,IAAI,CAAC;AAEV,MAAM,MAAM,UAAU,CACpB,KAAK,SAAS,MAAM,EACpB,OAAO,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACvC,KAAK,SAAS,YAAY,EAC1B,IAAI,SAAS,SAAS,CAAC,KAAK,CAAC,GAAG,SAAS,CAAC,KAAK,CAAC,IAC9C;IACF,QAAQ,CAAC,OAAO,CAAC,EAAE,SAAS,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,EAAE,CAAC;IACrD,QAAQ,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC,OAAO,EAAE,WAAW,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC;IAC1D,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,OAAO,EAAE,WAAW,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC;IAC7D,QAAQ,CAAC,MAAM,EAAE,KAAK,CAAC;CACxB,CAAC;AAEF,MAAM,MAAM,eAAe,CACzB,KAAK,SAAS,MAAM,EACpB,OAAO,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACvC,KAAK,SAAS,YAAY,EAC1B,IAAI,SAAS,SAAS,CAAC,KAAK,CAAC,GAAG,SAAS,CAAC,KAAK,CAAC,IAC9C,UAAU,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,GAAG,SAAS,UAAU,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,CAAC;AAEjG,MAAM,MAAM,KAAK,CAAC,KAAK,SAAS,MAAM,EAAE,OAAO,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,KAAK,SAAS,YAAY,IAAI;IAC7G,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,OAAO,CAAC,EAAE,SAAS,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,EAAE,CAAC;IACrD,QAAQ,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC,OAAO,EAAE,
|
|
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": "
|
|
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.
|
|
43
|
+
"@types/node": "^26.4.1",
|
|
43
44
|
"typescript": "^6.0.3",
|
|
44
|
-
"vite": "^8.2.
|
|
45
|
-
"vitest": "^
|
|
45
|
+
"vite": "^8.2.2",
|
|
46
|
+
"vitest": "^5.0.0"
|
|
46
47
|
}
|
|
47
48
|
}
|