@statewalker/fsm 0.35.0 → 0.37.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.
Files changed (41) hide show
  1. package/README.md +112 -0
  2. package/bin/cli.js +1 -1
  3. package/dist/bin/node-runner-UJp8T_oP.d.ts +16 -0
  4. package/dist/bin/node-runner-UJp8T_oP.d.ts.map +1 -0
  5. package/dist/bin/node-runner.js +40 -0
  6. package/dist/bin/node-runner.js.map +1 -0
  7. package/dist/index-vTjnkbGW.d.ts +129 -0
  8. package/dist/index-vTjnkbGW.d.ts.map +1 -0
  9. package/dist/index.js +43 -719
  10. package/dist/index.js.map +1 -1
  11. package/dist/launcher-6VUDviTj.d.ts +48 -0
  12. package/dist/launcher-6VUDviTj.d.ts.map +1 -0
  13. package/dist/launcher-CASrMAOa.js +443 -0
  14. package/dist/launcher-CASrMAOa.js.map +1 -0
  15. package/package.json +8 -8
  16. package/src/bin/node-runner.ts +57 -0
  17. package/src/core/fsm-base-class.ts +1 -26
  18. package/src/core/fsm-process.ts +14 -11
  19. package/src/core/fsm-state.ts +1 -21
  20. package/src/core/index.ts +1 -1
  21. package/src/index.ts +1 -5
  22. package/src/orchestrator/handler-registry.ts +108 -0
  23. package/src/orchestrator/index.ts +15 -9
  24. package/src/orchestrator/launcher.ts +42 -141
  25. package/src/orchestrator/start-process.ts +141 -26
  26. package/src/utils/index.ts +0 -2
  27. package/src/utils/printer.ts +5 -11
  28. package/src/utils/tracer.ts +1 -1
  29. package/CHANGELOG.md +0 -59
  30. package/dist/index.d.ts +0 -310
  31. package/src/core/new-fsm-process.ts +0 -83
  32. package/src/orchestrator/constants.ts +0 -130
  33. package/src/orchestrator/is-generator.ts +0 -12
  34. package/src/orchestrator/process-config-manager.ts +0 -70
  35. package/src/orchestrator/resolve-module-refs.ts +0 -52
  36. package/src/orchestrator/start-node-processes.ts +0 -19
  37. package/src/orchestrator/start-processes.ts +0 -32
  38. package/src/orchestrator/types.ts +0 -34
  39. package/src/utils/handlers.ts +0 -35
  40. package/src/utils/process.ts +0 -26
  41. package/src/utils/transitions.ts +0 -56
package/README.md CHANGED
@@ -1 +1,113 @@
1
1
  # @statewalker/fsm: Hierarchical Finite State Machine
2
+
3
+ Class-based HFSM with nested states, event-driven transitions, lifecycle hooks, and dump/restore serialization.
4
+
5
+ ## Core Classes
6
+
7
+ ### FsmStateConfig
8
+
9
+ Declarative state tree definition:
10
+
11
+ ```typescript
12
+ const config: FsmStateConfig = {
13
+ key: "Main",
14
+ transitions: [
15
+ ["", "start", "Active"], // initial → Active
16
+ ["Active", "done", ""], // Active → final
17
+ ["*", "reset", "Active"], // any → Active
18
+ ],
19
+ states: [
20
+ { key: "Active", states: [
21
+ { key: "Step1" },
22
+ { key: "Step2" },
23
+ ], transitions: [
24
+ ["", "", "Step1"], // initial → Step1 (eventless)
25
+ ["Step1", "next", "Step2"],
26
+ ]},
27
+ ],
28
+ };
29
+ ```
30
+
31
+ ### FsmProcess
32
+
33
+ Runtime state machine. Maintains a state stack (root → ... → leaf), dispatches events, manages lifecycle.
34
+
35
+ - `dispatch(event)` — trigger a transition
36
+ - `shutdown()` — exit all states gracefully
37
+ - `state` — current leaf state
38
+ - `status` — bitmask tracking enter/exit cycle
39
+ - `onStateCreate(handler)` — called for every new state (primary extension point)
40
+ - `dump()` / `restore(data)` — serialization hooks
41
+
42
+ ### FsmState
43
+
44
+ Individual node in the state hierarchy.
45
+
46
+ - `key` — state name
47
+ - `parent` — parent state
48
+ - `onEnter(handler)` — run when entering
49
+ - `onExit(handler)` — run when exiting (reverse order)
50
+ - `onStateError(handler)` — error handling
51
+ - `dump()` / `restore(data)` — per-state serialization
52
+
53
+ ## Orchestrator
54
+
55
+ ### startProcess(context, config, load, startEvent?)
56
+
57
+ High-level entry point: creates FsmProcess, wires handlers, binds FSM into context.
58
+
59
+ Context keys bound:
60
+ - `fsm:dispatch` — dispatch function
61
+ - `fsm:terminate` — shutdown function
62
+ - `fsm:states` — current state stack
63
+ - `fsm:event` — last event
64
+
65
+ `load(stateKey)` returns handler(s) for each state. Handlers can return:
66
+ - `void` — no cleanup
67
+ - `Function` — registered as onExit cleanup
68
+ - `AsyncGenerator` — yielded events are dispatched to FSM
69
+
70
+ ### HandlerRegistry
71
+
72
+ Convention-based handler discovery via `createHandlerRegistry()`:
73
+
74
+ ```typescript
75
+ const registry = createHandlerRegistry();
76
+ registry.addConfig("MyProcess", config);
77
+ registry.addHandlers("MyProcess", { "Active": activeHandler, "Step1": step1Handler });
78
+ const load = registry.getLoader("MyProcess");
79
+ ```
80
+
81
+ ### launcher(config)
82
+
83
+ Multi-process launcher with strict types:
84
+
85
+ ```typescript
86
+ interface LauncherConfig {
87
+ processes: ProcessDef[];
88
+ start?: string[];
89
+ context?: (parent: Record<string, unknown>) => Record<string, unknown>;
90
+ }
91
+
92
+ interface ProcessDef {
93
+ name: string;
94
+ config: FsmStateConfig;
95
+ handlers?: (StageHandler | Record<string, StageHandler | StageHandler[]>)[];
96
+ start?: boolean;
97
+ }
98
+ ```
99
+
100
+ ## Utilities
101
+
102
+ - `printer(process)` — log state transitions to console
103
+ - `tracer(process)` — collect transition trace for testing
104
+
105
+ ## Migration from pre-0.35
106
+
107
+ Removed in 0.35:
108
+ - `FsmBaseClass.data`, `.setData()`, `.getData()` — use closures or context instead
109
+ - `FsmState.getData(key, recursive)`, `.useData(key)` — use closures
110
+ - `FsmBaseClass._runHandlerParallel()` — handlers run sequentially now
111
+ - `newFsmProcess()` — use `startProcess()` from orchestrator
112
+ - `utils/handlers.ts` (`addSubstateHandlers`, `callStateHandlers`) — use HandlerRegistry
113
+ - `utils/process.ts` — use `startProcess()` directly
package/bin/cli.js CHANGED
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
2
 
3
- import startNodeProcesses from "../dist/index.js";
3
+ import { startNodeProcesses } from "../dist/bin/node-runner.js";
4
4
 
5
5
  startNodeProcesses();
@@ -0,0 +1,16 @@
1
+ import { n as LauncherConfig } from "../launcher-6VUDviTj.js";
2
+
3
+ //#region src/bin/node-runner.d.ts
4
+ declare function startProcesses({
5
+ onExit,
6
+ modules,
7
+ context
8
+ }: {
9
+ onExit?: () => Promise<void> | void;
10
+ modules: unknown[];
11
+ context?: LauncherConfig["context"];
12
+ }): Promise<() => Promise<void>>;
13
+ declare function startNodeProcesses(modules?: string[]): Promise<void>;
14
+ //#endregion
15
+ export { startNodeProcesses as default, startNodeProcesses, startProcesses };
16
+ //# sourceMappingURL=node-runner-UJp8T_oP.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"node-runner-UJp8T_oP.d.ts","names":[],"sources":["../../src/bin/node-runner.ts"],"mappings":";;;iBAOsB,cAAA;;;;;iBAKL;EALK,OAAA,EAAA,OAAA,EAAc;EAAA,OAAA,CAAA,EAOxB,cAPwB,CAAA,SAAA,CAAA;IAQnC,OAPC,CAAA,GAAA,GAOD,OAPC,CAAA,IAAA,CAAA,CAAA;AACA,iBA6BoB,kBAAA,CA7BpB,OAAA,CAAA,EAAA,MAAA,EAAA,CAAA,EA6B4D,OA7B5D,CAAA,IAAA,CAAA"}
@@ -0,0 +1,40 @@
1
+ import { n as launcher } from "../launcher-CASrMAOa.js";
2
+ //#region src/bin/node-runner.ts
3
+ function resolveModulesPaths(baseUrl, ...refs) {
4
+ return refs.map((ref) => new URL(ref, baseUrl).pathname);
5
+ }
6
+ async function startProcesses({ onExit, modules, context }) {
7
+ const processDefs = [];
8
+ for (const mod of modules) {
9
+ const imported = typeof mod === "string" || mod instanceof URL ? await import(String(mod)) : mod;
10
+ if (imported && typeof imported === "object") processDefs.push(imported);
11
+ }
12
+ if (onExit) processDefs.push({
13
+ name: "Exit",
14
+ config: { key: "Exit" },
15
+ handlers: [() => onExit]
16
+ });
17
+ return await launcher({
18
+ processes: processDefs,
19
+ context
20
+ });
21
+ }
22
+ async function startNodeProcesses(modules) {
23
+ try {
24
+ if (!modules) modules = process.argv.slice(2);
25
+ const terminate = await startProcesses({
26
+ modules: resolveModulesPaths(`file://${process.cwd()}/`, ...modules),
27
+ onExit: () => process.exit(0)
28
+ });
29
+ process.on("SIGINT", terminate);
30
+ process.on("SIGTERM", terminate);
31
+ process.stdin.resume();
32
+ } catch (err) {
33
+ console.error("Fatal error:", err);
34
+ process.exit(1);
35
+ }
36
+ }
37
+ //#endregion
38
+ export { startNodeProcesses as default, startNodeProcesses, startProcesses };
39
+
40
+ //# sourceMappingURL=node-runner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"node-runner.js","names":[],"sources":["../../src/bin/node-runner.ts"],"sourcesContent":["import type { LauncherConfig, ProcessDef } from \"../orchestrator/launcher.ts\";\nimport { launcher } from \"../orchestrator/launcher.ts\";\n\nfunction resolveModulesPaths(baseUrl: string, ...refs: string[]): string[] {\n return refs.map((ref) => new URL(ref, baseUrl).pathname);\n}\n\nexport async function startProcesses({\n onExit,\n modules,\n context,\n}: {\n onExit?: () => Promise<void> | void;\n modules: unknown[];\n context?: LauncherConfig[\"context\"];\n}) {\n const processDefs: ProcessDef[] = [];\n for (const mod of modules) {\n const imported =\n typeof mod === \"string\" || mod instanceof URL\n ? await import(String(mod))\n : mod;\n if (imported && typeof imported === \"object\") {\n processDefs.push(imported as ProcessDef);\n }\n }\n\n if (onExit) {\n processDefs.push({\n name: \"Exit\",\n config: { key: \"Exit\" },\n handlers: [() => onExit],\n });\n }\n\n return await launcher({ processes: processDefs, context });\n}\n\nexport async function startNodeProcesses(modules?: string[]): Promise<void> {\n try {\n if (!modules) {\n modules = process.argv.slice(2);\n }\n const terminate = await startProcesses({\n modules: resolveModulesPaths(`file://${process.cwd()}/`, ...modules),\n onExit: () => process.exit(0),\n });\n process.on(\"SIGINT\", terminate);\n process.on(\"SIGTERM\", terminate);\n process.stdin.resume();\n } catch (err) {\n console.error(\"Fatal error:\", err);\n process.exit(1);\n }\n}\n\nexport default startNodeProcesses;\n"],"mappings":";;AAGA,SAAS,oBAAoB,SAAiB,GAAG,MAA0B;AACzE,QAAO,KAAK,KAAK,QAAQ,IAAI,IAAI,KAAK,QAAQ,CAAC,SAAS;;AAG1D,eAAsB,eAAe,EACnC,QACA,SACA,WAKC;CACD,MAAM,cAA4B,EAAE;AACpC,MAAK,MAAM,OAAO,SAAS;EACzB,MAAM,WACJ,OAAO,QAAQ,YAAY,eAAe,MACtC,MAAM,OAAO,OAAO,IAAI,IACxB;AACN,MAAI,YAAY,OAAO,aAAa,SAClC,aAAY,KAAK,SAAuB;;AAI5C,KAAI,OACF,aAAY,KAAK;EACf,MAAM;EACN,QAAQ,EAAE,KAAK,QAAQ;EACvB,UAAU,OAAO,OAAO;EACzB,CAAC;AAGJ,QAAO,MAAM,SAAS;EAAE,WAAW;EAAa;EAAS,CAAC;;AAG5D,eAAsB,mBAAmB,SAAmC;AAC1E,KAAI;AACF,MAAI,CAAC,QACH,WAAU,QAAQ,KAAK,MAAM,EAAE;EAEjC,MAAM,YAAY,MAAM,eAAe;GACrC,SAAS,oBAAoB,UAAU,QAAQ,KAAK,CAAC,IAAI,GAAG,QAAQ;GACpE,cAAc,QAAQ,KAAK,EAAE;GAC9B,CAAC;AACF,UAAQ,GAAG,UAAU,UAAU;AAC/B,UAAQ,GAAG,WAAW,UAAU;AAChC,UAAQ,MAAM,QAAQ;UACf,KAAK;AACZ,UAAQ,MAAM,gBAAgB,IAAI;AAClC,UAAQ,KAAK,EAAE"}
@@ -0,0 +1,129 @@
1
+ import { a as HandlerRegistry, c as toStageHandlers, d as FsmEventKey, f as FsmStateConfig, g as STATE_INITIAL, h as STATE_FINAL, i as launcher, l as EVENT_ANY, m as STATE_ANY, n as LauncherConfig, o as StageHandler, p as FsmStateKey, r as ProcessDef, s as createHandlerRegistry, t as KEY_LAUNCH_PROCESS, u as EVENT_EMPTY } from "./launcher-6VUDviTj.js";
2
+
3
+ //#region src/core/fsm-base-class.d.ts
4
+ type Handler<P extends unknown[] = unknown[], R = unknown> = (...args: P) => R;
5
+ declare class FsmBaseClass {
6
+ handlers: Record<string, Handler[]>;
7
+ protected _addHandler<T>(type: string, handler: T, direct?: boolean): () => void;
8
+ protected _removeHandler<T>(type: string, handler: T): void;
9
+ _runHandler(type: string, ...args: unknown[]): Promise<void>;
10
+ _handleError(error: Error | unknown): Promise<void>;
11
+ }
12
+ declare function bindMethods<T>(obj: T, ...methods: (string | symbol)[]): T;
13
+ //#endregion
14
+ //#region src/core/fsm-state-descriptor.d.ts
15
+ declare class FsmStateDescriptor {
16
+ transitions: Record<string, Record<string, string>>;
17
+ states: Record<string, FsmStateDescriptor>;
18
+ static build(config: FsmStateConfig): FsmStateDescriptor;
19
+ getTargetStateKey(stateKey: string, eventKey: string): string;
20
+ }
21
+ //# sourceMappingURL=fsm-state-descriptor.d.ts.map
22
+ //#endregion
23
+ //#region src/core/fsm-state.d.ts
24
+ type FsmStateDump = Record<string, unknown> & {
25
+ key: string;
26
+ data: Record<string, unknown>;
27
+ };
28
+ type FsmStateHandler = (state: FsmState, ...args: unknown[]) => void | Promise<void>;
29
+ type FsmStateDumpHandler = (state: FsmState, dump: FsmStateDump) => void | Promise<void>;
30
+ type FsmStateErrorHandler = (state: FsmState, error: unknown) => void | Promise<void>;
31
+ declare class FsmState extends FsmBaseClass {
32
+ process: FsmProcess;
33
+ key: string;
34
+ parent?: FsmState;
35
+ descriptor?: FsmStateDescriptor;
36
+ constructor(process: FsmProcess, parent: FsmState | undefined, key: string, descriptor?: FsmStateDescriptor);
37
+ onEnter(handler: FsmStateHandler): () => void;
38
+ onExit(handler: FsmStateHandler): () => void;
39
+ onStateError(handler: FsmStateErrorHandler): () => void;
40
+ dump(handler: FsmStateDumpHandler): () => void;
41
+ restore(handler: FsmStateDumpHandler): () => void;
42
+ _handleError(error: Error | unknown): Promise<void>;
43
+ }
44
+ //# sourceMappingURL=fsm-state.d.ts.map
45
+ //#endregion
46
+ //#region src/core/fsm-process.d.ts
47
+ declare const STATUS_NONE = 0;
48
+ declare const STATUS_FIRST = 1;
49
+ declare const STATUS_NEXT = 2;
50
+ declare const STATUS_LEAF = 4;
51
+ declare const STATUS_LAST = 8;
52
+ declare const STATUS_FINISHED = 16;
53
+ declare const STATUS_ENTER: number;
54
+ declare const STATUS_EXIT: number;
55
+ type FsmProcessHandler = (process: FsmProcess, ...args: unknown[]) => void | Promise<void>;
56
+ type FsmProcessDump = Record<string, unknown> & {
57
+ status: number;
58
+ event?: string;
59
+ stack: FsmStateDump[];
60
+ };
61
+ type FsmProcessDumpHandler = (process: FsmProcess, dump: FsmProcessDump) => void | Promise<void>;
62
+ declare class FsmProcess extends FsmBaseClass {
63
+ state?: FsmState;
64
+ event?: string;
65
+ nextEvent?: string;
66
+ running: boolean;
67
+ mask: number;
68
+ status: number;
69
+ config: FsmStateConfig;
70
+ rootDescriptor: FsmStateDescriptor;
71
+ constructor(config: FsmStateConfig);
72
+ shutdown(event?: string): Promise<void>;
73
+ dispatch(event: string): Promise<boolean>;
74
+ dump(...args: unknown[]): Promise<FsmProcessDump>;
75
+ restore(dump: FsmProcessDump, ...args: unknown[]): Promise<this>;
76
+ onStateCreate(handler: FsmStateHandler): () => void;
77
+ onStateError(handler: (state: FsmState, error: unknown) => void | Promise<void>): () => void;
78
+ _handleStateError(state: FsmState, error: Error | unknown): Promise<void>;
79
+ _newState(parent: FsmState | undefined, key: string, descriptor: FsmStateDescriptor | undefined): Promise<FsmState>;
80
+ _getSubstate(parent: FsmState | undefined, prevStateKey: string | undefined): Promise<FsmState | undefined>;
81
+ _newSubstate(parent: FsmState | undefined, toState: string): Promise<FsmState>;
82
+ _update(): Promise<boolean>;
83
+ }
84
+ //# sourceMappingURL=fsm-process.d.ts.map
85
+ //#endregion
86
+ //#region src/orchestrator/start-process.d.ts
87
+ interface ProcessHandle {
88
+ shutdown(): Promise<void>;
89
+ dump(...args: unknown[]): Promise<FsmProcessDump>;
90
+ restore(dump: FsmProcessDump, ...args: unknown[]): Promise<void>;
91
+ }
92
+ declare const KEY_DISPATCH = "fsm:dispatch";
93
+ declare const KEY_TERMINATE = "fsm:terminate";
94
+ declare const KEY_STATES = "fsm:states";
95
+ declare const KEY_EVENT = "fsm:event";
96
+ declare function getStateTransitions(state?: FsmState): [from: string, event: string, to: string][];
97
+ declare function isStateTransitionEnabled(process: FsmProcess, event: string): boolean;
98
+ declare function startProcess<C = unknown>(context: C, config: FsmStateConfig, load: (state: string, event: string | undefined) => StageHandler<C>[] | Promise<StageHandler<C>[]>, startEvent?: string): Promise<ProcessHandle>;
99
+ /** @deprecated Use `startProcess` instead */
100
+ declare const startFsmProcess: typeof startProcess;
101
+ //# sourceMappingURL=start-process.d.ts.map
102
+ //#endregion
103
+ //#region src/utils/printer.d.ts
104
+ type Printer = (...args: unknown[]) => void;
105
+ type PrinterConfig = {
106
+ prefix?: string;
107
+ print?: (...args: unknown[]) => void;
108
+ lineNumbers?: boolean;
109
+ };
110
+ declare function preparePrinter(process: FsmProcess, {
111
+ prefix,
112
+ print,
113
+ lineNumbers
114
+ }: PrinterConfig): Printer;
115
+ declare function setProcessPrinter(process: FsmProcess, config?: PrinterConfig): void;
116
+ declare function getProcessPrinter(process: FsmProcess): Printer;
117
+ declare function getPrinter(state: {
118
+ process: FsmProcess;
119
+ }): Printer;
120
+ //# sourceMappingURL=printer.d.ts.map
121
+ //#endregion
122
+ //#region src/utils/tracer.d.ts
123
+ declare function setProcessTracer(process: FsmProcess, print?: Printer): () => void;
124
+ declare function setStateTracer(state: FsmState, print?: Printer): void;
125
+ //# sourceMappingURL=tracer.d.ts.map
126
+
127
+ //#endregion
128
+ export { EVENT_ANY, EVENT_EMPTY, FsmBaseClass, FsmEventKey, FsmProcess, FsmProcessDump, FsmProcessDumpHandler, FsmProcessHandler, FsmState, FsmStateConfig, FsmStateDescriptor, FsmStateDump, FsmStateDumpHandler, FsmStateErrorHandler, FsmStateHandler, FsmStateKey, HandlerRegistry, KEY_DISPATCH, KEY_EVENT, KEY_LAUNCH_PROCESS, KEY_STATES, KEY_TERMINATE, LauncherConfig, Printer, PrinterConfig, ProcessDef, ProcessHandle, STATE_ANY, STATE_FINAL, STATE_INITIAL, STATUS_ENTER, STATUS_EXIT, STATUS_FINISHED, STATUS_FIRST, STATUS_LAST, STATUS_LEAF, STATUS_NEXT, STATUS_NONE, StageHandler, bindMethods, createHandlerRegistry, getPrinter, getProcessPrinter, getStateTransitions, isStateTransitionEnabled, launcher, preparePrinter, setProcessPrinter, setProcessTracer, setStateTracer, startFsmProcess, startProcess, toStageHandlers };
129
+ //# sourceMappingURL=index-vTjnkbGW.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-vTjnkbGW.d.ts","names":[],"sources":["../src/core/fsm-base-class.ts","../src/core/fsm-state-descriptor.ts","../src/core/fsm-state.ts","../src/core/fsm-process.ts","../src/orchestrator/start-process.ts","../src/utils/printer.ts","../src/utils/tracer.ts"],"mappings":"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"}