@statewalker/fsm 0.34.0 → 0.36.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/bin/cli.js ADDED
@@ -0,0 +1,5 @@
1
+ #!/usr/bin/env node
2
+
3
+ import startNodeProcesses from "../dist/index.js";
4
+
5
+ startNodeProcesses();
package/dist/index.d.ts CHANGED
@@ -307,4 +307,29 @@ declare function startProcesses({ onExit, modules, init, }: {
307
307
  init?: (context: Record<string, unknown>) => Promise<Record<string, unknown>> | Record<string, unknown>;
308
308
  }): Promise<() => Promise<void>>;
309
309
 
310
- export { EVENT_ANY, EVENT_EMPTY, type FsmEventKey, FsmProcess, type FsmProcessDump, type FsmProcessDumpHandler, type FsmProcessHandler, FsmState, type FsmStateConfig, FsmStateDescriptor, type FsmStateDump, type FsmStateDumpHandler, type FsmStateErrorHandler, type FsmStateHandler, type FsmStateKey, type IProcessConfigManager, KEY_DISPATCH, KEY_EVENT, KEY_LAUNCH_PROCESS, KEY_REGISTER_CONFIG, KEY_REGISTER_HANDLERS, KEY_STATES, KEY_TERMINATE, type Module, type ProcessConfig, ProcessConfigManager, STATE_ANY, STATE_FINAL, STATE_INITIAL, STATUS_ENTER, STATUS_EXIT, STATUS_FINISHED, STATUS_FIRST, STATUS_LAST, STATUS_LEAF, STATUS_NEXT, STATUS_NONE, type StageHandler, startNodeProcesses as default, launcher, newFsmProcess, resolveModulesPaths, resolveModulesUrls, startFsmProcess, startNodeProcesses, startProcesses, toStageHandlers };
310
+ type Printer = (...args: unknown[]) => void;
311
+ type PrinterConfig = {
312
+ prefix?: string;
313
+ print?: (...args: unknown[]) => void;
314
+ lineNumbers?: boolean;
315
+ };
316
+ declare const KEY_PRINTER = "printer";
317
+ declare function preparePrinter(process: FsmProcess, { prefix, print, lineNumbers }: PrinterConfig): Printer;
318
+ declare function setPrinter(state: FsmState, config?: PrinterConfig): void;
319
+ declare function setProcessPrinter(process: FsmProcess, config?: PrinterConfig): void;
320
+ declare function getProcessPrinter(process: FsmProcess): Printer;
321
+ declare function getPrinter(state: FsmState): Printer;
322
+
323
+ declare function newProcess(config: FsmStateConfig, { prefix, print, lineNumbers, }: {
324
+ prefix?: string;
325
+ print?: (...args: any[]) => void;
326
+ lineNumbers?: boolean;
327
+ }): FsmProcess;
328
+
329
+ declare function setProcessTracer(process: FsmProcess, print?: Printer): () => void;
330
+ declare function setStateTracer(state: FsmState, print?: Printer): void;
331
+
332
+ declare function isStateTransitionEnabled(process: FsmProcess, event: string): boolean;
333
+ declare function getStateTransitions(state?: FsmState): [from: string, event: string, to: string][];
334
+
335
+ export { EVENT_ANY, EVENT_EMPTY, type FsmEventKey, FsmProcess, type FsmProcessDump, type FsmProcessDumpHandler, type FsmProcessHandler, FsmState, type FsmStateConfig, FsmStateDescriptor, type FsmStateDump, type FsmStateDumpHandler, type FsmStateErrorHandler, type FsmStateHandler, type FsmStateKey, type IProcessConfigManager, KEY_DISPATCH, KEY_EVENT, KEY_LAUNCH_PROCESS, KEY_PRINTER, KEY_REGISTER_CONFIG, KEY_REGISTER_HANDLERS, KEY_STATES, KEY_TERMINATE, type Module, type Printer, type PrinterConfig, type ProcessConfig, ProcessConfigManager, STATE_ANY, STATE_FINAL, STATE_INITIAL, STATUS_ENTER, STATUS_EXIT, STATUS_FINISHED, STATUS_FIRST, STATUS_LAST, STATUS_LEAF, STATUS_NEXT, STATUS_NONE, type StageHandler, startNodeProcesses as default, getPrinter, getProcessPrinter, getStateTransitions, isStateTransitionEnabled, launcher, newFsmProcess, newProcess, preparePrinter, resolveModulesPaths, resolveModulesUrls, setPrinter, setProcessPrinter, setProcessTracer, setStateTracer, startFsmProcess, startNodeProcesses, startProcesses, toStageHandlers };
package/dist/index.js CHANGED
@@ -485,6 +485,71 @@ var ProcessConfigManager = class {
485
485
  }
486
486
  };
487
487
 
488
+ // src/utils/printer.ts
489
+ var KEY_PRINTER = "printer";
490
+ function preparePrinter(process2, { prefix = "", print = console.log, lineNumbers = false }) {
491
+ let lineCounter = 0;
492
+ const shift = () => {
493
+ let prefix2 = "";
494
+ for (let s = process2.state?.parent; s; s = s.parent) {
495
+ prefix2 += " ";
496
+ }
497
+ return prefix2;
498
+ };
499
+ const getPrefix = lineNumbers ? () => `[${++lineCounter}]${shift()}` : shift;
500
+ const printer = (...args) => print(prefix, getPrefix(), ...args);
501
+ return printer;
502
+ }
503
+ function setPrinter(state, config = {}) {
504
+ const printer = preparePrinter(state.process, config);
505
+ state.setData(KEY_PRINTER, printer);
506
+ }
507
+ function setProcessPrinter(process2, config = {}) {
508
+ const printer = preparePrinter(process2, config);
509
+ process2.setData(KEY_PRINTER, printer);
510
+ }
511
+ function getProcessPrinter(process2) {
512
+ return process2.getData(KEY_PRINTER) || console.log;
513
+ }
514
+ function getPrinter(state) {
515
+ return state.getData(KEY_PRINTER, true) || getProcessPrinter(state.process);
516
+ }
517
+
518
+ // src/utils/tracer.ts
519
+ function setProcessTracer(process2, print) {
520
+ return process2.onStateCreate((state) => {
521
+ setStateTracer(state, print);
522
+ });
523
+ }
524
+ function setStateTracer(state, print) {
525
+ state.onEnter(() => {
526
+ const printLine = print || getPrinter(state);
527
+ printLine(`<${state?.key} event="${state.process.event}">`);
528
+ });
529
+ state.onExit(async () => {
530
+ await Promise.resolve().then(async () => {
531
+ const printLine = print || getPrinter(state);
532
+ printLine(`</${state.key}> <!-- event="${state.process.event}" -->`);
533
+ });
534
+ });
535
+ }
536
+
537
+ // src/utils/process.ts
538
+ function newProcess(config, {
539
+ prefix,
540
+ print,
541
+ lineNumbers = true
542
+ }) {
543
+ const process2 = new FsmProcess(config);
544
+ setProcessPrinter(process2, {
545
+ prefix,
546
+ print,
547
+ lineNumbers
548
+ });
549
+ setProcessTracer(process2);
550
+ return process2;
551
+ }
552
+
488
553
  // src/orchestrator/is-generator.ts
489
554
  function isGenerator(value) {
490
555
  return typeof value === "object" && value !== null && "next" in value && typeof value.next === "function";
@@ -615,14 +680,20 @@ async function launcher(options) {
615
680
  return v;
616
681
  }
617
682
  );
683
+ const processesToStart = {};
618
684
  for (const process2 of processes) {
685
+ const processName = process2.name;
686
+ const start = process2.start;
687
+ if (start === void 0) {
688
+ if (!(processName in processesToStart)) {
689
+ processesToStart[processName] = void 0;
690
+ }
691
+ } else {
692
+ processesToStart[processName] = start;
693
+ }
619
694
  registerProcess(configsManager, process2);
620
695
  }
621
696
  const shutdowns = [];
622
- let startProcesses2 = asArray(config.start);
623
- if (startProcesses2.length === 0) {
624
- startProcesses2 = processes.map((p) => p.name).filter(Boolean);
625
- }
626
697
  let initContext = (context) => context;
627
698
  const configContext = config.context ?? config.init;
628
699
  if (configContext) {
@@ -634,7 +705,8 @@ async function launcher(options) {
634
705
  throw new Error("Invalid launcher configuration: context");
635
706
  }
636
707
  }
637
- for (const processName of startProcesses2) {
708
+ for (const [processName, start] of Object.entries(processesToStart)) {
709
+ if (start === false) continue;
638
710
  let context = {
639
711
  parent: rootContext,
640
712
  "fsm:name": processName
@@ -709,6 +781,6 @@ async function startNodeProcesses(modules) {
709
781
  // src/index.ts
710
782
  var index_default = startNodeProcesses;
711
783
 
712
- export { EVENT_ANY, EVENT_EMPTY, FsmProcess, FsmState, FsmStateDescriptor, KEY_DISPATCH, KEY_EVENT, KEY_LAUNCH_PROCESS, KEY_REGISTER_CONFIG, KEY_REGISTER_HANDLERS, KEY_STATES, KEY_TERMINATE, ProcessConfigManager, STATE_ANY, STATE_FINAL, STATE_INITIAL, STATUS_ENTER, STATUS_EXIT, STATUS_FINISHED, STATUS_FIRST, STATUS_LAST, STATUS_LEAF, STATUS_NEXT, STATUS_NONE, index_default as default, launcher, newFsmProcess, resolveModulesPaths, resolveModulesUrls, startFsmProcess, startNodeProcesses, startProcesses, toStageHandlers };
784
+ export { EVENT_ANY, EVENT_EMPTY, FsmProcess, FsmState, FsmStateDescriptor, KEY_DISPATCH, KEY_EVENT, KEY_LAUNCH_PROCESS, KEY_PRINTER, KEY_REGISTER_CONFIG, KEY_REGISTER_HANDLERS, KEY_STATES, KEY_TERMINATE, ProcessConfigManager, STATE_ANY, STATE_FINAL, STATE_INITIAL, STATUS_ENTER, STATUS_EXIT, STATUS_FINISHED, STATUS_FIRST, STATUS_LAST, STATUS_LEAF, STATUS_NEXT, STATUS_NONE, index_default as default, getPrinter, getProcessPrinter, getStateTransitions, isStateTransitionEnabled, launcher, newFsmProcess, newProcess, preparePrinter, resolveModulesPaths, resolveModulesUrls, setPrinter, setProcessPrinter, setProcessTracer, setStateTracer, startFsmProcess, startNodeProcesses, startProcesses, toStageHandlers };
713
785
  //# sourceMappingURL=index.js.map
714
786
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/core/fsm-base-class.ts","../src/core/fsm-state.ts","../src/core/fsm-state-config.ts","../src/core/fsm-state-descriptor.ts","../src/core/fsm-process.ts","../src/utils/transitions.ts","../src/core/new-fsm-process.ts","../src/orchestrator/constants.ts","../src/orchestrator/types.ts","../src/orchestrator/process-config-manager.ts","../src/orchestrator/is-generator.ts","../src/orchestrator/start-process.ts","../src/orchestrator/launcher.ts","../src/orchestrator/resolve-module-refs.ts","../src/orchestrator/start-processes.ts","../src/orchestrator/start-node-processes.ts","../src/index.ts"],"names":["process","stateKey","eventKey","isGenerator","value","config","configsManager","startProcesses"],"mappings":"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","file":"index.js","sourcesContent":["type Handler<P extends unknown[] = unknown[], R = unknown> = (...args: P) => R; // Function;\n// type Handler = Function;\n\nexport class FsmBaseClass {\n handlers: Record<string, Handler[]> = {};\n data: Record<string, unknown> = {};\n constructor() {\n bindMethods(this, \"setData\", \"getData\");\n }\n setData<T>(key: string, value: T) {\n this.data[key] = value;\n return this;\n }\n getData<T>(key: string): T | undefined {\n return this.data[key] as T;\n }\n\n // ----------------------------------------------\n // internal methods\n protected _addHandler<T>(type: string, handler: T, direct: boolean = true) {\n let list = this.handlers[type];\n if (!list) {\n list = this.handlers[type] = [];\n }\n const h = handler as Handler;\n direct ? list.push(h) : list.unshift(h);\n return () => this._removeHandler(type, h);\n }\n\n protected _removeHandler<T>(type: string, handler: T) {\n let list = this.handlers[type];\n if (!list) return;\n list = list.filter((h) => h !== handler);\n if (list.length > 0) {\n this.handlers[type] = list;\n } else {\n delete this.handlers[type];\n }\n }\n\n async _runHandlerParallel(type: string, ...args: unknown[]) {\n const list = this.handlers[type] || [];\n await Promise.all(\n list.map(async (handler) => {\n try {\n await handler(...args);\n } catch (error) {\n this._handleError(error);\n }\n }),\n );\n }\n\n async _runHandler(type: string, ...args: unknown[]) {\n const list = this.handlers[type] || [];\n for (const handler of list) {\n try {\n await handler(...args);\n } catch (error) {\n await this._handleError(error);\n }\n }\n }\n\n async _handleError(error: Error | unknown) {\n console.error(error);\n }\n}\n\nexport function bindMethods<T>(obj: T, ...methods: (string | symbol)[]) {\n const o = obj as Record<string | symbol, unknown>;\n for (const methodName of methods) {\n const method = o[methodName];\n if (typeof method !== \"function\") continue;\n o[methodName] = method.bind(o);\n }\n return obj;\n}\n","import { bindMethods, FsmBaseClass } from \"./fsm-base-class.ts\";\nimport type { FsmProcess } from \"./fsm-process.ts\";\nimport type { FsmStateDescriptor } from \"./fsm-state-descriptor.ts\";\n\nexport type FsmStateDump = Record<string, unknown> & {\n key: string;\n data: Record<string, unknown>;\n};\nexport type FsmStateHandler = (\n state: FsmState,\n ...args: unknown[]\n) => void | Promise<void>;\n\nexport type FsmStateDumpHandler = (\n state: FsmState,\n dump: FsmStateDump,\n) => void | Promise<void>;\n\nexport type FsmStateErrorHandler = (\n state: FsmState,\n error: unknown,\n) => void | Promise<void>;\n\nexport class FsmState extends FsmBaseClass {\n process: FsmProcess;\n key: string;\n parent?: FsmState;\n descriptor?: FsmStateDescriptor;\n\n constructor(\n process: FsmProcess,\n parent: FsmState | undefined,\n key: string,\n descriptor?: FsmStateDescriptor,\n ) {\n super();\n this.process = process;\n this.key = key;\n this.parent = parent;\n this.descriptor = descriptor;\n bindMethods(\n this,\n \"onEnter\",\n \"onExit\",\n \"dump\",\n \"restore\",\n \"useData\",\n \"onStateError\",\n );\n }\n\n onEnter(handler: FsmStateHandler) {\n return this._addHandler(\"onEnter\", handler, true);\n }\n onExit(handler: FsmStateHandler) {\n return this._addHandler(\"onExit\", handler, false);\n }\n onStateError(handler: FsmStateErrorHandler) {\n return this._addHandler(\"onStateError\", handler);\n }\n dump(handler: FsmStateDumpHandler) {\n return this._addHandler(\"dump\", handler, true);\n }\n restore(handler: FsmStateDumpHandler) {\n return this._addHandler(\"restore\", handler, true);\n }\n getData<T>(key: string, recursive: boolean = true): T | undefined {\n return (\n (this.data[key] as T) ??\n (recursive ? this.parent?.getData<T>(key, recursive) : undefined)\n );\n }\n useData<T>(key: string) {\n return [\n (recursive: boolean = true) => this.getData<T>(key, recursive),\n (value: T) => this.setData(key, value),\n ];\n }\n\n async _handleError(error: Error | unknown) {\n await this._runHandler(\"onStateError\", this, error);\n await this.process._handleStateError(this, error);\n }\n}\n","export const STATE_ANY = \"*\";\nexport const STATE_INITIAL = \"\";\nexport const STATE_FINAL = \"\";\nexport const EVENT_ANY = \"*\";\nexport const EVENT_EMPTY = \"\";\n\nexport type FsmStateKey = string;\nexport type FsmEventKey = string;\nexport type FsmStateConfig = {\n key: FsmStateKey;\n transitions?: [from: FsmStateKey, event: FsmEventKey, to: FsmStateKey][];\n states?: FsmStateConfig[];\n} & Record<string, unknown>;\n","import {\n EVENT_ANY,\n type FsmStateConfig,\n STATE_ANY,\n STATE_FINAL,\n} from \"./fsm-state-config.ts\";\n\nexport class FsmStateDescriptor {\n transitions: Record<string, Record<string, string>> = {};\n states: Record<string, FsmStateDescriptor> = {};\n\n static build(config: FsmStateConfig) {\n const descriptor = new FsmStateDescriptor();\n for (const [from, event, to] of config.transitions || []) {\n let index = descriptor.transitions[from];\n if (!index) {\n index = descriptor.transitions[from] = {};\n }\n index[event] = to;\n }\n if (config.states) {\n for (const substateConfig of config.states) {\n descriptor.states[substateConfig.key] =\n FsmStateDescriptor.build(substateConfig);\n }\n }\n return descriptor;\n }\n\n getTargetStateKey(stateKey: string, eventKey: string) {\n const pairs = [\n [stateKey, eventKey],\n [STATE_ANY, eventKey],\n [stateKey, EVENT_ANY],\n [STATE_ANY, EVENT_ANY],\n ];\n let targetKey: string | undefined;\n for (\n let i = 0, len = pairs.length;\n targetKey === undefined && i < len;\n i++\n ) {\n const [stateKey, eventKey] = pairs[i];\n const stateTransitions = this.transitions[stateKey];\n if (!stateTransitions) continue;\n targetKey = stateTransitions[eventKey];\n }\n return targetKey !== undefined ? targetKey : STATE_FINAL;\n }\n}\n","import { bindMethods, FsmBaseClass } from \"./fsm-base-class.ts\";\nimport {\n FsmState,\n type FsmStateDump,\n type FsmStateHandler,\n} from \"./fsm-state.ts\";\nimport {\n EVENT_EMPTY,\n type FsmStateConfig,\n STATE_FINAL,\n STATE_INITIAL,\n} from \"./fsm-state-config.ts\";\nimport { FsmStateDescriptor } from \"./fsm-state-descriptor.ts\";\n\nexport const STATUS_NONE = 0;\nexport const STATUS_FIRST = 1;\nexport const STATUS_NEXT = 2;\nexport const STATUS_LEAF = 4;\nexport const STATUS_LAST = 8;\nexport const STATUS_FINISHED = 16;\n\n//\nexport const STATUS_ENTER = STATUS_FIRST | STATUS_NEXT;\nexport const STATUS_EXIT = STATUS_LEAF | STATUS_LAST;\n\nexport type FsmProcessHandler = (\n process: FsmProcess,\n ...args: unknown[]\n) => void | Promise<void>;\n\nexport type FsmProcessDump = Record<string, unknown> & {\n status: number;\n event?: string;\n stack: FsmStateDump[];\n};\n\nexport type FsmProcessDumpHandler = (\n process: FsmProcess,\n dump: FsmProcessDump,\n) => void | Promise<void>;\n\nexport class FsmProcess extends FsmBaseClass {\n state?: FsmState;\n event?: string;\n nextEvent?: string;\n running: boolean = false;\n mask: number = STATUS_LEAF;\n status: number = 0;\n config: FsmStateConfig;\n rootDescriptor: FsmStateDescriptor;\n\n constructor(config: FsmStateConfig) {\n super();\n this.rootDescriptor = FsmStateDescriptor.build(config);\n this.config = config;\n bindMethods(this, \"dispatch\", \"dump\", \"restore\");\n }\n\n async shutdown(event?: string) {\n while (this.state) {\n this.event = event;\n this.status = STATUS_FINISHED;\n await this.state?._runHandler(\"onExit\", this.state);\n this.state = this.state.parent;\n }\n }\n\n async dispatch(event: string): Promise<boolean> {\n this.nextEvent = event;\n if (!this.running && !(this.status & STATUS_FINISHED)) {\n this.running = true;\n try {\n this.event = this.nextEvent;\n this.nextEvent = undefined;\n while (true) {\n // ---\n if (this.status & STATUS_EXIT) {\n await this.state?._runHandler(\"onExit\", this.state);\n }\n if (!this._update()) break;\n if (this.status & STATUS_ENTER) {\n await this.state?._runHandler(\"onEnter\", this.state);\n }\n if (this.status & this.mask) break;\n // ---\n }\n } finally {\n this.running = false;\n }\n const nextEvent = this.nextEvent;\n if (nextEvent !== undefined) {\n return Promise.resolve().then(() => this.dispatch(nextEvent));\n }\n }\n return !(this.status & STATUS_FINISHED);\n }\n\n async dump(...args: unknown[]): Promise<FsmProcessDump> {\n const dumpState = async (state: FsmState) => {\n const stateDump: FsmStateDump = {\n key: state.key,\n data: {},\n };\n await state._runHandler(\"dump\", state, stateDump.data, ...args);\n return stateDump;\n };\n const dumpStates = async (\n state: FsmState | undefined,\n stack: FsmStateDump[] = [],\n ) => {\n if (!state) return stack;\n state.parent && (await dumpStates(state.parent, stack));\n stack.push(await dumpState(state));\n return stack;\n };\n const dump: FsmProcessDump = {\n status: this.status,\n event: this.event,\n stack: await dumpStates(this.state),\n };\n return dump;\n }\n\n async restore(dump: FsmProcessDump, ...args: unknown[]) {\n this.status = dump.status || 0;\n this.event = dump.event;\n this.state = undefined;\n for (let i = 0; i < dump.stack.length; i++) {\n const stateDump = dump.stack[i];\n this.state = this.state\n ? this._newSubstate(this.state, stateDump.key)\n : this._newState(undefined, stateDump.key, this.rootDescriptor);\n await this.state._runHandler(\n \"restore\",\n this.state,\n stateDump.data,\n ...args,\n );\n }\n return this;\n }\n\n onStateCreate(handler: FsmStateHandler) {\n return this._addHandler(\"onStateCreate\", handler, true);\n }\n\n onStateError(\n handler: (state: FsmState, error: unknown) => void | Promise<void>,\n ) {\n return this._addHandler(\"onStateError\", handler);\n }\n\n async _handleStateError(state: FsmState, error: Error | unknown) {\n await this._runHandler(\"onStateError\", state, error);\n this._handleError(error);\n }\n\n _newState(\n parent: FsmState | undefined,\n key: string,\n descriptor: FsmStateDescriptor | undefined,\n ) {\n const state = new FsmState(this, parent, key, descriptor);\n this._runHandlerParallel(\"onStateCreate\", state);\n return state;\n }\n\n _getSubstate(parent: FsmState | undefined, prevStateKey: string | undefined) {\n if (!parent) return;\n const toState =\n parent.descriptor?.getTargetStateKey(\n prevStateKey || STATE_INITIAL,\n this.event || EVENT_EMPTY,\n ) || STATE_FINAL;\n if (!toState) return;\n return this._newSubstate(parent, toState);\n }\n\n _newSubstate(parent: FsmState | undefined, toState: string) {\n let descriptor: FsmStateDescriptor | undefined;\n for (\n let state: FsmState | undefined = parent;\n !descriptor && state;\n state = state.parent\n ) {\n descriptor = state.descriptor?.states[toState];\n }\n return this._newState(parent, toState, descriptor);\n }\n\n _update() {\n if (this.status & STATUS_FINISHED) return false;\n const nextState =\n this.status !== STATUS_NONE\n ? this.status & STATUS_ENTER\n ? this._getSubstate(this.state, STATE_INITIAL)\n : this._getSubstate(this.state?.parent, this.state?.key)\n : this._newState(undefined, this.config.key, this.rootDescriptor);\n if (nextState !== undefined) {\n this.state = nextState;\n this.status = this.status & STATUS_EXIT ? STATUS_NEXT : STATUS_FIRST;\n } else {\n if (this.status & STATUS_EXIT) {\n this.state = this.state?.parent;\n this.status = STATUS_LAST;\n } else {\n this.status = STATUS_LEAF;\n }\n if (!this.state) this.status = STATUS_FINISHED;\n }\n return !(this.status & STATUS_FINISHED);\n }\n}\n","import type { FsmProcess } from \"../core/fsm-process.ts\";\nimport type { FsmState } from \"../core/fsm-state.ts\";\nimport type { FsmStateDescriptor } from \"../core/fsm-state-descriptor.ts\";\n\nexport function isStateTransitionEnabled(process: FsmProcess, event: string) {\n const transitions = getStateTransitions(process.state);\n let active = false;\n for (const [from, ev, to] of transitions) {\n if (ev === event) {\n active = true;\n break;\n }\n }\n return active;\n}\n\nexport function getStateTransitions(\n state?: FsmState,\n): [from: string, event: string, to: string][] {\n const result: [from: string, event: string, to: string][] = [];\n const index = {};\n if (state) {\n let prevStateKey = state.key;\n for (let parent = state?.parent; parent; parent = parent.parent) {\n if (!parent.descriptor) continue;\n result.push(\n ...getTransitionsFromDescriptor(parent.descriptor, prevStateKey, index),\n );\n prevStateKey = parent.key;\n }\n }\n return result.reverse();\n}\n\nfunction getTransitionsFromDescriptor(\n descriptor: FsmStateDescriptor,\n prevStateKey: string,\n index: Record<string, boolean> = {},\n) {\n const result: [from: string, event: string, to: string][] = [];\n const prevStateKeys = [prevStateKey, \"*\"];\n for (const prevKey of prevStateKeys) {\n const targets: undefined | Record<string, string> =\n descriptor.transitions[prevKey];\n if (targets) {\n for (const [event, target] of Object.entries(targets)) {\n if (index[event]) continue;\n if (target) {\n index[event] = true;\n }\n result.push([prevStateKey, event, target]);\n }\n }\n }\n return result;\n}\n","import { isStateTransitionEnabled } from \"../utils/transitions.ts\";\nimport { FsmProcess } from \"./fsm-process.ts\";\nimport type { FsmStateConfig } from \"./fsm-state-config.ts\";\n\nexport type Module<C = unknown> = (context: C) =>\n | void\n | (() => void | Promise<void>)\n | Promise<void | (() => void | Promise<void>)>\n // Event emitters / triggers\n | Generator<string>\n | AsyncGenerator<string>;\n\nexport function newFsmProcess<C>(\n context: C,\n config: FsmStateConfig,\n load: (\n state: string,\n event: undefined | string,\n ) =>\n | undefined\n | Module<C>\n | Module<C>[]\n | Promise<undefined | Module<C> | Module<C>[]>,\n): [\n dispatch: (event: string) => Promise<boolean>,\n shutdown: () => Promise<void>,\n] {\n let started = false;\n let terminated = false;\n const process = new FsmProcess(config);\n async function dispatch(event: string): Promise<boolean> {\n return terminated ||\n (event !== undefined &&\n (!started || isStateTransitionEnabled(process, event)))\n ? process.dispatch(event)\n : false;\n }\n process.onStateCreate((state) => {\n started = true;\n state.onEnter(async () => {\n const modules = (await load(state.key, process.event)) ?? [];\n for (const module of Array.isArray(modules) ? modules : [modules]) {\n const result = await module?.(context);\n if (isGenerator(result)) {\n state.onExit(() => {\n result.return?.(void 0);\n });\n (async () => {\n for await (const event of result) {\n if (terminated) {\n break;\n }\n await dispatch(event);\n if (terminated) {\n break;\n }\n }\n })();\n } else if (typeof result === \"function\") {\n state.onExit(result);\n }\n }\n });\n });\n async function shutdown(): Promise<void> {\n await process.shutdown();\n terminated = true;\n }\n return [dispatch, shutdown] as const;\n\n function isGenerator(\n value: unknown,\n ): value is\n | Generator<string, void, unknown>\n | AsyncGenerator<string, void, unknown> {\n return (\n typeof value === \"object\" &&\n value !== null &&\n \"next\" in value &&\n typeof (value as Generator<string, void, unknown>).next === \"function\"\n );\n }\n}\n","/**\n * Key used to bind the dispatch function to the process context.\n * The dispatch function allows triggering state transitions by dispatching events.\n *\n * Example usage:\n * ```typescript\n * const context: Record<string, unknown> = {};\n * // Initialize the FSM process using `startFsmProcess`\n * const dispatch = context[\"fsm:dispatch\"] as (event: string) => Promise<void>;\n * await dispatch(\"someEvent\");\n */\nexport const KEY_DISPATCH = \"fsm:dispatch\" as const;\n\n/**\n * Key used to bind the terminate function to the process context.\n * The terminate function is used to gracefully shut down the FSM process.\n * It returns a Promise that resolves when the process has been fully terminated.\n * Example usage:\n * ```typescript\n * const context: Record<string, unknown> = {};\n * // Initialize the FSM process using `startFsmProcess`\n * const terminate = context[\"fsm:terminate\"] as () => Promise<void>;\n * await terminate();\n * ```\n */\nexport const KEY_TERMINATE = \"fsm:terminate\" as const;\n\n/**\n * Key used to bind the current stack of active states to the process context.\n * This provides a snapshot of the states the FSM process has entered.\n * It is represented as an array of strings -- state keys.\n *\n * Example usage:\n * ```typescript\n * const context: Record<string, unknown> = {};\n * // Initialize the FSM process using `startFsmProcess`\n * const states = context[\"fsm:states\"] as string[];\n * console.log(\"Current active states:\", states);\n * ```\n */\nexport const KEY_STATES = \"fsm:states\" as const;\n\n/**\n * Key used to bind the current event being processed to the process context.\n * This represents the event that triggered the current state transition.\n * It is represented as a string.\n * Example usage:\n * ```typescript\n * const context: Record<string, unknown> = {};\n * // Initialize the FSM process using `startFsmProcess`\n * const event = context[\"fsm:event\"] as string;\n * console.log(\"Current event:\", event);\n * ```\n */\nexport const KEY_EVENT = \"fsm:event\" as const;\n\n//-------------------------------------------------\n\n// export const KEY_START_PROCESS = \"fsm:sys:start\" as const;\n/**\n * Key used to register a new FSM process configuration in the process context.\n * This key is associated with a function that allows adding new FSM configurations.\n * The function takes a process name and its configuration, and returns a cleanup function\n * to remove the registered configuration.\n * Example usage:\n * ```typescript\n * const context: Record<string, unknown> = {};\n * initProcessManager(context); // Initialize the process manager in the context\n * ...\n * type StateConfig = { key: string; transitions?: string[][]; states?: StateConfig[] };\n * const registerConfig = context[\"fsm:sys:registerConfig\"] as (name: string, config: StateConfig) => () => void;\n * const unregister = registerConfig(\"myProcess\", { key: \"Main\", transitions: [...] });\n * // To unregister the configuration later\n * unregister();\n * ```\n */\nexport const KEY_REGISTER_CONFIG = \"fsm:sys:registerConfig\" as const;\n\n/**\n * Key used to register state and event handlers for FSM processes in the process context.\n * This key is associated with a function that allows adding handler modules for a specific process.\n * The function takes a process name and a variable number of handler modules, returning a cleanup function\n * to remove the registered handlers.\n * Example usage:\n * ```typescript\n * const context: Record<string, unknown> = {};\n * initProcessManager(context); // Initialize the process manager in the context\n * ...\n * const registerHandlers = context[\"fsm:sys:registerHandlers\"] as (name: string, ...modules: unknown[]) => () => void;\n * const handlerModule1 = {\n * Main: async (context) => { ... },\n * SomeState: async (context) => { ... },\n * }\n * // Views layer can be defined in the same or separate modules\n * const handlerModule3 = {\n * MainView: async (context) => { ... },\n * SomeStateView: async (context) => { ... },\n * }\n * // A common handler function to call for all states\n * const handlerModule2 = (context) => { ... };\n * const unregister = registerHandlers(\n * \"myProcess\",\n * handlerModule1,\n * handlerModule2,\n * handlerModule3\n * );\n * // To unregister the handlers later\n * unregister();\n * ```\n */\nexport const KEY_REGISTER_HANDLERS = \"fsm:sys:registerHandlers\" as const;\n\n/**\n * Key used to launch an FSM process in the process context.\n * This key is associated with a function that initiates the FSM process based on its name and context.\n * The function takes the process name and context, returning either nothing, a cleanup function,\n * or a Promise that resolves to either nothing or a cleanup function.\n * Example usage:\n * ```typescript\n * const context: Record<string, unknown> = {};\n * initProcessManager(context); // Initialize the process manager in the context\n * // Register process configurations and handlers as needed\n *\n * const launchProcess = context[\"fsm:sys:launch\"] as (name: string, context: Record<string, unknown>) => () => Promise<void>;\n * const terminate = await launchProcess(\"myProcess\", context);\n * // To terminate the process later\n * terminate?.();\n * ```\n */\nexport const KEY_LAUNCH_PROCESS = \"fsm:sys:launch\" as const;\n","export type StageHandler<C = Record<string, unknown>> = (\n context: C,\n) =>\n | void\n | (() => void | Promise<void>)\n | Promise<void | (() => void | Promise<void>)>\n | AsyncGenerator<string, void, unknown>\n | Generator<string, void, unknown>;\n\nexport function toStageHandlers<C>(\n value: unknown,\n accept: (key: string, value: unknown) => boolean,\n): StageHandler<C>[] {\n return visit(value);\n\n function visit(val: unknown): StageHandler<C>[] {\n if (!val) {\n return [];\n }\n if (typeof val === \"function\") {\n return [val] as StageHandler<C>[];\n }\n if (typeof val !== \"object\") {\n return [];\n }\n if (Array.isArray(val)) {\n return val.flatMap(visit);\n }\n const modulesIndex = val as Record<string, unknown>;\n return Object.entries(modulesIndex).flatMap(([key, value]) => {\n return accept(key, value) ? visit(value) : [];\n });\n }\n}\n","import type { FsmStateConfig } from \"../core/fsm-state-config.ts\";\nimport { type StageHandler, toStageHandlers } from \"./types.ts\";\n\nexport interface IProcessConfigManager {\n getProcessConfig(processName: string): FsmStateConfig;\n getHandlersLoader<C = unknown>(\n processName: string,\n ): (state: string, event: undefined | string) => StageHandler<C>[];\n registerConfig(name: string, config: FsmStateConfig): () => void;\n registerHandlers(name: string, ...modules: unknown[]): () => void;\n}\n\nexport class ProcessConfigManager implements IProcessConfigManager {\n protected configs: Record<string, FsmStateConfig> = {};\n protected handlers: Record<string, unknown[]> = {};\n\n getProcessConfig(processName: string): FsmStateConfig {\n return this.configs[processName] ?? { key: \"Main\" };\n }\n\n getHandlersLoader<C = unknown>(\n processName: string,\n ): (state: string, event: undefined | string) => StageHandler<C>[] {\n const config = this.getProcessConfig(processName);\n return (stateKey: string) => {\n const modulesKeys: string[] = [];\n if (stateKey === config.key) {\n modulesKeys.push(\"default\");\n }\n modulesKeys.push(\n stateKey,\n `${stateKey}Controller`,\n `${stateKey}StateController`,\n `${stateKey}View`,\n `${stateKey}StateView`,\n `${stateKey}Trigger`,\n `${stateKey}StateTrigger`,\n `${stateKey}Test`,\n `${stateKey}StateTest`,\n );\n const keysSet = new Set(modulesKeys);\n const processHandlers = this.handlers[processName] ?? [];\n const handlers = toStageHandlers(processHandlers, (key: string) =>\n keysSet.has(key),\n );\n return handlers;\n };\n }\n\n registerConfig(name: string, config: FsmStateConfig): () => void {\n this.configs[name] = config;\n return () => {\n delete this.configs[name];\n };\n }\n\n registerHandlers(name: string, ...modules: unknown[]): () => void {\n let list: unknown[] = this.handlers[name];\n if (!list) {\n list = this.handlers[name] = [];\n }\n list.push(modules);\n return () => {\n list = list.filter((v) => v !== modules);\n if (list.length === 0) {\n delete this.handlers[name];\n }\n };\n }\n}\n","export function isGenerator(\n value: unknown,\n): value is\n | Generator<string, void, unknown>\n | AsyncGenerator<string, void, unknown> {\n return (\n typeof value === \"object\" &&\n value !== null &&\n \"next\" in value &&\n typeof (value as Generator<string, void, unknown>).next === \"function\"\n );\n}\n","import { FsmProcess } from \"../core/fsm-process.ts\";\nimport type { FsmStateConfig } from \"../core/fsm-state-config.ts\";\nimport { isStateTransitionEnabled } from \"../utils/index.ts\";\nimport {\n KEY_DISPATCH,\n KEY_EVENT,\n KEY_STATES,\n KEY_TERMINATE,\n} from \"./constants.ts\";\nimport { isGenerator } from \"./is-generator.ts\";\nimport type { StageHandler } from \"./types.ts\";\n\nexport async function startFsmProcess<C = unknown>(\n context: C,\n config: FsmStateConfig,\n load: (\n state: string,\n event: undefined | string,\n ) => StageHandler<C>[] | Promise<StageHandler<C>[]>,\n startEvent = \"\",\n): Promise<() => Promise<void>> {\n let terminated = false;\n const ctx = context as Record<string, unknown>;\n const process = new FsmProcess(config);\n const statesStack: string[] = [];\n // ctx[KEY_PROCESS] = process;\n process.onStateCreate((state) => {\n state.onEnter(async () => {\n statesStack.push(state.key);\n ctx[KEY_STATES] = [...statesStack];\n ctx[KEY_EVENT] = process.event;\n const modules = (await load(state.key, process.event)) ?? [];\n for (const module of Array.isArray(modules) ? modules : [modules]) {\n const result = await module?.(context);\n if (isGenerator(result)) {\n let stateExited = false;\n state.onExit(() => {\n stateExited = true;\n result.return?.(void 0);\n });\n (async () => {\n for await (const event of result) {\n if (stateExited || terminated) {\n break;\n }\n await dispatch(event);\n }\n })();\n } else if (typeof result === \"function\") {\n state.onExit(result);\n }\n }\n });\n state.onExit(() => {\n statesStack.pop();\n ctx[KEY_STATES] = [...statesStack];\n ctx[KEY_EVENT] = process.event;\n });\n });\n async function terminate(): Promise<void> {\n terminated = true;\n await process.shutdown();\n }\n async function dispatch(event: string): Promise<void> {\n if (event !== undefined && isStateTransitionEnabled(process, event)) {\n await process.dispatch(event);\n }\n }\n ctx[KEY_DISPATCH] = dispatch;\n ctx[KEY_TERMINATE] = terminate;\n await process.dispatch(startEvent);\n return terminate;\n}\n","import type { FsmStateConfig } from \"../core/fsm-state-config.ts\";\nimport { ProcessConfigManager } from \"./process-config-manager.ts\";\nimport { startFsmProcess } from \"./start-process.ts\";\nimport type { StageHandler } from \"./types.ts\";\n\nexport type ProcessConfig = {\n name: string;\n config?: FsmStateConfig;\n} & (\n | {\n handler?: StageHandler;\n }\n | {\n handlers?:\n | StageHandler\n | (\n | StageHandler\n | {\n [state: string]: StageHandler | StageHandler[];\n }\n )[];\n }\n | {\n default?:\n | StageHandler\n | (\n | StageHandler\n | {\n [state: string]: StageHandler | StageHandler[];\n }\n )[];\n }\n);\n\nfunction asArray<T>(\n value: T | T[] | undefined,\n filter: (v: T, idx: number) => T | undefined = (v) => v,\n): T[] {\n if (value === undefined) return [];\n const array = Array.isArray(value) ? value : [value];\n return array.filter(Boolean).map(filter).filter(Boolean) as T[];\n}\n\nexport async function launcher(options: unknown) {\n const configsManager = new ProcessConfigManager();\n\n async function launch(\n processName: string,\n context: Record<string, unknown>,\n startEvent: string = \"start\",\n ) {\n const config = configsManager.getProcessConfig(processName);\n const load = configsManager.getHandlersLoader(processName);\n return startFsmProcess(context, config, load, startEvent);\n }\n\n function registerProcess(\n configsManager: ProcessConfigManager,\n process: Record<string, unknown>,\n ) {\n if (!process || typeof process !== \"object\") {\n throw new Error(\"Invalid process configuration: not an object\");\n }\n const processName = process.name;\n if (!processName || typeof processName !== \"string\") {\n throw new Error(\"Invalid process configuration: missing or invalid name\");\n }\n\n const processConfig = process.config as FsmStateConfig | undefined;\n if (processConfig && typeof processConfig !== \"object\") {\n throw new Error(\n `Invalid process configuration: config is not an object in process ${process.name}`,\n );\n }\n if (processConfig) {\n configsManager.registerConfig(processName, processConfig);\n }\n\n const processHandlers = asArray(\n process.handlers ?? process.handler ?? process.default,\n (v, idx) => {\n if (typeof v === \"function\") return v;\n if (typeof v === \"object\" && v !== null) return v;\n throw new Error(\n [\n `Invalid process configuration:`,\n `a process handler is not object nor function in process ${processName} at index ${idx}`,\n `Recieved: ${v === null ? \"null\" : typeof v}`,\n ].join(\"\\n\"),\n );\n },\n );\n if (processHandlers.length > 0) {\n configsManager.registerHandlers(processName, ...processHandlers);\n }\n }\n\n const rootContext = { \"fsm:launch\": launch };\n const init = typeof options === \"function\" ? options : async () => options;\n const config = await init(rootContext);\n if (typeof config !== \"object\" || !config) {\n throw new Error(\"Invalid launcher configuration\");\n }\n\n const processes = asArray(\n config.processes ?? config.process ?? config.default,\n (v) => {\n if (typeof v === \"function\") {\n return {\n name: v.name || \"\",\n handler: v,\n };\n }\n if (typeof v !== \"object\") {\n throw new Error(\n \"Invalid launcher configuration: process is not an object\",\n );\n }\n return v;\n },\n );\n for (const process of processes) {\n registerProcess(configsManager, process);\n }\n\n const shutdowns: (() => Promise<void>)[] = [];\n let startProcesses = asArray<string>(config.start);\n if (startProcesses.length === 0) {\n startProcesses = processes.map((p) => p.name).filter(Boolean) as string[];\n }\n\n let initContext: (\n parent: Record<string, unknown>,\n ) => Record<string, unknown> = (context) => context;\n const configContext = config.context ?? config.init;\n if (configContext) {\n if (typeof configContext === \"function\") {\n initContext = configContext;\n } else if (typeof configContext === \"object\") {\n initContext = () => ({ parent: configContext });\n } else {\n throw new Error(\"Invalid launcher configuration: context\");\n }\n }\n for (const processName of startProcesses) {\n let context: Record<string, unknown> = {\n parent: rootContext,\n \"fsm:name\": processName,\n };\n context = initContext(context) ?? context;\n if (typeof context !== \"object\") {\n throw new Error(\n `Invalid launcher context for process \"${processName}\". Expected an object, but recieved ${typeof context}.`,\n );\n }\n const shutdown = await launch(processName, context);\n shutdowns.push(shutdown);\n }\n\n return async () => {\n for (const shutdown of shutdowns) {\n await shutdown();\n }\n };\n}\n","/**\n * Resolve module paths relative to a base URL.\n * This is useful for converting relative paths to absolute URLs.\n *\n * @param baseUrl - The base URL to resolve against.\n * @param refs - An array of module references (relative or absolute).\n * @returns An array of resolved absolute module URLs as strings.\n * @example\n * ```ts\n * const urls = resolveModulesUrls(\n * 'file:///home/user/project/', // base URL\n * 'https://example.com/js/my-module.js', // absolute URL\n * './module1.js', // relative path\n * '../module2.js' // relative path\n * );\n * console.log(urls);\n * // Output: [\n * // 'https://example.com/js/my-module.js',\n * // 'file:///home/user/project/module1.js',\n * // 'file:///home/user/module2.js'\n * // ] *\n * ```\n */\nexport function resolveModulesUrls(\n baseUrl: URL | string,\n ...refs: (URL | string)[]\n): string[] {\n return refs.map((ref) => new URL(ref, baseUrl).href);\n}\n\n/**\n * Resolves module paths relative to a base URL.\n * This is useful for converting relative paths to absolute file system paths.\n * @param baseUrl - The base URL to resolve against\n * @param refs - An array of module references (relative or absolute)\n * @returns - An array of resolved absolute module paths as strings\n * @example\n * ```ts\n * const paths = resolveModulesPaths('file:///home/user/project/', './module1.js', '../module2.js');\n * console.log(paths);\n * // Output: [\n * // '/home/user/project/module1.js',\n * // '/home/user/module2.js'\n * // ]\n * ```\n */\nexport function resolveModulesPaths(\n baseUrl: URL | string,\n ...refs: (URL | string)[]\n): string[] {\n return refs.map((ref) => new URL(ref, baseUrl).pathname);\n}\n","import { launcher } from \"./launcher.ts\";\n\nexport async function startProcesses({\n onExit,\n modules,\n init,\n}: {\n onExit?: () => Promise<void> | void;\n modules: unknown[];\n init?: (\n context: Record<string, unknown>,\n ) => Promise<Record<string, unknown>> | Record<string, unknown>;\n}) {\n const modulesList: unknown[] = [];\n for (const module of modules) {\n modulesList.push(\n typeof module === \"string\" || module instanceof URL\n ? await import(String(module))\n : module,\n );\n }\n return await launcher({\n init,\n processes: [\n ...modulesList,\n // This function is called on exit at the end of the process chain\n function Exit() {\n return onExit;\n },\n ],\n });\n}\n","import { resolveModulesPaths } from \"./resolve-module-refs.ts\";\nimport { startProcesses } from \"./start-processes.ts\";\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","export * from \"./core/index.ts\";\nexport * from \"./orchestrator/index.ts\";\n\n// export * from \"./utils/index.ts\";\n\nimport { startNodeProcesses } from \"./orchestrator/start-node-processes.ts\";\nexport default startNodeProcesses;\n"]}
1
+ {"version":3,"sources":["../src/core/fsm-base-class.ts","../src/core/fsm-state.ts","../src/core/fsm-state-config.ts","../src/core/fsm-state-descriptor.ts","../src/core/fsm-process.ts","../src/utils/transitions.ts","../src/core/new-fsm-process.ts","../src/orchestrator/constants.ts","../src/orchestrator/types.ts","../src/orchestrator/process-config-manager.ts","../src/utils/printer.ts","../src/utils/tracer.ts","../src/utils/process.ts","../src/orchestrator/is-generator.ts","../src/orchestrator/start-process.ts","../src/orchestrator/launcher.ts","../src/orchestrator/resolve-module-refs.ts","../src/orchestrator/start-processes.ts","../src/orchestrator/start-node-processes.ts","../src/index.ts"],"names":["process","stateKey","eventKey","isGenerator","value","prefix","config","configsManager"],"mappings":"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","file":"index.js","sourcesContent":["type Handler<P extends unknown[] = unknown[], R = unknown> = (...args: P) => R; // Function;\n// type Handler = Function;\n\nexport class FsmBaseClass {\n handlers: Record<string, Handler[]> = {};\n data: Record<string, unknown> = {};\n constructor() {\n bindMethods(this, \"setData\", \"getData\");\n }\n setData<T>(key: string, value: T) {\n this.data[key] = value;\n return this;\n }\n getData<T>(key: string): T | undefined {\n return this.data[key] as T;\n }\n\n // ----------------------------------------------\n // internal methods\n protected _addHandler<T>(type: string, handler: T, direct: boolean = true) {\n let list = this.handlers[type];\n if (!list) {\n list = this.handlers[type] = [];\n }\n const h = handler as Handler;\n direct ? list.push(h) : list.unshift(h);\n return () => this._removeHandler(type, h);\n }\n\n protected _removeHandler<T>(type: string, handler: T) {\n let list = this.handlers[type];\n if (!list) return;\n list = list.filter((h) => h !== handler);\n if (list.length > 0) {\n this.handlers[type] = list;\n } else {\n delete this.handlers[type];\n }\n }\n\n async _runHandlerParallel(type: string, ...args: unknown[]) {\n const list = this.handlers[type] || [];\n await Promise.all(\n list.map(async (handler) => {\n try {\n await handler(...args);\n } catch (error) {\n this._handleError(error);\n }\n }),\n );\n }\n\n async _runHandler(type: string, ...args: unknown[]) {\n const list = this.handlers[type] || [];\n for (const handler of list) {\n try {\n await handler(...args);\n } catch (error) {\n await this._handleError(error);\n }\n }\n }\n\n async _handleError(error: Error | unknown) {\n console.error(error);\n }\n}\n\nexport function bindMethods<T>(obj: T, ...methods: (string | symbol)[]) {\n const o = obj as Record<string | symbol, unknown>;\n for (const methodName of methods) {\n const method = o[methodName];\n if (typeof method !== \"function\") continue;\n o[methodName] = method.bind(o);\n }\n return obj;\n}\n","import { bindMethods, FsmBaseClass } from \"./fsm-base-class.ts\";\nimport type { FsmProcess } from \"./fsm-process.ts\";\nimport type { FsmStateDescriptor } from \"./fsm-state-descriptor.ts\";\n\nexport type FsmStateDump = Record<string, unknown> & {\n key: string;\n data: Record<string, unknown>;\n};\nexport type FsmStateHandler = (\n state: FsmState,\n ...args: unknown[]\n) => void | Promise<void>;\n\nexport type FsmStateDumpHandler = (\n state: FsmState,\n dump: FsmStateDump,\n) => void | Promise<void>;\n\nexport type FsmStateErrorHandler = (\n state: FsmState,\n error: unknown,\n) => void | Promise<void>;\n\nexport class FsmState extends FsmBaseClass {\n process: FsmProcess;\n key: string;\n parent?: FsmState;\n descriptor?: FsmStateDescriptor;\n\n constructor(\n process: FsmProcess,\n parent: FsmState | undefined,\n key: string,\n descriptor?: FsmStateDescriptor,\n ) {\n super();\n this.process = process;\n this.key = key;\n this.parent = parent;\n this.descriptor = descriptor;\n bindMethods(\n this,\n \"onEnter\",\n \"onExit\",\n \"dump\",\n \"restore\",\n \"useData\",\n \"onStateError\",\n );\n }\n\n onEnter(handler: FsmStateHandler) {\n return this._addHandler(\"onEnter\", handler, true);\n }\n onExit(handler: FsmStateHandler) {\n return this._addHandler(\"onExit\", handler, false);\n }\n onStateError(handler: FsmStateErrorHandler) {\n return this._addHandler(\"onStateError\", handler);\n }\n dump(handler: FsmStateDumpHandler) {\n return this._addHandler(\"dump\", handler, true);\n }\n restore(handler: FsmStateDumpHandler) {\n return this._addHandler(\"restore\", handler, true);\n }\n getData<T>(key: string, recursive: boolean = true): T | undefined {\n return (\n (this.data[key] as T) ??\n (recursive ? this.parent?.getData<T>(key, recursive) : undefined)\n );\n }\n useData<T>(key: string) {\n return [\n (recursive: boolean = true) => this.getData<T>(key, recursive),\n (value: T) => this.setData(key, value),\n ];\n }\n\n async _handleError(error: Error | unknown) {\n await this._runHandler(\"onStateError\", this, error);\n await this.process._handleStateError(this, error);\n }\n}\n","export const STATE_ANY = \"*\";\nexport const STATE_INITIAL = \"\";\nexport const STATE_FINAL = \"\";\nexport const EVENT_ANY = \"*\";\nexport const EVENT_EMPTY = \"\";\n\nexport type FsmStateKey = string;\nexport type FsmEventKey = string;\nexport type FsmStateConfig = {\n key: FsmStateKey;\n transitions?: [from: FsmStateKey, event: FsmEventKey, to: FsmStateKey][];\n states?: FsmStateConfig[];\n} & Record<string, unknown>;\n","import {\n EVENT_ANY,\n type FsmStateConfig,\n STATE_ANY,\n STATE_FINAL,\n} from \"./fsm-state-config.ts\";\n\nexport class FsmStateDescriptor {\n transitions: Record<string, Record<string, string>> = {};\n states: Record<string, FsmStateDescriptor> = {};\n\n static build(config: FsmStateConfig) {\n const descriptor = new FsmStateDescriptor();\n for (const [from, event, to] of config.transitions || []) {\n let index = descriptor.transitions[from];\n if (!index) {\n index = descriptor.transitions[from] = {};\n }\n index[event] = to;\n }\n if (config.states) {\n for (const substateConfig of config.states) {\n descriptor.states[substateConfig.key] =\n FsmStateDescriptor.build(substateConfig);\n }\n }\n return descriptor;\n }\n\n getTargetStateKey(stateKey: string, eventKey: string) {\n const pairs = [\n [stateKey, eventKey],\n [STATE_ANY, eventKey],\n [stateKey, EVENT_ANY],\n [STATE_ANY, EVENT_ANY],\n ];\n let targetKey: string | undefined;\n for (\n let i = 0, len = pairs.length;\n targetKey === undefined && i < len;\n i++\n ) {\n const [stateKey, eventKey] = pairs[i];\n const stateTransitions = this.transitions[stateKey];\n if (!stateTransitions) continue;\n targetKey = stateTransitions[eventKey];\n }\n return targetKey !== undefined ? targetKey : STATE_FINAL;\n }\n}\n","import { bindMethods, FsmBaseClass } from \"./fsm-base-class.ts\";\nimport {\n FsmState,\n type FsmStateDump,\n type FsmStateHandler,\n} from \"./fsm-state.ts\";\nimport {\n EVENT_EMPTY,\n type FsmStateConfig,\n STATE_FINAL,\n STATE_INITIAL,\n} from \"./fsm-state-config.ts\";\nimport { FsmStateDescriptor } from \"./fsm-state-descriptor.ts\";\n\nexport const STATUS_NONE = 0;\nexport const STATUS_FIRST = 1;\nexport const STATUS_NEXT = 2;\nexport const STATUS_LEAF = 4;\nexport const STATUS_LAST = 8;\nexport const STATUS_FINISHED = 16;\n\n//\nexport const STATUS_ENTER = STATUS_FIRST | STATUS_NEXT;\nexport const STATUS_EXIT = STATUS_LEAF | STATUS_LAST;\n\nexport type FsmProcessHandler = (\n process: FsmProcess,\n ...args: unknown[]\n) => void | Promise<void>;\n\nexport type FsmProcessDump = Record<string, unknown> & {\n status: number;\n event?: string;\n stack: FsmStateDump[];\n};\n\nexport type FsmProcessDumpHandler = (\n process: FsmProcess,\n dump: FsmProcessDump,\n) => void | Promise<void>;\n\nexport class FsmProcess extends FsmBaseClass {\n state?: FsmState;\n event?: string;\n nextEvent?: string;\n running: boolean = false;\n mask: number = STATUS_LEAF;\n status: number = 0;\n config: FsmStateConfig;\n rootDescriptor: FsmStateDescriptor;\n\n constructor(config: FsmStateConfig) {\n super();\n this.rootDescriptor = FsmStateDescriptor.build(config);\n this.config = config;\n bindMethods(this, \"dispatch\", \"dump\", \"restore\");\n }\n\n async shutdown(event?: string) {\n while (this.state) {\n this.event = event;\n this.status = STATUS_FINISHED;\n await this.state?._runHandler(\"onExit\", this.state);\n this.state = this.state.parent;\n }\n }\n\n async dispatch(event: string): Promise<boolean> {\n this.nextEvent = event;\n if (!this.running && !(this.status & STATUS_FINISHED)) {\n this.running = true;\n try {\n this.event = this.nextEvent;\n this.nextEvent = undefined;\n while (true) {\n // ---\n if (this.status & STATUS_EXIT) {\n await this.state?._runHandler(\"onExit\", this.state);\n }\n if (!this._update()) break;\n if (this.status & STATUS_ENTER) {\n await this.state?._runHandler(\"onEnter\", this.state);\n }\n if (this.status & this.mask) break;\n // ---\n }\n } finally {\n this.running = false;\n }\n const nextEvent = this.nextEvent;\n if (nextEvent !== undefined) {\n return Promise.resolve().then(() => this.dispatch(nextEvent));\n }\n }\n return !(this.status & STATUS_FINISHED);\n }\n\n async dump(...args: unknown[]): Promise<FsmProcessDump> {\n const dumpState = async (state: FsmState) => {\n const stateDump: FsmStateDump = {\n key: state.key,\n data: {},\n };\n await state._runHandler(\"dump\", state, stateDump.data, ...args);\n return stateDump;\n };\n const dumpStates = async (\n state: FsmState | undefined,\n stack: FsmStateDump[] = [],\n ) => {\n if (!state) return stack;\n state.parent && (await dumpStates(state.parent, stack));\n stack.push(await dumpState(state));\n return stack;\n };\n const dump: FsmProcessDump = {\n status: this.status,\n event: this.event,\n stack: await dumpStates(this.state),\n };\n return dump;\n }\n\n async restore(dump: FsmProcessDump, ...args: unknown[]) {\n this.status = dump.status || 0;\n this.event = dump.event;\n this.state = undefined;\n for (let i = 0; i < dump.stack.length; i++) {\n const stateDump = dump.stack[i];\n this.state = this.state\n ? this._newSubstate(this.state, stateDump.key)\n : this._newState(undefined, stateDump.key, this.rootDescriptor);\n await this.state._runHandler(\n \"restore\",\n this.state,\n stateDump.data,\n ...args,\n );\n }\n return this;\n }\n\n onStateCreate(handler: FsmStateHandler) {\n return this._addHandler(\"onStateCreate\", handler, true);\n }\n\n onStateError(\n handler: (state: FsmState, error: unknown) => void | Promise<void>,\n ) {\n return this._addHandler(\"onStateError\", handler);\n }\n\n async _handleStateError(state: FsmState, error: Error | unknown) {\n await this._runHandler(\"onStateError\", state, error);\n this._handleError(error);\n }\n\n _newState(\n parent: FsmState | undefined,\n key: string,\n descriptor: FsmStateDescriptor | undefined,\n ) {\n const state = new FsmState(this, parent, key, descriptor);\n this._runHandlerParallel(\"onStateCreate\", state);\n return state;\n }\n\n _getSubstate(parent: FsmState | undefined, prevStateKey: string | undefined) {\n if (!parent) return;\n const toState =\n parent.descriptor?.getTargetStateKey(\n prevStateKey || STATE_INITIAL,\n this.event || EVENT_EMPTY,\n ) || STATE_FINAL;\n if (!toState) return;\n return this._newSubstate(parent, toState);\n }\n\n _newSubstate(parent: FsmState | undefined, toState: string) {\n let descriptor: FsmStateDescriptor | undefined;\n for (\n let state: FsmState | undefined = parent;\n !descriptor && state;\n state = state.parent\n ) {\n descriptor = state.descriptor?.states[toState];\n }\n return this._newState(parent, toState, descriptor);\n }\n\n _update() {\n if (this.status & STATUS_FINISHED) return false;\n const nextState =\n this.status !== STATUS_NONE\n ? this.status & STATUS_ENTER\n ? this._getSubstate(this.state, STATE_INITIAL)\n : this._getSubstate(this.state?.parent, this.state?.key)\n : this._newState(undefined, this.config.key, this.rootDescriptor);\n if (nextState !== undefined) {\n this.state = nextState;\n this.status = this.status & STATUS_EXIT ? STATUS_NEXT : STATUS_FIRST;\n } else {\n if (this.status & STATUS_EXIT) {\n this.state = this.state?.parent;\n this.status = STATUS_LAST;\n } else {\n this.status = STATUS_LEAF;\n }\n if (!this.state) this.status = STATUS_FINISHED;\n }\n return !(this.status & STATUS_FINISHED);\n }\n}\n","import type { FsmProcess } from \"../core/fsm-process.ts\";\nimport type { FsmState } from \"../core/fsm-state.ts\";\nimport type { FsmStateDescriptor } from \"../core/fsm-state-descriptor.ts\";\n\nexport function isStateTransitionEnabled(process: FsmProcess, event: string) {\n const transitions = getStateTransitions(process.state);\n let active = false;\n for (const [from, ev, to] of transitions) {\n if (ev === event) {\n active = true;\n break;\n }\n }\n return active;\n}\n\nexport function getStateTransitions(\n state?: FsmState,\n): [from: string, event: string, to: string][] {\n const result: [from: string, event: string, to: string][] = [];\n const index = {};\n if (state) {\n let prevStateKey = state.key;\n for (let parent = state?.parent; parent; parent = parent.parent) {\n if (!parent.descriptor) continue;\n result.push(\n ...getTransitionsFromDescriptor(parent.descriptor, prevStateKey, index),\n );\n prevStateKey = parent.key;\n }\n }\n return result.reverse();\n}\n\nfunction getTransitionsFromDescriptor(\n descriptor: FsmStateDescriptor,\n prevStateKey: string,\n index: Record<string, boolean> = {},\n) {\n const result: [from: string, event: string, to: string][] = [];\n const prevStateKeys = [prevStateKey, \"*\"];\n for (const prevKey of prevStateKeys) {\n const targets: undefined | Record<string, string> =\n descriptor.transitions[prevKey];\n if (targets) {\n for (const [event, target] of Object.entries(targets)) {\n if (index[event]) continue;\n if (target) {\n index[event] = true;\n }\n result.push([prevStateKey, event, target]);\n }\n }\n }\n return result;\n}\n","import { isStateTransitionEnabled } from \"../utils/transitions.ts\";\nimport { FsmProcess } from \"./fsm-process.ts\";\nimport type { FsmStateConfig } from \"./fsm-state-config.ts\";\n\nexport type Module<C = unknown> = (context: C) =>\n | void\n | (() => void | Promise<void>)\n | Promise<void | (() => void | Promise<void>)>\n // Event emitters / triggers\n | Generator<string>\n | AsyncGenerator<string>;\n\nexport function newFsmProcess<C>(\n context: C,\n config: FsmStateConfig,\n load: (\n state: string,\n event: undefined | string,\n ) =>\n | undefined\n | Module<C>\n | Module<C>[]\n | Promise<undefined | Module<C> | Module<C>[]>,\n): [\n dispatch: (event: string) => Promise<boolean>,\n shutdown: () => Promise<void>,\n] {\n let started = false;\n let terminated = false;\n const process = new FsmProcess(config);\n async function dispatch(event: string): Promise<boolean> {\n return terminated ||\n (event !== undefined &&\n (!started || isStateTransitionEnabled(process, event)))\n ? process.dispatch(event)\n : false;\n }\n process.onStateCreate((state) => {\n started = true;\n state.onEnter(async () => {\n const modules = (await load(state.key, process.event)) ?? [];\n for (const module of Array.isArray(modules) ? modules : [modules]) {\n const result = await module?.(context);\n if (isGenerator(result)) {\n state.onExit(() => {\n result.return?.(void 0);\n });\n (async () => {\n for await (const event of result) {\n if (terminated) {\n break;\n }\n await dispatch(event);\n if (terminated) {\n break;\n }\n }\n })();\n } else if (typeof result === \"function\") {\n state.onExit(result);\n }\n }\n });\n });\n async function shutdown(): Promise<void> {\n await process.shutdown();\n terminated = true;\n }\n return [dispatch, shutdown] as const;\n\n function isGenerator(\n value: unknown,\n ): value is\n | Generator<string, void, unknown>\n | AsyncGenerator<string, void, unknown> {\n return (\n typeof value === \"object\" &&\n value !== null &&\n \"next\" in value &&\n typeof (value as Generator<string, void, unknown>).next === \"function\"\n );\n }\n}\n","/**\n * Key used to bind the dispatch function to the process context.\n * The dispatch function allows triggering state transitions by dispatching events.\n *\n * Example usage:\n * ```typescript\n * const context: Record<string, unknown> = {};\n * // Initialize the FSM process using `startFsmProcess`\n * const dispatch = context[\"fsm:dispatch\"] as (event: string) => Promise<void>;\n * await dispatch(\"someEvent\");\n */\nexport const KEY_DISPATCH = \"fsm:dispatch\" as const;\n\n/**\n * Key used to bind the terminate function to the process context.\n * The terminate function is used to gracefully shut down the FSM process.\n * It returns a Promise that resolves when the process has been fully terminated.\n * Example usage:\n * ```typescript\n * const context: Record<string, unknown> = {};\n * // Initialize the FSM process using `startFsmProcess`\n * const terminate = context[\"fsm:terminate\"] as () => Promise<void>;\n * await terminate();\n * ```\n */\nexport const KEY_TERMINATE = \"fsm:terminate\" as const;\n\n/**\n * Key used to bind the current stack of active states to the process context.\n * This provides a snapshot of the states the FSM process has entered.\n * It is represented as an array of strings -- state keys.\n *\n * Example usage:\n * ```typescript\n * const context: Record<string, unknown> = {};\n * // Initialize the FSM process using `startFsmProcess`\n * const states = context[\"fsm:states\"] as string[];\n * console.log(\"Current active states:\", states);\n * ```\n */\nexport const KEY_STATES = \"fsm:states\" as const;\n\n/**\n * Key used to bind the current event being processed to the process context.\n * This represents the event that triggered the current state transition.\n * It is represented as a string.\n * Example usage:\n * ```typescript\n * const context: Record<string, unknown> = {};\n * // Initialize the FSM process using `startFsmProcess`\n * const event = context[\"fsm:event\"] as string;\n * console.log(\"Current event:\", event);\n * ```\n */\nexport const KEY_EVENT = \"fsm:event\" as const;\n\n//-------------------------------------------------\n\n// export const KEY_START_PROCESS = \"fsm:sys:start\" as const;\n/**\n * Key used to register a new FSM process configuration in the process context.\n * This key is associated with a function that allows adding new FSM configurations.\n * The function takes a process name and its configuration, and returns a cleanup function\n * to remove the registered configuration.\n * Example usage:\n * ```typescript\n * const context: Record<string, unknown> = {};\n * initProcessManager(context); // Initialize the process manager in the context\n * ...\n * type StateConfig = { key: string; transitions?: string[][]; states?: StateConfig[] };\n * const registerConfig = context[\"fsm:sys:registerConfig\"] as (name: string, config: StateConfig) => () => void;\n * const unregister = registerConfig(\"myProcess\", { key: \"Main\", transitions: [...] });\n * // To unregister the configuration later\n * unregister();\n * ```\n */\nexport const KEY_REGISTER_CONFIG = \"fsm:sys:registerConfig\" as const;\n\n/**\n * Key used to register state and event handlers for FSM processes in the process context.\n * This key is associated with a function that allows adding handler modules for a specific process.\n * The function takes a process name and a variable number of handler modules, returning a cleanup function\n * to remove the registered handlers.\n * Example usage:\n * ```typescript\n * const context: Record<string, unknown> = {};\n * initProcessManager(context); // Initialize the process manager in the context\n * ...\n * const registerHandlers = context[\"fsm:sys:registerHandlers\"] as (name: string, ...modules: unknown[]) => () => void;\n * const handlerModule1 = {\n * Main: async (context) => { ... },\n * SomeState: async (context) => { ... },\n * }\n * // Views layer can be defined in the same or separate modules\n * const handlerModule3 = {\n * MainView: async (context) => { ... },\n * SomeStateView: async (context) => { ... },\n * }\n * // A common handler function to call for all states\n * const handlerModule2 = (context) => { ... };\n * const unregister = registerHandlers(\n * \"myProcess\",\n * handlerModule1,\n * handlerModule2,\n * handlerModule3\n * );\n * // To unregister the handlers later\n * unregister();\n * ```\n */\nexport const KEY_REGISTER_HANDLERS = \"fsm:sys:registerHandlers\" as const;\n\n/**\n * Key used to launch an FSM process in the process context.\n * This key is associated with a function that initiates the FSM process based on its name and context.\n * The function takes the process name and context, returning either nothing, a cleanup function,\n * or a Promise that resolves to either nothing or a cleanup function.\n * Example usage:\n * ```typescript\n * const context: Record<string, unknown> = {};\n * initProcessManager(context); // Initialize the process manager in the context\n * // Register process configurations and handlers as needed\n *\n * const launchProcess = context[\"fsm:sys:launch\"] as (name: string, context: Record<string, unknown>) => () => Promise<void>;\n * const terminate = await launchProcess(\"myProcess\", context);\n * // To terminate the process later\n * terminate?.();\n * ```\n */\nexport const KEY_LAUNCH_PROCESS = \"fsm:sys:launch\" as const;\n","export type StageHandler<C = Record<string, unknown>> = (\n context: C,\n) =>\n | void\n | (() => void | Promise<void>)\n | Promise<void | (() => void | Promise<void>)>\n | AsyncGenerator<string, void, unknown>\n | Generator<string, void, unknown>;\n\nexport function toStageHandlers<C>(\n value: unknown,\n accept: (key: string, value: unknown) => boolean,\n): StageHandler<C>[] {\n return visit(value);\n\n function visit(val: unknown): StageHandler<C>[] {\n if (!val) {\n return [];\n }\n if (typeof val === \"function\") {\n return [val] as StageHandler<C>[];\n }\n if (typeof val !== \"object\") {\n return [];\n }\n if (Array.isArray(val)) {\n return val.flatMap(visit);\n }\n const modulesIndex = val as Record<string, unknown>;\n return Object.entries(modulesIndex).flatMap(([key, value]) => {\n return accept(key, value) ? visit(value) : [];\n });\n }\n}\n","import type { FsmStateConfig } from \"../core/fsm-state-config.ts\";\nimport { type StageHandler, toStageHandlers } from \"./types.ts\";\n\nexport interface IProcessConfigManager {\n getProcessConfig(processName: string): FsmStateConfig;\n getHandlersLoader<C = unknown>(\n processName: string,\n ): (state: string, event: undefined | string) => StageHandler<C>[];\n registerConfig(name: string, config: FsmStateConfig): () => void;\n registerHandlers(name: string, ...modules: unknown[]): () => void;\n}\n\nexport class ProcessConfigManager implements IProcessConfigManager {\n protected configs: Record<string, FsmStateConfig> = {};\n protected handlers: Record<string, unknown[]> = {};\n\n getProcessConfig(processName: string): FsmStateConfig {\n return this.configs[processName] ?? { key: \"Main\" };\n }\n\n getHandlersLoader<C = unknown>(\n processName: string,\n ): (state: string, event: undefined | string) => StageHandler<C>[] {\n const config = this.getProcessConfig(processName);\n return (stateKey: string) => {\n const modulesKeys: string[] = [];\n if (stateKey === config.key) {\n modulesKeys.push(\"default\");\n }\n modulesKeys.push(\n stateKey,\n `${stateKey}Controller`,\n `${stateKey}StateController`,\n `${stateKey}View`,\n `${stateKey}StateView`,\n `${stateKey}Trigger`,\n `${stateKey}StateTrigger`,\n `${stateKey}Test`,\n `${stateKey}StateTest`,\n );\n const keysSet = new Set(modulesKeys);\n const processHandlers = this.handlers[processName] ?? [];\n const handlers = toStageHandlers(processHandlers, (key: string) =>\n keysSet.has(key),\n );\n return handlers;\n };\n }\n\n registerConfig(name: string, config: FsmStateConfig): () => void {\n this.configs[name] = config;\n return () => {\n delete this.configs[name];\n };\n }\n\n registerHandlers(name: string, ...modules: unknown[]): () => void {\n let list: unknown[] = this.handlers[name];\n if (!list) {\n list = this.handlers[name] = [];\n }\n list.push(modules);\n return () => {\n list = list.filter((v) => v !== modules);\n if (list.length === 0) {\n delete this.handlers[name];\n }\n };\n }\n}\n","import type { FsmProcess } from \"../core/fsm-process.ts\";\nimport type { FsmState } from \"../core/fsm-state.ts\";\nexport type Printer = (...args: unknown[]) => void;\nexport type PrinterConfig = {\n prefix?: string;\n print?: (...args: unknown[]) => void;\n lineNumbers?: boolean;\n};\n\nexport const KEY_PRINTER = \"printer\";\n\nexport function preparePrinter(\n process: FsmProcess,\n { prefix = \"\", print = console.log, lineNumbers = false }: PrinterConfig,\n): Printer {\n let lineCounter = 0;\n const shift = () => {\n let prefix = \"\";\n for (let s = process.state?.parent; s; s = s.parent) {\n prefix += \" \";\n }\n return prefix;\n };\n const getPrefix = lineNumbers ? () => `[${++lineCounter}]${shift()}` : shift;\n const printer = (...args: unknown[]) => print(prefix, getPrefix(), ...args);\n return printer;\n}\n\nexport function setPrinter(state: FsmState, config: PrinterConfig = {}) {\n const printer = preparePrinter(state.process, config);\n state.setData(KEY_PRINTER, printer);\n}\n\nexport function setProcessPrinter(\n process: FsmProcess,\n config: PrinterConfig = {},\n) {\n const printer = preparePrinter(process, config);\n process.setData(KEY_PRINTER, printer);\n}\n\nexport function getProcessPrinter(process: FsmProcess): Printer {\n return process.getData(KEY_PRINTER) || console.log;\n}\n\nexport function getPrinter(state: FsmState): Printer {\n return state.getData(KEY_PRINTER, true) || getProcessPrinter(state.process);\n}\n","import type { FsmProcess } from \"../core/fsm-process.ts\";\nimport type { FsmState } from \"../core/fsm-state.ts\";\nimport { getPrinter, type Printer } from \"./printer.ts\";\n\nexport function setProcessTracer(process: FsmProcess, print?: Printer) {\n return process.onStateCreate((state) => {\n setStateTracer(state, print);\n });\n}\n\nexport function setStateTracer(state: FsmState, print?: Printer) {\n state.onEnter(() => {\n const printLine = print || getPrinter(state);\n printLine(`<${state?.key} event=\"${state.process.event}\">`);\n });\n state.onExit(async () => {\n await Promise.resolve().then(async () => {\n const printLine = print || getPrinter(state);\n printLine(`</${state.key}> <!-- event=\"${state.process.event}\" -->`);\n });\n });\n}\n","import { FsmProcess } from \"../core/fsm-process.ts\";\nimport type { FsmStateConfig } from \"../core/fsm-state-config.ts\";\nimport { setProcessPrinter } from \"./printer.ts\";\nimport { setProcessTracer } from \"./tracer.ts\";\n\nexport function newProcess(\n config: FsmStateConfig,\n {\n prefix,\n print,\n lineNumbers = true,\n }: {\n prefix?: string;\n print?: (...args: any[]) => void;\n lineNumbers?: boolean;\n },\n): FsmProcess {\n const process = new FsmProcess(config);\n setProcessPrinter(process, {\n prefix,\n print,\n lineNumbers,\n });\n setProcessTracer(process);\n return process;\n}\n","export function isGenerator(\n value: unknown,\n): value is\n | Generator<string, void, unknown>\n | AsyncGenerator<string, void, unknown> {\n return (\n typeof value === \"object\" &&\n value !== null &&\n \"next\" in value &&\n typeof (value as Generator<string, void, unknown>).next === \"function\"\n );\n}\n","import { FsmProcess } from \"../core/fsm-process.ts\";\nimport type { FsmStateConfig } from \"../core/fsm-state-config.ts\";\nimport { isStateTransitionEnabled } from \"../utils/index.ts\";\nimport {\n KEY_DISPATCH,\n KEY_EVENT,\n KEY_STATES,\n KEY_TERMINATE,\n} from \"./constants.ts\";\nimport { isGenerator } from \"./is-generator.ts\";\nimport type { StageHandler } from \"./types.ts\";\n\nexport async function startFsmProcess<C = unknown>(\n context: C,\n config: FsmStateConfig,\n load: (\n state: string,\n event: undefined | string,\n ) => StageHandler<C>[] | Promise<StageHandler<C>[]>,\n startEvent = \"\",\n): Promise<() => Promise<void>> {\n let terminated = false;\n const ctx = context as Record<string, unknown>;\n const process = new FsmProcess(config);\n const statesStack: string[] = [];\n // ctx[KEY_PROCESS] = process;\n process.onStateCreate((state) => {\n state.onEnter(async () => {\n statesStack.push(state.key);\n ctx[KEY_STATES] = [...statesStack];\n ctx[KEY_EVENT] = process.event;\n const modules = (await load(state.key, process.event)) ?? [];\n for (const module of Array.isArray(modules) ? modules : [modules]) {\n const result = await module?.(context);\n if (isGenerator(result)) {\n let stateExited = false;\n state.onExit(() => {\n stateExited = true;\n result.return?.(void 0);\n });\n (async () => {\n for await (const event of result) {\n if (stateExited || terminated) {\n break;\n }\n await dispatch(event);\n }\n })();\n } else if (typeof result === \"function\") {\n state.onExit(result);\n }\n }\n });\n state.onExit(() => {\n statesStack.pop();\n ctx[KEY_STATES] = [...statesStack];\n ctx[KEY_EVENT] = process.event;\n });\n });\n async function terminate(): Promise<void> {\n terminated = true;\n await process.shutdown();\n }\n async function dispatch(event: string): Promise<void> {\n if (event !== undefined && isStateTransitionEnabled(process, event)) {\n await process.dispatch(event);\n }\n }\n ctx[KEY_DISPATCH] = dispatch;\n ctx[KEY_TERMINATE] = terminate;\n await process.dispatch(startEvent);\n return terminate;\n}\n","import type { FsmStateConfig } from \"../core/fsm-state-config.ts\";\nimport { ProcessConfigManager } from \"./process-config-manager.ts\";\nimport { startFsmProcess } from \"./start-process.ts\";\nimport type { StageHandler } from \"./types.ts\";\n\nexport type ProcessConfig = {\n name: string;\n config?: FsmStateConfig;\n} & (\n | {\n handler?: StageHandler;\n }\n | {\n handlers?:\n | StageHandler\n | (\n | StageHandler\n | {\n [state: string]: StageHandler | StageHandler[];\n }\n )[];\n }\n | {\n default?:\n | StageHandler\n | (\n | StageHandler\n | {\n [state: string]: StageHandler | StageHandler[];\n }\n )[];\n }\n);\n\nfunction asArray<T>(\n value: T | T[] | undefined,\n filter: (v: T, idx: number) => T | undefined = (v) => v,\n): T[] {\n if (value === undefined) return [];\n const array = Array.isArray(value) ? value : [value];\n return array.filter(Boolean).map(filter).filter(Boolean) as T[];\n}\n\nexport async function launcher(options: unknown) {\n const configsManager = new ProcessConfigManager();\n\n async function launch(\n processName: string,\n context: Record<string, unknown>,\n startEvent: string = \"start\",\n ) {\n const config = configsManager.getProcessConfig(processName);\n const load = configsManager.getHandlersLoader(processName);\n return startFsmProcess(context, config, load, startEvent);\n }\n\n function registerProcess(\n configsManager: ProcessConfigManager,\n process: Record<string, unknown>,\n ) {\n if (!process || typeof process !== \"object\") {\n throw new Error(\"Invalid process configuration: not an object\");\n }\n const processName = process.name;\n if (!processName || typeof processName !== \"string\") {\n throw new Error(\"Invalid process configuration: missing or invalid name\");\n }\n\n const processConfig = process.config as FsmStateConfig | undefined;\n if (processConfig && typeof processConfig !== \"object\") {\n throw new Error(\n `Invalid process configuration: config is not an object in process ${process.name}`,\n );\n }\n if (processConfig) {\n configsManager.registerConfig(processName, processConfig);\n }\n\n const processHandlers = asArray(\n process.handlers ?? process.handler ?? process.default,\n (v, idx) => {\n if (typeof v === \"function\") return v;\n if (typeof v === \"object\" && v !== null) return v;\n throw new Error(\n [\n `Invalid process configuration:`,\n `a process handler is not object nor function in process ${processName} at index ${idx}`,\n `Recieved: ${v === null ? \"null\" : typeof v}`,\n ].join(\"\\n\"),\n );\n },\n );\n if (processHandlers.length > 0) {\n configsManager.registerHandlers(processName, ...processHandlers);\n }\n }\n\n const rootContext = { \"fsm:launch\": launch };\n const init = typeof options === \"function\" ? options : async () => options;\n const config = await init(rootContext);\n if (typeof config !== \"object\" || !config) {\n throw new Error(\"Invalid launcher configuration\");\n }\n\n const processes = asArray(\n config.processes ?? config.process ?? config.default,\n (v) => {\n if (typeof v === \"function\") {\n return {\n name: v.name || \"\",\n handler: v,\n };\n }\n if (typeof v !== \"object\") {\n throw new Error(\n \"Invalid launcher configuration: process is not an object\",\n );\n }\n return v;\n },\n );\n\n const processesToStart = {} as Record<string, undefined | boolean>;\n for (const process of processes) {\n const processName = process.name;\n const start = process.start;\n if (start === undefined) {\n if (!(processName in processesToStart)) {\n processesToStart[processName] = undefined;\n }\n } else {\n processesToStart[processName] = start;\n }\n registerProcess(configsManager, process);\n }\n\n const shutdowns: (() => Promise<void>)[] = [];\n let initContext: (\n parent: Record<string, unknown>,\n ) => Record<string, unknown> = (context) => context;\n const configContext = config.context ?? config.init;\n if (configContext) {\n if (typeof configContext === \"function\") {\n initContext = configContext;\n } else if (typeof configContext === \"object\") {\n initContext = () => ({ parent: configContext });\n } else {\n throw new Error(\"Invalid launcher configuration: context\");\n }\n }\n for (const [processName, start] of Object.entries(processesToStart)) {\n if (start === false) continue;\n let context: Record<string, unknown> = {\n parent: rootContext,\n \"fsm:name\": processName,\n };\n context = initContext(context) ?? context;\n if (typeof context !== \"object\") {\n throw new Error(\n `Invalid launcher context for process \"${processName}\". Expected an object, but recieved ${typeof context}.`,\n );\n }\n const shutdown = await launch(processName, context);\n shutdowns.push(shutdown);\n }\n\n return async () => {\n for (const shutdown of shutdowns) {\n await shutdown();\n }\n };\n}\n","/**\n * Resolve module paths relative to a base URL.\n * This is useful for converting relative paths to absolute URLs.\n *\n * @param baseUrl - The base URL to resolve against.\n * @param refs - An array of module references (relative or absolute).\n * @returns An array of resolved absolute module URLs as strings.\n * @example\n * ```ts\n * const urls = resolveModulesUrls(\n * 'file:///home/user/project/', // base URL\n * 'https://example.com/js/my-module.js', // absolute URL\n * './module1.js', // relative path\n * '../module2.js' // relative path\n * );\n * console.log(urls);\n * // Output: [\n * // 'https://example.com/js/my-module.js',\n * // 'file:///home/user/project/module1.js',\n * // 'file:///home/user/module2.js'\n * // ] *\n * ```\n */\nexport function resolveModulesUrls(\n baseUrl: URL | string,\n ...refs: (URL | string)[]\n): string[] {\n return refs.map((ref) => new URL(ref, baseUrl).href);\n}\n\n/**\n * Resolves module paths relative to a base URL.\n * This is useful for converting relative paths to absolute file system paths.\n * @param baseUrl - The base URL to resolve against\n * @param refs - An array of module references (relative or absolute)\n * @returns - An array of resolved absolute module paths as strings\n * @example\n * ```ts\n * const paths = resolveModulesPaths('file:///home/user/project/', './module1.js', '../module2.js');\n * console.log(paths);\n * // Output: [\n * // '/home/user/project/module1.js',\n * // '/home/user/module2.js'\n * // ]\n * ```\n */\nexport function resolveModulesPaths(\n baseUrl: URL | string,\n ...refs: (URL | string)[]\n): string[] {\n return refs.map((ref) => new URL(ref, baseUrl).pathname);\n}\n","import { launcher } from \"./launcher.ts\";\n\nexport async function startProcesses({\n onExit,\n modules,\n init,\n}: {\n onExit?: () => Promise<void> | void;\n modules: unknown[];\n init?: (\n context: Record<string, unknown>,\n ) => Promise<Record<string, unknown>> | Record<string, unknown>;\n}) {\n const modulesList: unknown[] = [];\n for (const module of modules) {\n modulesList.push(\n typeof module === \"string\" || module instanceof URL\n ? await import(String(module))\n : module,\n );\n }\n return await launcher({\n init,\n processes: [\n ...modulesList,\n // This function is called on exit at the end of the process chain\n function Exit() {\n return onExit;\n },\n ],\n });\n}\n","import { resolveModulesPaths } from \"./resolve-module-refs.ts\";\nimport { startProcesses } from \"./start-processes.ts\";\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","export * from \"./core/index.ts\";\nexport * from \"./orchestrator/index.ts\";\nexport * from \"./utils/index.ts\";\n\nimport { startNodeProcesses } from \"./orchestrator/start-node-processes.ts\";\nexport default startNodeProcesses;\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@statewalker/fsm",
3
- "version": "0.34.0",
3
+ "version": "0.36.0",
4
4
  "description": "HFSM Implementation",
5
5
  "keywords": [],
6
6
  "homepage": "https://github.com/statewalker/statewalker-fsm",
@@ -10,7 +10,11 @@
10
10
  },
11
11
  "license": "MIT",
12
12
  "type": "module",
13
+ "bin": {
14
+ "fsm": "./bin/cli.js"
15
+ },
13
16
  "files": [
17
+ "bin",
14
18
  "dist",
15
19
  "src"
16
20
  ],
package/src/index.ts CHANGED
@@ -1,7 +1,6 @@
1
1
  export * from "./core/index.ts";
2
2
  export * from "./orchestrator/index.ts";
3
-
4
- // export * from "./utils/index.ts";
3
+ export * from "./utils/index.ts";
5
4
 
6
5
  import { startNodeProcesses } from "./orchestrator/start-node-processes.ts";
7
6
  export default startNodeProcesses;
@@ -119,16 +119,22 @@ export async function launcher(options: unknown) {
119
119
  return v;
120
120
  },
121
121
  );
122
+
123
+ const processesToStart = {} as Record<string, undefined | boolean>;
122
124
  for (const process of processes) {
125
+ const processName = process.name;
126
+ const start = process.start;
127
+ if (start === undefined) {
128
+ if (!(processName in processesToStart)) {
129
+ processesToStart[processName] = undefined;
130
+ }
131
+ } else {
132
+ processesToStart[processName] = start;
133
+ }
123
134
  registerProcess(configsManager, process);
124
135
  }
125
136
 
126
137
  const shutdowns: (() => Promise<void>)[] = [];
127
- let startProcesses = asArray<string>(config.start);
128
- if (startProcesses.length === 0) {
129
- startProcesses = processes.map((p) => p.name).filter(Boolean) as string[];
130
- }
131
-
132
138
  let initContext: (
133
139
  parent: Record<string, unknown>,
134
140
  ) => Record<string, unknown> = (context) => context;
@@ -142,7 +148,8 @@ export async function launcher(options: unknown) {
142
148
  throw new Error("Invalid launcher configuration: context");
143
149
  }
144
150
  }
145
- for (const processName of startProcesses) {
151
+ for (const [processName, start] of Object.entries(processesToStart)) {
152
+ if (start === false) continue;
146
153
  let context: Record<string, unknown> = {
147
154
  parent: rootContext,
148
155
  "fsm:name": processName,