@camcima/finita 2.1.0 → 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/Event.ts","../src/State.ts","../src/Transition.ts","../src/util/StateCollectionMerger.ts","../src/error/DuplicateStateError.ts","../src/StateCollection.ts","../src/Process.ts","../src/selector/OneOrNoneActiveTransition.ts","../src/mutex/NullMutex.ts","../src/Dispatcher.ts","../src/filter/ActiveTransitionFilter.ts","../src/error/WrongEventForStateError.ts","../src/error/LockCanNotBeAcquiredError.ts","../src/Statemachine.ts","../src/condition/Tautology.ts","../src/condition/Contradiction.ts","../src/condition/CallbackCondition.ts","../src/condition/Timeout.ts","../src/condition/AndComposite.ts","../src/condition/OrComposite.ts","../src/condition/Not.ts","../src/observer/CallbackObserver.ts","../src/observer/StatefulStatusChanger.ts","../src/observer/OnEnterObserver.ts","../src/observer/TransitionLogger.ts","../src/filter/FilterStateByEvent.ts","../src/filter/FilterStateByTransition.ts","../src/filter/FilterStateByFinalState.ts","../src/filter/FilterTransitionByEvent.ts","../src/selector/ScoreTransition.ts","../src/selector/WeightTransition.ts","../src/mutex/LockAdapterMutex.ts","../src/mutex/MutexFactory.ts","../src/factory/Factory.ts","../src/factory/SingleProcessDetector.ts","../src/factory/AbstractNamedProcessDetector.ts","../src/factory/StatefulStateNameDetector.ts","../src/util/SetupHelper.ts","../src/graph/GraphBuilder.ts"],"sourcesContent":["// MaybePromise type\nexport type { MaybePromise } from \"./MaybePromise.js\";\n\n// Core classes\nexport { Event } from \"./Event.js\";\nexport { State } from \"./State.js\";\nexport { Transition } from \"./Transition.js\";\nexport { StateCollection } from \"./StateCollection.js\";\nexport { Process } from \"./Process.js\";\nexport { Statemachine } from \"./Statemachine.js\";\nexport { Dispatcher } from \"./Dispatcher.js\";\n\n// Interfaces\nexport type {\n Named,\n Metadata,\n Weighted,\n Observer,\n ObservableSubject,\n ConditionInterface,\n EventInterface,\n TransitionInterface,\n StateInterface,\n StateCollectionInterface,\n ProcessInterface,\n StatemachineInterface,\n MutexInterface,\n MutexFactoryInterface,\n LockAdapterInterface,\n TransitionSelectorInterface,\n ProcessDetectorInterface,\n StateNameDetectorInterface,\n FactoryInterface,\n StatefulInterface,\n LastStateHasChangedDateInterface,\n DispatcherInterface,\n CallbackInterface,\n LoggerInterface,\n} from \"./interfaces/index.js\";\n\n// Conditions\nexport {\n Tautology,\n Contradiction,\n CallbackCondition,\n Timeout,\n AndComposite,\n OrComposite,\n Not,\n} from \"./condition/index.js\";\nexport type { ConditionCallbackFn } from \"./condition/index.js\";\n\n// Observers\nexport {\n CallbackObserver,\n StatefulStatusChanger,\n OnEnterObserver,\n TransitionLogger,\n} from \"./observer/index.js\";\n\n// Filters\nexport {\n ActiveTransitionFilter,\n FilterStateByEvent,\n FilterStateByTransition,\n FilterStateByFinalState,\n FilterTransitionByEvent,\n} from \"./filter/index.js\";\n\n// Selectors\nexport {\n OneOrNoneActiveTransition,\n ScoreTransition,\n WeightTransition,\n} from \"./selector/index.js\";\n\n// Mutex\nexport { NullMutex, LockAdapterMutex, MutexFactory } from \"./mutex/index.js\";\nexport type { StringConverter } from \"./mutex/index.js\";\n\n// Factory\nexport {\n Factory,\n SingleProcessDetector,\n AbstractNamedProcessDetector,\n StatefulStateNameDetector,\n} from \"./factory/index.js\";\n\n// Utils\nexport { SetupHelper, StateCollectionMerger } from \"./util/index.js\";\n\n// Graph\nexport { GraphBuilder } from \"./graph/index.js\";\nexport type {\n Graph,\n GraphNode,\n GraphEdge,\n DotOptions,\n MermaidOptions,\n} from \"./graph/index.js\";\n\n// Errors\nexport {\n WrongEventForStateError,\n LockCanNotBeAcquiredError,\n DuplicateStateError,\n} from \"./error/index.js\";\n","import type { EventInterface } from \"./interfaces/EventInterface.js\";\nimport type { Observer } from \"./interfaces/Observer.js\";\n\nexport class Event implements EventInterface {\n private readonly name: string;\n private readonly observers: Set<Observer> = new Set();\n private readonly metadata: Map<string, unknown> = new Map();\n private invokeArgs: unknown[] = [];\n\n constructor(name: string) {\n this.name = name;\n }\n\n getName(): string {\n return this.name;\n }\n\n getInvokeArgs(): unknown[] {\n return this.invokeArgs;\n }\n\n async invoke(...args: unknown[]): Promise<void> {\n this.invokeArgs = args;\n try {\n await this.notify();\n } finally {\n this.invokeArgs = [];\n }\n }\n\n attach(observer: Observer): void {\n this.observers.add(observer);\n }\n\n detach(observer: Observer): void {\n this.observers.delete(observer);\n }\n\n async notify(): Promise<void> {\n for (const observer of this.observers) {\n await observer.update(this);\n }\n }\n\n getObservers(): Iterable<Observer> {\n return this.observers;\n }\n\n getMetadata(): Record<string, unknown> {\n return Object.fromEntries(this.metadata);\n }\n\n getMetadataValue(key: string): unknown {\n return this.metadata.get(key);\n }\n\n setMetadataValue(key: string, value: unknown): void {\n this.metadata.set(key, value);\n }\n\n hasMetadataValue(key: string): boolean {\n return this.metadata.has(key);\n }\n\n deleteMetadataValue(key: string): void {\n this.metadata.delete(key);\n }\n}\n","import type { StateInterface } from \"./interfaces/StateInterface.js\";\nimport type { TransitionInterface } from \"./interfaces/TransitionInterface.js\";\nimport type { EventInterface } from \"./interfaces/EventInterface.js\";\nimport { Event } from \"./Event.js\";\n\nexport class State implements StateInterface {\n private readonly name: string;\n private readonly transitions: Set<TransitionInterface> = new Set();\n private readonly events: Map<string, EventInterface> = new Map();\n private readonly metadata: Map<string, unknown> = new Map();\n\n constructor(name: string) {\n this.name = name;\n }\n\n getName(): string {\n return this.name;\n }\n\n getTransitions(): Iterable<TransitionInterface> {\n return this.transitions;\n }\n\n addTransition(transition: TransitionInterface): void {\n if (this.transitions.has(transition)) {\n return;\n }\n const targetName = transition.getTargetState().getName();\n const eventName = transition.getEventName();\n const conditionName = transition.getConditionName();\n for (const existing of this.transitions) {\n if (\n existing.getTargetState().getName() === targetName &&\n existing.getEventName() === eventName &&\n existing.getConditionName() === conditionName\n ) {\n return;\n }\n }\n this.transitions.add(transition);\n if (eventName) {\n this.getEvent(eventName);\n }\n }\n\n getEventNames(): string[] {\n return Array.from(this.events.keys());\n }\n\n hasEvent(name: string): boolean {\n return this.events.has(name);\n }\n\n getEvent(name: string): EventInterface {\n let event = this.events.get(name);\n if (!event) {\n event = new Event(name);\n this.events.set(name, event);\n }\n return event;\n }\n\n getMetadata(): Record<string, unknown> {\n return Object.fromEntries(this.metadata);\n }\n\n getMetadataValue(key: string): unknown {\n return this.metadata.get(key);\n }\n\n setMetadataValue(key: string, value: unknown): void {\n this.metadata.set(key, value);\n }\n\n hasMetadataValue(key: string): boolean {\n return this.metadata.has(key);\n }\n\n deleteMetadataValue(key: string): void {\n this.metadata.delete(key);\n }\n}\n","import type { TransitionInterface } from \"./interfaces/TransitionInterface.js\";\nimport type { StateInterface } from \"./interfaces/StateInterface.js\";\nimport type { EventInterface } from \"./interfaces/EventInterface.js\";\nimport type { ConditionInterface } from \"./interfaces/ConditionInterface.js\";\n\nexport class Transition<\n TSubject = unknown,\n> implements TransitionInterface<TSubject> {\n private readonly targetState: StateInterface;\n private readonly eventName: string | null;\n private readonly condition: ConditionInterface<TSubject> | null;\n private weight: number = 1;\n\n constructor(\n targetState: StateInterface,\n eventName: string | null = null,\n condition: ConditionInterface<TSubject> | null = null,\n ) {\n this.targetState = targetState;\n this.eventName = eventName;\n this.condition = condition;\n }\n\n getTargetState(): StateInterface {\n return this.targetState;\n }\n\n getEventName(): string | null {\n return this.eventName;\n }\n\n getConditionName(): string | null {\n if (this.condition) {\n return this.condition.getName();\n }\n return null;\n }\n\n getCondition(): ConditionInterface<TSubject> | null {\n return this.condition;\n }\n\n async isActive(\n subject: TSubject,\n context: Map<string, unknown>,\n event?: EventInterface,\n ): Promise<boolean> {\n let result: boolean;\n if (event) {\n result = event.getName() === this.eventName;\n } else {\n result = this.eventName === null;\n }\n if (this.condition && result) {\n result = await this.condition.checkCondition(subject, context);\n }\n return result;\n }\n\n getWeight(): number {\n return this.weight;\n }\n\n setWeight(weight: number): void {\n this.weight = weight;\n }\n}\n","import type { StateCollectionInterface } from \"../interfaces/StateCollectionInterface.js\";\nimport type { StateInterface } from \"../interfaces/StateInterface.js\";\nimport type { TransitionInterface } from \"../interfaces/TransitionInterface.js\";\nimport type { ConditionInterface } from \"../interfaces/ConditionInterface.js\";\nimport { State } from \"../State.js\";\nimport { Transition } from \"../Transition.js\";\nimport { StateCollection } from \"../StateCollection.js\";\n\nexport class StateCollectionMerger {\n private readonly targetCollection: StateCollection;\n private stateNamePrefix = \"\";\n\n constructor(targetCollection: StateCollection) {\n this.targetCollection = targetCollection;\n }\n\n getStateNamePrefix(): string {\n return this.stateNamePrefix;\n }\n\n setStateNamePrefix(prefix: string): void {\n this.stateNamePrefix = prefix;\n }\n\n getTargetCollection(): StateCollection {\n return this.targetCollection;\n }\n\n protected createState(name: string): StateInterface {\n return new State(name);\n }\n\n protected findOrCreateState(name: string): StateInterface {\n const prefixedName = this.stateNamePrefix + name;\n if (this.targetCollection.hasState(prefixedName)) {\n return this.targetCollection.getState(prefixedName);\n }\n const state = this.createState(prefixedName);\n this.targetCollection.addState(state);\n return state;\n }\n\n protected createCondition(\n sourceTransition: TransitionInterface,\n ): ConditionInterface | null {\n return sourceTransition.getCondition();\n }\n\n protected createTransition(\n sourceTransition: TransitionInterface,\n ): Transition {\n const targetStateName = sourceTransition.getTargetState().getName();\n const targetState = this.findOrCreateState(targetStateName);\n this.mergeMetadata(sourceTransition.getTargetState(), targetState);\n const eventName = sourceTransition.getEventName();\n const condition = this.createCondition(sourceTransition);\n const transition = new Transition(targetState, eventName, condition);\n transition.setWeight(sourceTransition.getWeight());\n return transition;\n }\n\n protected mergeMetadata(\n source: StateInterface,\n target: StateInterface,\n ): void {\n const metadata = source.getMetadata();\n for (const [key, value] of Object.entries(metadata)) {\n target.setMetadataValue(key, value);\n }\n }\n\n protected mergeEvent(\n source: StateInterface,\n target: StateInterface,\n eventName: string,\n ): void {\n const sourceEvent = source.getEvent(eventName);\n const targetEvent = target.getEvent(eventName);\n\n const sourceMetadata = sourceEvent.getMetadata();\n for (const [key, value] of Object.entries(sourceMetadata)) {\n targetEvent.setMetadataValue(key, value);\n }\n\n for (const observer of sourceEvent.getObservers()) {\n targetEvent.attach(observer);\n }\n }\n\n protected mergeState(sourceState: StateInterface): void {\n const targetState = this.findOrCreateState(sourceState.getName());\n this.mergeMetadata(sourceState, targetState);\n\n for (const sourceTransition of sourceState.getTransitions()) {\n const targetTransition = this.createTransition(sourceTransition);\n targetState.addTransition(targetTransition);\n }\n\n for (const eventName of sourceState.getEventNames()) {\n this.mergeEvent(sourceState, targetState, eventName);\n }\n }\n\n merge(source: StateCollectionInterface | StateInterface): void {\n if (\"getStates\" in source && typeof source.getStates === \"function\") {\n const collection = source as StateCollectionInterface;\n for (const state of collection.getStates()) {\n this.mergeState(state);\n }\n } else {\n this.mergeState(source as StateInterface);\n }\n }\n}\n","export class DuplicateStateError extends Error {\n readonly stateName: string;\n\n constructor(stateName: string) {\n super(\n `There is already a different state with name \"${stateName}\" in this collection`,\n );\n this.name = \"DuplicateStateError\";\n this.stateName = stateName;\n }\n}\n","import type { StateCollectionInterface } from \"./interfaces/StateCollectionInterface.js\";\nimport type { StateInterface } from \"./interfaces/StateInterface.js\";\nimport { StateCollectionMerger } from \"./util/StateCollectionMerger.js\";\nimport { DuplicateStateError } from \"./error/DuplicateStateError.js\";\n\nexport class StateCollection implements StateCollectionInterface {\n private readonly states: Map<string, StateInterface> = new Map();\n private stateCollectionMerger: StateCollectionMerger | null = null;\n\n getState(name: string): StateInterface {\n const state = this.states.get(name);\n if (!state) {\n throw new Error(`State \"${name}\" not found`);\n }\n return state;\n }\n\n getStates(): Iterable<StateInterface> {\n return this.states.values();\n }\n\n hasState(name: string): boolean {\n return this.states.has(name);\n }\n\n addState(state: StateInterface): void {\n const existing = this.states.get(state.getName());\n if (existing && existing !== state) {\n throw new DuplicateStateError(state.getName());\n }\n this.states.set(state.getName(), state);\n }\n\n getStateCollectionMerger(): StateCollectionMerger {\n if (!this.stateCollectionMerger) {\n this.stateCollectionMerger = new StateCollectionMerger(this);\n }\n return this.stateCollectionMerger;\n }\n\n merge(source: StateCollectionInterface): void {\n const merger = this.getStateCollectionMerger();\n merger.merge(source);\n }\n}\n","import type { ProcessInterface } from \"./interfaces/ProcessInterface.js\";\nimport type { StateInterface } from \"./interfaces/StateInterface.js\";\nimport type { TransitionInterface } from \"./interfaces/TransitionInterface.js\";\nimport { StateCollection } from \"./StateCollection.js\";\nimport { DuplicateStateError } from \"./error/DuplicateStateError.js\";\n\nexport class Process implements ProcessInterface {\n private readonly name: string;\n private readonly initialState: StateInterface;\n private readonly states: StateCollection;\n\n constructor(name: string, initialState: StateInterface) {\n this.name = name;\n this.initialState = initialState;\n this.states = new StateCollection();\n this.registerState(initialState);\n }\n\n private registerState(state: StateInterface): void {\n const name = state.getName();\n if (this.states.hasState(name)) {\n if (this.states.getState(name) !== state) {\n throw new DuplicateStateError(name);\n }\n return;\n }\n this.states.addState(state);\n for (const transition of state.getTransitions()) {\n const targetState = (transition as TransitionInterface).getTargetState();\n this.registerState(targetState);\n }\n }\n\n getName(): string {\n return this.name;\n }\n\n getInitialState(): StateInterface {\n return this.initialState;\n }\n\n getStates(): Iterable<StateInterface> {\n return this.states.getStates();\n }\n\n getState(name: string): StateInterface {\n return this.states.getState(name);\n }\n\n hasState(name: string): boolean {\n return this.states.hasState(name);\n }\n}\n","import type { TransitionSelectorInterface } from \"../interfaces/TransitionSelectorInterface.js\";\nimport type { TransitionInterface } from \"../interfaces/TransitionInterface.js\";\n\nexport class OneOrNoneActiveTransition<\n TSubject = unknown,\n> implements TransitionSelectorInterface<TSubject> {\n selectTransition(\n transitions: Iterable<TransitionInterface<TSubject>>,\n ): TransitionInterface<TSubject> | null {\n const arr = Array.from(transitions);\n switch (arr.length) {\n case 0:\n return null;\n case 1:\n return arr[0];\n default:\n throw new Error(\"More than one transition is active!\");\n }\n }\n}\n","import type { MutexInterface } from \"../interfaces/MutexInterface.js\";\n\nexport class NullMutex implements MutexInterface {\n private acquired = false;\n\n acquireLock(): boolean {\n this.acquired = true;\n return true;\n }\n\n releaseLock(): boolean {\n this.acquired = false;\n return true;\n }\n\n isAcquired(): boolean {\n return this.acquired;\n }\n\n isLocked(): boolean {\n return false;\n }\n}\n","import type {\n DispatcherInterface,\n CallbackInterface,\n} from \"./interfaces/DispatcherInterface.js\";\nimport type { EventInterface } from \"./interfaces/EventInterface.js\";\n\nexport class Dispatcher implements DispatcherInterface {\n private commands: Array<{ event: EventInterface; args: unknown[] }> = [];\n private onReadyCallbacks: CallbackInterface[] = [];\n private ready = false;\n\n dispatch(\n event: EventInterface,\n args: unknown[] = [],\n onReadyCallback?: CallbackInterface,\n ): void {\n if (this.ready) {\n throw new Error(\"Was already invoked!\");\n }\n this.commands.push({ event, args });\n if (onReadyCallback) {\n this.onReadyCallbacks.push(onReadyCallback);\n }\n }\n\n async invoke(): Promise<void> {\n if (this.ready) {\n throw new Error(\"Was already invoked!\");\n }\n for (const { event, args } of this.commands) {\n await event.invoke(...args);\n }\n this.ready = true;\n for (const callback of this.onReadyCallbacks) {\n await callback.invoke();\n }\n }\n\n isReady(): boolean {\n return this.ready;\n }\n}\n","import type { TransitionInterface } from \"../interfaces/TransitionInterface.js\";\nimport type { EventInterface } from \"../interfaces/EventInterface.js\";\n\nexport class ActiveTransitionFilter {\n static async filter<TSubject = unknown>(\n transitions: Iterable<TransitionInterface<TSubject>>,\n subject: TSubject,\n context: Map<string, unknown>,\n event?: EventInterface,\n ): Promise<TransitionInterface<TSubject>[]> {\n const active: TransitionInterface<TSubject>[] = [];\n for (const transition of transitions) {\n if (await transition.isActive(subject, context, event)) {\n active.push(transition);\n }\n }\n return active;\n }\n}\n","export class WrongEventForStateError extends Error {\n readonly stateName: string;\n readonly eventName: string;\n\n constructor(stateName: string, eventName: string) {\n super(`Current state \"${stateName}\" doesn't have event \"${eventName}\"`);\n this.name = \"WrongEventForStateError\";\n this.stateName = stateName;\n this.eventName = eventName;\n }\n}\n","export class LockCanNotBeAcquiredError extends Error {\n constructor(message = \"Lock can not be acquired!\") {\n super(message);\n this.name = \"LockCanNotBeAcquiredError\";\n }\n}\n","import type { StatemachineInterface } from \"./interfaces/StatemachineInterface.js\";\nimport type { StateInterface } from \"./interfaces/StateInterface.js\";\nimport type { ProcessInterface } from \"./interfaces/ProcessInterface.js\";\nimport type { TransitionInterface } from \"./interfaces/TransitionInterface.js\";\nimport type { EventInterface } from \"./interfaces/EventInterface.js\";\nimport type { MutexInterface } from \"./interfaces/MutexInterface.js\";\nimport type { TransitionSelectorInterface } from \"./interfaces/TransitionSelectorInterface.js\";\nimport type { DispatcherInterface } from \"./interfaces/DispatcherInterface.js\";\nimport type { Observer } from \"./interfaces/Observer.js\";\nimport type { Named } from \"./interfaces/Named.js\";\nimport { OneOrNoneActiveTransition } from \"./selector/OneOrNoneActiveTransition.js\";\nimport { NullMutex } from \"./mutex/NullMutex.js\";\nimport { Dispatcher } from \"./Dispatcher.js\";\nimport { ActiveTransitionFilter } from \"./filter/ActiveTransitionFilter.js\";\nimport { WrongEventForStateError } from \"./error/WrongEventForStateError.js\";\nimport { LockCanNotBeAcquiredError } from \"./error/LockCanNotBeAcquiredError.js\";\n\nexport class Statemachine<\n TSubject = unknown,\n> implements StatemachineInterface<TSubject> {\n private readonly subject: TSubject;\n private currentState: StateInterface;\n private lastState: StateInterface | null = null;\n private readonly transitionSelector: TransitionSelectorInterface<TSubject>;\n private selectedTransition: TransitionInterface<TSubject> | null = null;\n private readonly process: ProcessInterface;\n private readonly mutex: MutexInterface;\n private autoreleaseLock = true;\n private dispatcher: DispatcherInterface | null = null;\n private currentEvent: EventInterface | null = null;\n private currentContext: Map<string, unknown> | null = null;\n private readonly observers: Set<Observer> = new Set();\n\n constructor(\n subject: TSubject,\n process: ProcessInterface,\n stateName?: string | null,\n transitionSelector?: TransitionSelectorInterface<TSubject> | null,\n mutex?: MutexInterface | null,\n ) {\n this.subject = subject;\n if (stateName) {\n this.currentState = process.getState(stateName);\n } else {\n this.currentState = process.getInitialState();\n }\n this.transitionSelector =\n transitionSelector ?? new OneOrNoneActiveTransition();\n this.process = process;\n this.mutex = mutex ?? new NullMutex();\n }\n\n getProcess(): ProcessInterface {\n return this.process;\n }\n\n getCurrentState(): StateInterface {\n return this.currentState;\n }\n\n getLastState(): StateInterface | null {\n return this.lastState;\n }\n\n getSubject(): TSubject {\n return this.subject;\n }\n\n getSelectedTransition(): TransitionInterface<TSubject> | null {\n return this.selectedTransition;\n }\n\n getCurrentContext(): Map<string, unknown> | null {\n return this.currentContext;\n }\n\n private async doCheckTransitions(\n context: Map<string, unknown>,\n event?: EventInterface,\n automaticVisited?: Set<StateInterface>,\n ): Promise<void> {\n try {\n const transitions = this.currentState.getTransitions();\n const activeTransitions = await ActiveTransitionFilter.filter(\n transitions,\n this.subject,\n context,\n event,\n );\n this.selectedTransition =\n this.transitionSelector.selectTransition(activeTransitions);\n if (this.selectedTransition) {\n const targetState = this.selectedTransition.getTargetState();\n if (this.selectedTransition.getEventName() === null) {\n if (!automaticVisited) {\n automaticVisited = new Set<StateInterface>();\n }\n automaticVisited.add(this.currentState);\n if (automaticVisited.has(targetState)) {\n throw new Error(\n `Automatic transition cycle detected: state \"${targetState.getName()}\" was already visited — this would cause infinite recursion`,\n );\n }\n }\n if (this.currentState !== targetState) {\n this.lastState = this.currentState;\n this.currentState = targetState;\n this.currentContext = context;\n this.currentEvent = event ?? null;\n try {\n await this.notify();\n } finally {\n this.currentContext = null;\n this.currentEvent = null;\n this.selectedTransition = null;\n this.lastState = null;\n }\n }\n await this.doCheckTransitions(context, undefined, automaticVisited);\n }\n } catch (error) {\n let message = `Exception was thrown when doing a transition from current state \"${this.currentState.getName()}\"`;\n if (this.currentEvent) {\n message += ` with event \"${this.currentEvent.getName()}\"`;\n }\n const named = this.subject as Named;\n if (named && typeof named.getName === \"function\") {\n message += ` for \"${named.getName()}\"`;\n }\n throw new Error(message, { cause: error });\n }\n }\n\n private async onDispatcherReady(): Promise<void> {\n if (this.dispatcher && this.dispatcher.isReady()) {\n const context = this.currentContext!;\n const event = this.currentEvent ?? undefined;\n this.dispatcher = null;\n this.currentContext = null;\n this.currentEvent = null;\n try {\n await this.doCheckTransitions(context, event);\n } finally {\n if (this.autoreleaseLock && this.isLockAcquired()) {\n await this.releaseLock();\n }\n }\n }\n }\n\n async dispatchEvent(\n dispatcher: DispatcherInterface,\n name: string,\n context?: Map<string, unknown>,\n ): Promise<void> {\n if (this.dispatcher) {\n throw new Error(\"Event dispatching is still running!\");\n }\n if (this.currentState.hasEvent(name)) {\n await this.acquireLockOrThrowException();\n try {\n this.dispatcher = dispatcher;\n this.currentContext = context ?? new Map();\n this.currentEvent = this.currentState.getEvent(name);\n dispatcher.dispatch(\n this.currentEvent,\n [this.subject, this.currentContext],\n { invoke: () => this.onDispatcherReady() },\n );\n } catch (error) {\n this.dispatcher = null;\n this.currentContext = null;\n this.currentEvent = null;\n if (this.autoreleaseLock) {\n await this.releaseLock();\n }\n throw error;\n }\n } else {\n throw new WrongEventForStateError(this.currentState.getName(), name);\n }\n }\n\n async triggerEvent(\n name: string,\n context?: Map<string, unknown>,\n ): Promise<void> {\n const dispatcher = new Dispatcher();\n try {\n await this.dispatchEvent(dispatcher, name, context);\n await dispatcher.invoke();\n } finally {\n this.dispatcher = null;\n this.currentContext = null;\n this.currentEvent = null;\n if (this.autoreleaseLock && this.isLockAcquired()) {\n await this.releaseLock();\n }\n }\n }\n\n async checkTransitions(context?: Map<string, unknown>): Promise<void> {\n await this.acquireLockOrThrowException();\n const ctx = context ?? new Map();\n try {\n await this.doCheckTransitions(ctx);\n } finally {\n if (this.autoreleaseLock && this.isLockAcquired()) {\n await this.releaseLock();\n }\n }\n }\n\n private async acquireLockOrThrowException(): Promise<void> {\n if (!(await this.acquireLock())) {\n throw new LockCanNotBeAcquiredError(\"Lock can not be acquired!\");\n }\n }\n\n isAutoreleaseLock(): boolean {\n return this.autoreleaseLock;\n }\n\n setAutoreleaseLock(autorelease: boolean): void {\n this.autoreleaseLock = autorelease;\n }\n\n async acquireLock(): Promise<boolean> {\n if (this.mutex.isAcquired()) {\n return true;\n }\n return this.mutex.acquireLock();\n }\n\n async releaseLock(): Promise<void> {\n await this.mutex.releaseLock();\n }\n\n isLockAcquired(): boolean {\n return this.mutex.isAcquired();\n }\n\n attach(observer: Observer): void {\n this.observers.add(observer);\n }\n\n detach(observer: Observer): void {\n this.observers.delete(observer);\n }\n\n async notify(): Promise<void> {\n for (const observer of this.observers) {\n await observer.update(this);\n }\n }\n\n getObservers(): Iterable<Observer> {\n return this.observers;\n }\n}\n","import type { ConditionInterface } from \"../interfaces/ConditionInterface.js\";\n\nexport class Tautology implements ConditionInterface {\n private readonly name: string;\n\n constructor(name = \"Tautology\") {\n this.name = name;\n }\n\n getName(): string {\n return this.name;\n }\n\n checkCondition(_subject: unknown, _context: Map<string, unknown>): boolean {\n return true;\n }\n}\n","import type { ConditionInterface } from \"../interfaces/ConditionInterface.js\";\n\nexport class Contradiction implements ConditionInterface {\n private readonly name: string;\n\n constructor(name = \"Contradiction\") {\n this.name = name;\n }\n\n getName(): string {\n return this.name;\n }\n\n checkCondition(_subject: unknown, _context: Map<string, unknown>): boolean {\n return false;\n }\n}\n","import type { ConditionInterface } from \"../interfaces/ConditionInterface.js\";\nimport type { MaybePromise } from \"../MaybePromise.js\";\n\nexport type ConditionCallbackFn<TSubject = unknown> = (\n subject: TSubject,\n context: Map<string, unknown>,\n) => MaybePromise<boolean>;\n\nexport class CallbackCondition<\n TSubject = unknown,\n> implements ConditionInterface<TSubject> {\n private readonly name: string;\n private readonly callable: ConditionCallbackFn<TSubject>;\n\n constructor(name: string, callable: ConditionCallbackFn<TSubject>) {\n this.name = name;\n this.callable = callable;\n }\n\n getName(): string {\n return this.name;\n }\n\n checkCondition(\n subject: TSubject,\n context: Map<string, unknown>,\n ): MaybePromise<boolean> {\n return this.callable(subject, context);\n }\n}\n","import type { ConditionInterface } from \"../interfaces/ConditionInterface.js\";\nimport type { LastStateHasChangedDateInterface } from \"../interfaces/LastStateHasChangedDateInterface.js\";\n\nfunction isLastStateHasChangedDate(\n obj: unknown,\n): obj is LastStateHasChangedDateInterface {\n return (\n typeof obj === \"object\" &&\n obj !== null &&\n \"getLastStateHasChangedDate\" in obj &&\n typeof (obj as LastStateHasChangedDateInterface)\n .getLastStateHasChangedDate === \"function\"\n );\n}\n\nexport class Timeout implements ConditionInterface {\n private readonly timeoutMs: number;\n private readonly label: string;\n\n constructor(timeoutMs: number, label?: string) {\n this.timeoutMs = timeoutMs;\n this.label = label ?? `${timeoutMs}ms`;\n }\n\n getName(): string {\n return `Timeout: ${this.label}`;\n }\n\n protected getLastStateHasChangedDate(\n subject: unknown,\n _context: Map<string, unknown>,\n ): Date {\n if (isLastStateHasChangedDate(subject)) {\n return subject.getLastStateHasChangedDate();\n }\n throw new Error(\"Subject must implement LastStateHasChangedDateInterface\");\n }\n\n checkCondition(subject: unknown, context: Map<string, unknown>): boolean {\n const date = new Date(\n this.getLastStateHasChangedDate(subject, context).getTime(),\n );\n date.setTime(date.getTime() + this.timeoutMs);\n return date <= new Date();\n }\n}\n","import type { ConditionInterface } from \"../interfaces/ConditionInterface.js\";\n\nexport class AndComposite<\n TSubject = unknown,\n> implements ConditionInterface<TSubject> {\n private readonly conditions: ConditionInterface<TSubject>[] = [];\n\n constructor(condition: ConditionInterface<TSubject>) {\n this.conditions.push(condition);\n }\n\n addAnd(condition: ConditionInterface<TSubject>): this {\n this.conditions.push(condition);\n return this;\n }\n\n getName(): string {\n const names = this.conditions.map((c) => c.getName());\n return `(${names.join(\" and \")})`;\n }\n\n async checkCondition(\n subject: TSubject,\n context: Map<string, unknown>,\n ): Promise<boolean> {\n for (const condition of this.conditions) {\n if (!(await condition.checkCondition(subject, context))) {\n return false;\n }\n }\n return true;\n }\n}\n","import type { ConditionInterface } from \"../interfaces/ConditionInterface.js\";\n\nexport class OrComposite<\n TSubject = unknown,\n> implements ConditionInterface<TSubject> {\n private readonly conditions: ConditionInterface<TSubject>[] = [];\n\n constructor(condition: ConditionInterface<TSubject>) {\n this.conditions.push(condition);\n }\n\n addOr(condition: ConditionInterface<TSubject>): this {\n this.conditions.push(condition);\n return this;\n }\n\n getName(): string {\n const names = this.conditions.map((c) => c.getName());\n return `(${names.join(\" or \")})`;\n }\n\n async checkCondition(\n subject: TSubject,\n context: Map<string, unknown>,\n ): Promise<boolean> {\n for (const condition of this.conditions) {\n if (await condition.checkCondition(subject, context)) {\n return true;\n }\n }\n return false;\n }\n}\n","import type { ConditionInterface } from \"../interfaces/ConditionInterface.js\";\n\nexport class Not<TSubject = unknown> implements ConditionInterface<TSubject> {\n private readonly condition: ConditionInterface<TSubject>;\n\n constructor(condition: ConditionInterface<TSubject>) {\n this.condition = condition;\n }\n\n getName(): string {\n return `not ( ${this.condition.getName()} )`;\n }\n\n async checkCondition(\n subject: TSubject,\n context: Map<string, unknown>,\n ): Promise<boolean> {\n return !(await this.condition.checkCondition(subject, context));\n }\n}\n","import type { Observer, ObservableSubject } from \"../interfaces/Observer.js\";\nimport type { EventInterface } from \"../interfaces/EventInterface.js\";\nimport type { MaybePromise } from \"../MaybePromise.js\";\n\nexport class CallbackObserver implements Observer {\n private readonly callback: (...args: unknown[]) => MaybePromise<void>;\n\n constructor(callback: (...args: unknown[]) => MaybePromise<void>) {\n this.callback = callback;\n }\n\n update(subject: ObservableSubject): MaybePromise<void> {\n const event = subject as EventInterface;\n if (typeof event.getInvokeArgs === \"function\") {\n return this.callback(...event.getInvokeArgs());\n }\n return this.callback(subject);\n }\n}\n","import type { Observer, ObservableSubject } from \"../interfaces/Observer.js\";\nimport type { StatemachineInterface } from \"../interfaces/StatemachineInterface.js\";\nimport type { StatefulInterface } from \"../interfaces/StatefulInterface.js\";\n\nfunction isStatemachine(obj: unknown): obj is StatemachineInterface {\n return (\n typeof obj === \"object\" &&\n obj !== null &&\n \"getCurrentState\" in obj &&\n \"getSubject\" in obj\n );\n}\n\nfunction isStateful(obj: unknown): obj is StatefulInterface {\n return (\n typeof obj === \"object\" &&\n obj !== null &&\n \"setCurrentStateName\" in obj &&\n typeof (obj as StatefulInterface).setCurrentStateName === \"function\"\n );\n}\n\nexport class StatefulStatusChanger implements Observer {\n update(subject: ObservableSubject): void {\n if (isStatemachine(subject)) {\n const subjectObj = subject.getSubject();\n if (isStateful(subjectObj)) {\n const stateName = subject.getCurrentState().getName();\n subjectObj.setCurrentStateName(stateName);\n }\n }\n }\n}\n","import type { Observer, ObservableSubject } from \"../interfaces/Observer.js\";\nimport type { StatemachineInterface } from \"../interfaces/StatemachineInterface.js\";\n\nfunction isStatemachine(obj: unknown): obj is StatemachineInterface {\n return (\n typeof obj === \"object\" &&\n obj !== null &&\n \"getCurrentState\" in obj &&\n \"triggerEvent\" in obj\n );\n}\n\nexport class OnEnterObserver implements Observer {\n static readonly DEFAULT_EVENT_NAME = \"onEnter\";\n\n private readonly eventName: string;\n\n constructor(eventName = OnEnterObserver.DEFAULT_EVENT_NAME) {\n this.eventName = eventName;\n }\n\n async update(subject: ObservableSubject): Promise<void> {\n if (\n isStatemachine(subject) &&\n subject.getCurrentState().hasEvent(this.eventName)\n ) {\n const sm = subject as StatemachineInterface;\n const autorelease = sm.isAutoreleaseLock();\n sm.setAutoreleaseLock(false);\n try {\n await sm.triggerEvent(\n this.eventName,\n sm.getCurrentContext() ?? undefined,\n );\n } finally {\n sm.setAutoreleaseLock(autorelease);\n }\n }\n }\n}\n","import type { Observer, ObservableSubject } from \"../interfaces/Observer.js\";\nimport type { StatemachineInterface } from \"../interfaces/StatemachineInterface.js\";\nimport type { LoggerInterface } from \"../interfaces/LoggerInterface.js\";\nimport type { Named } from \"../interfaces/Named.js\";\n\nfunction isStatemachine(obj: unknown): obj is StatemachineInterface {\n return (\n typeof obj === \"object\" &&\n obj !== null &&\n \"getCurrentState\" in obj &&\n \"getSubject\" in obj\n );\n}\n\nfunction isNamed(obj: unknown): obj is Named {\n return (\n typeof obj === \"object\" &&\n obj !== null &&\n \"getName\" in obj &&\n typeof (obj as Named).getName === \"function\"\n );\n}\n\nfunction convertToString(obj: unknown): string {\n if (isNamed(obj)) {\n return obj.getName();\n }\n return String(obj);\n}\n\nexport class TransitionLogger implements Observer {\n private readonly logger: LoggerInterface;\n private readonly loggerLevel: string;\n\n constructor(logger: LoggerInterface, loggerLevel = \"info\") {\n this.logger = logger;\n this.loggerLevel = loggerLevel;\n }\n\n update(subject: ObservableSubject): void {\n if (!isStatemachine(subject)) {\n return;\n }\n\n const context: Record<string, unknown> = {};\n context[\"subject\"] = subject.getSubject();\n context[\"currentState\"] = subject.getCurrentState();\n context[\"lastState\"] = subject.getLastState();\n context[\"transition\"] = subject.getSelectedTransition();\n\n let message = \"Transition\";\n\n if (context[\"subject\"] != null) {\n message += ` for \"${convertToString(context[\"subject\"])}\"`;\n }\n\n if (context[\"lastState\"] != null) {\n message += ` from \"${convertToString(context[\"lastState\"])}\"`;\n }\n\n if (context[\"currentState\"] != null) {\n message += ` to \"${convertToString(context[\"currentState\"])}\"`;\n }\n\n const transition = context[\"transition\"] as {\n getEventName?: () => string | null;\n getConditionName?: () => string | null;\n } | null;\n if (transition && typeof transition.getEventName === \"function\") {\n const eventName = transition.getEventName();\n const condition = transition.getConditionName?.();\n if (eventName || condition) {\n message += \" with\";\n if (eventName) {\n message += ` event \"${eventName}\"`;\n }\n if (condition) {\n message += ` condition \"${condition}\"`;\n }\n }\n }\n\n this.logger.log(this.loggerLevel, message, context);\n }\n}\n","import type { StateInterface } from \"../interfaces/StateInterface.js\";\n\nexport class FilterStateByEvent {\n static *filter(\n states: Iterable<StateInterface>,\n eventName: string,\n ): Iterable<StateInterface> {\n for (const state of states) {\n if (state.hasEvent(eventName)) {\n yield state;\n }\n }\n }\n}\n","import type { StateInterface } from \"../interfaces/StateInterface.js\";\n\n/**\n * Filters states that have at least one automatic transition (no event name).\n */\nexport class FilterStateByTransition {\n static *filter(states: Iterable<StateInterface>): Iterable<StateInterface> {\n for (const state of states) {\n for (const transition of state.getTransitions()) {\n if (!transition.getEventName()) {\n yield state;\n break;\n }\n }\n }\n }\n}\n","import type { StateInterface } from \"../interfaces/StateInterface.js\";\n\nexport class FilterStateByFinalState {\n static *filter(states: Iterable<StateInterface>): Iterable<StateInterface> {\n for (const state of states) {\n let count = 0;\n for (const _transition of state.getTransitions()) {\n count++;\n break;\n }\n if (count === 0) {\n yield state;\n }\n }\n }\n}\n","import type { TransitionInterface } from \"../interfaces/TransitionInterface.js\";\n\nexport class FilterTransitionByEvent {\n static *filter(\n transitions: Iterable<TransitionInterface>,\n eventName: string,\n ): Iterable<TransitionInterface> {\n for (const transition of transitions) {\n if (transition.getEventName() === eventName) {\n yield transition;\n }\n }\n }\n}\n","import type { TransitionSelectorInterface } from \"../interfaces/TransitionSelectorInterface.js\";\nimport type { TransitionInterface } from \"../interfaces/TransitionInterface.js\";\nimport { OneOrNoneActiveTransition } from \"./OneOrNoneActiveTransition.js\";\n\nexport class ScoreTransition<\n TSubject = unknown,\n> implements TransitionSelectorInterface<TSubject> {\n private readonly innerSelector: TransitionSelectorInterface<TSubject>;\n\n constructor(innerSelector?: TransitionSelectorInterface<TSubject>) {\n this.innerSelector =\n innerSelector ?? new OneOrNoneActiveTransition<TSubject>();\n }\n\n protected calculateScore(transition: TransitionInterface<TSubject>): number {\n let score = 0;\n if (transition.getEventName()) {\n score += 2;\n }\n if (transition.getConditionName()) {\n score += 1;\n }\n return score;\n }\n\n selectTransition(\n transitions: Iterable<TransitionInterface<TSubject>>,\n ): TransitionInterface<TSubject> | null {\n let bestTransitions: TransitionInterface<TSubject>[] = [];\n let bestScore = -1;\n for (const transition of transitions) {\n const score = this.calculateScore(transition);\n if (score > bestScore) {\n bestScore = score;\n bestTransitions = [transition];\n } else if (score === bestScore) {\n bestTransitions.push(transition);\n }\n }\n return this.innerSelector.selectTransition(bestTransitions);\n }\n}\n","import type { TransitionSelectorInterface } from \"../interfaces/TransitionSelectorInterface.js\";\nimport type { TransitionInterface } from \"../interfaces/TransitionInterface.js\";\nimport { OneOrNoneActiveTransition } from \"./OneOrNoneActiveTransition.js\";\n\nexport class WeightTransition<\n TSubject = unknown,\n> implements TransitionSelectorInterface<TSubject> {\n private readonly innerSelector: TransitionSelectorInterface<TSubject>;\n private readonly epsilon: number;\n\n constructor(\n innerSelector?: TransitionSelectorInterface<TSubject>,\n epsilon = 0.001,\n ) {\n this.innerSelector =\n innerSelector ?? new OneOrNoneActiveTransition<TSubject>();\n this.epsilon = epsilon;\n }\n\n selectTransition(\n transitions: Iterable<TransitionInterface<TSubject>>,\n ): TransitionInterface<TSubject> | null {\n let bestTransitions: TransitionInterface<TSubject>[] = [];\n let bestWeight: number | null = null;\n for (const transition of transitions) {\n const weight = transition.getWeight();\n const diff = weight - (bestWeight ?? 0);\n if (bestWeight === null || diff >= this.epsilon) {\n bestWeight = weight;\n bestTransitions = [transition];\n } else if (Math.abs(diff) < this.epsilon) {\n bestTransitions.push(transition);\n }\n }\n return this.innerSelector.selectTransition(bestTransitions);\n }\n}\n","import type { MutexInterface } from \"../interfaces/MutexInterface.js\";\nimport type { LockAdapterInterface } from \"../interfaces/LockAdapterInterface.js\";\n\nexport class LockAdapterMutex implements MutexInterface {\n private readonly lockAdapter: LockAdapterInterface;\n private readonly resourceName: string;\n private acquired = false;\n\n constructor(lockAdapter: LockAdapterInterface, resourceName: string) {\n this.lockAdapter = lockAdapter;\n this.resourceName = resourceName;\n }\n\n async acquireLock(): Promise<boolean> {\n if (!this.acquired) {\n this.acquired = await this.lockAdapter.acquireLock(this.resourceName);\n }\n return this.acquired;\n }\n\n async releaseLock(): Promise<boolean> {\n if (this.acquired) {\n const result = await this.lockAdapter.releaseLock(this.resourceName);\n if (result) {\n this.acquired = false;\n }\n return result;\n }\n return false;\n }\n\n isAcquired(): boolean {\n return this.acquired;\n }\n\n async isLocked(): Promise<boolean> {\n return this.lockAdapter.isLocked(this.resourceName);\n }\n}\n","import type { MutexFactoryInterface } from \"../interfaces/MutexFactoryInterface.js\";\nimport type { MutexInterface } from \"../interfaces/MutexInterface.js\";\nimport type { LockAdapterInterface } from \"../interfaces/LockAdapterInterface.js\";\nimport { LockAdapterMutex } from \"./LockAdapterMutex.js\";\n\nexport type StringConverter<TSubject = unknown> = (subject: TSubject) => string;\n\nexport class MutexFactory<\n TSubject = unknown,\n> implements MutexFactoryInterface<TSubject> {\n private readonly lockAdapter: LockAdapterInterface;\n private readonly stringConverter: StringConverter<TSubject>;\n\n constructor(\n lockAdapter: LockAdapterInterface,\n stringConverter: StringConverter<TSubject>,\n ) {\n this.lockAdapter = lockAdapter;\n this.stringConverter = stringConverter;\n }\n\n createMutex(subject: TSubject): MutexInterface {\n return new LockAdapterMutex(\n this.lockAdapter,\n this.stringConverter(subject),\n );\n }\n}\n","import type { FactoryInterface } from \"../interfaces/FactoryInterface.js\";\nimport type { ProcessDetectorInterface } from \"../interfaces/ProcessDetectorInterface.js\";\nimport type { StateNameDetectorInterface } from \"../interfaces/StateNameDetectorInterface.js\";\nimport type { TransitionSelectorInterface } from \"../interfaces/TransitionSelectorInterface.js\";\nimport type { MutexFactoryInterface } from \"../interfaces/MutexFactoryInterface.js\";\nimport type { StatemachineInterface } from \"../interfaces/StatemachineInterface.js\";\nimport type { Observer } from \"../interfaces/Observer.js\";\nimport { Statemachine } from \"../Statemachine.js\";\n\nexport class Factory<TSubject = unknown> implements FactoryInterface<TSubject> {\n private readonly processDetector: ProcessDetectorInterface<TSubject>;\n private readonly stateNameDetector: StateNameDetectorInterface<TSubject> | null;\n private readonly statemachineObservers: Set<Observer> = new Set();\n private transitionSelector: TransitionSelectorInterface<TSubject> | null =\n null;\n private mutexFactory: MutexFactoryInterface<TSubject> | null = null;\n\n constructor(\n processDetector: ProcessDetectorInterface<TSubject>,\n stateNameDetector?: StateNameDetectorInterface<TSubject> | null,\n ) {\n this.processDetector = processDetector;\n this.stateNameDetector = stateNameDetector ?? null;\n }\n\n setMutexFactory(factory: MutexFactoryInterface<TSubject> | null): void {\n this.mutexFactory = factory;\n }\n\n setTransitionSelector(selector: TransitionSelectorInterface<TSubject>): void {\n this.transitionSelector = selector;\n }\n\n attachStatemachineObserver(observer: Observer): void {\n this.statemachineObservers.add(observer);\n }\n\n detachStatemachineObserver(observer: Observer): void {\n this.statemachineObservers.delete(observer);\n }\n\n getStatemachineObservers(): Iterable<Observer> {\n return this.statemachineObservers;\n }\n\n async createStatemachine(\n subject: TSubject,\n ): Promise<StatemachineInterface<TSubject>> {\n const process = this.processDetector.detectProcess(subject);\n\n const stateName = this.stateNameDetector\n ? this.stateNameDetector.detectCurrentStateName(subject)\n : null;\n\n const mutex = this.mutexFactory\n ? await this.mutexFactory.createMutex(subject)\n : null;\n\n const statemachine = new Statemachine(\n subject,\n process,\n stateName,\n this.transitionSelector,\n mutex,\n );\n\n for (const observer of this.statemachineObservers) {\n statemachine.attach(observer);\n }\n\n return statemachine;\n }\n}\n","import type { ProcessDetectorInterface } from \"../interfaces/ProcessDetectorInterface.js\";\nimport type { ProcessInterface } from \"../interfaces/ProcessInterface.js\";\n\nexport class SingleProcessDetector<\n TSubject = unknown,\n> implements ProcessDetectorInterface<TSubject> {\n private readonly process: ProcessInterface;\n\n constructor(process: ProcessInterface) {\n this.process = process;\n }\n\n detectProcess(_subject: TSubject): ProcessInterface {\n return this.process;\n }\n}\n","import type { ProcessDetectorInterface } from \"../interfaces/ProcessDetectorInterface.js\";\nimport type { ProcessInterface } from \"../interfaces/ProcessInterface.js\";\n\nexport abstract class AbstractNamedProcessDetector<\n TSubject = unknown,\n> implements ProcessDetectorInterface<TSubject> {\n private readonly processes: Map<string, ProcessInterface> = new Map();\n\n protected abstract detectProcessName(subject: TSubject): string;\n\n addProcess(process: ProcessInterface): void {\n this.processes.set(process.getName(), process);\n }\n\n hasProcess(name: string): boolean {\n return this.processes.has(name);\n }\n\n detectProcess(subject: TSubject): ProcessInterface {\n const name = this.detectProcessName(subject);\n const process = this.processes.get(name);\n if (!process) {\n throw new Error(`Process \"${name}\" not found`);\n }\n return process;\n }\n}\n","import type { StateNameDetectorInterface } from \"../interfaces/StateNameDetectorInterface.js\";\nimport type { StatefulInterface } from \"../interfaces/StatefulInterface.js\";\n\nfunction isStateful(obj: unknown): obj is StatefulInterface {\n return (\n typeof obj === \"object\" &&\n obj !== null &&\n \"getCurrentStateName\" in obj &&\n typeof (obj as StatefulInterface).getCurrentStateName === \"function\"\n );\n}\n\nexport class StatefulStateNameDetector implements StateNameDetectorInterface<StatefulInterface> {\n detectCurrentStateName(subject: StatefulInterface): string | null {\n if (isStateful(subject)) {\n return subject.getCurrentStateName();\n }\n throw new Error(\"Subject has to implement the StatefulInterface!\");\n }\n}\n","import type { StateInterface } from \"../interfaces/StateInterface.js\";\nimport type { TransitionInterface } from \"../interfaces/TransitionInterface.js\";\nimport type { ConditionInterface } from \"../interfaces/ConditionInterface.js\";\nimport type { EventInterface } from \"../interfaces/EventInterface.js\";\nimport type { Observer } from \"../interfaces/Observer.js\";\nimport { State } from \"../State.js\";\nimport { Transition } from \"../Transition.js\";\nimport { StateCollection } from \"../StateCollection.js\";\n\nexport class SetupHelper {\n protected readonly stateCollection: StateCollection;\n\n constructor(stateCollection: StateCollection) {\n this.stateCollection = stateCollection;\n }\n\n findOrCreateState(name: string): StateInterface {\n if (!this.stateCollection.hasState(name)) {\n this.stateCollection.addState(new State(name));\n }\n return this.stateCollection.getState(name);\n }\n\n protected findTransition(\n sourceState: StateInterface,\n targetState: StateInterface,\n eventName: string | null = null,\n condition: ConditionInterface | null = null,\n ): TransitionInterface | null {\n const conditionName = condition ? condition.getName() : null;\n for (const transition of sourceState.getTransitions()) {\n const hasSameTargetState = transition.getTargetState() === targetState;\n const hasSameCondition = transition.getConditionName() === conditionName;\n const hasSameEvent = transition.getEventName() === eventName;\n if (hasSameTargetState && hasSameCondition && hasSameEvent) {\n return transition;\n }\n }\n return null;\n }\n\n findOrCreateTransition(\n sourceStateName: string,\n targetStateName: string,\n eventName: string | null = null,\n condition: ConditionInterface | null = null,\n ): TransitionInterface {\n const sourceState = this.findOrCreateState(sourceStateName);\n const targetState = this.findOrCreateState(targetStateName);\n let transition = this.findTransition(\n sourceState,\n targetState,\n eventName,\n condition,\n );\n if (!transition) {\n transition = new Transition(targetState, eventName, condition);\n sourceState.addTransition(transition);\n }\n return transition;\n }\n\n findOrCreateEvent(\n sourceStateName: string,\n eventName: string,\n ): EventInterface {\n const sourceState = this.findOrCreateState(sourceStateName);\n return sourceState.getEvent(eventName);\n }\n\n addCommand(\n sourceStateName: string,\n eventName: string,\n command: Observer,\n ): void {\n this.findOrCreateEvent(sourceStateName, eventName).attach(command);\n }\n\n addCommandAndSelfTransition(\n sourceStateName: string,\n eventName: string,\n command: Observer,\n ): void {\n this.addCommand(sourceStateName, eventName, command);\n this.findOrCreateTransition(sourceStateName, sourceStateName, eventName);\n }\n}\n","import type { StateInterface } from \"../interfaces/StateInterface.js\";\nimport type { TransitionInterface } from \"../interfaces/TransitionInterface.js\";\nimport type { StateCollectionInterface } from \"../interfaces/StateCollectionInterface.js\";\nimport type { Named } from \"../interfaces/Named.js\";\n\nexport interface GraphNode {\n id: string;\n label: string;\n metadata: Record<string, unknown>;\n}\n\nexport interface GraphEdge {\n source: string;\n target: string;\n label: string;\n metadata: Record<string, unknown>;\n}\n\nexport interface Graph {\n nodes: GraphNode[];\n edges: GraphEdge[];\n}\n\nfunction isNamed(obj: unknown): obj is Named {\n return (\n typeof obj === \"object\" &&\n obj !== null &&\n \"getName\" in obj &&\n typeof (obj as Named).getName === \"function\"\n );\n}\n\nfunction escapeDoubleQuotes(str: string): string {\n return str.replace(/\"/g, '\\\\\"');\n}\n\nfunction toMermaidId(name: string): string {\n return (\n \"s_\" +\n name.replace(\n /[^a-zA-Z0-9]/g,\n (ch) => `_${ch.charCodeAt(0).toString(16).padStart(4, \"0\")}`,\n )\n );\n}\n\nfunction escapeMermaidLabel(str: string): string {\n return str.replace(/\"/g, \"#quot;\");\n}\n\nfunction convertToString(obj: unknown): string {\n if (isNamed(obj)) {\n return obj.getName();\n }\n return String(obj);\n}\n\nexport interface DotOptions {\n rankdir?: string;\n}\n\nexport interface MermaidOptions {\n direction?: string;\n}\n\nexport class GraphBuilder {\n private readonly nodes: Map<string, GraphNode> = new Map();\n private readonly edges: GraphEdge[] = [];\n\n private getOrCreateNode(state: StateInterface): GraphNode {\n const name = state.getName();\n let node = this.nodes.get(name);\n if (!node) {\n node = { id: name, label: name, metadata: state.getMetadata() };\n this.nodes.set(name, node);\n }\n return node;\n }\n\n protected getTransitionLabel(\n state: StateInterface,\n transition: TransitionInterface,\n ): string {\n const parts: string[] = [];\n const eventName = transition.getEventName();\n if (eventName) {\n parts.push(`E: ${eventName}`);\n const event = state.getEvent(eventName);\n const observerNames: string[] = [];\n for (const observer of event.getObservers()) {\n observerNames.push(convertToString(observer));\n }\n if (observerNames.length > 0) {\n parts.push(`C: ${observerNames.join(\", \")}`);\n }\n }\n const conditionName = transition.getConditionName();\n if (conditionName) {\n parts.push(`IF: ${conditionName}`);\n }\n parts.push(`W: ${transition.getWeight()}`);\n return parts.join(\"\\n\");\n }\n\n addState(state: StateInterface): void {\n this.getOrCreateNode(state);\n for (const transition of state.getTransitions()) {\n const sourceNode = this.getOrCreateNode(state);\n const targetNode = this.getOrCreateNode(transition.getTargetState());\n const label = this.getTransitionLabel(state, transition);\n const metadata: Record<string, unknown> = {};\n const eventName = transition.getEventName();\n if (eventName && state.hasEvent(eventName)) {\n Object.assign(metadata, state.getEvent(eventName).getMetadata());\n }\n this.edges.push({\n source: sourceNode.id,\n target: targetNode.id,\n label,\n metadata,\n });\n }\n }\n\n addStates(states: Iterable<StateInterface>): void {\n for (const state of states) {\n this.addState(state);\n }\n }\n\n addStateCollection(stateCollection: StateCollectionInterface): void {\n this.addStates(stateCollection.getStates());\n }\n\n getGraph(): Graph {\n return {\n nodes: Array.from(this.nodes.values()),\n edges: [...this.edges],\n };\n }\n\n toDot(options?: DotOptions): string {\n const graph = this.getGraph();\n const rankdir = options?.rankdir ?? \"LR\";\n const lines: string[] = [];\n lines.push(\"digraph {\");\n lines.push(` rankdir=${rankdir};`);\n for (const node of graph.nodes) {\n const label = escapeDoubleQuotes(node.label);\n lines.push(` \"${label}\" [label=\"${label}\"];`);\n }\n for (const edge of graph.edges) {\n const source = escapeDoubleQuotes(edge.source);\n const target = escapeDoubleQuotes(edge.target);\n const label = escapeDoubleQuotes(edge.label);\n lines.push(` \"${source}\" -> \"${target}\" [label=\"${label}\"];`);\n }\n lines.push(\"}\");\n return lines.join(\"\\n\");\n }\n\n toMermaid(options?: MermaidOptions): string {\n const graph = this.getGraph();\n const direction = options?.direction ?? \"LR\";\n const lines: string[] = [];\n lines.push(`stateDiagram-v2`);\n lines.push(` direction ${direction}`);\n const declared = new Set<string>();\n for (const node of graph.nodes) {\n const id = toMermaidId(node.id);\n if (!declared.has(id)) {\n declared.add(id);\n const label = escapeMermaidLabel(node.label);\n lines.push(` ${id} : \"${label}\"`);\n }\n }\n for (const edge of graph.edges) {\n const source = toMermaidId(edge.source);\n const target = toMermaidId(edge.target);\n const label = escapeMermaidLabel(edge.label.replace(/\\n/g, \" / \"));\n lines.push(` ${source} --> ${target} : ${label}`);\n }\n return lines.join(\"\\n\");\n }\n}\n"],"mappings":"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","names":["isStatemachine","isStatemachine","isStateful","isNamed","convertToString"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/Event.ts","../src/internal/InternalConstruction.ts","../src/error/FinitaError.ts","../src/error/StateNotFoundError.ts","../src/StateCollection.ts","../src/Process.ts","../src/error/StateEventNotFoundError.ts","../src/State.ts","../src/Transition.ts","../src/error/DuplicateStateError.ts","../src/error/ProcessFinalizedError.ts","../src/error/GraphValidationError.ts","../src/error/DuplicateTransitionError.ts","../src/ProcessBuilder.ts","../src/error/AmbiguousTransitionError.ts","../src/selector/OneOrNoneActiveTransition.ts","../src/mutex/NullMutex.ts","../src/internal/Dispatcher.ts","../src/internal/OperationQueue.ts","../src/filter/ActiveTransitionFilter.ts","../src/error/WrongEventForStateError.ts","../src/error/LockCanNotBeAcquiredError.ts","../src/error/AutomaticTransitionCycleError.ts","../src/Statemachine.ts","../src/condition/Tautology.ts","../src/condition/Contradiction.ts","../src/condition/CallbackCondition.ts","../src/condition/Timeout.ts","../src/condition/AndComposite.ts","../src/condition/OrComposite.ts","../src/condition/Not.ts","../src/observer/CallbackObserver.ts","../src/observer/StatefulStatusChanger.ts","../src/observer/OnEnterObserver.ts","../src/observer/TransitionLogger.ts","../src/filter/FilterStateByEvent.ts","../src/filter/FilterStateByTransition.ts","../src/filter/FilterStateByFinalState.ts","../src/filter/FilterTransitionByEvent.ts","../src/selector/ScoreTransition.ts","../src/selector/WeightTransition.ts","../src/mutex/LockAdapterMutex.ts","../src/mutex/MutexFactory.ts","../src/factory/Factory.ts","../src/factory/SingleProcessDetector.ts","../src/error/ProcessNotFoundError.ts","../src/factory/AbstractNamedProcessDetector.ts","../src/error/InvalidSubjectError.ts","../src/factory/StatefulStateNameDetector.ts","../src/graph/GraphBuilder.ts"],"sourcesContent":["// MaybePromise type\nexport type { MaybePromise } from \"./MaybePromise.js\";\n\n// Core classes\nexport { Event } from \"./Event.js\";\nexport { Process } from \"./Process.js\";\nexport { State } from \"./State.js\"; // exported for type / instanceof use only\nexport { Transition } from \"./Transition.js\"; // same\nexport { ProcessBuilder } from \"./ProcessBuilder.js\";\nexport type {\n AddStateOptions,\n AddTransitionOptions,\n BuildOptions,\n} from \"./ProcessBuilder.js\";\nexport { Statemachine } from \"./Statemachine.js\";\n\n// Interfaces\nexport type {\n Named,\n Metadata,\n Weighted,\n Observer,\n ObservableSubject,\n AfterTransitionObserver,\n EnqueueContext,\n BeforeTransitionObserver,\n ConditionInterface,\n EventInterface,\n TransitionInterface,\n StateInterface,\n StateCollectionInterface,\n ProcessInterface,\n StatemachineInterface,\n StatemachineOptions,\n MutexInterface,\n MutexFactoryInterface,\n LockAdapterInterface,\n TransitionSelectorInterface,\n TransitionFrame,\n ProposedTransitionFrame,\n ProcessDetectorInterface,\n StateNameDetectorInterface,\n FactoryInterface,\n StatefulInterface,\n LastStateHasChangedDateInterface,\n DispatcherInterface,\n CallbackInterface,\n LoggerInterface,\n} from \"./interfaces/index.js\";\n\n// Conditions\nexport {\n Tautology,\n Contradiction,\n CallbackCondition,\n Timeout,\n AndComposite,\n OrComposite,\n Not,\n} from \"./condition/index.js\";\nexport type { ConditionCallbackFn } from \"./condition/index.js\";\n\n// Observers\nexport {\n CallbackObserver,\n StatefulStatusChanger,\n OnEnterObserver,\n TransitionLogger,\n} from \"./observer/index.js\";\n\n// Filters\nexport {\n ActiveTransitionFilter,\n FilterStateByEvent,\n FilterStateByTransition,\n FilterStateByFinalState,\n FilterTransitionByEvent,\n} from \"./filter/index.js\";\n\n// Selectors\nexport {\n OneOrNoneActiveTransition,\n ScoreTransition,\n WeightTransition,\n} from \"./selector/index.js\";\n\n// Mutex\nexport { NullMutex, LockAdapterMutex, MutexFactory } from \"./mutex/index.js\";\nexport type { StringConverter } from \"./mutex/index.js\";\n\n// Factory\nexport {\n Factory,\n SingleProcessDetector,\n AbstractNamedProcessDetector,\n StatefulStateNameDetector,\n} from \"./factory/index.js\";\n\n// Graph\nexport { GraphBuilder } from \"./graph/index.js\";\nexport type {\n Graph,\n GraphNode,\n GraphEdge,\n DotOptions,\n MermaidOptions,\n} from \"./graph/index.js\";\n\n// Errors\nexport {\n FinitaError,\n WrongEventForStateError,\n LockCanNotBeAcquiredError,\n DuplicateStateError,\n ProcessFinalizedError,\n GraphValidationError,\n DuplicateTransitionError,\n StateNotFoundError,\n StateEventNotFoundError,\n ProcessNotFoundError,\n InvalidSubjectError,\n AmbiguousTransitionError,\n AutomaticTransitionCycleError,\n} from \"./error/index.js\";\nexport type {\n GraphValidationCode,\n DuplicateTransitionConflict,\n} from \"./error/index.js\";\n","import type { EventInterface } from \"./interfaces/EventInterface.js\";\nimport type { Observer } from \"./interfaces/Observer.js\";\n\nexport class Event implements EventInterface {\n private readonly name: string;\n private readonly observers: Set<Observer> = new Set();\n private readonly metadata: Map<string, unknown> = new Map();\n private invokeArgs: unknown[] = [];\n\n constructor(name: string) {\n this.name = name;\n }\n\n getName(): string {\n return this.name;\n }\n\n getInvokeArgs(): unknown[] {\n return this.invokeArgs;\n }\n\n async invoke(...args: unknown[]): Promise<void> {\n this.invokeArgs = args;\n try {\n await this.notify();\n } finally {\n this.invokeArgs = [];\n }\n }\n\n attach(observer: Observer): void {\n this.observers.add(observer);\n }\n\n detach(observer: Observer): void {\n this.observers.delete(observer);\n }\n\n async notify(): Promise<void> {\n for (const observer of this.observers) {\n await observer.update(this);\n }\n }\n\n getObservers(): Iterable<Observer> {\n return this.observers;\n }\n\n getMetadata(): Record<string, unknown> {\n return Object.fromEntries(this.metadata);\n }\n\n getMetadataValue(key: string): unknown {\n return this.metadata.get(key);\n }\n\n setMetadataValue(key: string, value: unknown): void {\n this.metadata.set(key, value);\n }\n\n hasMetadataValue(key: string): boolean {\n return this.metadata.has(key);\n }\n\n deleteMetadataValue(key: string): void {\n this.metadata.delete(key);\n }\n}\n","/**\n * Symbol-based construction guard for State / Transition / Process.\n *\n * These classes' constructors require this symbol as the first argument.\n * Only ProcessBuilder imports it, ensuring only the builder can instantiate\n * the graph. User code receives an opaque type error if it tries to call\n * `new State(...)` directly.\n */\nexport const INTERNAL_CONSTRUCTION_KEY: unique symbol = Symbol(\n \"@camcima/finita/InternalConstruction\",\n);\nexport type InternalConstructionKey = typeof INTERNAL_CONSTRUCTION_KEY;\n","export abstract class FinitaError extends Error {\n abstract readonly code: string;\n\n constructor(message?: string) {\n super(message);\n if (new.target === FinitaError) {\n throw new TypeError(\n \"FinitaError is abstract and cannot be instantiated directly\",\n );\n }\n }\n}\n","import { FinitaError } from \"./FinitaError.js\";\n\nexport class StateNotFoundError extends FinitaError {\n readonly code = \"stateNotFound\";\n readonly stateName: string;\n readonly availableStates: readonly string[];\n\n constructor(stateName: string, availableStates: Iterable<string>) {\n const list = Array.from(availableStates);\n const display =\n list.length > 0 ? list.map((n) => `\"${n}\"`).join(\", \") : \"(none)\";\n super(`State \"${stateName}\" not found. Available: ${display}`);\n this.name = \"StateNotFoundError\";\n this.stateName = stateName;\n this.availableStates = Object.freeze([...list]);\n }\n}\n","import type { StateCollectionInterface } from \"./interfaces/StateCollectionInterface.js\";\nimport type { StateInterface } from \"./interfaces/StateInterface.js\";\nimport { StateNotFoundError } from \"./error/StateNotFoundError.js\";\n\nexport class StateCollection implements StateCollectionInterface {\n private readonly states: ReadonlyMap<string, StateInterface>;\n\n constructor(states: Iterable<StateInterface>) {\n const map = new Map<string, StateInterface>();\n for (const s of states) {\n map.set(s.getName(), s);\n }\n this.states = map;\n }\n\n getStates(): Iterable<StateInterface> {\n return this.states.values();\n }\n\n getState(name: string): StateInterface {\n const s = this.states.get(name);\n if (!s) {\n throw new StateNotFoundError(name, this.states.keys());\n }\n return s;\n }\n\n hasState(name: string): boolean {\n return this.states.has(name);\n }\n}\n","import type { ProcessInterface } from \"./interfaces/ProcessInterface.js\";\nimport type { StateInterface } from \"./interfaces/StateInterface.js\";\nimport type { InternalConstructionKey } from \"./internal/InternalConstruction.js\";\nimport { INTERNAL_CONSTRUCTION_KEY } from \"./internal/InternalConstruction.js\";\nimport { StateCollection } from \"./StateCollection.js\";\n\nexport class Process implements ProcessInterface {\n private readonly name: string;\n private readonly initialState: StateInterface;\n private readonly states: StateCollection;\n\n constructor(\n key: InternalConstructionKey,\n name: string,\n initialState: StateInterface,\n states: Iterable<StateInterface>,\n ) {\n if (key !== INTERNAL_CONSTRUCTION_KEY) {\n throw new Error(\"Process is not user-constructible; use ProcessBuilder.\");\n }\n this.name = name;\n this.initialState = initialState;\n this.states = new StateCollection(states);\n Object.freeze(this);\n }\n\n getName(): string {\n return this.name;\n }\n\n getInitialState(): StateInterface {\n return this.initialState;\n }\n\n getStates(): Iterable<StateInterface> {\n return this.states.getStates();\n }\n\n getState(name: string): StateInterface {\n return this.states.getState(name);\n }\n\n hasState(name: string): boolean {\n return this.states.hasState(name);\n }\n}\n","import { FinitaError } from \"./FinitaError.js\";\n\nexport class StateEventNotFoundError extends FinitaError {\n readonly code = \"stateEventNotFound\";\n readonly stateName: string;\n readonly eventName: string;\n\n constructor(stateName: string, eventName: string) {\n super(`State \"${stateName}\" has no event \"${eventName}\"`);\n this.name = \"StateEventNotFoundError\";\n this.stateName = stateName;\n this.eventName = eventName;\n }\n}\n","import type { StateInterface } from \"./interfaces/StateInterface.js\";\nimport type { TransitionInterface } from \"./interfaces/TransitionInterface.js\";\nimport type { EventInterface } from \"./interfaces/EventInterface.js\";\nimport type { InternalConstructionKey } from \"./internal/InternalConstruction.js\";\nimport { INTERNAL_CONSTRUCTION_KEY } from \"./internal/InternalConstruction.js\";\nimport { Event } from \"./Event.js\";\nimport { StateEventNotFoundError } from \"./error/StateEventNotFoundError.js\";\n\nexport class State implements StateInterface {\n private readonly name: string;\n private _transitions: ReadonlySet<TransitionInterface> | null = null;\n private readonly events: ReadonlyMap<string, EventInterface>;\n private readonly metadata: ReadonlyMap<string, unknown>;\n\n constructor(\n key: InternalConstructionKey,\n name: string,\n eventNames: Iterable<string>,\n metadata: ReadonlyMap<string, unknown>,\n ) {\n if (key !== INTERNAL_CONSTRUCTION_KEY) {\n throw new Error(\"State is not user-constructible; use ProcessBuilder.\");\n }\n this.name = name;\n const events = new Map<string, EventInterface>();\n for (const en of eventNames) {\n events.set(en, new Event(en));\n }\n this.events = events;\n this.metadata = new Map(metadata);\n }\n\n /**\n * Internal: populate transitions after State construction.\n * May only be called once and only with the construction key.\n * Used by ProcessBuilder to break the cycle: State must exist before\n * Transitions can target it, but State needs its transitions to be useful.\n */\n _initTransitions(\n key: InternalConstructionKey,\n transitions: Iterable<TransitionInterface>,\n ): void {\n if (key !== INTERNAL_CONSTRUCTION_KEY) {\n throw new Error(\"_initTransitions is internal\");\n }\n if (this._transitions !== null) {\n throw new Error(`State \"${this.name}\" transitions already set`);\n }\n this._transitions = new Set(transitions);\n }\n\n getName(): string {\n return this.name;\n }\n\n getTransitions(): Iterable<TransitionInterface> {\n if (this._transitions === null) {\n return [];\n }\n return this._transitions;\n }\n\n getEventNames(): string[] {\n return Array.from(this.events.keys());\n }\n\n hasEvent(name: string): boolean {\n return this.events.has(name);\n }\n\n getEvent(name: string): EventInterface {\n const event = this.events.get(name);\n if (!event) {\n throw new StateEventNotFoundError(this.name, name);\n }\n return event;\n }\n\n getMetadata(): Record<string, unknown> {\n return Object.fromEntries(this.metadata);\n }\n\n getMetadataValue(key: string): unknown {\n return this.metadata.get(key);\n }\n\n hasMetadataValue(key: string): boolean {\n return this.metadata.has(key);\n }\n}\n","import type { TransitionInterface } from \"./interfaces/TransitionInterface.js\";\nimport type { StateInterface } from \"./interfaces/StateInterface.js\";\nimport type { EventInterface } from \"./interfaces/EventInterface.js\";\nimport type { ConditionInterface } from \"./interfaces/ConditionInterface.js\";\nimport type { InternalConstructionKey } from \"./internal/InternalConstruction.js\";\nimport { INTERNAL_CONSTRUCTION_KEY } from \"./internal/InternalConstruction.js\";\n\nexport class Transition<\n TSubject = unknown,\n> implements TransitionInterface<TSubject> {\n private readonly targetState: StateInterface;\n private readonly eventName: string | null;\n private readonly condition: ConditionInterface<TSubject> | null;\n private readonly weight: number;\n\n constructor(\n key: InternalConstructionKey,\n targetState: StateInterface,\n eventName: string | null,\n condition: ConditionInterface<TSubject> | null,\n weight: number,\n ) {\n if (key !== INTERNAL_CONSTRUCTION_KEY) {\n throw new Error(\n \"Transition is not user-constructible; use ProcessBuilder.\",\n );\n }\n this.targetState = targetState;\n this.eventName = eventName;\n this.condition = condition;\n this.weight = weight;\n }\n\n getTargetState(): StateInterface {\n return this.targetState;\n }\n\n getEventName(): string | null {\n return this.eventName;\n }\n\n getConditionName(): string | null {\n return this.condition ? this.condition.getName() : null;\n }\n\n getCondition(): ConditionInterface<TSubject> | null {\n return this.condition;\n }\n\n async isActive(\n subject: TSubject,\n context: Map<string, unknown>,\n event?: EventInterface,\n ): Promise<boolean> {\n let active: boolean;\n if (event) {\n active = event.getName() === this.eventName;\n } else {\n active = this.eventName === null;\n }\n if (this.condition && active) {\n active = await this.condition.checkCondition(subject, context);\n }\n return active;\n }\n\n getWeight(): number {\n return this.weight;\n }\n}\n","import { FinitaError } from \"./FinitaError.js\";\n\nexport class DuplicateStateError extends FinitaError {\n readonly code = \"duplicateState\";\n readonly stateName: string;\n\n constructor(stateName: string) {\n super(\n `There is already a different state with name \"${stateName}\" in this collection`,\n );\n this.name = \"DuplicateStateError\";\n this.stateName = stateName;\n }\n}\n","import { FinitaError } from \"./FinitaError.js\";\n\nexport class ProcessFinalizedError extends FinitaError {\n readonly code = \"processFinalized\";\n readonly processName: string;\n\n constructor(processName: string) {\n super(\n `Process \"${processName}\" has already been built; ProcessBuilder.build() may only be called once`,\n );\n this.name = \"ProcessFinalizedError\";\n this.processName = processName;\n }\n}\n","import { FinitaError } from \"./FinitaError.js\";\n\nexport type GraphValidationCode =\n | \"unknownTarget\"\n | \"unknownSource\"\n | \"missingInitialState\"\n | \"multipleInitialStates\"\n | \"invalidEventName\"\n | \"invalidConditionName\"\n | \"orphanState\";\n\nexport class GraphValidationError extends FinitaError {\n readonly code: GraphValidationCode;\n readonly details: Readonly<Record<string, unknown>>;\n\n constructor(\n code: GraphValidationCode,\n message: string,\n details: Record<string, unknown> = {},\n ) {\n super(`[${code}] ${message}`);\n this.name = \"GraphValidationError\";\n this.code = code;\n this.details = Object.freeze({ ...details });\n }\n}\n","import { FinitaError } from \"./FinitaError.js\";\n\nexport interface DuplicateTransitionConflict {\n fromState: string;\n toState: string;\n eventName: string | null;\n existingConditionName: string | null;\n newConditionName: string | null;\n}\n\nexport class DuplicateTransitionError extends FinitaError {\n readonly code = \"duplicateTransition\";\n readonly conflict: Readonly<DuplicateTransitionConflict>;\n\n constructor(conflict: DuplicateTransitionConflict) {\n const eventLabel = conflict.eventName ?? \"<automatic>\";\n const existing = conflict.existingConditionName ?? \"<no condition>\";\n const incoming = conflict.newConditionName ?? \"<no condition>\";\n super(\n `Conflicting transition declarations from \"${conflict.fromState}\" to \"${conflict.toState}\" on event \"${eventLabel}\": existing condition \"${existing}\" vs new condition \"${incoming}\"`,\n );\n this.name = \"DuplicateTransitionError\";\n this.conflict = Object.freeze({ ...conflict });\n }\n}\n","import type { StateInterface } from \"./interfaces/StateInterface.js\";\nimport type { TransitionInterface } from \"./interfaces/TransitionInterface.js\";\nimport type { ConditionInterface } from \"./interfaces/ConditionInterface.js\";\nimport { INTERNAL_CONSTRUCTION_KEY } from \"./internal/InternalConstruction.js\";\nimport { Process } from \"./Process.js\";\nimport { State } from \"./State.js\";\nimport { Transition } from \"./Transition.js\";\nimport { DuplicateStateError } from \"./error/DuplicateStateError.js\";\nimport { ProcessFinalizedError } from \"./error/ProcessFinalizedError.js\";\nimport { GraphValidationError } from \"./error/GraphValidationError.js\";\nimport { DuplicateTransitionError } from \"./error/DuplicateTransitionError.js\";\n\ninterface StateSpec {\n name: string;\n initial: boolean;\n metadata: Map<string, unknown>;\n}\n\ninterface TransitionSpec<TSubject = unknown> {\n fromState: string;\n toState: string;\n eventName: string | null;\n condition: ConditionInterface<TSubject> | null;\n weight: number;\n}\n\nexport interface AddStateOptions {\n initial?: boolean;\n metadata?: Record<string, unknown>;\n}\n\nexport interface AddTransitionOptions<TSubject = unknown> {\n event?: string;\n condition?: ConditionInterface<TSubject>;\n weight?: number;\n}\n\nexport interface BuildOptions {\n /**\n * When true, orphan/unreachable states cause GraphValidationError.\n * When false (default), orphan states are silently allowed.\n */\n strictOrphans?: boolean;\n}\n\nexport class ProcessBuilder<TSubject = unknown> {\n private readonly processName: string;\n private readonly stateSpecs: Map<string, StateSpec> = new Map();\n private readonly transitionSpecs: TransitionSpec<TSubject>[] = [];\n private built = false;\n\n constructor(processName: string) {\n this.processName = processName;\n }\n\n addState(name: string, options: AddStateOptions = {}): this {\n if (this.built) {\n throw new ProcessFinalizedError(this.processName);\n }\n if (this.stateSpecs.has(name)) {\n throw new DuplicateStateError(name);\n }\n this.stateSpecs.set(name, {\n name,\n initial: options.initial === true,\n metadata: new Map(Object.entries(options.metadata ?? {})),\n });\n return this;\n }\n\n addTransition(\n fromState: string,\n toState: string,\n options: AddTransitionOptions<TSubject> = {},\n ): this {\n if (this.built) {\n throw new ProcessFinalizedError(this.processName);\n }\n let eventName: string | null = null;\n if (options.event !== undefined) {\n const raw = options.event;\n if (raw.trim() === \"\" || raw !== raw.trim()) {\n throw new GraphValidationError(\n \"invalidEventName\",\n `addTransition called with an empty or whitespace-padded event name from \"${fromState}\" to \"${toState}\"`,\n { fromState, toState, eventName: raw },\n );\n }\n eventName = raw;\n }\n if (options.condition) {\n const conditionName = options.condition.getName();\n if (conditionName.trim() === \"\") {\n throw new GraphValidationError(\n \"invalidConditionName\",\n `addTransition called with an empty/whitespace condition name from \"${fromState}\" to \"${toState}\"`,\n { fromState, toState, conditionName },\n );\n }\n }\n this.transitionSpecs.push({\n fromState,\n toState,\n eventName,\n condition: options.condition ?? null,\n weight: options.weight ?? 1,\n });\n return this;\n }\n\n build(options: BuildOptions = {}): Process {\n if (this.built) {\n throw new ProcessFinalizedError(this.processName);\n }\n this.built = true;\n\n this.validateInitialState();\n this.validateTransitionEndpoints();\n this.validateNoConflictingDuplicates();\n\n const initialName = this.findInitialStateName();\n const eventNamesByState = this.collectEventNamesByState();\n\n // Two-phase construction: create all State instances first (with no\n // transitions), then build Transitions targeting those instances and attach\n // them. Identity holds by construction for any graph topology.\n const finalStates = this.buildAllStates(eventNamesByState);\n\n if (options.strictOrphans) {\n this.validateOrphans(finalStates, initialName);\n }\n\n const initialState = finalStates.get(initialName)!;\n return new Process(\n INTERNAL_CONSTRUCTION_KEY,\n this.processName,\n initialState,\n finalStates.values(),\n );\n }\n\n // --- private helpers ---\n\n private validateInitialState(): void {\n const initials = Array.from(this.stateSpecs.values()).filter(\n (s) => s.initial,\n );\n if (initials.length === 0) {\n throw new GraphValidationError(\n \"missingInitialState\",\n `Process \"${this.processName}\" has no state declared with { initial: true }`,\n { processName: this.processName },\n );\n }\n if (initials.length > 1) {\n throw new GraphValidationError(\n \"multipleInitialStates\",\n `Process \"${this.processName}\" declares multiple initial states: ${initials.map((s) => `\"${s.name}\"`).join(\", \")}`,\n {\n processName: this.processName,\n initialStates: initials.map((s) => s.name),\n },\n );\n }\n }\n\n private findInitialStateName(): string {\n return Array.from(this.stateSpecs.values()).find((s) => s.initial)!.name;\n }\n\n private validateTransitionEndpoints(): void {\n for (const t of this.transitionSpecs) {\n if (!this.stateSpecs.has(t.fromState)) {\n throw new GraphValidationError(\n \"unknownSource\",\n `Transition source state \"${t.fromState}\" was not declared with addState`,\n {\n fromState: t.fromState,\n toState: t.toState,\n eventName: t.eventName,\n },\n );\n }\n if (!this.stateSpecs.has(t.toState)) {\n throw new GraphValidationError(\n \"unknownTarget\",\n `Transition target state \"${t.toState}\" was not declared with addState`,\n {\n fromState: t.fromState,\n toState: t.toState,\n eventName: t.eventName,\n },\n );\n }\n }\n }\n\n private validateNoConflictingDuplicates(): void {\n // Identity key: (fromState, eventName, toState).\n // Same condition reference → dedup (idempotent re-declaration).\n // Different condition references (including same-name-different-object) →\n // conflict (DuplicateTransitionError). We cannot introspect callable\n // bodies to compare logic, so different object identity is treated as\n // different logic — closes original review #6.\n const seen = new Map<string, TransitionSpec<TSubject>>();\n for (const t of this.transitionSpecs) {\n const key = `${t.fromState}\\x00${t.eventName ?? \"\"}\\x00${t.toState}`;\n const existing = seen.get(key);\n if (!existing) {\n seen.set(key, t);\n continue;\n }\n if (existing.condition !== t.condition) {\n throw new DuplicateTransitionError({\n fromState: t.fromState,\n toState: t.toState,\n eventName: t.eventName,\n existingConditionName: existing.condition\n ? existing.condition.getName()\n : null,\n newConditionName: t.condition ? t.condition.getName() : null,\n });\n }\n // Same identity AND same condition instance → dedup silently.\n }\n }\n\n private collectEventNamesByState(): Map<string, string[]> {\n const out = new Map<string, Set<string>>();\n for (const t of this.transitionSpecs) {\n if (t.eventName === null) continue;\n let bucket = out.get(t.fromState);\n if (!bucket) {\n bucket = new Set();\n out.set(t.fromState, bucket);\n }\n bucket.add(t.eventName);\n }\n return new Map(\n Array.from(out.entries()).map(([k, v]) => [k, Array.from(v)]),\n );\n }\n\n /**\n * Two-phase construction:\n * Phase 1 — create all final State instances with no transitions.\n * Phase 2 — build Transitions targeting the Phase-1 States, then attach\n * them via State._initTransitions.\n *\n * Because every Transition is created after every State exists, target\n * identity holds by construction for any graph topology (acyclic, cyclic,\n * self-loop).\n */\n private buildAllStates(\n eventNamesByState: Map<string, string[]>,\n ): Map<string, StateInterface> {\n const built = new Map<string, StateInterface>();\n\n // Phase 1: create all States with no transitions.\n for (const spec of this.stateSpecs.values()) {\n built.set(\n spec.name,\n new State(\n INTERNAL_CONSTRUCTION_KEY,\n spec.name,\n eventNamesByState.get(spec.name) ?? [],\n spec.metadata,\n ),\n );\n }\n\n // Phase 2: build Transitions targeting Phase-1 States, then attach.\n // Dedup-key uses object identity for the condition (not name), matching\n // validateNoConflictingDuplicates: same reference dedups, different\n // references are treated as different logic.\n const dedupSeen = new Set<string>();\n const conditionId = new Map<ConditionInterface<TSubject>, number>();\n let nextConditionId = 0;\n const idForCondition = (\n cond: ConditionInterface<TSubject> | null,\n ): string => {\n if (cond === null) return \"\";\n let id = conditionId.get(cond);\n if (id === undefined) {\n id = ++nextConditionId;\n conditionId.set(cond, id);\n }\n return String(id);\n };\n const transitionsByState = new Map<\n string,\n TransitionInterface<TSubject>[]\n >();\n for (const spec of this.stateSpecs.values()) {\n transitionsByState.set(spec.name, []);\n }\n for (const tSpec of this.transitionSpecs) {\n const dedupKey = `${tSpec.fromState}\\x00${tSpec.eventName ?? \"\"}\\x00${tSpec.toState}\\x00${idForCondition(tSpec.condition)}`;\n if (dedupSeen.has(dedupKey)) continue;\n dedupSeen.add(dedupKey);\n const targetState = built.get(tSpec.toState)!;\n const transition = new Transition<TSubject>(\n INTERNAL_CONSTRUCTION_KEY,\n targetState,\n tSpec.eventName,\n tSpec.condition,\n tSpec.weight,\n );\n transitionsByState.get(tSpec.fromState)!.push(transition);\n }\n\n for (const [name, transitions] of transitionsByState) {\n (built.get(name) as State)._initTransitions(\n INTERNAL_CONSTRUCTION_KEY,\n transitions,\n );\n }\n\n return built;\n }\n\n private validateOrphans(\n states: Map<string, StateInterface>,\n initialName: string,\n ): void {\n const reachable = new Set<string>();\n const queue: string[] = [initialName];\n while (queue.length > 0) {\n const name = queue.shift()!;\n if (reachable.has(name)) continue;\n reachable.add(name);\n const s = states.get(name)!;\n for (const t of s.getTransitions()) {\n queue.push(t.getTargetState().getName());\n }\n }\n const orphans: string[] = [];\n for (const name of states.keys()) {\n if (!reachable.has(name)) orphans.push(name);\n }\n if (orphans.length > 0) {\n throw new GraphValidationError(\n \"orphanState\",\n `Process \"${this.processName}\" has unreachable states: ${orphans.map((n) => `\"${n}\"`).join(\", \")}`,\n { processName: this.processName, orphanStates: orphans },\n );\n }\n }\n}\n","import { FinitaError } from \"./FinitaError.js\";\n\nexport class AmbiguousTransitionError extends FinitaError {\n readonly code = \"ambiguousTransition\";\n readonly activeCount: number;\n\n constructor(activeCount: number) {\n super(`More than one transition is active! (active count: ${activeCount})`);\n this.name = \"AmbiguousTransitionError\";\n this.activeCount = activeCount;\n }\n}\n","import type { TransitionSelectorInterface } from \"../interfaces/TransitionSelectorInterface.js\";\nimport type { TransitionInterface } from \"../interfaces/TransitionInterface.js\";\nimport { AmbiguousTransitionError } from \"../error/AmbiguousTransitionError.js\";\n\nexport class OneOrNoneActiveTransition<\n TSubject = unknown,\n> implements TransitionSelectorInterface<TSubject> {\n selectTransition(\n transitions: Iterable<TransitionInterface<TSubject>>,\n ): TransitionInterface<TSubject> | null {\n const arr = Array.from(transitions);\n switch (arr.length) {\n case 0:\n return null;\n case 1:\n return arr[0];\n default:\n throw new AmbiguousTransitionError(arr.length);\n }\n }\n}\n","import type { MutexInterface } from \"../interfaces/MutexInterface.js\";\n\nexport class NullMutex implements MutexInterface {\n private acquired = false;\n\n acquireLock(): boolean {\n this.acquired = true;\n return true;\n }\n\n releaseLock(): boolean {\n this.acquired = false;\n return true;\n }\n\n isAcquired(): boolean {\n return this.acquired;\n }\n\n isLocked(): boolean {\n return false;\n }\n}\n","import type { DispatcherInterface } from \"../interfaces/DispatcherInterface.js\";\nimport type { EventInterface } from \"../interfaces/EventInterface.js\";\n\nexport class Dispatcher implements DispatcherInterface {\n private commands: Array<{ event: EventInterface; args: unknown[] }> = [];\n private ready = false;\n\n dispatch(event: EventInterface, args: unknown[] = []): void {\n if (this.ready) {\n throw new Error(\"Was already invoked!\");\n }\n this.commands.push({ event, args });\n }\n\n async invoke(): Promise<void> {\n if (this.ready) {\n throw new Error(\"Was already invoked!\");\n }\n for (const { event, args } of this.commands) {\n await event.invoke(...args);\n }\n this.ready = true;\n }\n}\n","export type OperationKind = \"triggerEvent\" | \"checkTransitions\";\n\nexport interface QueuedOperation {\n kind: OperationKind;\n eventName: string | null;\n context: Map<string, unknown>;\n resolve: () => void;\n reject: (err: unknown) => void;\n}\n\n/**\n * FIFO queue of pending top-level Statemachine operations.\n *\n * Holds the deferred resolvers so that callers' promises can be settled\n * by the engine when their operation runs. Has no side effects beyond\n * push/shift; the Statemachine drives execution.\n */\nexport class OperationQueue {\n private readonly items: QueuedOperation[] = [];\n\n enqueue(op: QueuedOperation): void {\n this.items.push(op);\n }\n\n dequeue(): QueuedOperation | undefined {\n return this.items.shift();\n }\n\n isEmpty(): boolean {\n return this.items.length === 0;\n }\n}\n","import type { TransitionInterface } from \"../interfaces/TransitionInterface.js\";\nimport type { EventInterface } from \"../interfaces/EventInterface.js\";\n\nexport class ActiveTransitionFilter {\n static async filter<TSubject = unknown>(\n transitions: Iterable<TransitionInterface<TSubject>>,\n subject: TSubject,\n context: Map<string, unknown>,\n event?: EventInterface,\n ): Promise<TransitionInterface<TSubject>[]> {\n const active: TransitionInterface<TSubject>[] = [];\n for (const transition of transitions) {\n if (await transition.isActive(subject, context, event)) {\n active.push(transition);\n }\n }\n return active;\n }\n}\n","import { FinitaError } from \"./FinitaError.js\";\n\nexport class WrongEventForStateError extends FinitaError {\n readonly code = \"wrongEventForState\";\n readonly stateName: string;\n readonly eventName: string;\n\n constructor(stateName: string, eventName: string) {\n super(`Current state \"${stateName}\" doesn't have event \"${eventName}\"`);\n this.name = \"WrongEventForStateError\";\n this.stateName = stateName;\n this.eventName = eventName;\n }\n}\n","import { FinitaError } from \"./FinitaError.js\";\n\nexport class LockCanNotBeAcquiredError extends FinitaError {\n readonly code = \"lockCanNotBeAcquired\";\n\n constructor(message = \"Lock can not be acquired!\") {\n super(message);\n this.name = \"LockCanNotBeAcquiredError\";\n }\n}\n","import { FinitaError } from \"./FinitaError.js\";\n\nexport class AutomaticTransitionCycleError extends FinitaError {\n readonly code = \"automaticTransitionCycle\";\n readonly targetStateName: string;\n readonly visitedStateNames: readonly string[];\n\n constructor(targetStateName: string, visitedStateNames: Iterable<string>) {\n const visited = Array.from(visitedStateNames);\n super(\n `Automatic transition cycle detected: state \"${targetStateName}\" was already visited — this would cause infinite recursion`,\n );\n this.name = \"AutomaticTransitionCycleError\";\n this.targetStateName = targetStateName;\n this.visitedStateNames = Object.freeze([...visited]);\n }\n}\n","import type { StatemachineInterface } from \"./interfaces/StatemachineInterface.js\";\nimport type { StateInterface } from \"./interfaces/StateInterface.js\";\nimport type { ProcessInterface } from \"./interfaces/ProcessInterface.js\";\nimport type { TransitionInterface } from \"./interfaces/TransitionInterface.js\";\nimport type { EventInterface } from \"./interfaces/EventInterface.js\";\nimport type { MutexInterface } from \"./interfaces/MutexInterface.js\";\nimport type { TransitionSelectorInterface } from \"./interfaces/TransitionSelectorInterface.js\";\nimport type { BeforeTransitionObserver } from \"./interfaces/BeforeTransitionObserverInterface.js\";\nimport type {\n AfterTransitionObserver,\n EnqueueContext,\n} from \"./interfaces/AfterTransitionObserverInterface.js\";\nimport type {\n TransitionFrame,\n ProposedTransitionFrame,\n} from \"./interfaces/TransitionFrameInterface.js\";\nimport type { StatemachineOptions } from \"./interfaces/StatemachineOptions.js\";\nimport { OneOrNoneActiveTransition } from \"./selector/OneOrNoneActiveTransition.js\";\nimport { NullMutex } from \"./mutex/NullMutex.js\";\nimport { Dispatcher } from \"./internal/Dispatcher.js\";\nimport { OperationQueue } from \"./internal/OperationQueue.js\";\nimport type { QueuedOperation } from \"./internal/OperationQueue.js\";\nimport { ActiveTransitionFilter } from \"./filter/ActiveTransitionFilter.js\";\nimport { WrongEventForStateError } from \"./error/WrongEventForStateError.js\";\nimport { LockCanNotBeAcquiredError } from \"./error/LockCanNotBeAcquiredError.js\";\nimport { AutomaticTransitionCycleError } from \"./error/AutomaticTransitionCycleError.js\";\n\nexport class Statemachine<\n TSubject = unknown,\n> implements StatemachineInterface<TSubject> {\n private readonly subject: TSubject;\n private readonly process: ProcessInterface;\n private readonly transitionSelector: TransitionSelectorInterface<TSubject>;\n private readonly mutex: MutexInterface;\n\n private currentState: StateInterface;\n private lastState: StateInterface | null = null;\n\n private autoreleaseLock: boolean;\n\n private readonly queue = new OperationQueue();\n private running = false;\n\n private readonly beforeObservers: BeforeTransitionObserver<TSubject>[] = [];\n private readonly afterObservers: AfterTransitionObserver<TSubject>[] = [];\n\n constructor(\n subject: TSubject,\n process: ProcessInterface,\n options: StatemachineOptions<TSubject> = {},\n ) {\n this.subject = subject;\n this.process = process;\n this.currentState = options.initialStateName\n ? process.getState(options.initialStateName)\n : process.getInitialState();\n this.transitionSelector =\n options.transitionSelector ?? new OneOrNoneActiveTransition<TSubject>();\n this.mutex = options.mutex ?? new NullMutex();\n this.autoreleaseLock = options.autoreleaseLock ?? true;\n }\n\n // --- public getters ---\n\n getCurrentState(): StateInterface {\n return this.currentState;\n }\n\n getLastState(): StateInterface | null {\n return this.lastState;\n }\n\n getSubject(): TSubject {\n return this.subject;\n }\n\n getProcess(): ProcessInterface {\n return this.process;\n }\n\n // --- public observer attach/detach ---\n\n attachBefore(observer: BeforeTransitionObserver<TSubject>): void {\n this.beforeObservers.push(observer);\n }\n\n detachBefore(observer: BeforeTransitionObserver<TSubject>): void {\n const idx = this.beforeObservers.indexOf(observer);\n if (idx >= 0) this.beforeObservers.splice(idx, 1);\n }\n\n getBeforeObservers(): Iterable<BeforeTransitionObserver<TSubject>> {\n return this.beforeObservers;\n }\n\n attachAfter(observer: AfterTransitionObserver<TSubject>): void {\n this.afterObservers.push(observer);\n }\n\n detachAfter(observer: AfterTransitionObserver<TSubject>): void {\n const idx = this.afterObservers.indexOf(observer);\n if (idx >= 0) this.afterObservers.splice(idx, 1);\n }\n\n getAfterObservers(): Iterable<AfterTransitionObserver<TSubject>> {\n return this.afterObservers;\n }\n\n // --- public locking ---\n\n async acquireLock(): Promise<boolean> {\n return this.mutex.acquireLock();\n }\n\n async releaseLock(): Promise<void> {\n await this.mutex.releaseLock();\n }\n\n isLockAcquired(): boolean {\n return this.mutex.isAcquired();\n }\n\n isAutoreleaseLock(): boolean {\n return this.autoreleaseLock;\n }\n\n setAutoreleaseLock(autorelease: boolean): void {\n this.autoreleaseLock = autorelease;\n }\n\n // --- public top-level operations ---\n\n triggerEvent(name: string, context?: Map<string, unknown>): Promise<void> {\n return new Promise<void>((resolve, reject) => {\n this.queue.enqueue({\n kind: \"triggerEvent\",\n eventName: name,\n context: context ?? new Map(),\n resolve,\n reject,\n });\n void this.runIfIdle();\n });\n }\n\n checkTransitions(context?: Map<string, unknown>): Promise<void> {\n return new Promise<void>((resolve, reject) => {\n this.queue.enqueue({\n kind: \"checkTransitions\",\n eventName: null,\n context: context ?? new Map(),\n resolve,\n reject,\n });\n void this.runIfIdle();\n });\n }\n\n // --- internal runner ---\n\n private async runIfIdle(): Promise<void> {\n if (this.running) return;\n this.running = true;\n try {\n while (!this.queue.isEmpty()) {\n const op = this.queue.dequeue()!;\n await this.runOperation(op);\n }\n } finally {\n this.running = false;\n }\n }\n\n private async runOperation(op: QueuedOperation): Promise<void> {\n // If the caller has already acquired the mutex (e.g. manual lock\n // management with autoreleaseLock: false), don't reacquire — many\n // mutex implementations (database advisory locks, redis SET NX, etc.)\n // are not idempotent and will fail on the second acquire. We only\n // release in this method if we acquired in this method.\n let acquiredHere = false;\n try {\n if (!this.mutex.isAcquired()) {\n if (!(await this.mutex.acquireLock())) {\n throw new LockCanNotBeAcquiredError(\"Lock can not be acquired!\");\n }\n acquiredHere = true;\n }\n\n const event =\n op.kind === \"triggerEvent\" ? this.resolveEvent(op.eventName!) : null;\n\n await this.processOperation(event, op.context);\n op.resolve();\n } catch (err) {\n op.reject(err);\n } finally {\n if (acquiredHere && this.autoreleaseLock) {\n try {\n await this.mutex.releaseLock();\n } catch {\n // releaseLock errors must not mask the operation outcome.\n }\n }\n }\n }\n\n private resolveEvent(name: string): EventInterface {\n if (!this.currentState.hasEvent(name)) {\n throw new WrongEventForStateError(this.currentState.getName(), name);\n }\n return this.currentState.getEvent(name);\n }\n\n /**\n * Drive transitions starting from the current state, following automatic\n * transitions until quiescent. The first iteration may use the supplied\n * event; subsequent iterations are automatic.\n */\n private async processOperation(\n initialEvent: EventInterface | null,\n context: Map<string, unknown>,\n ): Promise<void> {\n let event = initialEvent;\n const automaticVisited = new Set<StateInterface>();\n\n // Fire event-attached observers (imperative commands attached via\n // event.attach()) when the user-supplied event is resolved, regardless\n // of whether a transition fires. Runs once per triggerEvent call —\n // automatic transitions in the iteration loop have event=null and don't\n // re-trigger this dispatch.\n if (event) {\n const dispatcher = new Dispatcher();\n dispatcher.dispatch(event, [this.subject, context]);\n await dispatcher.invoke();\n }\n\n while (true) {\n const transitions = this.currentState.getTransitions();\n const active = await ActiveTransitionFilter.filter(\n transitions,\n this.subject,\n context,\n event ?? undefined,\n );\n const selected = this.transitionSelector.selectTransition(\n active,\n ) as TransitionInterface<TSubject> | null;\n\n if (!selected) {\n return;\n }\n\n const target = selected.getTargetState();\n\n if (selected.getEventName() === null) {\n automaticVisited.add(this.currentState);\n if (automaticVisited.has(target)) {\n throw new AutomaticTransitionCycleError(\n target.getName(),\n Array.from(automaticVisited).map((s) => s.getName()),\n );\n }\n }\n\n if (this.currentState !== target) {\n const proposedFrame: ProposedTransitionFrame<TSubject> = Object.freeze({\n fromState: this.currentState,\n toState: target,\n transition: selected,\n event,\n condition: selected.getCondition(),\n context: this.readonlyContext(context),\n timestamp: Date.now(),\n machineName: this.process.getName(),\n });\n\n // Before phase — first observer to throw aborts.\n for (const observer of this.beforeObservers) {\n await observer.notify(proposedFrame);\n }\n\n // Commit.\n const fromState = this.currentState;\n this.lastState = fromState;\n this.currentState = target;\n\n const committedFrame: TransitionFrame<TSubject> = Object.freeze({\n fromState,\n toState: target,\n transition: selected,\n event,\n condition: selected.getCondition(),\n context: this.readonlyContext(context),\n timestamp: proposedFrame.timestamp,\n machineName: this.process.getName(),\n });\n\n // After phase — collect errors, notify all, then rethrow.\n const enqueueCtx: EnqueueContext = {\n enqueue: (chainedEventName, chainedCtx) => {\n this.queue.enqueue({\n kind: \"triggerEvent\",\n eventName: chainedEventName,\n context: chainedCtx ?? new Map(),\n resolve: () => {\n /* chained ops are not awaited by the original caller */\n },\n reject: () => {\n /* chained errors do not propagate to the original caller */\n },\n });\n },\n };\n\n const errors: unknown[] = [];\n for (const observer of this.afterObservers) {\n try {\n await observer.notify(committedFrame, enqueueCtx);\n } catch (err) {\n errors.push(err);\n }\n }\n if (errors.length === 1) {\n throw errors[0];\n }\n if (errors.length > 1) {\n throw new AggregateError(\n errors,\n `${errors.length} after-transition observer(s) threw`,\n );\n }\n }\n\n // Auto-follow-on: continue with no event.\n event = null;\n }\n }\n\n private readonlyContext(\n ctx: Map<string, unknown>,\n ): ReadonlyMap<string, unknown> {\n // Wrap to discourage mutation. We don't deep-freeze the values themselves —\n // keys removed from the wrapper map don't affect the underlying ctx, so\n // a thin wrapper suffices.\n return new Map(ctx);\n }\n}\n","import type { ConditionInterface } from \"../interfaces/ConditionInterface.js\";\n\nexport class Tautology implements ConditionInterface {\n private readonly name: string;\n\n constructor(name = \"Tautology\") {\n this.name = name;\n }\n\n getName(): string {\n return this.name;\n }\n\n checkCondition(_subject: unknown, _context: Map<string, unknown>): boolean {\n return true;\n }\n}\n","import type { ConditionInterface } from \"../interfaces/ConditionInterface.js\";\n\nexport class Contradiction implements ConditionInterface {\n private readonly name: string;\n\n constructor(name = \"Contradiction\") {\n this.name = name;\n }\n\n getName(): string {\n return this.name;\n }\n\n checkCondition(_subject: unknown, _context: Map<string, unknown>): boolean {\n return false;\n }\n}\n","import type { ConditionInterface } from \"../interfaces/ConditionInterface.js\";\nimport type { MaybePromise } from \"../MaybePromise.js\";\n\nexport type ConditionCallbackFn<TSubject = unknown> = (\n subject: TSubject,\n context: Map<string, unknown>,\n) => MaybePromise<boolean>;\n\nexport class CallbackCondition<\n TSubject = unknown,\n> implements ConditionInterface<TSubject> {\n private readonly name: string;\n private readonly callable: ConditionCallbackFn<TSubject>;\n\n constructor(name: string, callable: ConditionCallbackFn<TSubject>) {\n this.name = name;\n this.callable = callable;\n }\n\n getName(): string {\n return this.name;\n }\n\n checkCondition(\n subject: TSubject,\n context: Map<string, unknown>,\n ): MaybePromise<boolean> {\n return this.callable(subject, context);\n }\n}\n","import type { ConditionInterface } from \"../interfaces/ConditionInterface.js\";\nimport type { LastStateHasChangedDateInterface } from \"../interfaces/LastStateHasChangedDateInterface.js\";\n\nfunction isLastStateHasChangedDate(\n obj: unknown,\n): obj is LastStateHasChangedDateInterface {\n return (\n typeof obj === \"object\" &&\n obj !== null &&\n \"getLastStateHasChangedDate\" in obj &&\n typeof (obj as LastStateHasChangedDateInterface)\n .getLastStateHasChangedDate === \"function\"\n );\n}\n\nexport class Timeout implements ConditionInterface {\n private readonly timeoutMs: number;\n private readonly label: string;\n\n constructor(timeoutMs: number, label?: string) {\n this.timeoutMs = timeoutMs;\n this.label = label ?? `${timeoutMs}ms`;\n }\n\n getName(): string {\n return `Timeout: ${this.label}`;\n }\n\n protected getLastStateHasChangedDate(\n subject: unknown,\n _context: Map<string, unknown>,\n ): Date {\n if (isLastStateHasChangedDate(subject)) {\n return subject.getLastStateHasChangedDate();\n }\n throw new Error(\"Subject must implement LastStateHasChangedDateInterface\");\n }\n\n checkCondition(subject: unknown, context: Map<string, unknown>): boolean {\n const date = new Date(\n this.getLastStateHasChangedDate(subject, context).getTime(),\n );\n date.setTime(date.getTime() + this.timeoutMs);\n return date <= new Date();\n }\n}\n","import type { ConditionInterface } from \"../interfaces/ConditionInterface.js\";\n\nexport class AndComposite<\n TSubject = unknown,\n> implements ConditionInterface<TSubject> {\n private readonly conditions: ConditionInterface<TSubject>[] = [];\n\n constructor(condition: ConditionInterface<TSubject>) {\n this.conditions.push(condition);\n }\n\n addAnd(condition: ConditionInterface<TSubject>): this {\n this.conditions.push(condition);\n return this;\n }\n\n getName(): string {\n const names = this.conditions.map((c) => c.getName());\n return `(${names.join(\" and \")})`;\n }\n\n async checkCondition(\n subject: TSubject,\n context: Map<string, unknown>,\n ): Promise<boolean> {\n for (const condition of this.conditions) {\n if (!(await condition.checkCondition(subject, context))) {\n return false;\n }\n }\n return true;\n }\n}\n","import type { ConditionInterface } from \"../interfaces/ConditionInterface.js\";\n\nexport class OrComposite<\n TSubject = unknown,\n> implements ConditionInterface<TSubject> {\n private readonly conditions: ConditionInterface<TSubject>[] = [];\n\n constructor(condition: ConditionInterface<TSubject>) {\n this.conditions.push(condition);\n }\n\n addOr(condition: ConditionInterface<TSubject>): this {\n this.conditions.push(condition);\n return this;\n }\n\n getName(): string {\n const names = this.conditions.map((c) => c.getName());\n return `(${names.join(\" or \")})`;\n }\n\n async checkCondition(\n subject: TSubject,\n context: Map<string, unknown>,\n ): Promise<boolean> {\n for (const condition of this.conditions) {\n if (await condition.checkCondition(subject, context)) {\n return true;\n }\n }\n return false;\n }\n}\n","import type { ConditionInterface } from \"../interfaces/ConditionInterface.js\";\n\nexport class Not<TSubject = unknown> implements ConditionInterface<TSubject> {\n private readonly condition: ConditionInterface<TSubject>;\n\n constructor(condition: ConditionInterface<TSubject>) {\n this.condition = condition;\n }\n\n getName(): string {\n return `not ( ${this.condition.getName()} )`;\n }\n\n async checkCondition(\n subject: TSubject,\n context: Map<string, unknown>,\n ): Promise<boolean> {\n return !(await this.condition.checkCondition(subject, context));\n }\n}\n","import type { Observer, ObservableSubject } from \"../interfaces/Observer.js\";\nimport type { EventInterface } from \"../interfaces/EventInterface.js\";\nimport type { MaybePromise } from \"../MaybePromise.js\";\n\n/**\n * Legacy Observer for Event observers (commands attached to specific events).\n *\n * In v3 this is no longer used as a Statemachine observer. To run a\n * callback after every transition, implement AfterTransitionObserver\n * directly or compose a small wrapper.\n */\nexport class CallbackObserver implements Observer {\n private readonly callback: (...args: unknown[]) => MaybePromise<void>;\n\n constructor(callback: (...args: unknown[]) => MaybePromise<void>) {\n this.callback = callback;\n }\n\n update(subject: ObservableSubject): MaybePromise<void> {\n const event = subject as EventInterface;\n if (typeof event.getInvokeArgs === \"function\") {\n return this.callback(...event.getInvokeArgs());\n }\n return this.callback(subject);\n }\n}\n","import type { AfterTransitionObserver } from \"../interfaces/AfterTransitionObserverInterface.js\";\nimport type { TransitionFrame } from \"../interfaces/TransitionFrameInterface.js\";\nimport type { StatefulInterface } from \"../interfaces/StatefulInterface.js\";\n\nexport class StatefulStatusChanger<\n TSubject extends StatefulInterface,\n> implements AfterTransitionObserver<TSubject> {\n private readonly subject: TSubject;\n\n constructor(subject: TSubject) {\n this.subject = subject;\n }\n\n notify(frame: TransitionFrame<TSubject>): void {\n this.subject.setCurrentStateName(frame.toState.getName());\n }\n}\n","import type {\n AfterTransitionObserver,\n EnqueueContext,\n} from \"../interfaces/AfterTransitionObserverInterface.js\";\nimport type { TransitionFrame } from \"../interfaces/TransitionFrameInterface.js\";\n\n/**\n * After-transition observer that fires an event named DEFAULT_EVENT_NAME\n * (or a custom name) when entering any state that has that event declared.\n *\n * The chained event is *enqueued*, not invoked inline: it runs as its own\n * top-level operation after the current operation completes. Other\n * after-observers registered after OnEnterObserver still see the original\n * frame, not the chained one.\n */\nexport class OnEnterObserver<\n TSubject = unknown,\n> implements AfterTransitionObserver<TSubject> {\n static readonly DEFAULT_EVENT_NAME = \"onEnter\";\n\n private readonly eventName: string;\n\n constructor(eventName: string = OnEnterObserver.DEFAULT_EVENT_NAME) {\n this.eventName = eventName;\n }\n\n notify(frame: TransitionFrame<TSubject>, ctx: EnqueueContext): void {\n if (frame.toState.hasEvent(this.eventName)) {\n ctx.enqueue(this.eventName, new Map(frame.context));\n }\n }\n}\n","import type { AfterTransitionObserver } from \"../interfaces/AfterTransitionObserverInterface.js\";\nimport type { TransitionFrame } from \"../interfaces/TransitionFrameInterface.js\";\nimport type { LoggerInterface } from \"../interfaces/LoggerInterface.js\";\nimport type { Named } from \"../interfaces/Named.js\";\n\nfunction isNamed(obj: unknown): obj is Named {\n return (\n typeof obj === \"object\" &&\n obj !== null &&\n \"getName\" in obj &&\n typeof (obj as Named).getName === \"function\"\n );\n}\n\nfunction asString(obj: unknown): string {\n if (isNamed(obj)) return obj.getName();\n return String(obj);\n}\n\nexport class TransitionLogger<\n TSubject = unknown,\n> implements AfterTransitionObserver<TSubject> {\n private readonly logger: LoggerInterface;\n private readonly loggerLevel: string;\n\n constructor(logger: LoggerInterface, loggerLevel = \"info\") {\n this.logger = logger;\n this.loggerLevel = loggerLevel;\n }\n\n notify(frame: TransitionFrame<TSubject>): void {\n let message = \"Transition\";\n\n // Subject identity isn't on the frame in v3 — callers who want subject\n // names attach a custom observer that closes over the subject.\n\n message += ` from \"${asString(frame.fromState)}\" to \"${asString(frame.toState)}\"`;\n\n const eventName = frame.event ? frame.event.getName() : null;\n const conditionName = frame.condition ? frame.condition.getName() : null;\n if (eventName || conditionName) {\n message += \" with\";\n if (eventName) message += ` event \"${eventName}\"`;\n if (conditionName) message += ` condition \"${conditionName}\"`;\n }\n\n this.logger.log(this.loggerLevel, message, {\n fromState: frame.fromState,\n toState: frame.toState,\n event: frame.event,\n transition: frame.transition,\n machineName: frame.machineName,\n });\n }\n}\n","import type { StateInterface } from \"../interfaces/StateInterface.js\";\n\nexport class FilterStateByEvent {\n static *filter(\n states: Iterable<StateInterface>,\n eventName: string,\n ): Iterable<StateInterface> {\n for (const state of states) {\n if (state.hasEvent(eventName)) {\n yield state;\n }\n }\n }\n}\n","import type { StateInterface } from \"../interfaces/StateInterface.js\";\n\n/**\n * Filters states that have at least one automatic transition (no event name).\n */\nexport class FilterStateByTransition {\n static *filter(states: Iterable<StateInterface>): Iterable<StateInterface> {\n for (const state of states) {\n for (const transition of state.getTransitions()) {\n if (!transition.getEventName()) {\n yield state;\n break;\n }\n }\n }\n }\n}\n","import type { StateInterface } from \"../interfaces/StateInterface.js\";\n\nexport class FilterStateByFinalState {\n static *filter(states: Iterable<StateInterface>): Iterable<StateInterface> {\n for (const state of states) {\n let count = 0;\n for (const _transition of state.getTransitions()) {\n count++;\n break;\n }\n if (count === 0) {\n yield state;\n }\n }\n }\n}\n","import type { TransitionInterface } from \"../interfaces/TransitionInterface.js\";\n\nexport class FilterTransitionByEvent {\n static *filter(\n transitions: Iterable<TransitionInterface>,\n eventName: string,\n ): Iterable<TransitionInterface> {\n for (const transition of transitions) {\n if (transition.getEventName() === eventName) {\n yield transition;\n }\n }\n }\n}\n","import type { TransitionSelectorInterface } from \"../interfaces/TransitionSelectorInterface.js\";\nimport type { TransitionInterface } from \"../interfaces/TransitionInterface.js\";\nimport { OneOrNoneActiveTransition } from \"./OneOrNoneActiveTransition.js\";\n\nexport class ScoreTransition<\n TSubject = unknown,\n> implements TransitionSelectorInterface<TSubject> {\n private readonly innerSelector: TransitionSelectorInterface<TSubject>;\n\n constructor(innerSelector?: TransitionSelectorInterface<TSubject>) {\n this.innerSelector =\n innerSelector ?? new OneOrNoneActiveTransition<TSubject>();\n }\n\n protected calculateScore(transition: TransitionInterface<TSubject>): number {\n let score = 0;\n if (transition.getEventName()) {\n score += 2;\n }\n if (transition.getConditionName()) {\n score += 1;\n }\n return score;\n }\n\n selectTransition(\n transitions: Iterable<TransitionInterface<TSubject>>,\n ): TransitionInterface<TSubject> | null {\n let bestTransitions: TransitionInterface<TSubject>[] = [];\n let bestScore = -1;\n for (const transition of transitions) {\n const score = this.calculateScore(transition);\n if (score > bestScore) {\n bestScore = score;\n bestTransitions = [transition];\n } else if (score === bestScore) {\n bestTransitions.push(transition);\n }\n }\n return this.innerSelector.selectTransition(bestTransitions);\n }\n}\n","import type { TransitionSelectorInterface } from \"../interfaces/TransitionSelectorInterface.js\";\nimport type { TransitionInterface } from \"../interfaces/TransitionInterface.js\";\nimport { OneOrNoneActiveTransition } from \"./OneOrNoneActiveTransition.js\";\n\nexport class WeightTransition<\n TSubject = unknown,\n> implements TransitionSelectorInterface<TSubject> {\n private readonly innerSelector: TransitionSelectorInterface<TSubject>;\n private readonly epsilon: number;\n\n constructor(\n innerSelector?: TransitionSelectorInterface<TSubject>,\n epsilon = 0.001,\n ) {\n this.innerSelector =\n innerSelector ?? new OneOrNoneActiveTransition<TSubject>();\n this.epsilon = epsilon;\n }\n\n selectTransition(\n transitions: Iterable<TransitionInterface<TSubject>>,\n ): TransitionInterface<TSubject> | null {\n let bestTransitions: TransitionInterface<TSubject>[] = [];\n let bestWeight: number | null = null;\n for (const transition of transitions) {\n const weight = transition.getWeight();\n const diff = weight - (bestWeight ?? 0);\n if (bestWeight === null || diff >= this.epsilon) {\n bestWeight = weight;\n bestTransitions = [transition];\n } else if (Math.abs(diff) < this.epsilon) {\n bestTransitions.push(transition);\n }\n }\n return this.innerSelector.selectTransition(bestTransitions);\n }\n}\n","import type { MutexInterface } from \"../interfaces/MutexInterface.js\";\nimport type { LockAdapterInterface } from \"../interfaces/LockAdapterInterface.js\";\n\nexport class LockAdapterMutex implements MutexInterface {\n private readonly lockAdapter: LockAdapterInterface;\n private readonly resourceName: string;\n private acquired = false;\n\n constructor(lockAdapter: LockAdapterInterface, resourceName: string) {\n this.lockAdapter = lockAdapter;\n this.resourceName = resourceName;\n }\n\n async acquireLock(): Promise<boolean> {\n if (!this.acquired) {\n this.acquired = await this.lockAdapter.acquireLock(this.resourceName);\n }\n return this.acquired;\n }\n\n async releaseLock(): Promise<boolean> {\n if (this.acquired) {\n const result = await this.lockAdapter.releaseLock(this.resourceName);\n if (result) {\n this.acquired = false;\n }\n return result;\n }\n return false;\n }\n\n isAcquired(): boolean {\n return this.acquired;\n }\n\n async isLocked(): Promise<boolean> {\n return this.lockAdapter.isLocked(this.resourceName);\n }\n}\n","import type { MutexFactoryInterface } from \"../interfaces/MutexFactoryInterface.js\";\nimport type { MutexInterface } from \"../interfaces/MutexInterface.js\";\nimport type { LockAdapterInterface } from \"../interfaces/LockAdapterInterface.js\";\nimport { LockAdapterMutex } from \"./LockAdapterMutex.js\";\n\nexport type StringConverter<TSubject = unknown> = (subject: TSubject) => string;\n\nexport class MutexFactory<\n TSubject = unknown,\n> implements MutexFactoryInterface<TSubject> {\n private readonly lockAdapter: LockAdapterInterface;\n private readonly stringConverter: StringConverter<TSubject>;\n\n constructor(\n lockAdapter: LockAdapterInterface,\n stringConverter: StringConverter<TSubject>,\n ) {\n this.lockAdapter = lockAdapter;\n this.stringConverter = stringConverter;\n }\n\n createMutex(subject: TSubject): MutexInterface {\n return new LockAdapterMutex(\n this.lockAdapter,\n this.stringConverter(subject),\n );\n }\n}\n","import type { FactoryInterface } from \"../interfaces/FactoryInterface.js\";\nimport type { ProcessDetectorInterface } from \"../interfaces/ProcessDetectorInterface.js\";\nimport type { StateNameDetectorInterface } from \"../interfaces/StateNameDetectorInterface.js\";\nimport type { TransitionSelectorInterface } from \"../interfaces/TransitionSelectorInterface.js\";\nimport type { MutexFactoryInterface } from \"../interfaces/MutexFactoryInterface.js\";\nimport type { StatemachineInterface } from \"../interfaces/StatemachineInterface.js\";\nimport type { BeforeTransitionObserver } from \"../interfaces/BeforeTransitionObserverInterface.js\";\nimport type { AfterTransitionObserver } from \"../interfaces/AfterTransitionObserverInterface.js\";\nimport { Statemachine } from \"../Statemachine.js\";\n\nexport class Factory<TSubject = unknown> implements FactoryInterface<TSubject> {\n private readonly processDetector: ProcessDetectorInterface<TSubject>;\n private readonly stateNameDetector: StateNameDetectorInterface<TSubject> | null;\n private readonly beforeObservers: Set<BeforeTransitionObserver<TSubject>> =\n new Set();\n private readonly afterObservers: Set<AfterTransitionObserver<TSubject>> =\n new Set();\n private transitionSelector: TransitionSelectorInterface<TSubject> | null =\n null;\n private mutexFactory: MutexFactoryInterface<TSubject> | null = null;\n\n constructor(\n processDetector: ProcessDetectorInterface<TSubject>,\n stateNameDetector?: StateNameDetectorInterface<TSubject> | null,\n ) {\n this.processDetector = processDetector;\n this.stateNameDetector = stateNameDetector ?? null;\n }\n\n setMutexFactory(factory: MutexFactoryInterface<TSubject> | null): void {\n this.mutexFactory = factory;\n }\n\n setTransitionSelector(selector: TransitionSelectorInterface<TSubject>): void {\n this.transitionSelector = selector;\n }\n\n attachBeforeObserver(observer: BeforeTransitionObserver<TSubject>): void {\n this.beforeObservers.add(observer);\n }\n\n detachBeforeObserver(observer: BeforeTransitionObserver<TSubject>): void {\n this.beforeObservers.delete(observer);\n }\n\n attachAfterObserver(observer: AfterTransitionObserver<TSubject>): void {\n this.afterObservers.add(observer);\n }\n\n detachAfterObserver(observer: AfterTransitionObserver<TSubject>): void {\n this.afterObservers.delete(observer);\n }\n\n async createStatemachine(\n subject: TSubject,\n ): Promise<StatemachineInterface<TSubject>> {\n const process = this.processDetector.detectProcess(subject);\n const stateName = this.stateNameDetector\n ? this.stateNameDetector.detectCurrentStateName(subject)\n : undefined;\n const mutex = this.mutexFactory\n ? await this.mutexFactory.createMutex(subject)\n : undefined;\n\n const sm = new Statemachine<TSubject>(subject, process, {\n initialStateName: stateName ?? undefined,\n transitionSelector: this.transitionSelector ?? undefined,\n mutex: mutex ?? undefined,\n });\n\n for (const o of this.beforeObservers) sm.attachBefore(o);\n for (const o of this.afterObservers) sm.attachAfter(o);\n\n return sm;\n }\n}\n","import type { ProcessDetectorInterface } from \"../interfaces/ProcessDetectorInterface.js\";\nimport type { ProcessInterface } from \"../interfaces/ProcessInterface.js\";\n\nexport class SingleProcessDetector<\n TSubject = unknown,\n> implements ProcessDetectorInterface<TSubject> {\n private readonly process: ProcessInterface;\n\n constructor(process: ProcessInterface) {\n this.process = process;\n }\n\n detectProcess(_subject: TSubject): ProcessInterface {\n return this.process;\n }\n}\n","import { FinitaError } from \"./FinitaError.js\";\n\nexport class ProcessNotFoundError extends FinitaError {\n readonly code = \"processNotFound\";\n readonly processName: string;\n readonly availableProcesses: readonly string[];\n\n constructor(processName: string, availableProcesses: Iterable<string>) {\n const list = Array.from(availableProcesses);\n const display =\n list.length > 0 ? list.map((n) => `\"${n}\"`).join(\", \") : \"(none)\";\n super(`Process \"${processName}\" not found. Available: ${display}`);\n this.name = \"ProcessNotFoundError\";\n this.processName = processName;\n this.availableProcesses = Object.freeze([...list]);\n }\n}\n","import type { ProcessDetectorInterface } from \"../interfaces/ProcessDetectorInterface.js\";\nimport type { ProcessInterface } from \"../interfaces/ProcessInterface.js\";\nimport { ProcessNotFoundError } from \"../error/ProcessNotFoundError.js\";\n\nexport abstract class AbstractNamedProcessDetector<\n TSubject = unknown,\n> implements ProcessDetectorInterface<TSubject> {\n private readonly processes: Map<string, ProcessInterface> = new Map();\n\n protected abstract detectProcessName(subject: TSubject): string;\n\n addProcess(process: ProcessInterface): void {\n this.processes.set(process.getName(), process);\n }\n\n hasProcess(name: string): boolean {\n return this.processes.has(name);\n }\n\n detectProcess(subject: TSubject): ProcessInterface {\n const name = this.detectProcessName(subject);\n const process = this.processes.get(name);\n if (!process) {\n throw new ProcessNotFoundError(name, this.processes.keys());\n }\n return process;\n }\n}\n","import { FinitaError } from \"./FinitaError.js\";\n\nexport class InvalidSubjectError extends FinitaError {\n readonly code = \"invalidSubject\";\n readonly expectedInterface: string;\n readonly missingMembers: readonly string[];\n\n constructor(expectedInterface: string, missingMembers: Iterable<string>) {\n const members = Array.from(missingMembers);\n const memberList = members.map((m) => `\"${m}\"`).join(\", \");\n super(\n `Subject does not satisfy ${expectedInterface}; missing member(s): ${memberList || \"(unknown)\"}`,\n );\n this.name = \"InvalidSubjectError\";\n this.expectedInterface = expectedInterface;\n this.missingMembers = Object.freeze([...members]);\n }\n}\n","import type { StateNameDetectorInterface } from \"../interfaces/StateNameDetectorInterface.js\";\nimport type { StatefulInterface } from \"../interfaces/StatefulInterface.js\";\nimport { InvalidSubjectError } from \"../error/InvalidSubjectError.js\";\n\nfunction isStateful(obj: unknown): obj is StatefulInterface {\n return (\n typeof obj === \"object\" &&\n obj !== null &&\n \"getCurrentStateName\" in obj &&\n typeof (obj as StatefulInterface).getCurrentStateName === \"function\"\n );\n}\n\nexport class StatefulStateNameDetector implements StateNameDetectorInterface<StatefulInterface> {\n detectCurrentStateName(subject: StatefulInterface): string | null {\n if (isStateful(subject)) {\n return subject.getCurrentStateName();\n }\n throw new InvalidSubjectError(\"StatefulInterface\", [\"getCurrentStateName\"]);\n }\n}\n","import type { StateInterface } from \"../interfaces/StateInterface.js\";\nimport type { TransitionInterface } from \"../interfaces/TransitionInterface.js\";\nimport type { StateCollectionInterface } from \"../interfaces/StateCollectionInterface.js\";\nimport type { Named } from \"../interfaces/Named.js\";\n\nexport interface GraphNode {\n id: string;\n label: string;\n metadata: Record<string, unknown>;\n}\n\nexport interface GraphEdge {\n source: string;\n target: string;\n label: string;\n metadata: Record<string, unknown>;\n}\n\nexport interface Graph {\n nodes: GraphNode[];\n edges: GraphEdge[];\n}\n\nfunction isNamed(obj: unknown): obj is Named {\n return (\n typeof obj === \"object\" &&\n obj !== null &&\n \"getName\" in obj &&\n typeof (obj as Named).getName === \"function\"\n );\n}\n\nfunction escapeDoubleQuotes(str: string): string {\n return str.replace(/\"/g, '\\\\\"');\n}\n\nfunction toMermaidId(name: string): string {\n return (\n \"s_\" +\n name.replace(\n /[^a-zA-Z0-9]/g,\n (ch) => `_${ch.charCodeAt(0).toString(16).padStart(4, \"0\")}`,\n )\n );\n}\n\nfunction escapeMermaidLabel(str: string): string {\n return str.replace(/\"/g, \"#quot;\");\n}\n\nfunction convertToString(obj: unknown): string {\n if (isNamed(obj)) {\n return obj.getName();\n }\n return String(obj);\n}\n\nexport interface DotOptions {\n rankdir?: string;\n}\n\nexport interface MermaidOptions {\n direction?: string;\n}\n\nexport class GraphBuilder {\n private readonly nodes: Map<string, GraphNode> = new Map();\n private readonly edges: GraphEdge[] = [];\n private readonly statesWithEdges: Set<string> = new Set();\n\n private getOrCreateNode(state: StateInterface): GraphNode {\n const name = state.getName();\n let node = this.nodes.get(name);\n if (!node) {\n node = { id: name, label: name, metadata: state.getMetadata() };\n this.nodes.set(name, node);\n }\n return node;\n }\n\n protected getTransitionLabel(\n state: StateInterface,\n transition: TransitionInterface,\n ): string {\n const parts: string[] = [];\n const eventName = transition.getEventName();\n if (eventName) {\n parts.push(`E: ${eventName}`);\n const event = state.getEvent(eventName);\n const observerNames: string[] = [];\n for (const observer of event.getObservers()) {\n observerNames.push(convertToString(observer));\n }\n if (observerNames.length > 0) {\n parts.push(`C: ${observerNames.join(\", \")}`);\n }\n }\n const conditionName = transition.getConditionName();\n if (conditionName) {\n parts.push(`IF: ${conditionName}`);\n }\n parts.push(`W: ${transition.getWeight()}`);\n return parts.join(\"\\n\");\n }\n\n addState(state: StateInterface): void {\n this.getOrCreateNode(state);\n const name = state.getName();\n if (this.statesWithEdges.has(name)) return;\n this.statesWithEdges.add(name);\n for (const transition of state.getTransitions()) {\n const sourceNode = this.getOrCreateNode(state);\n const targetNode = this.getOrCreateNode(transition.getTargetState());\n const label = this.getTransitionLabel(state, transition);\n const metadata: Record<string, unknown> = {};\n const eventName = transition.getEventName();\n if (eventName && state.hasEvent(eventName)) {\n Object.assign(metadata, state.getEvent(eventName).getMetadata());\n }\n this.edges.push({\n source: sourceNode.id,\n target: targetNode.id,\n label,\n metadata,\n });\n }\n }\n\n addStates(states: Iterable<StateInterface>): void {\n for (const state of states) {\n this.addState(state);\n }\n }\n\n addStateCollection(stateCollection: StateCollectionInterface): void {\n this.addStates(stateCollection.getStates());\n }\n\n getGraph(): Graph {\n return {\n nodes: Array.from(this.nodes.values()),\n edges: [...this.edges],\n };\n }\n\n toDot(options?: DotOptions): string {\n const graph = this.getGraph();\n const rankdir = options?.rankdir ?? \"LR\";\n const lines: string[] = [];\n lines.push(\"digraph {\");\n lines.push(` rankdir=${rankdir};`);\n for (const node of graph.nodes) {\n const label = escapeDoubleQuotes(node.label);\n lines.push(` \"${label}\" [label=\"${label}\"];`);\n }\n for (const edge of graph.edges) {\n const source = escapeDoubleQuotes(edge.source);\n const target = escapeDoubleQuotes(edge.target);\n const label = escapeDoubleQuotes(edge.label);\n lines.push(` \"${source}\" -> \"${target}\" [label=\"${label}\"];`);\n }\n lines.push(\"}\");\n return lines.join(\"\\n\");\n }\n\n toMermaid(options?: MermaidOptions): string {\n const graph = this.getGraph();\n const direction = options?.direction ?? \"LR\";\n const lines: string[] = [];\n lines.push(`stateDiagram-v2`);\n lines.push(` direction ${direction}`);\n const declared = new Set<string>();\n for (const node of graph.nodes) {\n const id = toMermaidId(node.id);\n if (!declared.has(id)) {\n declared.add(id);\n const label = escapeMermaidLabel(node.label);\n lines.push(` ${id} : \"${label}\"`);\n }\n }\n for (const edge of graph.edges) {\n const source = toMermaidId(edge.source);\n const target = toMermaidId(edge.target);\n const label = escapeMermaidLabel(edge.label.replace(/\\n/g, \" / \"));\n lines.push(` ${source} --> ${target} : ${label}`);\n }\n return lines.join(\"\\n\");\n }\n}\n"],"mappings":"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","names":["isNamed"]}