@statewalker/fsm 0.36.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.
- package/README.md +112 -0
- package/bin/cli.js +1 -1
- package/dist/bin/node-runner-UJp8T_oP.d.ts +16 -0
- package/dist/bin/node-runner-UJp8T_oP.d.ts.map +1 -0
- package/dist/bin/node-runner.js +40 -0
- package/dist/bin/node-runner.js.map +1 -0
- package/dist/index-vTjnkbGW.d.ts +129 -0
- package/dist/index-vTjnkbGW.d.ts.map +1 -0
- package/dist/index.js +38 -779
- package/dist/index.js.map +1 -1
- package/dist/launcher-6VUDviTj.d.ts +48 -0
- package/dist/launcher-6VUDviTj.d.ts.map +1 -0
- package/dist/launcher-CASrMAOa.js +443 -0
- package/dist/launcher-CASrMAOa.js.map +1 -0
- package/package.json +8 -8
- package/src/bin/node-runner.ts +57 -0
- package/src/core/fsm-base-class.ts +1 -26
- package/src/core/fsm-process.ts +14 -11
- package/src/core/fsm-state.ts +1 -21
- package/src/core/index.ts +1 -1
- package/src/index.ts +0 -3
- package/src/orchestrator/handler-registry.ts +108 -0
- package/src/orchestrator/index.ts +15 -9
- package/src/orchestrator/launcher.ts +42 -141
- package/src/orchestrator/start-process.ts +141 -26
- package/src/utils/index.ts +0 -2
- package/src/utils/printer.ts +5 -11
- package/src/utils/tracer.ts +1 -1
- package/CHANGELOG.md +0 -59
- package/dist/index.d.ts +0 -335
- package/src/core/new-fsm-process.ts +0 -83
- package/src/orchestrator/constants.ts +0 -130
- package/src/orchestrator/is-generator.ts +0 -12
- package/src/orchestrator/process-config-manager.ts +0 -70
- package/src/orchestrator/resolve-module-refs.ts +0 -52
- package/src/orchestrator/start-node-processes.ts +0 -19
- package/src/orchestrator/start-processes.ts +0 -32
- package/src/orchestrator/types.ts +0 -34
- package/src/utils/handlers.ts +0 -35
- package/src/utils/process.ts +0 -26
- package/src/utils/transitions.ts +0 -56
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/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"]}
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../src/utils/printer.ts","../src/utils/tracer.ts"],"sourcesContent":["import type { FsmProcess } from \"../core/fsm-process.ts\";\nexport type Printer = (...args: unknown[]) => void;\nexport type PrinterConfig = {\n prefix?: string;\n print?: (...args: unknown[]) => void;\n lineNumbers?: boolean;\n};\n\nconst printerStore = new WeakMap<object, 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 setProcessPrinter(\n process: FsmProcess,\n config: PrinterConfig = {},\n) {\n const printer = preparePrinter(process, config);\n printerStore.set(process, printer);\n}\n\nexport function getProcessPrinter(process: FsmProcess): Printer {\n return printerStore.get(process) || console.log;\n}\n\nexport function getPrinter(state: { process: FsmProcess }): Printer {\n return printerStore.get(state) || 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: FsmState) => {\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"],"mappings":";;AAQA,MAAM,+BAAe,IAAI,SAA0B;AAEnD,SAAgB,eACd,SACA,EAAE,SAAS,IAAI,QAAQ,QAAQ,KAAK,cAAc,SACzC;CACT,IAAI,cAAc;CAClB,MAAM,cAAc;EAClB,IAAI,SAAS;AACb,OAAK,IAAI,IAAI,QAAQ,OAAO,QAAQ,GAAG,IAAI,EAAE,OAC3C,WAAU;AAEZ,SAAO;;CAET,MAAM,YAAY,oBAAoB,IAAI,EAAE,YAAY,GAAG,OAAO,KAAK;CACvE,MAAM,WAAW,GAAG,SAAoB,MAAM,QAAQ,WAAW,EAAE,GAAG,KAAK;AAC3E,QAAO;;AAGT,SAAgB,kBACd,SACA,SAAwB,EAAE,EAC1B;CACA,MAAM,UAAU,eAAe,SAAS,OAAO;AAC/C,cAAa,IAAI,SAAS,QAAQ;;AAGpC,SAAgB,kBAAkB,SAA8B;AAC9D,QAAO,aAAa,IAAI,QAAQ,IAAI,QAAQ;;AAG9C,SAAgB,WAAW,OAAyC;AAClE,QAAO,aAAa,IAAI,MAAM,IAAI,kBAAkB,MAAM,QAAQ;;;;ACpCpE,SAAgB,iBAAiB,SAAqB,OAAiB;AACrE,QAAO,QAAQ,eAAe,UAAoB;AAChD,iBAAe,OAAO,MAAM;GAC5B;;AAGJ,SAAgB,eAAe,OAAiB,OAAiB;AAC/D,OAAM,cAAc;AAElB,GADkB,SAAS,WAAW,MAAM,EAClC,IAAI,OAAO,IAAI,UAAU,MAAM,QAAQ,MAAM,IAAI;GAC3D;AACF,OAAM,OAAO,YAAY;AACvB,QAAM,QAAQ,SAAS,CAAC,KAAK,YAAY;AAEvC,IADkB,SAAS,WAAW,MAAM,EAClC,KAAK,MAAM,IAAI,gBAAgB,MAAM,QAAQ,MAAM,OAAO;IACpE;GACF"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
//#region src/core/fsm-state-config.d.ts
|
|
2
|
+
declare const STATE_ANY = "*";
|
|
3
|
+
declare const STATE_INITIAL = "";
|
|
4
|
+
declare const STATE_FINAL = "";
|
|
5
|
+
declare const EVENT_ANY = "*";
|
|
6
|
+
declare const EVENT_EMPTY = "";
|
|
7
|
+
type FsmStateKey = string;
|
|
8
|
+
type FsmEventKey = string;
|
|
9
|
+
type FsmStateConfig = {
|
|
10
|
+
key: FsmStateKey;
|
|
11
|
+
transitions?: [from: FsmStateKey, event: FsmEventKey, to: FsmStateKey][];
|
|
12
|
+
states?: FsmStateConfig[];
|
|
13
|
+
} & Record<string, unknown>;
|
|
14
|
+
//# sourceMappingURL=fsm-state-config.d.ts.map
|
|
15
|
+
//#endregion
|
|
16
|
+
//#region src/orchestrator/handler-registry.d.ts
|
|
17
|
+
/** A handler invoked when a state is entered. */
|
|
18
|
+
type StageHandler<C = Record<string, unknown>> = (context: C) => void | (() => void | Promise<void>) | Promise<void | (() => void | Promise<void>)> | AsyncGenerator<string, void, unknown> | Generator<string, void, unknown>;
|
|
19
|
+
/** Maps a state key to a handler module key for auto-discovery. */
|
|
20
|
+
type PatternFn = (state: string) => string;
|
|
21
|
+
interface HandlerRegistry {
|
|
22
|
+
register(processName: string, config: FsmStateConfig): () => void;
|
|
23
|
+
registerHandlers(processName: string, ...modules: unknown[]): () => void;
|
|
24
|
+
getConfig(processName: string): FsmStateConfig;
|
|
25
|
+
getLoader<C>(processName: string, patterns?: PatternFn[]): (state: string, event?: string) => StageHandler<C>[];
|
|
26
|
+
}
|
|
27
|
+
declare function createHandlerRegistry(): HandlerRegistry;
|
|
28
|
+
declare function toStageHandlers<C>(value: unknown, accept: (key: string, value: unknown) => boolean): StageHandler<C>[];
|
|
29
|
+
//#endregion
|
|
30
|
+
//#region src/orchestrator/launcher.d.ts
|
|
31
|
+
declare const KEY_LAUNCH_PROCESS = "fsm:launch";
|
|
32
|
+
interface LauncherConfig {
|
|
33
|
+
processes: ProcessDef[];
|
|
34
|
+
start?: string[];
|
|
35
|
+
context?: (parent: Record<string, unknown>) => Record<string, unknown>;
|
|
36
|
+
}
|
|
37
|
+
interface ProcessDef {
|
|
38
|
+
name: string;
|
|
39
|
+
config: FsmStateConfig;
|
|
40
|
+
handlers?: (StageHandler | Record<string, StageHandler | StageHandler[]>)[];
|
|
41
|
+
start?: boolean;
|
|
42
|
+
}
|
|
43
|
+
declare function launcher(config: LauncherConfig): Promise<() => Promise<void>>;
|
|
44
|
+
//# sourceMappingURL=launcher.d.ts.map
|
|
45
|
+
|
|
46
|
+
//#endregion
|
|
47
|
+
export { HandlerRegistry as a, toStageHandlers as c, FsmEventKey as d, FsmStateConfig as f, STATE_INITIAL as g, STATE_FINAL as h, launcher as i, EVENT_ANY as l, STATE_ANY as m, LauncherConfig as n, StageHandler as o, FsmStateKey as p, ProcessDef as r, createHandlerRegistry as s, KEY_LAUNCH_PROCESS as t, EVENT_EMPTY as u };
|
|
48
|
+
//# sourceMappingURL=launcher-6VUDviTj.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"launcher-6VUDviTj.d.ts","names":[],"sources":["../src/core/fsm-state-config.ts","../src/orchestrator/handler-registry.ts","../src/orchestrator/launcher.ts"],"mappings":";cAAa,SAAA;AAAA,cACA,aAAA,GADS,EAAA;AACT,cACA,WAAA,GADa,EAAA;AACb,cACA,SAAA,GADW,GAAA;AACX,cACA,WAAA,GADS,EAAA;AACT,KAED,WAAA,GAFY,MAAA;AAEZ,KACA,WAAA,GADW,MAAA;AACX,KACA,cAAA,GADW;EACX,GAAA,EACL,WADK;EAAc,WAAA,CAAA,EAAA,CAAA,IAAA,EAEH,WAFG,EAAA,KAAA,EAEiB,WAFjB,EAAA,EAAA,EAEkC,WAFlC,CAAA,EAAA;QACnB,CAAA,EAEI,cAFJ,EAAA;IAGH,MAFmB,CAAA,MAAA,EAAA,OAAA,CAAA;;;;AAVvB;AACa,KCED,YDFc,CAAA,ICEG,MDFH,CAAA,MAAA,EAAA,OAAA,CAAA,CAAA,GAAA,CAAA,OAAA,ECGf,CDHe,EAAA,GAAA,IAAA,GAAA,CAAA,GAAA,GAAA,IAAA,GCMR,ODNQ,CAAA,IAAA,CAAA,CAAA,GCOtB,ODPsB,CAAA,IAAA,GAAA,CAAA,GAAA,GAAA,IAAA,GCOO,ODPP,CAAA,IAAA,CAAA,CAAA,CAAA,GCQtB,cDRsB,CAAA,MAAA,EAAA,IAAA,EAAA,OAAA,CAAA,GCStB,SDTsB,CAAA,MAAA,EAAA,IAAA,EAAA,OAAA,CAAA;AAC1B;AACA,KCUK,SAAA,GDViB,CAAA,KAAA,EAAA,MAAA,EAAA,GAAA,MAAA;AACT,UCkBI,eAAA,CDlBO;EAEZ,QAAA,CAAA,WAAW,EAAA,MAAA,EAAA,MAAA,ECiBiB,cDjBjB,CAAA,EAAA,GAAA,GAAA,IAAA;EACX,gBAAW,CAAA,WAAA,EAAA,MAAA,EAAA,GAAA,OAAA,EAAA,OAAA,EAAA,CAAA,EAAA,GAAA,GAAA,IAAA;EACX,SAAA,CAAA,WAAc,EAAA,MAAA,CAAA,ECiBQ,cDjBR;EAAA,SAAA,CAAA,CAAA,CAAA,CAAA,WAAA,EAAA,MAAA,EAAA,QAAA,CAAA,ECoBX,SDpBW,EAAA,CAAA,EAAA,CAAA,KAAA,EAAA,MAAA,EAAA,KAAA,CAAA,EAAA,MAAA,EAAA,GCqBc,YDrBd,CCqB2B,CDrB3B,CAAA,EAAA;;AAEH,iBCsBP,qBAAA,CAAA,CDtBO,ECsBkB,eDtBlB;AAAoB,iBCiF3B,eDjF2B,CAAA,CAAA,CAAA,CAAA,KAAA,EAAA,OAAA,EAAA,MAAA,EAAA,CAAA,GAAA,EAAA,MAAA,EAAA,KAAA,EAAA,OAAA,EAAA,GAAA,OAAA,CAAA,ECoFxC,YDpFwC,CCoF3B,CDpF2B,CAAA,EAAA;;;AAT9B,cEIA,kBAAA,GFJa,YAAA;AACb,UEKI,cAAA,CFLO;EACX,SAAA,EEKA,UFLS,EAAA;EACT,KAAA,CAAA,EAAA,MAAW,EAAA;EAEZ,OAAA,CAAA,EAAA,CAAA,MAAW,EEIF,MFJE,CAAA,MAAA,EAAA,OAAA,CAAA,EAAA,GEI0B,MFJ1B,CAAA,MAAA,EAAA,OAAA,CAAA;AACvB;AACY,UEKK,UAAA,CFLS;EAAA,IAAA,EAAA,MAAA;QACnB,EEMG,cFNH;UACgB,CAAA,EAAA,CEMT,YFNS,GEMM,MFNN,CAAA,MAAA,EEMqB,YFNrB,GEMoC,YFNpC,EAAA,CAAA,CAAA,EAAA;OAAoB,CAAA,EAAA,OAAA;;AAChC,iBESW,QAAA,CFTX,MAAA,EEUD,cFVC,CAAA,EEWR,OFXQ,CAAA,GAAA,GEWM,OFXN,CAAA,IAAA,CAAA,CAAA"}
|
|
@@ -0,0 +1,443 @@
|
|
|
1
|
+
//#region src/core/fsm-base-class.ts
|
|
2
|
+
var FsmBaseClass = class {
|
|
3
|
+
constructor() {
|
|
4
|
+
this.handlers = {};
|
|
5
|
+
}
|
|
6
|
+
_addHandler(type, handler, direct = true) {
|
|
7
|
+
let list = this.handlers[type];
|
|
8
|
+
if (!list) list = this.handlers[type] = [];
|
|
9
|
+
const h = handler;
|
|
10
|
+
direct ? list.push(h) : list.unshift(h);
|
|
11
|
+
return () => this._removeHandler(type, h);
|
|
12
|
+
}
|
|
13
|
+
_removeHandler(type, handler) {
|
|
14
|
+
let list = this.handlers[type];
|
|
15
|
+
if (!list) return;
|
|
16
|
+
list = list.filter((h) => h !== handler);
|
|
17
|
+
if (list.length > 0) this.handlers[type] = list;
|
|
18
|
+
else delete this.handlers[type];
|
|
19
|
+
}
|
|
20
|
+
async _runHandler(type, ...args) {
|
|
21
|
+
const list = this.handlers[type] || [];
|
|
22
|
+
for (const handler of list) try {
|
|
23
|
+
await handler(...args);
|
|
24
|
+
} catch (error) {
|
|
25
|
+
await this._handleError(error);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
async _handleError(error) {
|
|
29
|
+
console.error(error);
|
|
30
|
+
}
|
|
31
|
+
};
|
|
32
|
+
function bindMethods(obj, ...methods) {
|
|
33
|
+
const o = obj;
|
|
34
|
+
for (const methodName of methods) {
|
|
35
|
+
const method = o[methodName];
|
|
36
|
+
if (typeof method !== "function") continue;
|
|
37
|
+
o[methodName] = method.bind(o);
|
|
38
|
+
}
|
|
39
|
+
return obj;
|
|
40
|
+
}
|
|
41
|
+
//#endregion
|
|
42
|
+
//#region src/core/fsm-state.ts
|
|
43
|
+
var FsmState = class extends FsmBaseClass {
|
|
44
|
+
constructor(process, parent, key, descriptor) {
|
|
45
|
+
super();
|
|
46
|
+
this.process = process;
|
|
47
|
+
this.key = key;
|
|
48
|
+
this.parent = parent;
|
|
49
|
+
this.descriptor = descriptor;
|
|
50
|
+
bindMethods(this, "onEnter", "onExit", "dump", "restore", "onStateError");
|
|
51
|
+
}
|
|
52
|
+
onEnter(handler) {
|
|
53
|
+
return this._addHandler("onEnter", handler, true);
|
|
54
|
+
}
|
|
55
|
+
onExit(handler) {
|
|
56
|
+
return this._addHandler("onExit", handler, false);
|
|
57
|
+
}
|
|
58
|
+
onStateError(handler) {
|
|
59
|
+
return this._addHandler("onStateError", handler);
|
|
60
|
+
}
|
|
61
|
+
dump(handler) {
|
|
62
|
+
return this._addHandler("dump", handler, true);
|
|
63
|
+
}
|
|
64
|
+
restore(handler) {
|
|
65
|
+
return this._addHandler("restore", handler, true);
|
|
66
|
+
}
|
|
67
|
+
async _handleError(error) {
|
|
68
|
+
await this._runHandler("onStateError", this, error);
|
|
69
|
+
await this.process._handleStateError(this, error);
|
|
70
|
+
}
|
|
71
|
+
};
|
|
72
|
+
//#endregion
|
|
73
|
+
//#region src/core/fsm-state-config.ts
|
|
74
|
+
const STATE_ANY = "*";
|
|
75
|
+
const STATE_INITIAL = "";
|
|
76
|
+
const STATE_FINAL = "";
|
|
77
|
+
const EVENT_ANY = "*";
|
|
78
|
+
const EVENT_EMPTY = "";
|
|
79
|
+
//#endregion
|
|
80
|
+
//#region src/core/fsm-state-descriptor.ts
|
|
81
|
+
var FsmStateDescriptor = class FsmStateDescriptor {
|
|
82
|
+
constructor() {
|
|
83
|
+
this.transitions = {};
|
|
84
|
+
this.states = {};
|
|
85
|
+
}
|
|
86
|
+
static build(config) {
|
|
87
|
+
const descriptor = new FsmStateDescriptor();
|
|
88
|
+
for (const [from, event, to] of config.transitions || []) {
|
|
89
|
+
let index = descriptor.transitions[from];
|
|
90
|
+
if (!index) index = descriptor.transitions[from] = {};
|
|
91
|
+
index[event] = to;
|
|
92
|
+
}
|
|
93
|
+
if (config.states) for (const substateConfig of config.states) descriptor.states[substateConfig.key] = FsmStateDescriptor.build(substateConfig);
|
|
94
|
+
return descriptor;
|
|
95
|
+
}
|
|
96
|
+
getTargetStateKey(stateKey, eventKey) {
|
|
97
|
+
const pairs = [
|
|
98
|
+
[stateKey, eventKey],
|
|
99
|
+
["*", eventKey],
|
|
100
|
+
[stateKey, "*"],
|
|
101
|
+
["*", "*"]
|
|
102
|
+
];
|
|
103
|
+
let targetKey;
|
|
104
|
+
for (let i = 0, len = pairs.length; targetKey === void 0 && i < len; i++) {
|
|
105
|
+
const [stateKey, eventKey] = pairs[i];
|
|
106
|
+
const stateTransitions = this.transitions[stateKey];
|
|
107
|
+
if (!stateTransitions) continue;
|
|
108
|
+
targetKey = stateTransitions[eventKey];
|
|
109
|
+
}
|
|
110
|
+
return targetKey !== void 0 ? targetKey : "";
|
|
111
|
+
}
|
|
112
|
+
};
|
|
113
|
+
//#endregion
|
|
114
|
+
//#region src/core/fsm-process.ts
|
|
115
|
+
const STATUS_NONE = 0;
|
|
116
|
+
const STATUS_FIRST = 1;
|
|
117
|
+
const STATUS_NEXT = 2;
|
|
118
|
+
const STATUS_LEAF = 4;
|
|
119
|
+
const STATUS_LAST = 8;
|
|
120
|
+
const STATUS_FINISHED = 16;
|
|
121
|
+
const STATUS_ENTER = 3;
|
|
122
|
+
const STATUS_EXIT = 12;
|
|
123
|
+
var FsmProcess = class extends FsmBaseClass {
|
|
124
|
+
constructor(config) {
|
|
125
|
+
super();
|
|
126
|
+
this.running = false;
|
|
127
|
+
this.mask = 4;
|
|
128
|
+
this.status = 0;
|
|
129
|
+
this.rootDescriptor = FsmStateDescriptor.build(config);
|
|
130
|
+
this.config = config;
|
|
131
|
+
bindMethods(this, "dispatch", "dump", "restore");
|
|
132
|
+
}
|
|
133
|
+
async shutdown(event) {
|
|
134
|
+
while (this.state) {
|
|
135
|
+
this.event = event;
|
|
136
|
+
this.status = 16;
|
|
137
|
+
await this.state?._runHandler("onExit", this.state);
|
|
138
|
+
this.state = this.state.parent;
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
async dispatch(event) {
|
|
142
|
+
this.nextEvent = event;
|
|
143
|
+
if (!this.running && !(this.status & 16)) {
|
|
144
|
+
this.running = true;
|
|
145
|
+
try {
|
|
146
|
+
this.event = this.nextEvent;
|
|
147
|
+
this.nextEvent = void 0;
|
|
148
|
+
while (true) {
|
|
149
|
+
if (this.status & 12) await this.state?._runHandler("onExit", this.state);
|
|
150
|
+
if (!await this._update()) break;
|
|
151
|
+
if (this.status & 3) await this.state?._runHandler("onEnter", this.state);
|
|
152
|
+
if (this.status & this.mask) break;
|
|
153
|
+
}
|
|
154
|
+
} finally {
|
|
155
|
+
this.running = false;
|
|
156
|
+
}
|
|
157
|
+
const nextEvent = this.nextEvent;
|
|
158
|
+
if (nextEvent !== void 0) return Promise.resolve().then(() => this.dispatch(nextEvent));
|
|
159
|
+
}
|
|
160
|
+
return !(this.status & 16);
|
|
161
|
+
}
|
|
162
|
+
async dump(...args) {
|
|
163
|
+
const dumpState = async (state) => {
|
|
164
|
+
const stateDump = {
|
|
165
|
+
key: state.key,
|
|
166
|
+
data: {}
|
|
167
|
+
};
|
|
168
|
+
await state._runHandler("dump", state, stateDump.data, ...args);
|
|
169
|
+
return stateDump;
|
|
170
|
+
};
|
|
171
|
+
const dumpStates = async (state, stack = []) => {
|
|
172
|
+
if (!state) return stack;
|
|
173
|
+
state.parent && await dumpStates(state.parent, stack);
|
|
174
|
+
stack.push(await dumpState(state));
|
|
175
|
+
return stack;
|
|
176
|
+
};
|
|
177
|
+
return {
|
|
178
|
+
status: this.status,
|
|
179
|
+
event: this.event,
|
|
180
|
+
stack: await dumpStates(this.state)
|
|
181
|
+
};
|
|
182
|
+
}
|
|
183
|
+
async restore(dump, ...args) {
|
|
184
|
+
this.status = dump.status || 0;
|
|
185
|
+
this.event = dump.event;
|
|
186
|
+
this.state = void 0;
|
|
187
|
+
for (let i = 0; i < dump.stack.length; i++) {
|
|
188
|
+
const stateDump = dump.stack[i];
|
|
189
|
+
this.state = this.state ? await this._newSubstate(this.state, stateDump.key) : await this._newState(void 0, stateDump.key, this.rootDescriptor);
|
|
190
|
+
await this.state._runHandler("restore", this.state, stateDump.data, ...args);
|
|
191
|
+
}
|
|
192
|
+
return this;
|
|
193
|
+
}
|
|
194
|
+
onStateCreate(handler) {
|
|
195
|
+
return this._addHandler("onStateCreate", handler, true);
|
|
196
|
+
}
|
|
197
|
+
onStateError(handler) {
|
|
198
|
+
return this._addHandler("onStateError", handler);
|
|
199
|
+
}
|
|
200
|
+
async _handleStateError(state, error) {
|
|
201
|
+
await this._runHandler("onStateError", state, error);
|
|
202
|
+
this._handleError(error);
|
|
203
|
+
}
|
|
204
|
+
async _newState(parent, key, descriptor) {
|
|
205
|
+
const state = new FsmState(this, parent, key, descriptor);
|
|
206
|
+
await this._runHandler("onStateCreate", state);
|
|
207
|
+
return state;
|
|
208
|
+
}
|
|
209
|
+
async _getSubstate(parent, prevStateKey) {
|
|
210
|
+
if (!parent) return;
|
|
211
|
+
const toState = parent.descriptor?.getTargetStateKey(prevStateKey || "", this.event || "") || "";
|
|
212
|
+
if (!toState) return;
|
|
213
|
+
return this._newSubstate(parent, toState);
|
|
214
|
+
}
|
|
215
|
+
async _newSubstate(parent, toState) {
|
|
216
|
+
let descriptor;
|
|
217
|
+
for (let state = parent; !descriptor && state; state = state.parent) descriptor = state.descriptor?.states[toState];
|
|
218
|
+
return this._newState(parent, toState, descriptor);
|
|
219
|
+
}
|
|
220
|
+
async _update() {
|
|
221
|
+
if (this.status & 16) return false;
|
|
222
|
+
const nextState = this.status !== 0 ? this.status & 3 ? await this._getSubstate(this.state, "") : await this._getSubstate(this.state?.parent, this.state?.key) : await this._newState(void 0, this.config.key, this.rootDescriptor);
|
|
223
|
+
if (nextState !== void 0) {
|
|
224
|
+
this.state = nextState;
|
|
225
|
+
this.status = this.status & 12 ? 2 : 1;
|
|
226
|
+
} else {
|
|
227
|
+
if (this.status & 12) {
|
|
228
|
+
this.state = this.state?.parent;
|
|
229
|
+
this.status = 8;
|
|
230
|
+
} else this.status = 4;
|
|
231
|
+
if (!this.state) this.status = 16;
|
|
232
|
+
}
|
|
233
|
+
return !(this.status & 16);
|
|
234
|
+
}
|
|
235
|
+
};
|
|
236
|
+
//#endregion
|
|
237
|
+
//#region src/orchestrator/handler-registry.ts
|
|
238
|
+
const DEFAULT_PATTERNS = [
|
|
239
|
+
(state) => state,
|
|
240
|
+
(state) => `${state}Controller`,
|
|
241
|
+
(state) => `${state}View`,
|
|
242
|
+
(state) => `${state}Trigger`
|
|
243
|
+
];
|
|
244
|
+
function createHandlerRegistry() {
|
|
245
|
+
const configs = {};
|
|
246
|
+
const handlers = {};
|
|
247
|
+
return {
|
|
248
|
+
register(processName, config) {
|
|
249
|
+
configs[processName] = config;
|
|
250
|
+
return () => {
|
|
251
|
+
delete configs[processName];
|
|
252
|
+
};
|
|
253
|
+
},
|
|
254
|
+
registerHandlers(processName, ...modules) {
|
|
255
|
+
let list = handlers[processName];
|
|
256
|
+
if (!list) list = handlers[processName] = [];
|
|
257
|
+
list.push(modules);
|
|
258
|
+
return () => {
|
|
259
|
+
const l = handlers[processName];
|
|
260
|
+
if (!l) return;
|
|
261
|
+
const idx = l.indexOf(modules);
|
|
262
|
+
if (idx !== -1) l.splice(idx, 1);
|
|
263
|
+
if (l.length === 0) delete handlers[processName];
|
|
264
|
+
};
|
|
265
|
+
},
|
|
266
|
+
getConfig(processName) {
|
|
267
|
+
const config = configs[processName];
|
|
268
|
+
if (!config) throw new Error(`No config registered for process "${processName}"`);
|
|
269
|
+
return config;
|
|
270
|
+
},
|
|
271
|
+
getLoader(processName, patterns) {
|
|
272
|
+
const config = this.getConfig(processName);
|
|
273
|
+
const pats = patterns ?? DEFAULT_PATTERNS;
|
|
274
|
+
return (stateKey) => {
|
|
275
|
+
const modulesKeys = [];
|
|
276
|
+
if (stateKey === config.key) modulesKeys.push("default");
|
|
277
|
+
for (const pattern of pats) modulesKeys.push(pattern(stateKey));
|
|
278
|
+
const keysSet = new Set(modulesKeys);
|
|
279
|
+
return toStageHandlers(handlers[processName] ?? [], (key) => keysSet.has(key));
|
|
280
|
+
};
|
|
281
|
+
}
|
|
282
|
+
};
|
|
283
|
+
}
|
|
284
|
+
function toStageHandlers(value, accept) {
|
|
285
|
+
return visit(value);
|
|
286
|
+
function visit(val) {
|
|
287
|
+
if (!val) return [];
|
|
288
|
+
if (typeof val === "function") return [val];
|
|
289
|
+
if (typeof val !== "object") return [];
|
|
290
|
+
if (Array.isArray(val)) return val.flatMap(visit);
|
|
291
|
+
return Object.entries(val).flatMap(([key, value]) => {
|
|
292
|
+
return accept(key, value) ? visit(value) : [];
|
|
293
|
+
});
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
//#endregion
|
|
297
|
+
//#region src/orchestrator/start-process.ts
|
|
298
|
+
const KEY_DISPATCH = "fsm:dispatch";
|
|
299
|
+
const KEY_TERMINATE = "fsm:terminate";
|
|
300
|
+
const KEY_STATES = "fsm:states";
|
|
301
|
+
const KEY_EVENT = "fsm:event";
|
|
302
|
+
function getStateTransitions(state) {
|
|
303
|
+
const result = [];
|
|
304
|
+
const index = {};
|
|
305
|
+
if (state) {
|
|
306
|
+
let prevStateKey = state.key;
|
|
307
|
+
for (let parent = state.parent; parent; parent = parent.parent) {
|
|
308
|
+
if (!parent.descriptor) continue;
|
|
309
|
+
result.push(...getTransitionsFromDescriptor(parent.descriptor, prevStateKey, index));
|
|
310
|
+
prevStateKey = parent.key;
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
return result.reverse();
|
|
314
|
+
}
|
|
315
|
+
function getTransitionsFromDescriptor(descriptor, prevStateKey, index) {
|
|
316
|
+
const result = [];
|
|
317
|
+
const prevStateKeys = [prevStateKey, "*"];
|
|
318
|
+
for (const prevKey of prevStateKeys) {
|
|
319
|
+
const targets = descriptor.transitions[prevKey];
|
|
320
|
+
if (targets) for (const [event, target] of Object.entries(targets)) {
|
|
321
|
+
if (index[event]) continue;
|
|
322
|
+
if (target) index[event] = true;
|
|
323
|
+
result.push([
|
|
324
|
+
prevStateKey,
|
|
325
|
+
event,
|
|
326
|
+
target
|
|
327
|
+
]);
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
return result;
|
|
331
|
+
}
|
|
332
|
+
function isStateTransitionEnabled(process, event) {
|
|
333
|
+
const transitions = getStateTransitions(process.state);
|
|
334
|
+
for (const [, ev] of transitions) if (ev === event) return true;
|
|
335
|
+
return false;
|
|
336
|
+
}
|
|
337
|
+
function isGenerator(value) {
|
|
338
|
+
return typeof value === "object" && value !== null && "next" in value && typeof value.next === "function";
|
|
339
|
+
}
|
|
340
|
+
async function startProcess(context, config, load, startEvent = "") {
|
|
341
|
+
let terminated = false;
|
|
342
|
+
const ctx = context;
|
|
343
|
+
const process = new FsmProcess(config);
|
|
344
|
+
const statesStack = [];
|
|
345
|
+
process.onStateCreate((state) => {
|
|
346
|
+
state.onEnter(async () => {
|
|
347
|
+
statesStack.push(state.key);
|
|
348
|
+
ctx[KEY_STATES] = [...statesStack];
|
|
349
|
+
ctx[KEY_EVENT] = process.event;
|
|
350
|
+
const modules = await load(state.key, process.event) ?? [];
|
|
351
|
+
for (const module of Array.isArray(modules) ? modules : [modules]) {
|
|
352
|
+
const result = await module?.(context);
|
|
353
|
+
if (isGenerator(result)) {
|
|
354
|
+
let stateExited = false;
|
|
355
|
+
state.onExit(() => {
|
|
356
|
+
stateExited = true;
|
|
357
|
+
result.return?.(void 0);
|
|
358
|
+
});
|
|
359
|
+
(async () => {
|
|
360
|
+
try {
|
|
361
|
+
for await (const event of result) {
|
|
362
|
+
if (stateExited || terminated) break;
|
|
363
|
+
await dispatch(event);
|
|
364
|
+
if (stateExited || terminated) break;
|
|
365
|
+
}
|
|
366
|
+
} catch {}
|
|
367
|
+
})();
|
|
368
|
+
} else if (typeof result === "function") state.onExit(result);
|
|
369
|
+
}
|
|
370
|
+
});
|
|
371
|
+
state.onExit(() => {
|
|
372
|
+
statesStack.pop();
|
|
373
|
+
ctx[KEY_STATES] = [...statesStack];
|
|
374
|
+
ctx[KEY_EVENT] = process.event;
|
|
375
|
+
});
|
|
376
|
+
});
|
|
377
|
+
async function dispatch(event) {
|
|
378
|
+
if (event !== void 0 && isStateTransitionEnabled(process, event)) await process.dispatch(event);
|
|
379
|
+
}
|
|
380
|
+
async function terminate() {
|
|
381
|
+
terminated = true;
|
|
382
|
+
await process.shutdown();
|
|
383
|
+
}
|
|
384
|
+
async function dumpProcess(...args) {
|
|
385
|
+
return process.dump(...args);
|
|
386
|
+
}
|
|
387
|
+
async function restoreProcess(dumpData, ...args) {
|
|
388
|
+
statesStack.length = 0;
|
|
389
|
+
terminated = false;
|
|
390
|
+
await process.restore(dumpData, ...args);
|
|
391
|
+
for (let state = process.state; state; state = state.parent) statesStack.unshift(state.key);
|
|
392
|
+
ctx[KEY_STATES] = [...statesStack];
|
|
393
|
+
ctx[KEY_EVENT] = process.event;
|
|
394
|
+
}
|
|
395
|
+
ctx[KEY_DISPATCH] = dispatch;
|
|
396
|
+
ctx[KEY_TERMINATE] = terminate;
|
|
397
|
+
await process.dispatch(startEvent);
|
|
398
|
+
return {
|
|
399
|
+
shutdown: terminate,
|
|
400
|
+
dump: dumpProcess,
|
|
401
|
+
restore: restoreProcess
|
|
402
|
+
};
|
|
403
|
+
}
|
|
404
|
+
/** @deprecated Use `startProcess` instead */
|
|
405
|
+
const startFsmProcess = startProcess;
|
|
406
|
+
//#endregion
|
|
407
|
+
//#region src/orchestrator/launcher.ts
|
|
408
|
+
const KEY_LAUNCH_PROCESS = "fsm:launch";
|
|
409
|
+
async function launcher(config) {
|
|
410
|
+
const registry = createHandlerRegistry();
|
|
411
|
+
async function launch(processName, context, startEvent = "start") {
|
|
412
|
+
return startProcess(context, registry.getConfig(processName), registry.getLoader(processName), startEvent);
|
|
413
|
+
}
|
|
414
|
+
const rootContext = { [KEY_LAUNCH_PROCESS]: launch };
|
|
415
|
+
const initContext = config.context ?? ((ctx) => ctx);
|
|
416
|
+
const startSet = config.start ? new Set(config.start) : void 0;
|
|
417
|
+
for (const def of config.processes) {
|
|
418
|
+
registry.register(def.name, def.config);
|
|
419
|
+
if (def.handlers?.length) registry.registerHandlers(def.name, ...def.handlers);
|
|
420
|
+
}
|
|
421
|
+
const shutdowns = [];
|
|
422
|
+
const seen = /* @__PURE__ */ new Set();
|
|
423
|
+
for (const def of config.processes) {
|
|
424
|
+
if (seen.has(def.name)) continue;
|
|
425
|
+
seen.add(def.name);
|
|
426
|
+
if (def.start === false) continue;
|
|
427
|
+
if (startSet && !startSet.has(def.name)) continue;
|
|
428
|
+
let context = {
|
|
429
|
+
parent: rootContext,
|
|
430
|
+
"fsm:name": def.name
|
|
431
|
+
};
|
|
432
|
+
context = initContext(context) ?? context;
|
|
433
|
+
const handle = await launch(def.name, context);
|
|
434
|
+
shutdowns.push(handle.shutdown);
|
|
435
|
+
}
|
|
436
|
+
return async () => {
|
|
437
|
+
for (const shutdown of shutdowns) await shutdown();
|
|
438
|
+
};
|
|
439
|
+
}
|
|
440
|
+
//#endregion
|
|
441
|
+
export { bindMethods as A, EVENT_ANY as C, STATE_INITIAL as D, STATE_FINAL as E, FsmState as O, FsmStateDescriptor as S, STATE_ANY as T, STATUS_FIRST as _, KEY_STATES as a, STATUS_NEXT as b, isStateTransitionEnabled as c, createHandlerRegistry as d, toStageHandlers as f, STATUS_FINISHED as g, STATUS_EXIT as h, KEY_EVENT as i, FsmBaseClass as k, startFsmProcess as l, STATUS_ENTER as m, launcher as n, KEY_TERMINATE as o, FsmProcess as p, KEY_DISPATCH as r, getStateTransitions as s, KEY_LAUNCH_PROCESS as t, startProcess as u, STATUS_LAST as v, EVENT_EMPTY as w, STATUS_NONE as x, STATUS_LEAF as y };
|
|
442
|
+
|
|
443
|
+
//# sourceMappingURL=launcher-CASrMAOa.js.map
|