@vedmalex/statemachine 1.0.0-beta.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +75 -0
- package/dist/index.cjs +3989 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.js +3943 -0
- package/dist/index.js.map +1 -0
- package/package.json +77 -0
- package/types/adapters.d.ts +30 -0
- package/types/config_validator.d.ts +76 -0
- package/types/error_handling.d.ts +124 -0
- package/types/index.d.ts +77 -0
- package/types/lite.d.ts +6 -0
- package/types/logger.d.ts +74 -0
- package/types/monitoring.d.ts +239 -0
- package/types/presets.d.ts +27 -0
- package/types/scheduler.d.ts +65 -0
- package/types/security.d.ts +145 -0
- package/types/state_machine.d.ts +227 -0
- package/types/types.d.ts +250 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/scheduler.ts","../src/logger.ts","../src/security.ts","../src/monitoring.ts","../src/types.ts","../src/error_handling.ts","../src/state_machine.ts","../src/lite.ts","../src/config_validator.ts"],"sourcesContent":["import type { ITimerScheduler } from './types'\n\n/**\n * Тип для идентификатора таймера\n */\ntype TimerToken = object\n\ninterface TimerTask {\n token: TimerToken\n executeAt: number\n callback: () => void\n}\n\n/**\n * Планировщик таймеров на базе Min-Heap (Двоичная куча).\n * Позволяет эффективно управлять тысячами таймеров, используя единый цикл проверки.\n */\nexport class TimerScheduler {\n // Min-Heap: элемент с наименьшим executeAt всегда в index 0\n private heap: TimerTask[] = []\n\n // Set для быстрой проверки отмененных задач (Lazy Cancellation)\n // Это позволяет удалять задачи за O(1) без поиска в куче O(n)\n private activeTokens: WeakSet<TimerToken> = new WeakSet()\n\n private intervalId: any = null\n private pollingInterval = 100 // ms\n\n constructor() {}\n\n /**\n * Настройка режима опроса\n * @param interval Интервал проверки в мс. Если 0 или null - авто-тик выключается (ручной режим)\n */\n public setPollingInterval(interval: number | null) {\n this.stop()\n if (interval !== null && interval > 0) {\n this.pollingInterval = interval\n this.start()\n }\n }\n\n /**\n * Проверка активности планировщика\n */\n public isActive(): boolean {\n return this.intervalId !== null\n }\n\n /**\n * Запуск единого таймера\n */\n public start() {\n if (this.intervalId) return\n this.intervalId = setInterval(() => this.process(), this.pollingInterval)\n }\n\n /**\n * Остановка единого таймера\n */\n public stop() {\n if (this.intervalId) {\n clearInterval(this.intervalId)\n this.intervalId = null\n }\n }\n\n /**\n * Добавить задачу\n * @param delay задержка в мс\n * @param callback функция для выполнения\n * @returns токен для отмены\n */\n public schedule(delay: number, callback: () => void): TimerToken {\n const token = {}\n const executeAt = Date.now() + delay\n\n const task: TimerTask = { token, executeAt, callback }\n\n this.activeTokens.add(token)\n this.insert(task)\n\n return token\n }\n\n /**\n * Отменить задачу\n * @param token токен задачи\n */\n public cancel(token: TimerToken) {\n // Просто удаляем из активных токенов.\n // Задача останется в куче, но будет пропущена при обработке (Lazy Delete).\n this.activeTokens.delete(token)\n }\n\n /**\n * Обработать очередь (вызывается таймером или вручную)\n */\n public process(now: number = Date.now()) {\n while (this.heap.length > 0) {\n // Смотрим на самый ранний таймер\n const task = this.heap[0]\n /* c8 ignore next */ if (task === undefined) break\n\n // Если его время еще не пришло - останавливаемся\n if (task.executeAt > now) {\n break\n }\n\n // Извлекаем задачу\n this.extractMin()\n\n // Если задача не была отменена - выполняем\n if (this.activeTokens.has(task.token)) {\n this.activeTokens.delete(task.token)\n try {\n task.callback()\n } catch (e) {\n console.error('Error in scheduled task', e)\n }\n }\n }\n }\n\n /**\n * Очистить все задачи\n */\n public clear() {\n this.heap = []\n // WeakSet нельзя очистить явно, но это и не нужно,\n // так как без ссылок из heap токены будут собраны GC\n this.activeTokens = new WeakSet()\n }\n\n // === Min-Heap Implementation ===\n\n private insert(task: TimerTask) {\n this.heap.push(task)\n this.bubbleUp(this.heap.length - 1)\n }\n\n private extractMin(): TimerTask | undefined {\n /* c8 ignore next */ if (this.heap.length === 0) return undefined\n\n const min = this.heap[0]\n /* c8 ignore next */ if (min === undefined) return undefined\n const last = this.heap.pop()\n\n if (this.heap.length > 0 && last !== undefined) {\n this.heap[0] = last\n this.sinkDown(0)\n }\n\n return min\n }\n\n private bubbleUp(index: number) {\n while (index > 0) {\n const parentIndex = Math.floor((index - 1) / 2)\n const parent = this.heap[parentIndex]\n const current = this.heap[index]\n /* c8 ignore next */ if (parent === undefined || current === undefined) break\n if (parent.executeAt <= current.executeAt) break\n\n this.swap(index, parentIndex)\n index = parentIndex\n }\n }\n\n private sinkDown(index: number) {\n const length = this.heap.length\n const element = this.heap[index]\n /* c8 ignore next */ if (element === undefined) return\n\n while (true) {\n const leftChildIdx = 2 * index + 1\n const rightChildIdx = 2 * index + 2\n let swapIdx: number | null = null\n\n if (leftChildIdx < length) {\n const leftChild = this.heap[leftChildIdx]\n if (leftChild !== undefined && leftChild.executeAt < element.executeAt) {\n swapIdx = leftChildIdx\n }\n }\n\n if (rightChildIdx < length) {\n const rightChild = this.heap[rightChildIdx]\n /* c8 ignore next */\n if (rightChild !== undefined) {\n if (\n (swapIdx === null && rightChild.executeAt < element.executeAt) ||\n /* c8 ignore next */\n (swapIdx !== null && this.heap[swapIdx] !== undefined &&\n rightChild.executeAt < this.heap[swapIdx]!.executeAt)\n ) {\n swapIdx = rightChildIdx\n }\n }\n }\n\n if (swapIdx === null) break\n\n this.swap(index, swapIdx)\n index = swapIdx\n }\n }\n\n private swap(a: number, b: number) {\n const temp = this.heap[a]\n const other = this.heap[b]\n /* c8 ignore next */ if (temp === undefined || other === undefined) return\n this.heap[a] = other\n this.heap[b] = temp\n }\n}\n\n/**\n * @internal — default factory for StateMachine.scheduler injection slot.\n * Returns a new TimerScheduler instance (NOT a singleton).\n * Same-module placement required: TimerScheduler constructor is public within module.\n */\nexport function createDefaultScheduler(): ITimerScheduler {\n return new TimerScheduler()\n}\n","/**\n * Professional logging system for StateMachine library\n * Replaces console.log/console.error with configurable, structured logging\n */\n\n// Log levels in order of severity\nexport const LogLevel = {\n DEBUG: 0,\n INFO: 1,\n WARN: 2,\n ERROR: 3,\n FATAL: 4,\n OFF: 5,\n} as const\n\nexport type LogLevel = (typeof LogLevel)[keyof typeof LogLevel]\n\n// Log level names for display\nconst LogLevelNames: Record<LogLevel, string> = {\n [LogLevel.DEBUG]: 'DEBUG',\n [LogLevel.INFO]: 'INFO',\n [LogLevel.WARN]: 'WARN',\n [LogLevel.ERROR]: 'ERROR',\n [LogLevel.FATAL]: 'FATAL',\n [LogLevel.OFF]: 'OFF',\n}\n\n// Log entry structure\ninterface LogEntry {\n timestamp: number\n level: LogLevel\n message: string\n context?: Record<string, any>\n error?: Error\n source: string\n}\n\n// Logger configuration\ninterface LoggerConfig {\n level: LogLevel\n enableConsole: boolean\n enableStructuredLogging: boolean\n timestampFormat: 'iso' | 'unix' | 'relative'\n includeStackTrace: boolean\n}\n\n// Default logger configuration\nexport const DEFAULT_LOGGER_CONFIG: LoggerConfig = {\n level: LogLevel.WARN, // Only warnings and above in production\n enableConsole: true,\n enableStructuredLogging: false,\n timestampFormat: 'iso',\n includeStackTrace: false,\n}\n\n// Log appender interface for extensibility\ninterface LogAppender {\n append(entry: LogEntry): void\n}\n\n// Console appender implementation\nexport class ConsoleAppender implements LogAppender {\n private config: LoggerConfig\n\n constructor(config: LoggerConfig) {\n this.config = config\n }\n\n append(entry: LogEntry): void {\n if (!this.config.enableConsole) return\n\n const timestamp = this.formatTimestamp(entry.timestamp)\n const levelName = LogLevelNames[entry.level]\n const prefix = `[${timestamp}] [${levelName}] [${entry.source}]`\n\n if (this.config.enableStructuredLogging) {\n const structuredEntry = {\n timestamp: entry.timestamp,\n level: levelName,\n source: entry.source,\n message: entry.message,\n context: entry.context,\n error: entry.error?.message,\n }\n console.log(JSON.stringify(structuredEntry))\n } else {\n const message = `${prefix} ${entry.message}`\n\n switch (entry.level) {\n case LogLevel.DEBUG:\n case LogLevel.INFO:\n console.log(message, entry.context || '')\n break\n case LogLevel.WARN:\n console.warn(message, entry.context || '')\n break\n case LogLevel.ERROR:\n case LogLevel.FATAL:\n console.error(message, entry.context || '', entry.error || '')\n if (this.config.includeStackTrace && entry.error) {\n console.error(entry.error.stack)\n }\n break\n }\n }\n }\n\n private formatTimestamp(timestamp: number): string {\n switch (this.config.timestampFormat) {\n case 'unix':\n return timestamp.toString()\n case 'relative':\n return `+${timestamp - Date.now()}ms`\n case 'iso':\n default:\n return new Date(timestamp).toISOString()\n }\n }\n}\n\n// Memory appender for testing\nexport class MemoryAppender implements LogAppender {\n private entries: LogEntry[] = []\n\n append(entry: LogEntry): void {\n this.entries.push(entry)\n }\n\n getEntries(): LogEntry[] {\n return [...this.entries]\n }\n\n clear(): void {\n this.entries = []\n }\n\n getEntriesByLevel(level: LogLevel): LogEntry[] {\n return this.entries.filter((entry) => entry.level === level)\n }\n}\n\n// Main logger class\nexport class Logger {\n private config: LoggerConfig\n private appenders: LogAppender[] = []\n private source: string\n\n constructor(source: string, config: Partial<LoggerConfig> = {}) {\n this.source = source\n this.config = { ...DEFAULT_LOGGER_CONFIG, ...config }\n\n // Add default console appender\n this.appenders.push(new ConsoleAppender(this.config))\n }\n\n // Add custom appender\n addAppender(appender: LogAppender): void {\n this.appenders.push(appender)\n }\n\n // Remove appender\n removeAppender(appender: LogAppender): void {\n const index = this.appenders.indexOf(appender)\n if (index > -1) {\n this.appenders.splice(index, 1)\n }\n }\n\n // Update configuration\n updateConfig(config: Partial<LoggerConfig>): void {\n this.config = { ...this.config, ...config }\n }\n\n // Check if level is enabled\n isLevelEnabled(level: LogLevel): boolean {\n return level >= this.config.level && this.config.level !== LogLevel.OFF\n }\n\n // Core logging method\n private log(\n level: LogLevel,\n message: string,\n context?: Record<string, any>,\n error?: Error,\n ): void {\n if (!this.isLevelEnabled(level)) return\n\n const entry: LogEntry = {\n timestamp: Date.now(),\n level,\n message,\n ...(context !== undefined ? { context } : {}),\n ...(error !== undefined ? { error } : {}),\n source: this.source,\n }\n\n this.appenders.forEach((appender) => {\n try {\n appender.append(entry)\n } catch (e) {\n // Fallback to console if appender fails\n console.error('Logger appender failed:', e)\n }\n })\n }\n\n // Convenience methods\n debug(message: string, context?: Record<string, any>): void {\n this.log(LogLevel.DEBUG, message, context)\n }\n\n info(message: string, context?: Record<string, any>): void {\n this.log(LogLevel.INFO, message, context)\n }\n\n warn(message: string, context?: Record<string, any>): void {\n this.log(LogLevel.WARN, message, context)\n }\n\n error(message: string, context?: Record<string, any>, error?: Error): void {\n this.log(LogLevel.ERROR, message, context, error)\n }\n\n fatal(message: string, context?: Record<string, any>, error?: Error): void {\n this.log(LogLevel.FATAL, message, context, error)\n }\n\n // Create child logger with additional context\n child(childSource: string, _additionalContext?: Record<string, any>): Logger {\n const childLogger = new Logger(`${this.source}.${childSource}`, this.config)\n childLogger.appenders = this.appenders\n return childLogger\n }\n}\n\n// Global logger factory\nexport class LoggerFactory {\n private static defaultConfig: LoggerConfig = DEFAULT_LOGGER_CONFIG\n private static loggers: Map<string, Logger> = new Map()\n\n static setDefaultConfig(config: Partial<LoggerConfig>): void {\n LoggerFactory.defaultConfig = { ...DEFAULT_LOGGER_CONFIG, ...config }\n }\n\n static getLogger(source: string, config?: Partial<LoggerConfig>): Logger {\n const key = source\n if (!LoggerFactory.loggers.has(key)) {\n const loggerConfig = config\n ? { ...LoggerFactory.defaultConfig, ...config }\n : LoggerFactory.defaultConfig\n LoggerFactory.loggers.set(key, new Logger(source, loggerConfig))\n }\n return LoggerFactory.loggers.get(key)!\n }\n\n static clearLoggers(): void {\n LoggerFactory.loggers.clear()\n }\n}\n\n// Convenience exports\nexport const getLogger = LoggerFactory.getLogger\nexport const setDefaultLogLevel = (level: LogLevel) => {\n LoggerFactory.setDefaultConfig({ level })\n}\n\n// Pre-configured loggers for common use cases\nexport const stateMachineLogger = getLogger('StateMachine')\nexport const securityLogger = getLogger('Security')\n","/**\n * @deprecated Will be removed in a follow-up task. Security policy enforcement should\n * happen at the host-application layer; this module is a source-tree marker.\n *\n * Post TD-T3-4 pruning, symbols from this module are not reachable from `dist/index.js` —\n * the deprecation has no public deprecation cycle, only source-tree intent.\n *\n * Governance treatments (multi-treatment file, per TASK-003 CODE_REVIEW F-CR3-8):\n * - tsconfig.json `include: [\"src/**\\/*\"]` — typechecked under strict TS for now\n * - vitest.config.ts `coverage.exclude` — excluded from coverage instrumentation\n * - knip.json `ignore` — excluded from unused-export warnings\n * - package.json `files: [\"dist\", \"types\", ...]` — NOT shipped to npm (since TASK-003 CODE_REVIEW F-CR3-1)\n *\n * Removal trigger: when no in-tree code references the file (currently `src/tests/security.test.ts`\n * does), delete the file plus its test plus all four governance-list entries above.\n *\n * Security module for safe function serialization and validation\n * Replaces unsafe `new Function()` usage with secure alternatives\n */\n\nimport { securityLogger } from './logger'\nimport type {\n ActionOrString,\n ErrorHandler,\n ErrorHandlerOrString,\n EventAction,\n KeysOf,\n} from './types'\n\n// Configuration for function security\n/**\n * @deprecated host-application-level enforcement; this module will be removed in a follow-up task.\n */\nexport interface FunctionSecurityConfig {\n allowedFunctionNames: Set<string>\n maxFunctionLength: number\n enableValidation: boolean\n customPatterns?: DangerousPattern[]\n}\n\n/**\n * @deprecated host-application-level enforcement; this module will be removed in a follow-up task.\n */\nexport type FunctionRiskLevel = 'low' | 'medium' | 'high' | 'critical'\n\n/**\n * @deprecated host-application-level enforcement; this module will be removed in a follow-up task.\n */\nexport interface DangerousPattern {\n pattern: RegExp\n risk: FunctionRiskLevel\n description: string\n category?: string\n}\n\n/**\n * @deprecated host-application-level enforcement; this module will be removed in a follow-up task.\n */\nexport interface FunctionValidationResult {\n isValid: boolean\n errors: string[]\n riskLevel: FunctionRiskLevel\n detectedPatterns: string[]\n}\n\nconst BUILTIN_PATTERNS: DangerousPattern[] = [\n {\n pattern: /\\beval\\s*\\(/gi,\n risk: 'critical',\n description: 'Direct eval() usage',\n category: 'eval',\n },\n {\n pattern: /\\bFunction\\s*\\(/gi,\n risk: 'high',\n description: 'Dynamic Function constructor call',\n category: 'eval',\n },\n {\n pattern: /new\\s+Function\\s*\\(/gi,\n risk: 'high',\n description: 'Dynamic function creation',\n category: 'eval',\n },\n {\n pattern: /setTimeout\\s*\\(\\s*['\"`][^'\"`]*['\"`]/gi,\n risk: 'high',\n description: 'setTimeout with string code',\n category: 'eval',\n },\n {\n pattern: /setInterval\\s*\\(\\s*['\"`][^'\"`]*['\"`]/gi,\n risk: 'high',\n description: 'setInterval with string code',\n category: 'eval',\n },\n {\n pattern: /\\bfetch\\s*\\(/gi,\n risk: 'medium',\n description: 'Network request via fetch',\n category: 'network',\n },\n {\n pattern: /XMLHttpRequest/gi,\n risk: 'medium',\n description: 'XMLHttpRequest usage',\n category: 'network',\n },\n {\n pattern: /WebSocket/gi,\n risk: 'medium',\n description: 'WebSocket connection',\n category: 'network',\n },\n {\n pattern: /require\\s*\\(\\s*['\"`]fs['\"`]\\s*\\)/gi,\n risk: 'high',\n description: 'File system access via require(\"fs\")',\n category: 'filesystem',\n },\n {\n pattern: /import.*from\\s*['\"`]fs['\"`]/gi,\n risk: 'high',\n description: 'File system access via import',\n category: 'filesystem',\n },\n {\n pattern: /document\\./gi,\n risk: 'medium',\n description: 'DOM access',\n category: 'dom',\n },\n {\n pattern: /window\\./gi,\n risk: 'medium',\n description: 'Window object access',\n category: 'dom',\n },\n {\n pattern: /innerHTML/gi,\n risk: 'high',\n description: 'innerHTML manipulation (XSS risk)',\n category: 'dom',\n },\n {\n pattern: /global\\./gi,\n risk: 'high',\n description: 'Global scope access',\n category: 'global',\n },\n {\n pattern: /process\\./gi,\n risk: 'high',\n description: 'Process object access',\n category: 'process',\n },\n {\n pattern: /child_process/gi,\n risk: 'critical',\n description: 'Child process execution',\n category: 'process',\n },\n {\n pattern: /exec\\s*\\(/gi,\n risk: 'critical',\n description: 'Command execution',\n category: 'process',\n },\n {\n pattern: /require\\s*\\(/gi,\n risk: 'critical',\n description: 'CommonJS require',\n category: 'module',\n },\n {\n pattern: /import\\s*\\(/gi,\n risk: 'critical',\n description: 'Dynamic import',\n category: 'module',\n },\n {\n pattern: /__proto__/gi,\n risk: 'critical',\n description: 'Prototype pollution',\n category: 'prototype',\n },\n {\n pattern: /constructor/gi,\n risk: 'critical',\n description: 'Constructor access',\n category: 'prototype',\n },\n {\n pattern: /prototype/gi,\n risk: 'critical',\n description: 'Prototype access',\n category: 'prototype',\n },\n {\n pattern: /\\[['\"]__proto__['\"]\\]/gi,\n risk: 'critical',\n description: 'Prototype pollution via bracket notation',\n category: 'prototype',\n },\n {\n pattern: /constructor\\s*\\[/gi,\n risk: 'critical',\n description: 'Constructor access via bracket notation',\n category: 'prototype',\n },\n]\n\n/**\n * @deprecated host-application-level enforcement; this module will be removed in a follow-up task.\n */\nexport const DEFAULT_SECURITY_CONFIG: FunctionSecurityConfig = {\n allowedFunctionNames: new Set([\n // Common safe function patterns\n 'onEnter',\n 'onExit',\n 'onBeforeEnter',\n 'onAfterEnter',\n 'onBeforeExit',\n 'onAfterExit',\n 'onTransition',\n 'onError',\n 'guard',\n 'onBefore',\n 'onAfter',\n 'onSuccess',\n\n // Internal serializer function names (used as metadata)\n 'config_onError',\n 'state_onError',\n 'event_onBefore',\n 'event_onAfter',\n 'event_onSuccess',\n 'event_onError',\n 'transition_guard',\n 'transition_onTransition',\n 'transition_onError',\n 'invoke_cond',\n 'invoke_action',\n\n // Legacy deserialization marker\n 'legacy_deserialization',\n ]),\n maxFunctionLength: 10000, // 10KB limit\n enableValidation: true,\n customPatterns: [],\n}\n\n/**\n * @deprecated host-application-level enforcement; this module will be removed in a follow-up task.\n */\nexport type SafeSerializedAction =\n | {\n type: 'string'\n name: string\n }\n | {\n type: 'function'\n body: string\n hash: string // Security hash for validation\n metadata: {\n length: number\n createdAt: number\n functionName?: string\n }\n }\n\n/**\n * @deprecated host-application-level enforcement; this module will be removed in a follow-up task.\n */\nexport class FunctionValidator {\n private config: FunctionSecurityConfig\n private allPatterns: DangerousPattern[]\n\n constructor(config: Partial<FunctionSecurityConfig> = {}) {\n this.config = { ...DEFAULT_SECURITY_CONFIG, ...config }\n this.allPatterns = [\n ...BUILTIN_PATTERNS,\n ...(this.config.customPatterns ?? []),\n ]\n }\n\n public addCustomPattern(pattern: DangerousPattern): void {\n this.allPatterns.push(pattern)\n }\n\n /**\n * Validates function body for security threats.\n *\n * Never throws: returns a structured result.\n */\n validate(body: string, functionName?: string): FunctionValidationResult {\n if (!this.config.enableValidation) {\n return {\n isValid: true,\n errors: [],\n riskLevel: 'low',\n detectedPatterns: [],\n }\n }\n\n const errors: string[] = []\n const detectedPatterns: string[] = []\n let riskLevel: FunctionRiskLevel = 'low'\n\n // Check length limit\n if (body.length > this.config.maxFunctionLength) {\n errors.push(\n `Function body exceeds maximum length of ${this.config.maxFunctionLength} characters`,\n )\n riskLevel = 'high'\n }\n\n const riskPriority: Record<FunctionRiskLevel, number> = {\n low: 0,\n medium: 1,\n high: 2,\n critical: 3,\n }\n\n for (const { pattern, risk, description } of this.allPatterns) {\n if (pattern.global || pattern.sticky) {\n pattern.lastIndex = 0\n }\n if (pattern.test(body)) {\n errors.push(`Function contains dangerous pattern: ${description}`)\n detectedPatterns.push(description)\n if (riskPriority[risk] > riskPriority[riskLevel]) {\n riskLevel = risk\n }\n }\n }\n\n // Validate function name if provided\n if (functionName && !this.config.allowedFunctionNames.has(functionName)) {\n errors.push(`Function name '${functionName}' is not in allowed list`)\n if (riskLevel === 'low') riskLevel = 'medium'\n }\n\n return {\n isValid: errors.length === 0,\n errors,\n riskLevel,\n detectedPatterns,\n }\n }\n\n /**\n * Validates function body for security threats\n */\n validateFunctionBody(body: string, functionName?: string): boolean {\n const result = this.validate(body, functionName)\n if (!result.isValid) {\n throw new Error(result.errors.join('; '))\n }\n return result.isValid\n }\n\n /**\n * Creates a security hash for function validation\n */\n async createSecurityHash(body: string, metadata: any): Promise<string> {\n // Use Web Crypto API for secure hashing\n const encoder = new TextEncoder()\n const data = encoder.encode(body + JSON.stringify(metadata))\n\n // Check if crypto is available (Browser/Node/Bun)\n if (typeof crypto !== 'undefined' && crypto.subtle) {\n const hashBuffer = await crypto.subtle.digest('SHA-256', data)\n return Array.from(new Uint8Array(hashBuffer))\n .map((b) => b.toString(16).padStart(2, '0'))\n .join('')\n }\n\n // Fallback for environments without crypto.subtle (should be rare in modern envs)\n // Using a slightly better non-crypto hash (FNV-1a inspired) than the previous simple shift\n const str = body + JSON.stringify(metadata)\n let hash = 0x811c9dc5\n for (let i = 0; i < str.length; i++) {\n hash ^= str.charCodeAt(i)\n hash = Math.imul(hash, 0x01000193)\n }\n return (hash >>> 0).toString(16)\n }\n\n /**\n * Validates security hash\n */\n async validateSecurityHash(\n body: string,\n metadata: any,\n expectedHash: string,\n ): Promise<boolean> {\n const actualHash = await this.createSecurityHash(body, metadata)\n return actualHash === expectedHash\n }\n}\n\n/**\n * @deprecated host-application-level enforcement; this module will be removed in a follow-up task.\n */\nexport class SafeFunctionSerializer {\n public validator: FunctionValidator\n\n constructor(config?: Partial<FunctionSecurityConfig>) {\n this.validator = new FunctionValidator(config)\n }\n\n /**\n * Safely serializes an action with security validation (Async)\n */\n async serializeActionAsync<TOwner extends object, R = void>(\n action: ActionOrString<TOwner, R> | ErrorHandlerOrString<TOwner>,\n functionName?: string,\n ): Promise<SafeSerializedAction | undefined> {\n if (typeof action === 'string') {\n return { type: 'string', name: action }\n } else if (typeof action === 'function') {\n const body = action.toString()\n\n // Validate function body\n this.validator.validateFunctionBody(body, functionName)\n\n const metadata = {\n length: body.length,\n createdAt: Date.now(),\n ...(functionName !== undefined ? { functionName } : {}),\n }\n\n const hash = await this.validator.createSecurityHash(body, metadata)\n\n return {\n type: 'function',\n body,\n hash,\n metadata,\n }\n }\n return undefined\n }\n\n /**\n * Legacy synchronous serialization (Uses weak hash, kept for backward compatibility)\n * @deprecated Use serializeActionAsync instead for better security\n */\n serializeAction<TOwner extends object, R = void>(\n action: ActionOrString<TOwner, R> | ErrorHandlerOrString<TOwner>,\n functionName?: string,\n ): SafeSerializedAction | undefined {\n if (typeof action === 'string') {\n return { type: 'string', name: action }\n } else if (typeof action === 'function') {\n const body = action.toString()\n this.validator.validateFunctionBody(body, functionName)\n\n const metadata = {\n length: body.length,\n createdAt: Date.now(),\n ...(functionName !== undefined ? { functionName } : {}),\n }\n\n // Sync version uses the weak fallback hash logic implicitly or needs a sync version of createHash\n // We'll implement a sync weak hash here inline to preserve sync behavior\n const str = body + JSON.stringify(metadata)\n let hash = 0x811c9dc5\n for (let i = 0; i < str.length; i++) {\n hash ^= str.charCodeAt(i)\n hash = Math.imul(hash, 0x01000193)\n }\n\n return {\n type: 'function',\n body,\n hash: (hash >>> 0).toString(16),\n metadata,\n }\n }\n return undefined\n }\n\n /**\n * Safely deserializes an action with security validation (Async)\n */\n async deserializeActionAsync<TOwner extends object, R = void>(\n serializedAction: SafeSerializedAction | undefined,\n ): Promise<\n ActionOrString<TOwner, R> | ErrorHandlerOrString<TOwner> | undefined\n > {\n if (!serializedAction) {\n return undefined\n }\n\n if (serializedAction.type === 'string') {\n return serializedAction.name as KeysOf<TOwner, EventAction<TOwner, R>>\n } else if (serializedAction.type === 'function') {\n try {\n // Validate security hash\n const isValid = await this.validator.validateSecurityHash(\n serializedAction.body,\n serializedAction.metadata,\n serializedAction.hash,\n )\n\n if (!isValid) {\n // Fallback check for legacy weak hash if crypto hash failed\n // This allows reading old backups/configs\n const str =\n serializedAction.body + JSON.stringify(serializedAction.metadata)\n let hash = 0x811c9dc5\n for (let i = 0; i < str.length; i++) {\n hash ^= str.charCodeAt(i)\n hash = Math.imul(hash, 0x01000193)\n }\n const legacyHash = (hash >>> 0).toString(16)\n\n if (legacyHash !== serializedAction.hash) {\n throw new Error('Function security hash validation failed')\n }\n }\n\n // Re-validate function body\n this.validator.validateFunctionBody(\n serializedAction.body,\n serializedAction.metadata.functionName,\n )\n\n // Create function using safe method\n return this.createSafeFunction(serializedAction.body)\n } catch (e) {\n securityLogger.error(\n 'Error deserializing function',\n {\n functionName: serializedAction.metadata.functionName,\n bodyLength: serializedAction.body.length,\n hash: serializedAction.hash,\n },\n e instanceof Error ? e : new Error(String(e)),\n )\n return undefined\n }\n }\n return undefined\n }\n\n /**\n * Safely deserializes an action (Synchronous - Legacy/Weak)\n */\n deserializeAction<TOwner extends object, R = void>(\n serializedAction: SafeSerializedAction | undefined,\n ): ActionOrString<TOwner, R> | ErrorHandlerOrString<TOwner> | undefined {\n if (!serializedAction) {\n return undefined\n }\n\n if (serializedAction.type === 'string') {\n return serializedAction.name as KeysOf<TOwner, EventAction<TOwner, R>>\n } else if (serializedAction.type === 'function') {\n try {\n // Sync validation only checks weak hash\n const str =\n serializedAction.body + JSON.stringify(serializedAction.metadata)\n let hash = 0x811c9dc5\n for (let i = 0; i < str.length; i++) {\n hash ^= str.charCodeAt(i)\n hash = Math.imul(hash, 0x01000193)\n }\n const calculatedHash = (hash >>> 0).toString(16)\n\n if (calculatedHash !== serializedAction.hash) {\n // We cannot verify crypto hashes synchronously, so we must fail or skip verification\n // for crypto hashes. If the hash looks like a weak hash (short hex), we check it.\n // If it looks like SHA-256 (64 chars), we can't verify it sync.\n if (serializedAction.hash.length === 64) {\n console.warn(\n 'Warning: Skipping verification of SHA-256 hash in synchronous deserializeAction. Use deserializeActionAsync for security.',\n )\n } else {\n throw new Error('Function security hash validation failed (Legacy)')\n }\n }\n\n this.validator.validateFunctionBody(\n serializedAction.body,\n serializedAction.metadata.functionName,\n )\n\n return this.createSafeFunction(serializedAction.body)\n } catch (e) {\n securityLogger.error(\n 'Error deserializing function',\n {\n functionName: serializedAction.metadata.functionName,\n bodyLength: serializedAction.body.length,\n hash: serializedAction.hash,\n },\n e instanceof Error ? e : new Error(String(e)),\n )\n return undefined\n }\n }\n return undefined\n }\n\n /**\n * Safely deserializes legacy function strings (without security metadata)\n * This method provides backward compatibility for old string-based function serialization\n * while maintaining security through validation and sandboxing.\n */\n deserializeLegacyString(\n action: string,\n ): EventAction<any> | ErrorHandler<any> | undefined {\n if (!action || typeof action !== 'string') {\n return undefined\n }\n\n try {\n // Validate function body for security threats\n this.validator.validateFunctionBody(action, 'legacy_deserialization')\n\n // Create function using the same safe method as modern serialization\n return this.createSafeFunction(action)\n } catch (e) {\n securityLogger.error(\n 'Blocked unsafe legacy function string',\n { actionLength: action.length },\n e instanceof Error ? e : new Error(String(e)),\n )\n return undefined\n }\n }\n\n /**\n * Creates a function safely without using new Function()\n * Uses a whitelist approach with predefined function templates\n */\n private createSafeFunction(\n body: string,\n ): EventAction<any> | ErrorHandler<any> {\n // For now, we'll use a safer approach with Function constructor\n // but with additional validation and sandboxing.\n //\n // Important: we must preserve the original function *signature* (parameter names),\n // because state machine code calls hooks/conditions with specific arguments\n // (e.g. invoke.cond(adaptee)). Stripping the wrapper breaks that contract.\n try {\n const source = body.trim()\n\n // Executor runs in a restricted scope and evaluates the provided function source\n // as an expression, then calls it with (adaptee, ...args).\n const executor = new Function(\n 'adaptee',\n 'args',\n `\n // Block dangerous globals by creating local variables that shadow them\n var eval = undefined;\n var Function = undefined;\n var setTimeout = undefined;\n var setInterval = undefined;\n var document = undefined;\n var window = undefined;\n var global = undefined;\n var process = undefined;\n var require = undefined;\n\n const __fn = (${source});\n if (typeof __fn !== 'function') {\n throw new Error('Deserialized source is not a function');\n }\n return __fn(adaptee, ...(Array.isArray(args) ? args : []));\n `,\n ) as (adaptee: any, args: any[]) => any\n\n // Preserve varargs call style used across the codebase.\n return ((adaptee: any, ...args: any[]) => executor(adaptee, args)) as\n | EventAction<any>\n | ErrorHandler<any>\n } catch (e) {\n const message = e instanceof Error ? e.message : String(e)\n throw new Error(`Failed to create safe function: ${message}`)\n }\n }\n}\n\n/**\n * @deprecated host-application-level enforcement; this module will be removed in a follow-up task.\n */\n// Global instance for convenience\nexport const safeFunctionSerializer = new SafeFunctionSerializer()\n\n/**\n * @deprecated host-application-level enforcement; this module will be removed in a follow-up task.\n */\nexport const serializeAction = safeFunctionSerializer.serializeAction.bind(\n safeFunctionSerializer,\n)\n\n/**\n * @deprecated host-application-level enforcement; this module will be removed in a follow-up task.\n */\nexport const deserializeAction = safeFunctionSerializer.deserializeAction.bind(\n safeFunctionSerializer,\n)\n","// Monitoring and metrics module for StateMachine\n// Provides essential monitoring for state machine transitions and errors\n\nimport { stateMachineLogger } from './logger'\nimport type { ErrorContext, IMonitor, MonitorMetricsSnapshot, TransitionContext } from './types'\n\n/**\n * Performance metrics interface\n */\ninterface PerformanceMetrics {\n transitionTime: number\n stateChangeCount: number\n errorCount: number\n timestamp: number\n}\n\n/**\n * Health check status\n */\nexport const HealthStatus = {\n HEALTHY: 'healthy',\n WARNING: 'warning',\n CRITICAL: 'critical',\n UNKNOWN: 'unknown',\n} as const\n\nexport type HealthStatus = (typeof HealthStatus)[keyof typeof HealthStatus]\n\n/**\n * Health check result\n */\ninterface HealthCheckResult {\n status: HealthStatus\n message: string\n timestamp: number\n metrics?: Record<string, any>\n}\n\n/**\n * Monitoring configuration\n */\nexport interface MonitoringConfig {\n enabled: boolean\n metricsInterval: number // milliseconds\n healthCheckInterval: number // milliseconds\n maxMetricsHistory: number\n thresholds: {\n transitionTimeWarning: number // milliseconds\n transitionTimeCritical: number // milliseconds\n errorRateWarning: number // percentage\n errorRateCritical: number // percentage\n }\n}\n\n/**\n * Default monitoring configuration\n */\nexport const DEFAULT_MONITORING_CONFIG: MonitoringConfig = {\n enabled: true,\n metricsInterval: 5000, // 5 seconds\n healthCheckInterval: 30000, // 30 seconds\n maxMetricsHistory: 1000,\n thresholds: {\n transitionTimeWarning: 100, // 100ms\n transitionTimeCritical: 500, // 500ms\n errorRateWarning: 5, // 5%\n errorRateCritical: 15, // 15%\n },\n}\n\n/**\n * Metrics collector for StateMachine performance monitoring\n */\nexport class MetricsCollector {\n private metrics: PerformanceMetrics[] = []\n private config: MonitoringConfig\n private startTime: number = Date.now()\n private transitionCount = 0\n private errorCount = 0\n\n constructor(config: Partial<MonitoringConfig> = {}) {\n this.config = { ...DEFAULT_MONITORING_CONFIG, ...config }\n }\n\n /**\n * Record a state transition\n */\n recordTransition(transitionTime: number): void {\n if (!this.config.enabled) return\n\n this.transitionCount++\n\n const metrics: PerformanceMetrics = {\n transitionTime,\n stateChangeCount: this.transitionCount,\n errorCount: this.errorCount,\n timestamp: Date.now(),\n }\n\n this.addMetrics(metrics)\n this.logMetrics(metrics)\n }\n\n /**\n * Record an error\n */\n recordError(): void {\n if (!this.config.enabled) return\n this.errorCount++\n }\n\n /**\n * Get current metrics summary\n */\n getMetricsSummary(): {\n totalTransitions: number\n totalErrors: number\n averageTransitionTime: number\n errorRate: number\n uptime: number\n } {\n const now = Date.now()\n const uptime = now - this.startTime\n const recentMetrics = this.getRecentMetrics(60000) // Last minute\n\n const averageTransitionTime =\n recentMetrics.length > 0\n ? recentMetrics.reduce((sum, m) => sum + m.transitionTime, 0) /\n recentMetrics.length\n : 0\n\n const errorRate =\n this.transitionCount > 0\n ? (this.errorCount / this.transitionCount) * 100\n : 0\n\n return {\n totalTransitions: this.transitionCount,\n totalErrors: this.errorCount,\n averageTransitionTime,\n errorRate,\n uptime,\n }\n }\n\n /**\n * Get metrics history\n */\n getMetricsHistory(timeRange?: number): PerformanceMetrics[] {\n if (timeRange) {\n return this.getRecentMetrics(timeRange)\n }\n return [...this.metrics]\n }\n\n /**\n * Clear metrics history\n */\n clearMetrics(): void {\n this.metrics = []\n this.transitionCount = 0\n this.errorCount = 0\n this.startTime = Date.now()\n }\n\n /**\n * Get recent metrics within time range\n */\n private getRecentMetrics(timeRange: number): PerformanceMetrics[] {\n const cutoff = Date.now() - timeRange\n return this.metrics.filter((m) => m.timestamp >= cutoff)\n }\n\n /**\n * Add metrics to history with size limit\n */\n private addMetrics(metrics: PerformanceMetrics): void {\n this.metrics.push(metrics)\n\n // Maintain size limit\n if (this.metrics.length > this.config.maxMetricsHistory) {\n this.metrics = this.metrics.slice(-this.config.maxMetricsHistory)\n }\n }\n\n /**\n * Log metrics if significant\n */\n private logMetrics(metrics: PerformanceMetrics): void {\n const { thresholds } = this.config\n\n if (metrics.transitionTime > thresholds.transitionTimeCritical) {\n stateMachineLogger.error('Critical transition time detected', {\n transitionTime: metrics.transitionTime,\n threshold: thresholds.transitionTimeCritical,\n })\n } else if (metrics.transitionTime > thresholds.transitionTimeWarning) {\n stateMachineLogger.warn('Slow transition detected', {\n transitionTime: metrics.transitionTime,\n threshold: thresholds.transitionTimeWarning,\n })\n }\n }\n}\n\n/**\n * Performance monitor for real-time tracking\n */\nexport class PerformanceMonitor {\n private metricsCollector: MetricsCollector\n private config: MonitoringConfig\n private intervalId: NodeJS.Timeout | undefined\n private isRunning = false\n\n constructor(\n metricsCollector: MetricsCollector,\n config: Partial<MonitoringConfig> = {},\n ) {\n this.metricsCollector = metricsCollector\n this.config = { ...DEFAULT_MONITORING_CONFIG, ...config }\n }\n\n /**\n * Start performance monitoring\n */\n start(): void {\n if (this.isRunning || !this.config.enabled) return\n\n this.isRunning = true\n this.intervalId = setInterval(() => {\n this.collectMetrics()\n }, this.config.metricsInterval)\n\n stateMachineLogger.info('Performance monitoring started', {\n interval: this.config.metricsInterval,\n })\n }\n\n /**\n * Stop performance monitoring\n */\n stop(): void {\n if (!this.isRunning) return\n\n this.isRunning = false\n /* c8 ignore next 4 */\n if (this.intervalId) {\n clearInterval(this.intervalId)\n this.intervalId = undefined\n }\n\n stateMachineLogger.info('Performance monitoring stopped')\n }\n\n /**\n * Get current performance status\n */\n getPerformanceStatus(): {\n status: HealthStatus\n summary: ReturnType<MetricsCollector['getMetricsSummary']>\n issues: string[]\n } {\n const summary = this.metricsCollector.getMetricsSummary()\n const issues: string[] = []\n let status: HealthStatus = HealthStatus.HEALTHY\n\n // Check error rate\n if (summary.errorRate >= this.config.thresholds.errorRateCritical) {\n status = HealthStatus.CRITICAL\n issues.push(`Critical error rate: ${summary.errorRate.toFixed(2)}%`)\n } else if (summary.errorRate >= this.config.thresholds.errorRateWarning) {\n status = HealthStatus.WARNING\n issues.push(`High error rate: ${summary.errorRate.toFixed(2)}%`)\n }\n\n // Check transition time\n if (\n summary.averageTransitionTime >=\n this.config.thresholds.transitionTimeCritical\n ) {\n status = HealthStatus.CRITICAL\n issues.push(\n `Critical transition time: ${summary.averageTransitionTime.toFixed(2)}ms`,\n )\n } else if (\n summary.averageTransitionTime >=\n this.config.thresholds.transitionTimeWarning\n ) {\n if (status === HealthStatus.HEALTHY) status = HealthStatus.WARNING\n issues.push(\n `Slow transitions: ${summary.averageTransitionTime.toFixed(2)}ms`,\n )\n }\n\n return { status, summary, issues }\n }\n\n /**\n * Collect current metrics\n */\n private collectMetrics(): void {\n const summary = this.metricsCollector.getMetricsSummary()\n\n stateMachineLogger.debug('Performance metrics collected', {\n totalTransitions: summary.totalTransitions,\n errorRate: summary.errorRate,\n averageTransitionTime: summary.averageTransitionTime,\n })\n }\n}\n\n/**\n * Health checker for StateMachine instances\n */\nexport class HealthChecker {\n private performanceMonitor: PerformanceMonitor\n private config: MonitoringConfig\n private intervalId: NodeJS.Timeout | undefined\n private isRunning = false\n private lastHealthCheck: HealthCheckResult | undefined\n\n constructor(\n performanceMonitor: PerformanceMonitor,\n config: Partial<MonitoringConfig> = {},\n ) {\n this.performanceMonitor = performanceMonitor\n this.config = { ...DEFAULT_MONITORING_CONFIG, ...config }\n }\n\n /**\n * Start health checking\n */\n start(): void {\n if (this.isRunning || !this.config.enabled) return\n\n this.isRunning = true\n this.intervalId = setInterval(() => {\n this.performHealthCheck()\n }, this.config.healthCheckInterval)\n\n stateMachineLogger.info('Health checking started', {\n interval: this.config.healthCheckInterval,\n })\n }\n\n /**\n * Stop health checking\n */\n stop(): void {\n if (!this.isRunning) return\n\n this.isRunning = false\n /* c8 ignore next 4 */\n if (this.intervalId) {\n clearInterval(this.intervalId)\n this.intervalId = undefined\n }\n\n stateMachineLogger.info('Health checking stopped')\n }\n\n /**\n * Perform immediate health check\n */\n performHealthCheck(): HealthCheckResult {\n const performanceStatus = this.performanceMonitor.getPerformanceStatus()\n\n const result: HealthCheckResult = {\n status: performanceStatus.status,\n message: this.generateHealthMessage(performanceStatus),\n timestamp: Date.now(),\n metrics: performanceStatus.summary,\n }\n\n this.lastHealthCheck = result\n this.logHealthCheck(result)\n\n return result\n }\n\n /**\n * Get last health check result\n */\n getLastHealthCheck(): HealthCheckResult | undefined {\n return this.lastHealthCheck\n }\n\n /**\n * Generate health message based on status\n */\n private generateHealthMessage(\n performanceStatus: ReturnType<PerformanceMonitor['getPerformanceStatus']>,\n ): string {\n const { status, issues, summary } = performanceStatus\n\n if (status === HealthStatus.HEALTHY) {\n return `StateMachine is healthy. ${summary.totalTransitions} transitions, ${summary.errorRate.toFixed(2)}% error rate`\n }\n\n if (status === HealthStatus.WARNING) {\n return `StateMachine has warnings: ${issues.join(', ')}`\n }\n\n /* c8 ignore next */\n if (status === HealthStatus.CRITICAL) {\n /* c8 ignore next */\n return `StateMachine is in critical state: ${issues.join(', ')}`\n }\n\n /* c8 ignore next */\n return 'StateMachine health status unknown'\n }\n\n /**\n * Log health check results\n */\n private logHealthCheck(result: HealthCheckResult): void {\n const logData = {\n status: result.status,\n message: result.message,\n metrics: result.metrics,\n }\n\n switch (result.status) {\n case HealthStatus.HEALTHY:\n stateMachineLogger.debug('Health check passed', logData)\n break\n case HealthStatus.WARNING:\n stateMachineLogger.warn('Health check warning', logData)\n break\n case HealthStatus.CRITICAL:\n stateMachineLogger.error('Health check critical', logData)\n break\n /* c8 ignore next 2 */\n default:\n stateMachineLogger.info('Health check completed', logData)\n }\n }\n}\n\n/**\n * Comprehensive monitoring system\n */\nexport class StateMachineMonitor {\n private metricsCollector: MetricsCollector\n private performanceMonitor: PerformanceMonitor\n private healthChecker: HealthChecker\n private config: MonitoringConfig\n\n constructor(config: Partial<MonitoringConfig> = {}) {\n this.config = { ...DEFAULT_MONITORING_CONFIG, ...config }\n this.metricsCollector = new MetricsCollector(this.config)\n this.performanceMonitor = new PerformanceMonitor(\n this.metricsCollector,\n this.config,\n )\n this.healthChecker = new HealthChecker(this.performanceMonitor, this.config)\n }\n\n /**\n * Start all monitoring components\n */\n start(): void {\n this.performanceMonitor.start()\n this.healthChecker.start()\n\n stateMachineLogger.info('StateMachine monitoring started', {\n config: this.config,\n })\n }\n\n /**\n * Stop all monitoring components\n */\n stop(): void {\n this.performanceMonitor.stop()\n this.healthChecker.stop()\n\n stateMachineLogger.info('StateMachine monitoring stopped')\n }\n\n /**\n * Record a transition for monitoring (F-T4-TS-5 widening: added success + context params)\n */\n recordTransition(transitionTime: number, success: boolean = true, _context?: TransitionContext): void {\n this.metricsCollector.recordTransition(transitionTime)\n if (!success) this.metricsCollector.recordError()\n // _context kept for future enrichment\n }\n\n /**\n * Record an error for monitoring (F-T4-TS-5 widening: added error + context params)\n */\n recordError(_error?: Error, _context?: ErrorContext): void {\n this.metricsCollector.recordError()\n }\n\n /**\n * Record an event for monitoring (optional IMonitor extension)\n */\n recordEvent(_eventName: string, _duration: number): void {\n // optional implementation; metrics enrichment deferred to follow-up\n }\n\n /**\n * Get aggregate metrics snapshot (optional IMonitor extension)\n */\n getMetrics(): MonitorMetricsSnapshot {\n const summary = this.metricsCollector.getMetricsSummary()\n return {\n totalTransitions: summary.totalTransitions,\n successCount: summary.totalTransitions - summary.totalErrors,\n errorCount: summary.totalErrors,\n averageDuration: summary.averageTransitionTime,\n }\n }\n\n /**\n * Get comprehensive monitoring report\n */\n getMonitoringReport(): {\n health: HealthCheckResult\n performance: ReturnType<PerformanceMonitor['getPerformanceStatus']>\n metrics: ReturnType<MetricsCollector['getMetricsSummary']>\n config: MonitoringConfig\n } {\n const health = this.healthChecker.performHealthCheck()\n const performance = this.performanceMonitor.getPerformanceStatus()\n const metrics = this.metricsCollector.getMetricsSummary()\n\n return {\n health,\n performance,\n metrics,\n config: this.config,\n }\n }\n\n /**\n * Export metrics for external monitoring systems\n */\n exportMetrics(): {\n prometheus?: string\n json: any\n } {\n const metrics = this.metricsCollector.getMetricsSummary()\n const health = this.healthChecker.getLastHealthCheck()\n\n const jsonExport = {\n timestamp: Date.now(),\n metrics,\n health,\n config: this.config,\n }\n\n // Prometheus format\n const prometheusExport = this.generatePrometheusMetrics(metrics, health)\n\n return {\n prometheus: prometheusExport,\n json: jsonExport,\n }\n }\n\n /**\n * Generate Prometheus-compatible metrics (without memory metrics)\n */\n private generatePrometheusMetrics(\n metrics: ReturnType<MetricsCollector['getMetricsSummary']>,\n health?: HealthCheckResult,\n ): string {\n const lines: string[] = []\n\n // Transitions counter\n lines.push(\n '# HELP statemachine_transitions_total Total number of state transitions',\n )\n lines.push('# TYPE statemachine_transitions_total counter')\n lines.push(`statemachine_transitions_total ${metrics.totalTransitions}`)\n\n // Errors counter\n lines.push('# HELP statemachine_errors_total Total number of errors')\n lines.push('# TYPE statemachine_errors_total counter')\n lines.push(`statemachine_errors_total ${metrics.totalErrors}`)\n\n // Average transition time\n lines.push(\n '# HELP statemachine_transition_time_avg Average transition time in milliseconds',\n )\n lines.push('# TYPE statemachine_transition_time_avg gauge')\n lines.push(\n `statemachine_transition_time_avg ${metrics.averageTransitionTime}`,\n )\n\n // Error rate\n lines.push('# HELP statemachine_error_rate Error rate percentage')\n lines.push('# TYPE statemachine_error_rate gauge')\n lines.push(`statemachine_error_rate ${metrics.errorRate}`)\n\n // Uptime\n lines.push('# HELP statemachine_uptime Uptime in milliseconds')\n lines.push('# TYPE statemachine_uptime gauge')\n lines.push(`statemachine_uptime ${metrics.uptime}`)\n\n // Health status\n if (health) {\n const healthValue =\n health.status === HealthStatus.HEALTHY\n ? 1\n : health.status === HealthStatus.WARNING\n ? 0.5\n : 0\n lines.push(\n '# HELP statemachine_health Health status (1=healthy, 0.5=warning, 0=critical)',\n )\n lines.push('# TYPE statemachine_health gauge')\n lines.push(`statemachine_health ${healthValue}`)\n }\n\n return lines.join('\\n')\n }\n}\n\n/**\n * @internal — default factory for StateMachine.monitor injection slot.\n * Returns a new StateMachineMonitor instance (NOT a singleton).\n */\nexport function createDefaultMonitor(): IMonitor {\n return new StateMachineMonitor()\n}\n\n/**\n * Utility functions for monitoring integration\n */\nexport const MonitoringUtils = {\n /**\n * Create monitoring decorator for StateMachine methods\n */\n withMonitoring<T extends (...args: any[]) => any>(\n fn: T,\n monitor: StateMachineMonitor,\n _operationName: string,\n ): T {\n return ((...args: any[]) => {\n const startTime = Date.now()\n\n try {\n const result = fn(...args)\n\n if (result instanceof Promise) {\n return result\n .then((value) => {\n monitor.recordTransition(Date.now() - startTime)\n return value\n })\n .catch((error) => {\n monitor.recordError()\n throw error\n })\n } else {\n monitor.recordTransition(Date.now() - startTime)\n return result\n }\n } catch (error) {\n monitor.recordError()\n throw error\n }\n }) as T\n },\n\n /**\n * Create monitoring middleware\n */\n createMonitoringMiddleware(monitor: StateMachineMonitor) {\n return {\n beforeTransition: (context: any) => {\n context._monitoringStartTime = Date.now()\n },\n afterTransition: (context: any) => {\n if (context._monitoringStartTime) {\n monitor.recordTransition(Date.now() - context._monitoringStartTime)\n }\n },\n onError: (_context: any, _error: any) => {\n monitor.recordError()\n },\n }\n },\n}\n","export type StateName = string\nexport type EventName = string\nexport type EventAction<T, R = void> = (adaptee: T, ...args: unknown[]) => R\nexport type ErrorHandler<T> = EventAction<T, void>\n\n// Helper type to extract only methods from a type T\nexport type MethodsOf<T> = {\n [K in keyof T as T[K] extends (...args: any[]) => any ? K : never]: T[K]\n}\n\n// Helper type to extract only properties (non-functions) from a type T\nexport type PropertiesOf<T> = {\n [K in keyof T as T[K] extends (...args: any[]) => any ? never : K]: T[K]\n}\n\nexport type KeysOf<T, R> = {\n [K in keyof T]: T[K] extends R ? K : never\n}[keyof T]\n\nexport type ErrorContext = {\n state?: StateName\n event?: EventName\n action?: string\n transition?: string\n phase?: 'guard' | 'action' | 'transition' | 'enter' | 'exit'\n}\n\nexport class StateMachineError extends Error {\n readonly context: ErrorContext\n\n constructor(message: string, context: ErrorContext, cause?: Error) {\n super(message)\n this.name = 'StateMachineError'\n this.context = context\n this.cause = cause\n /* c8 ignore next 3 */\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, StateMachineError)\n }\n }\n\n override toString(): string {\n const { state, event, action, transition, phase } = this.context\n const details = []\n if (state) details.push(`state: ${state}`)\n if (event) details.push(`event: ${event}`)\n if (action) details.push(`action: ${action}`)\n if (transition) details.push(`transition: ${transition}`)\n if (phase) details.push(`phase: ${phase}`)\n\n return `${this.name}: ${this.message}${details.length ? ` (${details.join(', ')})` : ''}`\n }\n}\n\n// ✅ НОВОЕ: Абстракция логгера\nexport interface ILogger {\n debug(message: string, context?: any): void\n info(message: string, context?: any): void\n warn(message: string, context?: any, error?: Error): void\n error(message: string, context?: any, error?: Error): void\n}\n\n// === WASM-friendly injection contracts (per TD-T4-2a, TD-T4-2, TD-T4-2b) ===\n\n/** @unstable — timer scheduling injection contract; consumed by StateMachine. */\nexport interface ITimerScheduler {\n isActive(): boolean\n schedule(delay: number, callback: () => void): object\n cancel(token: object): void\n}\n\n/** @unstable — transition observability context (additive on IMonitor). */\nexport interface TransitionContext {\n fromState: string\n toState: string\n eventName?: string\n}\n\n/** @unstable — minimal aggregate observability snapshot for tests. */\nexport interface MonitorMetricsSnapshot {\n totalTransitions: number\n successCount: number\n errorCount: number\n averageDuration: number\n}\n\n/**\n * @unstable — observability injection contract.\n * EXPANDED additively in TASK-004 per TD-T4-2: third param of `recordTransition`\n * is parameter-optional; `recordEvent?` and `getMetrics?` are interface-optional.\n * Existing 2-arg call site at state_machine.ts:1665 remains valid.\n */\nexport interface IMonitor {\n recordTransition(duration: number, success: boolean, context?: TransitionContext): void\n recordError(error: Error, context?: ErrorContext): void\n recordEvent?(eventName: string, duration: number): void\n getMetrics?(): MonitorMetricsSnapshot\n}\n\n/** @unstable — error-handler injection contract; surfaces methods consumed by host integrations. */\nexport interface IErrorHandler {\n isEnabled(): boolean\n enable(): void\n disable(): void\n addRecoveryStrategy(strategy: import('./error_handling').ErrorRecoveryStrategy): void\n removeRecoveryStrategy(strategyName: string): void\n getAnalytics(): import('./error_handling').ErrorAnalytics\n}\n\n// ✅ НОВОЕ: Опции инъекции для StateMachine\nexport interface StateMachineOptions {\n logger?: ILogger\n monitor?: IMonitor // EXISTING; element type evolves additively per TD-T4-2\n scheduler?: ITimerScheduler // NEW per TD-T4-2a\n errorHandler?: IErrorHandler // NEW per TD-T4-2b\n /**\n * Maximum time (ms) to wait for async entry/exit actions.\n * If exceeded, the transition aborts with an error.\n */\n transitionTimeout?: number\n /**\n * State to transition to if an error occurs during a transition (Zombie State Prevention).\n */\n errorState?: string\n /**\n * If true, aborts the transition if onExit fails, keeping the state machine in the source state.\n */\n abortOnExitError?: boolean\n /**\n * Maximum depth of the event queue before rejecting new events.\n * Default: 1000\n */\n maxQueueDepth?: number\n}\n\n// Simplified and composable StatePaths types for better TypeScript performance\ntype StringKey = string & {}\n\n// Base type for simple state names (no regions)\nexport type SimpleStateName<S> = StringKey & keyof S\n\n// Type for region-based state names (parent.region)\nexport type RegionStateName<S> = {\n [K in keyof S & string]: S[K] extends { regions?: infer R }\n ? R extends Record<string, any>\n ? `${K}.${StringKey & keyof R}`\n : never\n : never\n}[keyof S & string]\n\n// Type for nested state names (parent.region.child)\nexport type NestedStateName<S> = {\n [K in keyof S & string]: S[K] extends { regions?: infer R }\n ? R extends Record<string, any>\n ? {\n [RegKey in keyof R & string]: R[RegKey] extends Record<string, any>\n ? `${K}.${RegKey}.${StringKey & keyof R[RegKey]}`\n : never\n }[keyof R & string]\n : never\n : never\n}[keyof S & string]\n\n// Type for deeply nested state names (parent.region.child.subregion)\nexport type DeepNestedStateName<S> = {\n [K in keyof S & string]: S[K] extends { regions?: infer R }\n ? R extends Record<string, any>\n ? {\n [RegKey in keyof R & string]: R[RegKey] extends Record<string, any>\n ? {\n [ChildKey in keyof R[RegKey] &\n string]: R[RegKey][ChildKey] extends {\n regions?: infer CR\n }\n ? CR extends Record<string, any>\n ? `${K}.${RegKey}.${ChildKey}.${StringKey & keyof CR}`\n : never\n : never\n }[keyof R[RegKey] & string]\n : never\n }[keyof R & string]\n : never\n : never\n}[keyof S & string]\n\n// Composable StatePaths type - union of all possible path types\nexport type StatePaths<S> =\n | SimpleStateName<S>\n | RegionStateName<S>\n | NestedStateName<S>\n | DeepNestedStateName<S>\n\nexport type ActionOrString<T extends object, R = void> =\n | KeysOf<T, EventAction<T, R>>\n | EventAction<Adapter<T>, R>\nexport type ErrorHandlerOrString<T extends object> =\n | KeysOf<T, ErrorHandler<T>>\n | ErrorHandler<T>\n\n// Тип для имени региона\nexport type RegionName = string\n// Конфигурация регионов\nexport type RegionsConfig<T extends object> = Record<\n RegionName,\n StateMachineConfig<T>['states']\n>\n\nexport type State<T extends object> = {\n name: StateName\n display?: string\n comment?: string\n iconCls?: string\n onBeforeEnter?: ActionOrString<T>\n onEnter?: ActionOrString<T>\n onAfterEnter?: ActionOrString<T>\n onBeforeExit?: ActionOrString<T>\n onExit?: ActionOrString<T>\n onAfterExit?: ActionOrString<T>\n onError?: ErrorHandlerOrString<T>\n regions?: RegionsConfig<T> // Заменяем `states` на `regions`\n initial?: StateName // Добавляем initial для регионов и иерархических состояний\n history?: 'deep' | 'shallow' // Добавляем свойство для истории состояний\n invoke?: StateInvocation<T>[] // Поручения (выполняются при входе в состояние)\n}\n\nexport interface StateInvocation<T extends object> {\n /** Время задержки в миллисекундах */\n delay: number\n /** Событие, которое будет вызвано после задержки */\n event: EventName\n /** Условие запуска поручения */\n cond?: (adaptee: T) => boolean\n /** Действие, выполняемое перед событием */\n action?: ActionOrString<T>\n}\n\n// Использовать для полей from, to в Transition\nexport type Transition<T extends object, S extends States<T>> = {\n from: StatePaths<S>\n to: StatePaths<S>\n priority?: number\n guard?: ActionOrString<T, boolean>\n /**\n * Action executed during the transition (after leaving `from`, before entering `to`).\n * Receives the current owner context. Use for side-effects scoped to this edge.\n */\n onTransition?: ActionOrString<T>\n onError?: ErrorHandlerOrString<T>\n}\n\nexport type Event<T extends object, S extends States<T>> = {\n name: EventName\n display?: string\n comment?: string\n transitions: Array<Transition<T, S>>\n onBefore?: ActionOrString<T>\n onAfter?: ActionOrString<T>\n onSuccess?: ActionOrString<T>\n onError?: ErrorHandlerOrString<T>\n}\n\n///Record<StateName, Omit<State<T>, 'name'>>\nexport type States<T extends object> = Record<StateName, Omit<State<T>, 'name'>>\nexport type Events<T extends object, S extends States<T>> = Record<\n EventName,\n Omit<Event<T, S>, 'name'>\n>\n\nexport interface Adapter<T extends object> {\n get adaptee(): T\n set(property: keyof T, value: T[keyof T]): void\n get(property: keyof T): T[keyof T]\n}\n\nexport type ExtractAdaptee<T> = T extends MemoryAdapter<infer R> ? R : T\n\nexport function isAdapter<T extends object>(inp: unknown): inp is Adapter<T> {\n return !!inp && typeof inp === 'object' && 'set' in inp && 'get' in inp\n}\n\nexport interface StateMachineConfig<T extends object = object> {\n name: string\n description?: string\n stateAttribute: KeysOf<PropertiesOf<T>, string>\n // initialState: StateName; // initialState теперь просто StateName, может быть в регионе\n initialState: keyof StateMachineConfig<T>['states']\n events: Record<\n EventName,\n Omit<Event<T, StateMachineConfig<T>['states']>, 'name'>\n >\n states: States<T> // Корневые состояния машины\n // states: Record<StateName, Omit<State<T>, 'name'>>\n onError?: KeysOf<T, ErrorHandler<T>>\n}\n\n// `Adaptee<T>`, `Configuree<T>`, and `Config<T>` type-utilities were removed in TASK-003 CODE_REVIEW.\n// They had zero internal usage and were not exported from the curated public surface (TD-T3-4).\n// If a downstream consumer use case emerges, re-introduce as `export type` and add to `src/index.ts`.\n\n// New interface for state persistence\nexport interface StatePersistenceAdapter {\n save(state?: {\n currentState: string\n history: any\n stateEntryTimes: any\n }): Promise<void>\n restore(): Promise<{\n currentState: string\n history: any\n stateEntryTimes: any\n }>\n}\n\n// Memory Adapter (renamed from AdapterJSON)\nexport class MemoryAdapter<T extends object>\n implements Adapter<T>, StatePersistenceAdapter {\n adaptee: T\n private _savedState: unknown\n\n constructor(data: T) {\n this.adaptee = data\n }\n\n set(property: keyof T, value: T[keyof T]) {\n this.adaptee[property] = value\n }\n\n get(property: keyof T): T[keyof T] {\n return this.adaptee[property]\n }\n\n // StatePersistenceAdapter implementation\n async save(state?: { currentState: string; history: unknown; stateEntryTimes: unknown }) {\n this._savedState = state\n }\n\n async restore(): Promise<{ currentState: string; history: unknown; stateEntryTimes: unknown }> {\n return this._savedState as { currentState: string; history: unknown; stateEntryTimes: unknown }\n }\n}\n\n// LocalStorage Adapter\nexport class LocalStorageAdapter<T extends object>\n implements Adapter<T>, StatePersistenceAdapter {\n adaptee: T\n private key: string\n\n constructor(data: T, storageKey = 'state_machine') {\n this.adaptee = data\n this.key = storageKey\n }\n\n set(property: keyof T, value: T[keyof T]) {\n this.adaptee[property] = value\n }\n\n get(property: keyof T): T[keyof T] {\n return this.adaptee[property]\n }\n\n // StatePersistenceAdapter implementation\n async save(state?: any) {\n const data = { ...this.adaptee, state }\n globalThis.localStorage.setItem(this.key, JSON.stringify(data))\n }\n\n async restore() {\n const stored = globalThis.localStorage.getItem(this.key)\n /* c8 ignore next */\n return stored ? JSON.parse(stored).state : { currentState: '', history: {} }\n }\n}\n\n// SessionStorage Adapter\nexport class SessionStorageAdapter<T extends object>\n implements Adapter<T>, StatePersistenceAdapter {\n adaptee: T\n private key: string\n\n constructor(data: T, storageKey = 'state_machine') {\n this.adaptee = data\n this.key = storageKey\n }\n\n set(property: keyof T, value: T[keyof T]) {\n this.adaptee[property] = value\n }\n\n get(property: keyof T): T[keyof T] {\n return this.adaptee[property]\n }\n\n // StatePersistenceAdapter implementation\n async save(state?: any) {\n const data = { ...this.adaptee, state }\n globalThis.sessionStorage.setItem(this.key, JSON.stringify(data))\n }\n\n async restore() {\n const stored = globalThis.sessionStorage.getItem(this.key)\n /* c8 ignore next */\n return stored ? JSON.parse(stored).state : undefined\n }\n}\n\n// Server Adapter (async example)\nexport class ServerAdapter<T extends object>\n implements Adapter<T>, StatePersistenceAdapter {\n adaptee: T\n static data: Record<string, unknown> = {}\n private endpoint: string\n\n constructor(data: T, endpoint = '/api/state') {\n this.adaptee = data\n this.endpoint = endpoint\n }\n\n set(property: keyof T, value: T[keyof T]) {\n this.adaptee[property] = value\n }\n\n get(property: keyof T): T[keyof T] {\n return this.adaptee[property]\n }\n\n // StatePersistenceAdapter implementation (simulated async)\n async save(state?: any): Promise<void> {\n if (state) {\n // Simulate server call\n await new Promise((resolve) => setTimeout(resolve, 100))\n ServerAdapter.data[this.endpoint] = state\n }\n }\n\n async restore(): Promise<any> {\n // Simulate server fetch\n await new Promise((resolve) => setTimeout(resolve, 100))\n return (\n ServerAdapter.data[this.endpoint] || { currentState: '', history: {} }\n )\n }\n}\n","/**\n * Enhanced error handling module for StateMachine library\n * Provides comprehensive error context, recovery strategies, and error analytics\n */\n\nimport { stateMachineLogger } from './logger'\nimport { type ErrorContext, StateMachineError } from './types'\n\n// Extended error context with more detailed information\nexport interface ExtendedErrorContext extends ErrorContext {\n timestamp: number\n machineId?: string\n currentStateHistory?: string[]\n attemptedTransition?: {\n from: string\n to: string\n event: string\n }\n stackTrace?: string | undefined\n userAgent?: string | undefined\n sessionId?: string | undefined\n additionalData?: Record<string, any> | undefined\n}\n\n// Error severity levels\nexport const ErrorSeverity = {\n LOW: 'low',\n MEDIUM: 'medium',\n HIGH: 'high',\n CRITICAL: 'critical',\n} as const\n\nexport type ErrorSeverity = (typeof ErrorSeverity)[keyof typeof ErrorSeverity]\n\n// Error categories for better classification\nexport const ErrorCategory = {\n VALIDATION: 'validation',\n TRANSITION: 'transition',\n ACTION: 'action',\n SERIALIZATION: 'serialization',\n CONFIGURATION: 'configuration',\n SECURITY: 'security',\n PERFORMANCE: 'performance',\n NETWORK: 'network',\n UNKNOWN: 'unknown',\n} as const\n\nexport type ErrorCategory = (typeof ErrorCategory)[keyof typeof ErrorCategory]\n\n// Enhanced error class with additional metadata\nexport class EnhancedStateMachineError extends StateMachineError {\n readonly severity: ErrorSeverity\n readonly category: ErrorCategory\n readonly extendedContext: ExtendedErrorContext\n readonly recoverable: boolean\n readonly errorCode: string\n\n constructor(\n message: string,\n context: ErrorContext,\n options: {\n severity?: ErrorSeverity\n category?: ErrorCategory\n recoverable?: boolean\n errorCode?: string\n additionalData?: Record<string, any>\n cause?: Error\n } = {},\n ) {\n super(message, context, options.cause)\n\n this.severity = options.severity || ErrorSeverity.MEDIUM\n this.category = options.category || ErrorCategory.UNKNOWN\n this.recoverable = options.recoverable ?? true\n this.errorCode = options.errorCode || this.generateErrorCode()\n\n this.extendedContext = {\n ...context,\n timestamp: Date.now(),\n stackTrace: this.stack,\n additionalData: options.additionalData,\n }\n }\n\n private generateErrorCode(): string {\n const categoryCode = this.category.toUpperCase().substring(0, 3)\n const severityCode = this.severity.toUpperCase().substring(0, 1)\n const timestamp = Date.now().toString().slice(-6)\n return `SM_${categoryCode}_${severityCode}_${timestamp}`\n }\n\n toJSON(): Record<string, any> {\n return {\n name: this.name,\n message: this.message,\n errorCode: this.errorCode,\n severity: this.severity,\n category: this.category,\n recoverable: this.recoverable,\n context: this.extendedContext,\n stack: this.stack,\n }\n }\n}\n\n// Error recovery strategies\nexport interface ErrorRecoveryStrategy {\n name: string\n canRecover(error: EnhancedStateMachineError): boolean\n recover(error: EnhancedStateMachineError, context: any): Promise<boolean>\n}\n\n// Default recovery strategies\nexport class RetryRecoveryStrategy implements ErrorRecoveryStrategy {\n name = 'retry'\n private maxRetries: number\n private retryDelay: number\n\n constructor(maxRetries = 3, retryDelay = 1000) {\n this.maxRetries = maxRetries\n this.retryDelay = retryDelay\n }\n\n canRecover(error: EnhancedStateMachineError): boolean {\n return (\n error.recoverable &&\n error.category !== ErrorCategory.SECURITY &&\n error.severity !== ErrorSeverity.CRITICAL\n )\n }\n\n async recover(\n error: EnhancedStateMachineError,\n context: any,\n ): Promise<boolean> {\n const retryCount = context.retryCount || 0\n\n if (retryCount >= this.maxRetries) {\n stateMachineLogger.warn('Max retries exceeded', {\n errorCode: error.errorCode,\n retryCount,\n maxRetries: this.maxRetries,\n })\n return false\n }\n\n stateMachineLogger.info('Attempting error recovery', {\n errorCode: error.errorCode,\n strategy: this.name,\n attempt: retryCount + 1,\n })\n\n // Wait before retry\n await new Promise((resolve) => setTimeout(resolve, this.retryDelay))\n\n context.retryCount = retryCount + 1\n return true\n }\n}\n\nexport class FallbackStateRecoveryStrategy implements ErrorRecoveryStrategy {\n name = 'fallback_state'\n private fallbackState: string\n\n constructor(fallbackState = 'error_state') {\n this.fallbackState = fallbackState\n }\n\n canRecover(error: EnhancedStateMachineError): boolean {\n return (\n error.category === ErrorCategory.TRANSITION ||\n error.category === ErrorCategory.ACTION\n )\n }\n\n async recover(\n error: EnhancedStateMachineError,\n context: any,\n ): Promise<boolean> {\n try {\n if (\n context.stateMachine &&\n typeof context.stateMachine.setCurrentState === 'function'\n ) {\n stateMachineLogger.info('Recovering to fallback state', {\n errorCode: error.errorCode,\n fallbackState: this.fallbackState,\n originalState: error.context.state,\n })\n\n context.stateMachine.setCurrentState(this.fallbackState)\n return true\n }\n } catch (recoveryError) {\n stateMachineLogger.error(\n 'Fallback recovery failed',\n {\n errorCode: error.errorCode,\n fallbackState: this.fallbackState,\n },\n /* c8 ignore next */\n recoveryError instanceof Error\n ? recoveryError\n : new Error(String(recoveryError)),\n )\n }\n\n return false\n }\n}\n\n// Error analytics and reporting\nexport class ErrorAnalytics {\n private errors: EnhancedStateMachineError[] = []\n private maxStoredErrors: number\n\n constructor(maxStoredErrors = 1000) {\n this.maxStoredErrors = maxStoredErrors\n }\n\n recordError(error: EnhancedStateMachineError): void {\n this.errors.push(error)\n\n // Keep only recent errors\n if (this.errors.length > this.maxStoredErrors) {\n this.errors = this.errors.slice(-this.maxStoredErrors)\n }\n\n // Log error for immediate attention\n stateMachineLogger.error(\n 'StateMachine error recorded',\n {\n errorCode: error.errorCode,\n severity: error.severity,\n category: error.category,\n recoverable: error.recoverable,\n },\n error,\n )\n }\n\n getErrorStats(): {\n total: number\n bySeverity: Record<ErrorSeverity, number>\n byCategory: Record<ErrorCategory, number>\n recentErrors: number\n errorRate: number\n } {\n const now = Date.now()\n const oneHourAgo = now - 60 * 60 * 1000\n\n const recentErrors = this.errors.filter(\n (e) => e.extendedContext.timestamp > oneHourAgo,\n )\n\n const bySeverity = Object.values(ErrorSeverity).reduce(\n (acc, severity) => {\n acc[severity] = this.errors.filter(\n (e) => e.severity === severity,\n ).length\n return acc\n },\n {} as Record<ErrorSeverity, number>,\n )\n\n const byCategory = Object.values(ErrorCategory).reduce(\n (acc, category) => {\n acc[category] = this.errors.filter(\n (e) => e.category === category,\n ).length\n return acc\n },\n {} as Record<ErrorCategory, number>,\n )\n\n return {\n total: this.errors.length,\n bySeverity,\n byCategory,\n recentErrors: recentErrors.length,\n errorRate: recentErrors.length / 60, // errors per minute\n }\n }\n\n getTopErrors(limit = 10): Array<{\n errorCode: string\n message: string\n count: number\n lastOccurrence: number\n severity: ErrorSeverity\n category: ErrorCategory\n }> {\n const errorGroups = new Map<\n string,\n {\n errorCode: string\n message: string\n count: number\n lastOccurrence: number\n severity: ErrorSeverity\n category: ErrorCategory\n }\n >()\n\n this.errors.forEach((error) => {\n const key = `${error.message}_${error.category}`\n const existing = errorGroups.get(key)\n\n if (existing) {\n existing.count++\n existing.lastOccurrence = Math.max(\n existing.lastOccurrence,\n error.extendedContext.timestamp,\n )\n } else {\n errorGroups.set(key, {\n errorCode: error.errorCode,\n message: error.message,\n count: 1,\n lastOccurrence: error.extendedContext.timestamp,\n severity: error.severity,\n category: error.category,\n })\n }\n })\n\n return Array.from(errorGroups.values())\n .sort((a, b) => b.count - a.count)\n .slice(0, limit)\n }\n\n clearErrors(): void {\n this.errors = []\n }\n}\n\n// Main error handler class\nexport class ErrorHandler {\n private recoveryStrategies: ErrorRecoveryStrategy[] = []\n private analytics: ErrorAnalytics\n private enabled = true\n\n constructor() {\n this.analytics = new ErrorAnalytics()\n\n // Add default recovery strategies\n this.addRecoveryStrategy(new RetryRecoveryStrategy())\n this.addRecoveryStrategy(new FallbackStateRecoveryStrategy())\n }\n\n addRecoveryStrategy(strategy: ErrorRecoveryStrategy): void {\n this.recoveryStrategies.push(strategy)\n }\n\n removeRecoveryStrategy(strategyName: string): void {\n this.recoveryStrategies = this.recoveryStrategies.filter(\n (s) => s.name !== strategyName,\n )\n }\n\n async handleError(\n error: Error | EnhancedStateMachineError,\n context: any = {},\n ): Promise<boolean> {\n if (!this.enabled) {\n return false\n }\n\n // Convert to enhanced error if needed\n const enhancedError =\n error instanceof EnhancedStateMachineError\n ? error\n : this.convertToEnhancedError(error, context)\n\n // Record error for analytics\n this.analytics.recordError(enhancedError)\n\n // Attempt recovery\n for (const strategy of this.recoveryStrategies) {\n if (strategy.canRecover(enhancedError)) {\n try {\n const recovered = await strategy.recover(enhancedError, context)\n if (recovered) {\n stateMachineLogger.info('Error recovery successful', {\n errorCode: enhancedError.errorCode,\n strategy: strategy.name,\n })\n return true\n }\n } catch (recoveryError) {\n stateMachineLogger.error(\n 'Recovery strategy failed',\n {\n errorCode: enhancedError.errorCode,\n strategy: strategy.name,\n },\n /* c8 ignore next */\n recoveryError instanceof Error\n ? recoveryError\n : new Error(String(recoveryError)),\n )\n }\n }\n }\n\n stateMachineLogger.error('All recovery strategies failed', {\n errorCode: enhancedError.errorCode,\n severity: enhancedError.severity,\n category: enhancedError.category,\n })\n\n return false\n }\n\n private convertToEnhancedError(\n error: Error,\n context: any,\n ): EnhancedStateMachineError {\n // Determine category based on error message and context\n let category: ErrorCategory = ErrorCategory.UNKNOWN\n let severity: ErrorSeverity = ErrorSeverity.MEDIUM\n\n if (\n error.message.includes('transition') ||\n error.message.includes('state')\n ) {\n category = ErrorCategory.TRANSITION\n } else if (error.message.includes('action')) {\n category = ErrorCategory.ACTION\n } else if (error.message.includes('validation')) {\n category = ErrorCategory.VALIDATION\n severity = ErrorSeverity.HIGH\n } else if (\n error.message.includes('security') ||\n error.message.includes('injection')\n ) {\n category = ErrorCategory.SECURITY\n severity = ErrorSeverity.CRITICAL\n }\n\n return new EnhancedStateMachineError(\n error.message,\n context.errorContext || {},\n {\n category,\n severity,\n cause: error,\n additionalData: context,\n },\n )\n }\n\n getAnalytics(): ErrorAnalytics {\n return this.analytics\n }\n\n enable(): void {\n this.enabled = true\n }\n\n disable(): void {\n this.enabled = false\n }\n\n isEnabled(): boolean {\n return this.enabled\n }\n}\n\n/**\n * @internal — default factory for StateMachine.errorHandler injection slot.\n * Returns a new ErrorHandler instance (NOT a singleton).\n * Constructor at line 343 is public (verified).\n */\nexport function createDefaultErrorHandler(): import('./types').IErrorHandler {\n return new ErrorHandler()\n}\n\n// Utility functions\nexport function createEnhancedError(\n message: string,\n context: ErrorContext,\n options?: {\n severity?: ErrorSeverity\n category?: ErrorCategory\n recoverable?: boolean\n additionalData?: Record<string, any>\n },\n): EnhancedStateMachineError {\n return new EnhancedStateMachineError(message, context, options)\n}\n\nexport function isRecoverableError(error: Error): boolean {\n if (error instanceof EnhancedStateMachineError) {\n return error.recoverable\n }\n return true // Assume recoverable by default\n}\n","import { createDefaultScheduler } from './scheduler'\nimport { type SafeSerializedAction, safeFunctionSerializer } from './security'\nimport { createDefaultMonitor } from './monitoring'\nimport { createDefaultErrorHandler } from './error_handling'\nimport {\n type ActionOrString,\n type Adapter,\n type ErrorContext,\n type ErrorHandler,\n type ErrorHandlerOrString,\n type Event,\n type EventAction,\n type Events,\n type IErrorHandler,\n type ILogger,\n type IMonitor,\n type ITimerScheduler,\n isAdapter,\n type KeysOf,\n MemoryAdapter,\n type MethodsOf,\n type PropertiesOf,\n type RegionsConfig,\n type State,\n type StateMachineConfig,\n StateMachineError,\n type StateMachineOptions,\n type StateName,\n type StatePersistenceAdapter,\n type States,\n type Transition,\n} from './types'\n\n// Removed unused helper functions serializeAction and deserializeAction\n// These functions are available through safeFunctionSerializer directly when needed\n\n// ✅ НОВОЕ: Default implementation для Lite режима (No-Op или Console)\nconst ConsoleLogger: ILogger = {\n debug: () => { }, // По умолчанию выключено для Lite\n info: () => { },\n warn: (msg, ctx) => console.warn(msg, ctx),\n error: (msg, ctx, err) => console.error(msg, ctx, err),\n}\n\ninterface StateInfo {\n name: string\n display?: string\n isComposite: boolean\n regions?: string[]\n parent?: string\n children?: string[]\n}\n\ninterface QueuedEvent<TOwner extends object = object> {\n id: string\n eventName: string\n obj: Adapter<PropertiesOf<TOwner>>\n args: any[]\n resolve?: (value: boolean) => void\n reject?: (error: any) => void\n timestamp: number\n type: 'internal' | 'external'\n}\n\ninterface QueuedEventInfo {\n id: string\n event: string\n age: number\n type: 'internal' | 'external'\n}\n\nexport class StateMachine<\n TOwner extends object,\n SMConfig extends StateMachineConfig<TOwner>,\n> {\n // Приватные поля для зависимостей\n private logger: ILogger\n private monitor: IMonitor\n private scheduler: ITimerScheduler\n private errorHandler: IErrorHandler\n\n // Свойства\n private states: Map<keyof SMConfig['states'], State<TOwner>>\n private events: Map<\n keyof SMConfig['events'],\n Event<TOwner, SMConfig['states']>\n >\n private stateAttribute: KeysOf<PropertiesOf<TOwner>, string>\n private onError?: ErrorHandlerOrString<TOwner>\n private adaptee?: Adapter<PropertiesOf<TOwner>>\n private context?: MethodsOf<TOwner>\n private historyMap: Map<StateName, string> = new Map()\n private initialState: keyof SMConfig['states']\n private persistenceAdapter?: StatePersistenceAdapter\n private activeTimers: Map<string, any[]> = new Map()\n private stateEntryTimes: Map<string, number> = new Map()\n\n // Event Queue Infrastructure (SCXML Run-to-Completion)\n private externalQueue: QueuedEvent<TOwner>[] = []\n private internalQueue: QueuedEvent<TOwner>[] = []\n private isProcessing = false\n private eventIdCounter = 0\n private transitionDepth = 0\n private readonly MAX_TRANSITION_DEPTH = 100\n\n // Optional configuration\n private transitionTimeout?: number\n private errorState?: string\n private abortOnExitError?: boolean\n private maxQueueDepth = 1000\n\n // Transition state visibility\n private _isTransitioning = false\n private _targetState: string | undefined\n\n public get isTransitioning() {\n return this._isTransitioning\n }\n\n public get targetState() {\n return this._targetState\n }\n\n // Геттеры и сеттеры\n public set currentState(state: StateName) {\n if (!this.adaptee) throw new StateMachineError('no adaptee', { state })\n this.setCurrentState(state, this.adaptee)\n }\n\n public get currentState(): string {\n if (!this.adaptee) {\n const s = this.getCurrentState()\n /* c8 ignore next */\n throw new StateMachineError('no adaptee', s !== undefined ? { state: s } : {})\n }\n /* c8 ignore next */\n return this.getCurrentState(this.adaptee) ?? ''\n }\n\n // Конструктор\n constructor(\n config: SMConfig,\n adaptee?: Adapter<PropertiesOf<TOwner>> | PropertiesOf<TOwner>,\n options?: StateMachineOptions, // ⬅️ Внедрение через опции\n ) {\n this.initialState = config.initialState\n\n // ✅ Внедрение зависимостей (Dependency Injection)\n // Если передали - используем, если нет - fallback на легковесные версии\n this.logger = options?.logger ?? ConsoleLogger\n this.monitor = options?.monitor ?? createDefaultMonitor()\n this.scheduler = options?.scheduler ?? createDefaultScheduler()\n this.errorHandler = options?.errorHandler ?? createDefaultErrorHandler()\n\n if (adaptee) {\n if (!isAdapter<TOwner>(adaptee)) {\n this.adaptee = new MemoryAdapter(adaptee) as Adapter<\n PropertiesOf<TOwner>\n >\n } else {\n this.adaptee = adaptee as Adapter<PropertiesOf<TOwner>>\n }\n }\n\n // Apply options\n if (options?.transitionTimeout !== undefined) {\n this.transitionTimeout = options.transitionTimeout\n }\n if (options?.errorState !== undefined) {\n this.errorState = options.errorState\n }\n if (options?.abortOnExitError !== undefined) {\n this.abortOnExitError = options.abortOnExitError\n }\n if (options?.maxQueueDepth !== undefined) {\n this.maxQueueDepth = options.maxQueueDepth\n }\n if (config.onError !== undefined) {\n this.onError = config.onError\n }\n this.stateAttribute = config.stateAttribute\n this.states = new Map()\n this.events = new Map(\n Object.entries(config.events).map(([name, value]) => [\n name,\n {\n name,\n ...value,\n transitions: value.transitions.map((t) => ({\n ...t,\n // Support 'action' alias for 'onTransition'\n onTransition: t.onTransition || (t as any).action,\n })),\n },\n ]),\n )\n this.processStates(config.states)\n if (adaptee) {\n this.persistenceAdapter = adaptee as unknown as StatePersistenceAdapter\n this.setInitialState(config.initialState as string)\n }\n\n // Логируем инициализацию\n this.logger.info('StateMachine initialized', { name: config.name })\n }\n\n // Основные публичные методы\n public setContext(context: MethodsOf<TOwner>): void {\n this.context = context\n }\n\n private enqueueEvent(\n eventName: string,\n obj: Adapter<PropertiesOf<TOwner>>,\n args: any[],\n type: 'internal' | 'external',\n ): Promise<boolean> {\n if (\n this.externalQueue.length + this.internalQueue.length >=\n this.maxQueueDepth\n ) {\n const _s0 = this.getCurrentState(obj)\n return Promise.reject(\n new StateMachineError('Event queue overflow — possible infinite loop', {\n /* c8 ignore next */\n ...(_s0 !== undefined ? { state: _s0 } : {}),\n event: eventName,\n }),\n )\n }\n\n if (type === 'external') {\n return new Promise<boolean>((resolve, reject) => {\n this.externalQueue.push({\n id: `ext_${++this.eventIdCounter}`,\n eventName,\n obj,\n args,\n resolve,\n reject,\n timestamp: Date.now(),\n type: 'external',\n })\n this.scheduleProcessing()\n })\n }\n\n /* c8 ignore next 7 */\n this.internalQueue.push({\n id: `int_${++this.eventIdCounter}`,\n eventName,\n obj,\n args,\n timestamp: Date.now(),\n type: 'internal',\n })\n /* c8 ignore next */\n return Promise.resolve(true)\n }\n\n private raiseEvent(\n eventName: string,\n obj: Adapter<PropertiesOf<TOwner>>,\n ...args: any[]\n ): void {\n this.internalQueue.push({\n id: `int_${++this.eventIdCounter}`,\n eventName,\n obj,\n args,\n timestamp: Date.now(),\n type: 'internal',\n })\n }\n\n private scheduleProcessing(): void {\n /* c8 ignore next */\n if (this.isProcessing) return\n queueMicrotask(() => this.processQueues())\n }\n\n private async processQueues(): Promise<void> {\n /* c8 ignore next */\n if (this.isProcessing) return\n this.isProcessing = true\n\n try {\n while (this.internalQueue.length > 0 || this.externalQueue.length > 0) {\n if (this.transitionDepth >= this.MAX_TRANSITION_DEPTH) {\n const _s1 = this.getCurrentState()\n /* c8 ignore next */\n const error = new StateMachineError(\n 'Max transition depth exceeded — possible infinite loop',\n /* c8 ignore next */\n { ...(_s1 !== undefined ? { state: _s1 } : {}), event: 'processQueues' },\n )\n while (this.externalQueue.length > 0) {\n const evt = this.externalQueue.shift()!\n evt.reject?.(error)\n }\n this.internalQueue.length = 0\n throw error\n }\n\n if (this.internalQueue.length > 0) {\n const evt = this.internalQueue.shift()!\n this.transitionDepth++\n try {\n await this.executeQueuedTransition(evt)\n } finally {\n this.transitionDepth--\n }\n } else {\n const evt = this.externalQueue.shift()!\n this.transitionDepth++\n try {\n const result = await this.executeQueuedTransition(evt)\n evt.resolve?.(result)\n } catch (error) {\n evt.reject?.(error)\n } finally {\n this.transitionDepth--\n }\n }\n }\n } finally {\n this.isProcessing = false\n this.transitionDepth = 0\n }\n }\n\n private async executeQueuedTransition(\n queuedEvent: QueuedEvent<TOwner>,\n ): Promise<boolean> {\n const { eventName, obj, args } = queuedEvent\n const targetObj = obj\n\n let currentStateRaw = this.getCurrentState(targetObj)\n if (!currentStateRaw) {\n this.setInitialState(this.initialState as string, targetObj)\n currentStateRaw = this.getCurrentState(targetObj)\n }\n /* c8 ignore next */\n const currentState: string = currentStateRaw ?? ''\n\n let event = this.events.get(eventName as keyof SMConfig['events'])\n let transitions = event\n ? event.transitions.filter((t) =>\n this.isTransitionPossible(t, currentState),\n )\n : []\n\n if (!transitions.length) {\n const wildcardEvent = this.events.get('*' as keyof SMConfig['events'])\n if (wildcardEvent) {\n const wildcardTransitions = wildcardEvent.transitions.filter((t) =>\n this.isTransitionPossible(t, currentState),\n )\n if (wildcardTransitions.length > 0) {\n event = wildcardEvent\n transitions = wildcardTransitions\n }\n }\n }\n\n if (!event || !transitions.length) {\n throw new StateMachineError(\n `Invalid event: ${eventName} for state: ${currentState}`,\n { state: currentState, event: eventName },\n )\n }\n\n const allowedTransition = await this.getAllowedTransitions(\n targetObj,\n transitions,\n ...args,\n ).catch((error) => {\n this.logger.error(\n 'Error determining allowed transition',\n { event: eventName, state: currentState },\n /* c8 ignore next */\n error instanceof Error ? error : new Error(String(error)),\n )\n return undefined\n })\n\n if (!allowedTransition) {\n return false\n }\n\n const toState = await this.applyTransition(\n targetObj as any,\n currentState,\n allowedTransition,\n args,\n eventName as keyof SMConfig['events'],\n event,\n ).catch((error) => {\n this.logger.error(\n 'Error applying transition',\n {\n event: eventName,\n state: currentState,\n transition: `${allowedTransition.from} -> ${allowedTransition.to}`,\n },\n /* c8 ignore next */\n error instanceof Error ? error : new Error(String(error)),\n )\n if (this.errorHandler.isEnabled()) {\n this.monitor.recordError(\n error instanceof Error ? error : new Error(String(error)),\n { state: currentState, event: eventName },\n )\n }\n throw error // Propagate error to caller (e.g. fireEvent rejection)\n })\n\n if (!toState) {\n return false\n }\n\n this.setCurrentState(toState.name, targetObj)\n return true\n }\n\n /**\n * Fires an event to trigger a state transition.\n *\n * @param eventName - The name of the event to fire. Use '*' for wildcard events.\n * @param args - Additional arguments to pass to guards, actions, and callbacks.\n * @returns Promise<boolean> - True if a transition occurred, false otherwise.\n *\n * @throws StateMachineError if the event is invalid or no transition is possible (unless configured otherwise).\n *\n * @example\n * const success = await sm.fireEvent('submit', payload);\n */\n public async fireEvent(\n eventName: keyof SMConfig['events'] | '*',\n ...args: any[]\n ): Promise<boolean>\n public async fireEvent(\n eventName: keyof SMConfig['events'] | '*',\n obj?: Adapter<PropertiesOf<TOwner>>,\n ...args: unknown[]\n ): Promise<boolean> {\n let targetObj: Adapter<PropertiesOf<TOwner>>\n if (!obj) {\n if (this.adaptee) targetObj = this.adaptee\n else\n throw new StateMachineError('no adaptee or object passed', {\n event: String(eventName),\n })\n } else if (!isAdapter(obj)) {\n args.unshift(obj)\n if (this.adaptee) targetObj = this.adaptee\n else\n throw new StateMachineError('no adaptee or object passed', {\n event: String(eventName),\n })\n } else {\n targetObj = obj\n }\n\n return this.enqueueEvent(String(eventName), targetObj, args, 'external')\n }\n\n public getQueueDepth(): {\n internal: number\n external: number\n total: number\n } {\n return {\n internal: this.internalQueue.length,\n external: this.externalQueue.length,\n total: this.internalQueue.length + this.externalQueue.length,\n }\n }\n\n public getQueuedEvents(): QueuedEventInfo[] {\n const now = Date.now()\n const mapEvent = (evt: QueuedEvent<TOwner>): QueuedEventInfo => ({\n id: evt.id,\n event: evt.eventName,\n age: now - evt.timestamp,\n type: evt.type,\n })\n return [\n ...this.internalQueue.map(mapEvent),\n ...this.externalQueue.map(mapEvent),\n ]\n }\n\n public isProcessingEvents(): boolean {\n return this.isProcessing\n }\n\n /**\n * Checks if an event can be fired in the current state.\n *\n * @param eventName - The name of the event to check.\n * @param adaptee - Optional adapter/object to check against (defaults to internal adaptee).\n * @returns boolean - True if the event has a valid transition from the current state (guards are not executed).\n */\n public canFireEvent(\n eventName: keyof SMConfig['events'] | '*',\n adaptee?: Adapter<PropertiesOf<TOwner>>,\n ): boolean {\n const targetAdaptee = adaptee || this.adaptee\n if (!targetAdaptee) return false\n\n const currentState = this.getCurrentState(targetAdaptee)\n const effectiveState =\n currentState === ''\n ? this.getInitialCompositeState(this.initialState as string)\n : currentState\n /* c8 ignore next */ if (effectiveState === undefined) return false\n\n const event = this.events.get(String(eventName))\n if (\n !event ||\n !event.transitions.some((t) =>\n this.isTransitionPossible(t, effectiveState),\n )\n ) {\n const wildcardEvent = this.events.get('*')\n if (wildcardEvent) {\n return wildcardEvent.transitions.some((t) =>\n this.isTransitionPossible(t, effectiveState),\n )\n }\n return false\n }\n\n return true\n }\n\n public getAvailableEvents(adaptee?: Adapter<PropertiesOf<TOwner>>): string[] {\n const available: string[] = []\n for (const [name] of this.events) {\n if (this.canFireEvent(name, adaptee)) {\n available.push(String(name))\n }\n }\n return available\n }\n\n public async reset(adaptee?: Adapter<PropertiesOf<TOwner>>): Promise<void> {\n const targetAdaptee = adaptee || this.adaptee\n if (!targetAdaptee) {\n const _s2 = this.getCurrentState()\n throw new StateMachineError('no adaptee', _s2 !== undefined ? { state: _s2 } : {})\n }\n\n this.historyMap.clear()\n\n // Clear all active timers\n for (const timers of this.activeTimers.values()) {\n for (const id of timers) {\n this.clearTimer(id)\n }\n }\n this.activeTimers.clear()\n this.stateEntryTimes.clear()\n\n this.setInitialState(this.initialState as string, targetAdaptee)\n }\n\n public getStateHistory(): Record<string, string> {\n return Object.fromEntries(this.historyMap)\n }\n\n public getCurrentStateInfo(): StateInfo | undefined {\n const currentState = this.getCurrentState()\n if (currentState === undefined) return undefined\n\n const isComposite = currentState.includes('|')\n if (isComposite) {\n const activeStates = currentState.split('|').filter(Boolean)\n const regions = activeStates.map((s) => this.getRegionKey(s))\n return {\n name: currentState,\n isComposite: true,\n regions,\n children: activeStates,\n }\n }\n\n const state = this.states.get(currentState)\n /* c8 ignore next */ if (!state) return undefined\n\n const parent = currentState.includes('.')\n ? currentState.split('.').slice(0, -1).join('.')\n : undefined\n\n const children = this.getDirectChildren(currentState)\n const regions = state.regions ? Object.keys(state.regions) : undefined\n\n return {\n name: currentState,\n ...(state.display !== undefined ? { display: state.display } : {}),\n isComposite: Boolean(state.regions),\n ...(regions !== undefined ? { regions } : {}),\n ...(parent !== undefined ? { parent } : {}),\n ...(children.length ? { children } : {}),\n }\n }\n\n /**\n * Checks if the machine is in a specific state.\n * Supports hierarchical states (e.g. 'parent' matches 'parent.child').\n *\n * @param expectedState - The state name to check.\n * @param adaptee - Optional adapter to check against.\n * @returns boolean - True if the current state matches or is a substate of the expected state.\n */\n public isInState(\n expectedState: StateName,\n adaptee?: Adapter<PropertiesOf<TOwner>>,\n ): boolean {\n const currentState = this.getCurrentState(adaptee)\n if (!currentState) return expectedState === ''\n\n const currentParts = currentState.split('|').sort()\n const expectedParts = expectedState.split('|').sort()\n\n if (currentParts.length !== expectedParts.length) return false\n\n return currentParts.every((part, index) => part === expectedParts[index])\n }\n\n public attachToObject(\n object: any,\n eventMap: { [key: string]: string },\n ): void {\n for (const objectEventName in eventMap) {\n if (eventMap.hasOwnProperty(objectEventName)) {\n const stateMachineEventName = eventMap[objectEventName]\n /* c8 ignore next */ if (stateMachineEventName === undefined) continue\n if (typeof object.addEventListener === 'function') {\n object.addEventListener(objectEventName, (...args: any[]) => {\n this.fireEvent(stateMachineEventName, object, ...args).catch((e) =>\n this.logger.error(\n 'Error firing event',\n {\n objectEventName,\n stateMachineEventName,\n },\n /* c8 ignore next */\n e instanceof Error ? e : new Error(String(e)),\n ),\n )\n })\n } else if (typeof object.on === 'function') {\n object.on(objectEventName, (...args: any[]) => {\n this.fireEvent(stateMachineEventName, object, ...args).catch((e) =>\n this.logger.error(\n 'Error firing event',\n {\n objectEventName,\n stateMachineEventName,\n },\n /* c8 ignore next */\n e instanceof Error ? e : new Error(String(e)),\n ),\n )\n })\n } else {\n object[`on${objectEventName}`] = async (...args: any[]) => {\n return this.fireEvent(stateMachineEventName, object, ...args).catch(\n (e) =>\n this.logger.error(\n 'Error firing event',\n {\n objectEventName,\n stateMachineEventName,\n },\n /* c8 ignore next */\n e instanceof Error ? e : new Error(String(e)),\n ),\n )\n }\n }\n }\n }\n }\n\n // Методы для работы с состоянием\n public async saveState(adapter?: StatePersistenceAdapter) {\n const targetAdapter = adapter || this.persistenceAdapter\n if (!targetAdapter) {\n return\n }\n\n const currentState = this.getCurrentState() ?? ''\n const history = Object.fromEntries(this.historyMap)\n const stateData = {\n currentState,\n history,\n stateEntryTimes: Object.fromEntries(this.stateEntryTimes),\n }\n\n await targetAdapter.save(stateData)\n }\n\n public async restoreState(adapter?: StatePersistenceAdapter): Promise<void> {\n const targetAdapter = adapter || this.persistenceAdapter\n if (!targetAdapter) {\n return\n }\n\n const result = await targetAdapter.restore()\n this.validateCompositeState(result.currentState)\n this.historyMap = new Map(Object.entries(result.history))\n if (result.stateEntryTimes) {\n this.stateEntryTimes = new Map(Object.entries(result.stateEntryTimes))\n }\n this.setCurrentState(result.currentState)\n this.resumeTimers()\n }\n\n // Статические методы\n public static fromData<\n TOwner extends object,\n SMConfig extends StateMachineConfig<TOwner>,\n >(\n config: SMConfig,\n initialState?: string,\n context?: TOwner,\n options?: StateMachineOptions, // ⬅️ Добавляем опции\n ): StateMachine<TOwner, SMConfig> {\n const sm = new StateMachine<TOwner, SMConfig>(config, context, options)\n\n if (sm.adaptee) {\n sm.setCurrentState(initialState || (config.initialState as string))\n }\n\n return sm\n }\n\n public static fromJSON<\n TOwner extends object,\n SMConfig extends StateMachineConfig<TOwner>,\n >(\n jsonData: string,\n obj?: TOwner | Adapter<TOwner>,\n options?: StateMachineOptions,\n ): StateMachine<TOwner, SMConfig> {\n const parsedData = JSON.parse(jsonData)\n const { config, currentState, historyMap, stateEntryTimes } = parsedData\n\n const deserializedStates = StateMachine.deserializeStates<TOwner>(\n config.states,\n )\n const deserializedEvents = StateMachine.deserializeEvents<TOwner>(\n config.events,\n )\n\n const smConfig: StateMachineConfig<TOwner> = {\n name: 'DeserializedStateMachine',\n initialState: config.initialState,\n stateAttribute: config.stateAttribute,\n states: deserializedStates,\n events: deserializedEvents,\n onError: StateMachine.deserializeAction(config.onError) as KeysOf<\n TOwner,\n ErrorHandler<TOwner>\n >,\n }\n\n const sm = new StateMachine<TOwner, StateMachineConfig<TOwner>>(\n smConfig as SMConfig,\n obj as any,\n options,\n )\n\n sm.historyMap = new Map(historyMap)\n if (stateEntryTimes) {\n sm.stateEntryTimes = new Map(stateEntryTimes)\n }\n if (sm.adaptee && currentState) {\n sm.setCurrentState(currentState)\n sm.resumeTimers()\n }\n\n return sm\n }\n\n /**\n * Securely deserializes a StateMachine from JSON string (Async).\n * Verifies cryptographic hashes of serialized functions.\n */\n public static async fromSecureJSON<\n TOwner extends object,\n SMConfig extends StateMachineConfig<TOwner>,\n >(\n jsonData: string,\n obj?: TOwner | Adapter<TOwner>,\n options?: StateMachineOptions,\n ): Promise<StateMachine<TOwner, SMConfig>> {\n const parsedData = JSON.parse(jsonData)\n const { config, currentState, historyMap, stateEntryTimes } = parsedData\n\n // Async deserialization of states and events\n const deserializedStates =\n await StateMachine.deserializeStatesAsync<TOwner>(config.states)\n const deserializedEvents =\n await StateMachine.deserializeEventsAsync<TOwner>(config.events)\n\n const smConfig: StateMachineConfig<TOwner> = {\n name: 'DeserializedStateMachine',\n initialState: config.initialState,\n stateAttribute: config.stateAttribute,\n states: deserializedStates,\n events: deserializedEvents,\n onError: (await StateMachine.deserializeActionAsync(\n config.onError,\n )) as KeysOf<TOwner, ErrorHandler<TOwner>>,\n }\n\n const sm = new StateMachine<TOwner, StateMachineConfig<TOwner>>(\n smConfig as SMConfig,\n obj as any,\n options,\n )\n\n sm.historyMap = new Map(historyMap)\n if (stateEntryTimes) {\n sm.stateEntryTimes = new Map(stateEntryTimes)\n }\n if (sm.adaptee && currentState) {\n sm.setCurrentState(currentState)\n sm.resumeTimers()\n }\n\n return sm\n }\n\n /**\n * Deserialize states configuration (Async)\n */\n private static async deserializeStatesAsync<TOwner extends object>(\n statesConfig: any,\n ): Promise<States<TOwner>> {\n const result: States<TOwner> = {}\n for (const [name, stateData] of Object.entries(statesConfig) as [\n string,\n any,\n ][]) {\n const deserializedState = {\n ...stateData,\n onBeforeEnter: await StateMachine.deserializeActionAsync(\n stateData.onBeforeEnter,\n ),\n onEnter: await StateMachine.deserializeActionAsync(stateData.onEnter),\n onAfterEnter: await StateMachine.deserializeActionAsync(\n stateData.onAfterEnter,\n ),\n onBeforeExit: await StateMachine.deserializeActionAsync(\n stateData.onBeforeExit,\n ),\n onExit: await StateMachine.deserializeActionAsync(stateData.onExit),\n onAfterExit: await StateMachine.deserializeActionAsync(\n stateData.onAfterExit,\n ),\n onError: await StateMachine.deserializeActionAsync(stateData.onError),\n }\n\n if (stateData.invoke && Array.isArray(stateData.invoke)) {\n deserializedState.invoke = await Promise.all(\n stateData.invoke.map(async (inv: any) => ({\n ...inv,\n cond: await StateMachine.deserializeActionAsync(inv.cond),\n action: await StateMachine.deserializeActionAsync(inv.action),\n })),\n )\n }\n\n result[name] = deserializedState\n }\n return result\n }\n\n /**\n * Deserialize states configuration\n */\n private static deserializeStates<TOwner extends object>(\n statesConfig: any,\n ): States<TOwner> {\n return Object.entries(statesConfig).reduce(\n (acc, [name, stateData]: [string, any]) => {\n const deserializedState = {\n ...stateData,\n onBeforeEnter: StateMachine.deserializeAction(\n stateData.onBeforeEnter,\n ),\n onEnter: StateMachine.deserializeAction(stateData.onEnter),\n onAfterEnter: StateMachine.deserializeAction(stateData.onAfterEnter),\n onBeforeExit: StateMachine.deserializeAction(stateData.onBeforeExit),\n onExit: StateMachine.deserializeAction(stateData.onExit),\n onAfterExit: StateMachine.deserializeAction(stateData.onAfterExit),\n onError: StateMachine.deserializeAction(stateData.onError),\n }\n\n if (stateData.invoke && Array.isArray(stateData.invoke)) {\n deserializedState.invoke = stateData.invoke.map((inv: any) => ({\n ...inv,\n cond: StateMachine.deserializeAction(inv.cond),\n action: StateMachine.deserializeAction(inv.action),\n }))\n }\n\n acc[name] = deserializedState\n return acc\n },\n {} as States<TOwner>,\n )\n }\n\n /**\n * Deserialize events configuration (Async)\n */\n private static async deserializeEventsAsync<TOwner extends object>(\n eventsConfig: any,\n ): Promise<Events<TOwner, States<TOwner>>> {\n const result: Events<TOwner, States<TOwner>> = {}\n for (const [name, eventData] of Object.entries(eventsConfig) as [\n string,\n any,\n ][]) {\n result[name] = {\n ...eventData,\n onBefore: await StateMachine.deserializeActionAsync(eventData.onBefore),\n onAfter: await StateMachine.deserializeActionAsync(eventData.onAfter),\n onSuccess: await StateMachine.deserializeActionAsync(\n eventData.onSuccess,\n ),\n onError: await StateMachine.deserializeActionAsync(eventData.onError),\n transitions: await Promise.all(\n eventData.transitions.map((transitionData: any) =>\n StateMachine.deserializeTransitionAsync(transitionData),\n ),\n ),\n }\n }\n return result\n }\n\n /**\n * Deserialize events configuration\n */\n private static deserializeEvents<TOwner extends object>(\n eventsConfig: any,\n ): Events<TOwner, States<TOwner>> {\n return Object.entries(eventsConfig).reduce(\n (acc, [name, eventData]: [string, any]) => {\n acc[name] = {\n ...eventData,\n onBefore: StateMachine.deserializeAction(eventData.onBefore),\n onAfter: StateMachine.deserializeAction(eventData.onAfter),\n onSuccess: StateMachine.deserializeAction(eventData.onSuccess),\n onError: StateMachine.deserializeAction(eventData.onError),\n transitions: eventData.transitions.map((transitionData: any) =>\n StateMachine.deserializeTransition(transitionData),\n ),\n }\n return acc\n },\n {} as Events<TOwner, States<TOwner>>,\n )\n }\n\n /**\n * Deserialize transition configuration (Async)\n */\n private static async deserializeTransitionAsync(\n transitionData: any,\n ): Promise<any> {\n return {\n ...transitionData,\n guard: await StateMachine.deserializeActionAsync(transitionData.guard),\n // Support 'action' alias for 'onTransition'\n onTransition: await StateMachine.deserializeActionAsync(\n transitionData.onTransition || transitionData.action,\n ),\n onError: await StateMachine.deserializeActionAsync(\n transitionData.onError,\n ),\n }\n }\n\n /**\n * Deserialize transition configuration\n */\n private static deserializeTransition(transitionData: any): any {\n return {\n ...transitionData,\n guard: StateMachine.deserializeAction(transitionData.guard),\n // Support 'action' alias for 'onTransition' for compatibility\n onTransition: StateMachine.deserializeAction(\n transitionData.onTransition || transitionData.action\n ),\n onError: StateMachine.deserializeAction(transitionData.onError),\n }\n }\n\n /**\n * Static method for deserializing actions (Async)\n */\n private static async deserializeActionAsync(action: any): Promise<any> {\n if (!action) return action\n\n if (typeof action === 'object' && action.type === 'function') {\n return safeFunctionSerializer.deserializeActionAsync(action)\n }\n\n return StateMachine.deserializeAction(action)\n }\n\n /**\n * Static method for deserializing actions (now using safe deserializer)\n */\n private static deserializeAction(action: any): any {\n if (!action) return action\n\n // 1. Modern secure format with type and hash validation\n if (typeof action === 'object' && action.type === 'function') {\n return safeFunctionSerializer.deserializeAction(action)\n }\n\n // 2. Legacy string format (function or arrow function)\n if (typeof action === 'string') {\n const trimmed = action.trim()\n\n // Check if it looks like function code (not just a function name)\n if (\n trimmed.startsWith('function') ||\n trimmed.startsWith('(') ||\n trimmed.includes('=>')\n ) {\n // Use secure deserializer for legacy strings\n const safeFn = safeFunctionSerializer.deserializeLegacyString(action)\n if (safeFn) {\n return safeFn\n }\n // If validation failed, return undefined to prevent execution\n return undefined\n }\n }\n\n // 3. Action name reference (regular string like 'onEnter')\n return action\n }\n\n public static fromJSONWithContext<\n TOwner extends object,\n SMConfig extends StateMachineConfig<TOwner>,\n >(\n jsonData: string,\n context?: MethodsOf<TOwner>,\n options?: StateMachineOptions, // ⬅️ Добавляем опции\n ): StateMachine<TOwner, SMConfig> {\n const sm = StateMachine.fromJSON<TOwner, SMConfig>(\n jsonData,\n undefined,\n options,\n )\n if (context !== undefined) {\n sm.setContext(context)\n }\n return sm\n }\n\n // Приватные методы\n private setCurrentState(\n state: StateName,\n obj?: Adapter<PropertiesOf<TOwner>>,\n ) {\n const adaptee = obj || this.adaptee\n const stateConfig = this.states.get(state)\n\n if (\n stateConfig?.history &&\n stateConfig.history !== 'deep' &&\n stateConfig.regions\n ) {\n const historyState = this.historyMap.get(state)\n if (historyState && adaptee) {\n const currentState = this.getCurrentState(adaptee) ?? ''\n const newCompositeState = this.updatePartialState(\n currentState,\n state,\n historyState,\n )\n adaptee.set(\n this.stateAttribute,\n newCompositeState as TOwner[KeysOf<PropertiesOf<TOwner>, string>],\n )\n return\n }\n }\n if (stateConfig?.history === 'deep' && stateConfig.regions) {\n const historyState = this.historyMap.get(state)\n if (historyState && adaptee) {\n adaptee.set(\n this.stateAttribute,\n historyState as TOwner[KeysOf<PropertiesOf<TOwner>, string>],\n )\n return\n }\n }\n\n if (adaptee) {\n this.setCurrentStateInternal(state, adaptee)\n }\n }\n\n private setCurrentStateInternal(\n state: StateName,\n adaptee: Adapter<PropertiesOf<TOwner>>,\n ) {\n const currentState = this.getCurrentState(adaptee) || ''\n const currentStateMap = this.parseCompositeState(currentState)\n\n const newStateParts = state.split('|')\n const isRootState = newStateParts.length === 1 && !state.includes('.')\n if (isRootState) {\n currentStateMap.clear()\n currentStateMap.set(state, state)\n } else {\n for (const newStatePart of newStateParts) {\n if (!this.states.has(newStatePart)) {\n throw new StateMachineError(\n `Invalid state path: ${newStatePart} in composite state: ${state} states: ${Array.from(this.states.keys()).join(',')}`,\n { state: newStatePart },\n )\n }\n\n const regionKey = this.getRegionKey(newStatePart)\n const stateConfig = this.states.get(newStatePart)\n\n for (const [existingRegionKey] of currentStateMap.entries()) {\n if (\n existingRegionKey === regionKey ||\n existingRegionKey.startsWith(regionKey + '.') ||\n regionKey.startsWith(existingRegionKey + '.')\n ) {\n currentStateMap.delete(existingRegionKey)\n }\n }\n\n if (stateConfig?.regions) {\n const initialStatesForRegions = this.getInitialStatesForRegions(\n stateConfig.regions,\n newStatePart,\n )\n const regionStates = initialStatesForRegions.split('|')\n for (const regionState of regionStates) {\n const regionKeyNested = this.getRegionKey(regionState)\n currentStateMap.set(regionKeyNested, regionState)\n }\n } else {\n currentStateMap.set(regionKey, newStatePart)\n }\n }\n\n for (const [key, value] of currentStateMap.entries()) {\n if (!value.includes('.')) {\n currentStateMap.delete(key)\n }\n }\n }\n\n const newCompositeState = Array.from(currentStateMap.values()).join('|')\n this.validateCompositeState(newCompositeState)\n adaptee.set(\n this.stateAttribute,\n newCompositeState as TOwner[KeysOf<PropertiesOf<TOwner>, string>],\n )\n }\n\n public getCurrentState(adaptee?: Adapter<PropertiesOf<TOwner>>) {\n const targetAdaptee = adaptee || this.adaptee\n if (!targetAdaptee) return\n\n const currentState = targetAdaptee.get(this.stateAttribute) as string\n if (!currentState) return ''\n\n const stateParts = currentState.split('|')\n for (const statePart of stateParts) {\n if (!this.states.has(statePart)) {\n throw new StateMachineError(\n `Invalid state path in current state: ${statePart}`,\n { state: currentState },\n )\n }\n }\n return currentState\n }\n\n private setInitialState(\n initialState: string,\n obj?: Adapter<PropertiesOf<TOwner>>,\n ) {\n const targetAdaptee = obj || this.adaptee\n if (!targetAdaptee) return\n\n const stateConfig = this.states.get(initialState)\n let initialStates: string\n if (stateConfig?.regions) {\n initialStates = this.getInitialStatesForRegions(\n stateConfig.regions,\n initialState,\n )\n } else {\n initialStates = initialState\n }\n\n this.setCurrentState(initialStates, targetAdaptee)\n\n // Trigger enter actions for initial state(s) to start timers and other logic\n const stateParts = initialStates.split('|')\n const context: ErrorContext = {\n state: initialStates,\n phase: 'enter',\n }\n\n for (const statePart of stateParts) {\n this.executeEnterActions(\n targetAdaptee as unknown as Adapter<TOwner>,\n statePart,\n [],\n context,\n ).catch((err) => {\n this.logger.error(\n 'Error in initial state enter actions',\n { state: statePart },\n err,\n )\n })\n }\n }\n\n private getInitialCompositeState(initialState: string): string {\n const stateConfig = this.states.get(initialState)\n if (stateConfig?.regions) {\n return this.getInitialStatesForRegions(stateConfig.regions, initialState)\n }\n return initialState\n }\n\n private getDirectChildren(stateName: string): string[] {\n const prefix = `${stateName}.`\n const depth = stateName.split('.').length + 1\n\n const children: string[] = []\n for (const name of this.states.keys()) {\n const nameStr = String(name)\n if (!nameStr.startsWith(prefix)) continue\n if (nameStr.split('.').length !== depth) continue\n children.push(nameStr)\n }\n return children\n }\n\n private getInitialStatesForRegions(\n regions: RegionsConfig<TOwner>,\n parentPath: string,\n ): string {\n const regionStates: string[] = []\n for (const [regionName, regionStatesConfig] of Object.entries(regions)) {\n const regionPath = `${parentPath}.${regionName}`\n const initialState =\n regionStatesConfig.initial || Object.keys(regionStatesConfig)[0]\n const fullPath = `${regionPath}.${initialState}`\n\n const stateConfig = this.states.get(fullPath)\n if (stateConfig?.regions) {\n const nestedInitialStates = this.getInitialStatesForRegions(\n stateConfig.regions,\n fullPath,\n )\n regionStates.push(...nestedInitialStates.split('|'))\n } else {\n regionStates.push(fullPath)\n }\n }\n return regionStates.join('|')\n }\n\n private validateCompositeState(compositeState: string): void {\n const stateParts = compositeState.split('|')\n const regionKeys = new Set<string>()\n for (const statePart of stateParts) {\n const regionKey = this.getRegionKey(statePart)\n if (regionKeys.has(regionKey)) {\n throw new StateMachineError(\n `Contradictory state detected: multiple states for region ${regionKey} in composite state ${compositeState}`,\n { state: compositeState },\n )\n }\n regionKeys.add(regionKey)\n }\n }\n\n private processStates(\n statesConfig: States<TOwner>,\n parentStateName?: StateName,\n ) {\n for (const [name, value] of Object.entries(statesConfig)) {\n if (name === 'initial') continue\n\n const stateName = parentStateName ? `${parentStateName}.${name}` : name\n const state: State<TOwner> = { name: stateName, ...value }\n this.states.set(stateName, state)\n\n if (value.regions) {\n this.processRegions(value.regions, stateName)\n }\n }\n }\n\n private processRegions(\n regionsConfig: RegionsConfig<TOwner>,\n parentStateName: StateName,\n ) {\n for (const [regionName, regionStatesConfig] of Object.entries(\n regionsConfig,\n )) {\n this.processStates(regionStatesConfig, `${parentStateName}.${regionName}`)\n }\n }\n\n private processError(\n adaptee: Adapter<TOwner>,\n context: ErrorContext,\n ...fallback: Array<ErrorHandlerOrString<TOwner> | undefined>\n ) {\n let handler: ErrorHandler<TOwner> = (adaptee, err) => {\n // Safely get current state, fallback to context.state if adaptee is invalid\n let currentState: string\n try {\n if (adaptee && typeof (adaptee as any).get === 'function') {\n currentState = this.getCurrentState(\n adaptee as unknown as Adapter<PropertiesOf<TOwner>>,\n ) ?? ''\n } else {\n /* c8 ignore next */\n currentState = context.state || ''\n }\n } catch {\n /* c8 ignore next */\n currentState = context.state || ''\n }\n\n const _phase = err instanceof StateMachineError\n ? (err.context.phase ?? context.phase)\n : context.phase\n const _event = err instanceof StateMachineError\n ? (err.context.event ?? context.event)\n : context.event\n const _action = err instanceof StateMachineError\n ? (err.context.action ?? context.action)\n : context.action\n const _transition = err instanceof StateMachineError\n ? (err.context.transition ?? context.transition)\n : context.transition\n const errorContext: ErrorContext = {\n state: currentState,\n ...(_phase !== undefined ? { phase: _phase } : {}),\n ...(_event !== undefined ? { event: _event } : {}),\n ...(_action !== undefined ? { action: _action } : {}),\n ...(_transition !== undefined ? { transition: _transition } : {}),\n }\n\n throw new StateMachineError(\n `Error in state machine: ${err ? (err instanceof Error ? err.message : String(err)) : 'Unknown error'}`,\n errorContext,\n (err instanceof StateMachineError\n ? err.cause\n : err instanceof Error\n ? err\n : undefined) as Error | undefined,\n )\n }\n const handlers = (fallback ?? [this.onError]).filter(Boolean)\n if (handlers.length > 0) {\n const r = handlers\n .map((action) =>\n action\n ? typeof action === 'function'\n ? action\n : (this.context &&\n ((this.context as Record<string, unknown>)[action as string] as ErrorHandler<TOwner>)) ||\n (adaptee.get(action) as ErrorHandler<TOwner>)\n : undefined,\n )\n .filter(Boolean)\n .find((t) => t)\n if (r) handler = r\n }\n return (...args: any[]) => {\n const targetAdaptee = args.length >= 2 ? args[0] : adaptee\n const error = args.length >= 2 ? args[1] : args[0]\n return handler(targetAdaptee, error)\n }\n }\n\n private async callAction<CallResult>(\n obj: Adapter<TOwner>,\n actionName: ActionOrString<TOwner, CallResult>,\n ...args: any[]\n ): Promise<CallResult | void> {\n const _callActionState = this.getCurrentState(\n obj as unknown as Adapter<PropertiesOf<TOwner>>,\n )\n const context: ErrorContext = {\n /* c8 ignore next */\n ...(_callActionState !== undefined ? { state: _callActionState } : {}),\n phase: 'action',\n action: typeof actionName === 'string' ? actionName : 'anonymous',\n }\n\n const executeAction = async (): Promise<CallResult | void> => {\n try {\n // 1. Check in Context (Dependency Injection)\n if (this.context && (this.context as Record<string, unknown>)[actionName as string]) {\n const action = (this.context as Record<string, unknown>)[actionName as string] as EventAction<\n TOwner,\n CallResult\n >\n /* c8 ignore next */\n if (typeof action === 'function') {\n const result = action(this.context as any, ...args)\n return result instanceof Promise ? await result : result\n }\n }\n\n // 2. Check if it's an inline function (Compatibility mode)\n else if (typeof actionName === 'function') {\n const result = actionName(obj, ...args)\n return result instanceof Promise ? await result : result\n }\n\n // 3. Check in Object/Adaptee (Data Context)\n else if (obj.get(actionName as any)) {\n const action = obj.get(actionName as any)\n /* c8 ignore next */\n if (typeof action === 'function') {\n const result = action(obj, ...args)\n /* c8 ignore next */\n return result instanceof Promise ? await result : result\n }\n }\n throw new StateMachineError('No action found', context)\n } catch (error) {\n if (error instanceof StateMachineError) throw error\n throw new StateMachineError(\n `Error executing action: ${error instanceof Error ? error.message : String(error)}`,\n context,\n /* c8 ignore next */\n error instanceof Error ? error : undefined,\n )\n }\n }\n\n // Apply timeout if configured\n if (this.transitionTimeout && this.transitionTimeout > 0) {\n return Promise.race([\n executeAction(),\n new Promise<never>((_, reject) =>\n setTimeout(\n () => reject(new StateMachineError('Transition timeout', {\n /* c8 ignore next */\n action: typeof actionName === 'string' ? actionName : 'anonymous',\n phase: 'action'\n })),\n this.transitionTimeout\n )\n )\n ])\n }\n\n return executeAction()\n }\n\n private async getAllowedTransitions(\n obj: Adapter<PropertiesOf<TOwner>>,\n transitions: Array<Transition<TOwner, SMConfig['states']>>,\n ...args: unknown[]\n ) {\n let highestPriority = Number.NEGATIVE_INFINITY\n let selectedTransition: Transition<TOwner, SMConfig['states']> | undefined\n\n for (const transition of transitions) {\n if ((transition.priority ?? Number.NEGATIVE_INFINITY) < highestPriority) {\n continue\n }\n\n const _guardState = this.getCurrentState(obj)\n const context: ErrorContext = {\n /* c8 ignore next */\n ...(_guardState !== undefined ? { state: _guardState } : {}),\n phase: 'guard',\n transition: `${transition.from} -> ${transition.to}`,\n }\n\n const guardResult = transition.guard\n ? await this.callAction(obj as any, transition.guard, ...args).catch(\n this.processError(\n obj as any,\n context,\n transition.onError,\n this.onError,\n ),\n )\n : true\n if (!guardResult) {\n continue\n }\n\n highestPriority = transition.priority ?? Number.NEGATIVE_INFINITY\n selectedTransition = transition\n }\n\n return selectedTransition\n }\n\n private isTransitionPossible(\n transition: Transition<TOwner, SMConfig['states']>,\n currentState: string,\n ): boolean {\n const currentStates = this.parseCompositeState(currentState)\n\n // Handle wildcard transition\n if (transition.from === '*') {\n return true\n }\n\n const fromStates = transition.from.split('|')\n\n return fromStates.every((fromState) => {\n // Handle wildcard in parallel state part (e.g. \"lobby|*\")\n if (fromState === '*') return true\n\n const regionKey = this.getRegionKey(fromState)\n const currentStateForRegion = currentStates.get(regionKey)\n if (!currentStateForRegion) return false\n\n return (\n currentStateForRegion === fromState ||\n this.isParentState(currentStateForRegion, fromState)\n )\n })\n }\n\n private isParentState(parentState: string, childState: string): boolean {\n return (\n childState.startsWith(parentState + '.') || childState === parentState\n )\n }\n\n private async applyTransition(\n obj: Adapter<TOwner>,\n currentState: string,\n transition: Transition<TOwner, SMConfig['states']>,\n args: any[],\n eventName: keyof SMConfig['events'],\n event: Event<TOwner, SMConfig['states']>,\n ): Promise<State<TOwner> | undefined> {\n const context: ErrorContext = {\n state: currentState,\n event: String(eventName),\n transition: `${transition.from} -> ${transition.to}`,\n phase: 'transition',\n }\n\n const targetState = transition.to === '*' ? currentState : transition.to\n this._isTransitioning = true\n this._targetState = targetState as string\n\n try {\n // Phase 1: Guard validation\n if (transition.guard) {\n const allow = await this.callAction(obj, transition.guard, ...args).catch(\n this.processError(\n obj,\n { ...context, phase: 'guard' },\n transition.onError,\n this.onError,\n ),\n )\n /* c8 ignore next */\n if (!allow) {\n /* c8 ignore next */\n return undefined\n }\n }\n\n // Phase 2: Before event action\n if (event.onBefore) {\n await this.callAction(obj, event.onBefore, ...args).catch(\n this.processError(\n obj,\n { ...context },\n transition.onError,\n this.onError,\n ),\n )\n }\n\n // Phase 3: Exit actions\n try {\n await this.executeExitActions(obj, transition.from, args, context)\n } catch (error) {\n if (this.abortOnExitError) {\n this.logger.warn('Transition aborted due to onExit error', { state: currentState, error })\n return undefined // Stay in source state\n }\n throw error // Propagate error (likely stopping transition but potentially leaving inconsistent state if not handled by caller)\n }\n\n // Phase 4: History management\n this.manageStateHistory(transition.from, currentState, obj)\n\n // Phase 5: Transition action\n if (transition.onTransition) {\n await this.callAction(obj, transition.onTransition, ...args).catch(\n this.processError(\n obj,\n { ...context },\n transition.onError,\n this.onError,\n ),\n )\n }\n\n // Phase 6: Enter actions\n try {\n await this.executeEnterActions(obj, transition.to, args, context)\n } catch (error) {\n // ZOMBIE STATE PREVENTION\n if (this.errorState) {\n this.logger.error(`Failed to enter state '${targetState}'. Fallback to error state '${this.errorState}'`, { error })\n const newState = this.updateState(currentState, this.errorState)\n this.setCurrentState(newState, obj as any)\n return this.states.get(this.errorState)\n }\n throw error\n }\n\n // Phase 7: After event action\n if (event.onAfter) {\n try {\n await this.callAction(obj, event.onAfter, ...args)\n } catch (error) {\n const errorHandler = this.processError(\n obj,\n { ...context },\n event.onError,\n this.onError,\n )\n errorHandler(obj as any, error)\n }\n }\n\n // Phase 8: State update\n const transitionStartTime = Date.now()\n const newState = this.updateState(currentState, targetState)\n this.setCurrentState(newState, obj as any)\n\n // Record successful transition\n const transitionTime = Date.now() - transitionStartTime\n this.monitor.recordTransition(transitionTime, true)\n\n return this.states.get(targetState)\n } finally {\n this._isTransitioning = false\n this._targetState = undefined\n }\n }\n\n /**\n * Execute exit actions for a state\n */\n private async executeExitActions(\n obj: Adapter<TOwner>,\n fromStateName: string,\n args: any[],\n context: ErrorContext,\n ): Promise<void> {\n const fromState = this.states.get(fromStateName)\n\n // Clear timers when exiting the state\n if (this.activeTimers.has(fromStateName)) {\n const timers = this.activeTimers.get(fromStateName) || []\n for (const timerId of timers) {\n this.clearTimer(timerId)\n }\n this.activeTimers.delete(fromStateName)\n }\n\n // Clear entry time\n this.stateEntryTimes.delete(fromStateName)\n\n if (!fromState) return\n\n const exitContext = { ...context, phase: 'exit' as const }\n\n // Execute exit actions in sequence\n const exitActions = [\n fromState.onBeforeExit,\n fromState.onExit,\n fromState.onAfterExit,\n ]\n\n for (const action of exitActions) {\n if (action) {\n await this.callAction(obj, action, ...args).catch(\n this.processError(obj, exitContext, fromState.onError, this.onError),\n )\n }\n }\n }\n\n /**\n * Execute enter actions for a state\n */\n private async executeEnterActions(\n obj: Adapter<TOwner>,\n toStateName: string,\n args: any[],\n context: ErrorContext,\n ): Promise<void> {\n const toState = this.states.get(toStateName)\n if (!toState) return\n\n const enterContext = { ...context, phase: 'enter' as const }\n\n // Execute enter actions in sequence\n const enterActions = [\n toState.onBeforeEnter,\n toState.onEnter,\n toState.onAfterEnter,\n ]\n\n for (const action of enterActions) {\n if (action) {\n await this.callAction(obj, action, ...args).catch(\n this.processError(obj, enterContext, toState.onError, this.onError),\n )\n }\n }\n\n // Handle time-based transitions (invoke)\n if (toState.invoke && toState.invoke.length > 0) {\n // Record entry time if not already recorded (e.g. from resumeTimers)\n if (!this.stateEntryTimes.has(toStateName)) {\n this.stateEntryTimes.set(toStateName, Date.now())\n }\n\n const timers: any[] = []\n for (const invocation of toState.invoke) {\n // Check condition (cond) before starting the timer\n if (invocation.cond) {\n try {\n const shouldInvoke = invocation.cond(obj.adaptee)\n if (!shouldInvoke) continue\n } catch (e) {\n this.logger.error(\n 'Error in invoke condition',\n { state: toStateName },\n e as Error,\n )\n continue\n }\n }\n\n const callback = async () => {\n const currentState = this.getCurrentState(obj as any)\n if (currentState?.split('|').includes(toStateName)) {\n try {\n if (invocation.action) {\n await this.callAction(obj, invocation.action)\n }\n this.raiseEvent(invocation.event as string, obj as any)\n this.scheduleProcessing()\n } catch (err) {\n this.logger.error(\n 'Invocation error',\n { state: toStateName, event: invocation.event },\n err as Error,\n )\n }\n }\n }\n\n const timerId = this.setTimer(callback, invocation.delay)\n timers.push(timerId)\n }\n this.activeTimers.set(toStateName, timers)\n }\n }\n\n /**\n * Helper to set timer (native or scheduled)\n */\n private setTimer(callback: () => void, delay: number): any {\n // If scheduler is running (lazy mode enabled), use it.\n // Otherwise fallback to native setTimeout for standard behavior.\n const scheduler = this.scheduler\n if (scheduler.isActive()) {\n return scheduler.schedule(delay, callback)\n }\n return setTimeout(callback, delay)\n }\n\n /**\n * Helper to clear timer\n */\n private clearTimer(timerId: any): void {\n const scheduler = this.scheduler\n // We can try to cancel in scheduler even if inactive (it handles untracked tokens gracefully)\n // But to be safe and correct with types:\n // Note: TimerToken is object, setTimeout returns Timeout (Node) or number (Browser).\n // We check if it looks like our token (simple object) or native handle.\n if (\n scheduler.isActive() &&\n typeof timerId === 'object' &&\n timerId !== null &&\n !('ref' in timerId)\n ) {\n scheduler.cancel(timerId)\n } else {\n clearTimeout(timerId)\n }\n }\n\n /**\n * Manage state history for transitions\n */\n private manageStateHistory(\n fromStateName: string,\n currentState: string,\n obj: Adapter<TOwner>,\n ): void {\n const fromState = this.states.get(fromStateName)\n\n // Handle state history\n if (fromState?.history) {\n if (fromState.history === 'deep') {\n this.historyMap.set(fromState.name, currentState)\n } else if (fromState.history === 'shallow' && fromState.regions) {\n this.historyMap.set(fromState.name, this.getCurrentState(obj as any) ?? '')\n }\n }\n\n // Handle parent state history\n const fromStateParent = this.findParentStateWithHistory(fromStateName)\n if (fromStateParent?.history) {\n this.historyMap.set(fromStateParent.name, currentState)\n }\n }\n\n private findParentStateWithHistory(\n stateName: string,\n ): State<TOwner> | undefined {\n let current = stateName\n while (current.includes('.')) {\n current = current.split('.').slice(0, -1).join('.')\n const state = this.states.get(current)\n if (state?.history) return state\n }\n return undefined\n }\n\n private updatePartialState(\n currentState: string,\n parentState: StateName,\n newSubstate: string,\n ): string {\n if (!currentState) return newSubstate\n\n const currentParts = currentState.split('|')\n const regionKey = parentState.split('.').slice(0, -1).join('.')\n\n let updatedParts = currentParts\n .map((part) => {\n const partRegionKey = this.getRegionKey(part)\n if (partRegionKey === regionKey) {\n return newSubstate\n }\n if (partRegionKey.startsWith(`${regionKey}.`)) {\n return null\n }\n return part\n })\n .filter((m): m is string => m !== null && m !== undefined)\n\n if (!updatedParts.some((part) => this.getRegionKey(part) === regionKey)) {\n const regionState = this.states.get(newSubstate)\n if (regionState?.regions) {\n return currentState\n } else {\n updatedParts.push(newSubstate)\n }\n }\n\n updatedParts = updatedParts.filter((part) => part !== null) as string[]\n\n const newCompositeState = updatedParts.join('|')\n this.validateCompositeState(newCompositeState)\n\n return newCompositeState\n }\n\n private updateState(currentState: string, toState: string): string {\n const currentStateMap = this.parseCompositeState(currentState)\n const toStateParts = toState.split('|')\n\n // Handle simple root state transition\n if (toStateParts.length === 1 && !toState.includes('.')) {\n currentStateMap.clear()\n currentStateMap.set(toState, toState)\n return toState\n }\n\n // Handle complex state transitions with regions\n for (const toStatePart of toStateParts) {\n const regionKey = this.getRegionKey(toStatePart)\n const stateConfig = this.states.get(toStatePart)\n\n // Remove conflicting states efficiently\n this.removeConflictingStates(currentStateMap, regionKey)\n\n // Add new state or region states\n if (stateConfig?.regions) {\n this.addRegionStates(currentStateMap, stateConfig, toStatePart)\n } else {\n currentStateMap.set(regionKey, toStatePart)\n }\n }\n\n // Clean up root states\n this.cleanupRootStates(currentStateMap)\n\n const newCompositeState = Array.from(currentStateMap.values()).join('|')\n this.validateCompositeState(newCompositeState)\n return newCompositeState\n }\n\n /**\n * Remove conflicting states from the state map\n */\n private removeConflictingStates(\n currentStateMap: Map<string, string>,\n regionKey: string,\n ): void {\n const keysToDelete: string[] = []\n\n for (const [key, value] of currentStateMap.entries()) {\n const existingRegionKey = this.getRegionKey(value)\n if (\n existingRegionKey === regionKey ||\n existingRegionKey.startsWith(`${regionKey}.`)\n ) {\n keysToDelete.push(key)\n }\n }\n\n // Batch delete for better performance\n for (const key of keysToDelete) {\n currentStateMap.delete(key)\n }\n }\n\n /**\n * Add region states to the state map\n */\n private addRegionStates(\n currentStateMap: Map<string, string>,\n stateConfig: State<TOwner>,\n toStatePart: string,\n ): void {\n const initialStatesForRegions = this.getInitialStatesForRegions(\n stateConfig.regions!,\n toStatePart,\n )\n const regionStates = initialStatesForRegions.split('|')\n\n for (const regionState of regionStates) {\n const regionKeyNested = this.getRegionKey(regionState)\n currentStateMap.set(regionKeyNested, regionState)\n }\n }\n\n /**\n * Clean up root states from the state map\n */\n private cleanupRootStates(currentStateMap: Map<string, string>): void {\n const keysToDelete: string[] = []\n\n for (const [key, value] of currentStateMap.entries()) {\n if (!value.includes('.')) {\n keysToDelete.push(key)\n }\n }\n\n // Batch delete for better performance\n for (const key of keysToDelete) {\n currentStateMap.delete(key)\n }\n }\n\n private parseCompositeState(compositeState: string): Map<string, string> {\n const stateMap = new Map<string, string>()\n if (!compositeState) return stateMap\n\n // Optimized parsing with single split operation\n const stateParts = compositeState.split('|')\n for (let i = 0; i < stateParts.length; i++) {\n const statePart = stateParts[i]\n /* c8 ignore next */ if (statePart === undefined) continue\n const regionKey = this.getRegionKey(statePart)\n stateMap.set(regionKey, statePart)\n }\n return stateMap\n }\n\n private getRegionKey(statePath: string): string {\n // Optimized with lastIndexOf for better performance\n const lastDotIndex = statePath.lastIndexOf('.')\n return lastDotIndex === -1\n ? statePath\n : statePath.substring(0, lastDotIndex)\n }\n\n private resumeTimers() {\n // Clear any existing active timers first\n for (const timers of this.activeTimers.values()) {\n for (const id of timers) {\n this.clearTimer(id)\n }\n }\n this.activeTimers.clear()\n\n const currentState = this.getCurrentState()\n if (!currentState) return\n\n const activeStates = currentState.split('|')\n const activeStatesSet = new Set(activeStates)\n\n // GC: Remove times for inactive states to prevent memory leaks in stateEntryTimes\n for (const stateName of this.stateEntryTimes.keys()) {\n if (!activeStatesSet.has(stateName)) {\n this.stateEntryTimes.delete(stateName)\n }\n }\n\n const now = Date.now()\n\n for (const stateName of activeStates) {\n const state = this.states.get(stateName)\n if (!state || !state.invoke || state.invoke.length === 0) continue\n\n const entryTime = this.stateEntryTimes.get(stateName)\n // If no entry time recorded, assume just entered (fallback for old data)\n const startTime = entryTime || now\n if (!entryTime) {\n this.stateEntryTimes.set(stateName, startTime)\n }\n\n const elapsed = now - startTime\n const timers: any[] = []\n\n for (const invocation of state.invoke) {\n const remaining = Math.max(0, invocation.delay - elapsed)\n\n // If time already passed, fire immediately (in next tick)\n const callback = async () => {\n // Verify we are still in this state\n const current = this.getCurrentState(this.adaptee)\n if (current?.split('|').includes(stateName)) {\n try {\n // Check condition (cond) at execution time, not at setup time\n if (invocation.cond && this.adaptee) {\n try {\n if (!invocation.cond(this.adaptee.adaptee as any)) return\n } catch (_e) {\n return\n }\n }\n\n if (invocation.action && this.adaptee) {\n await this.callAction(this.adaptee as any, invocation.action)\n }\n await this.fireEvent(invocation.event as any).catch((err) => {\n this.logger.error(\n 'Resumed timer transition error',\n { state: stateName, event: invocation.event },\n err,\n )\n })\n } catch (_err) {\n /* log */\n }\n }\n }\n\n const timerId = this.setTimer(callback, remaining)\n timers.push(timerId)\n }\n this.activeTimers.set(stateName, timers)\n }\n }\n\n // Методы сериализации\n public toJSON(): string {\n // Pre-allocate objects for better performance\n const serializedStates: Record<string, any> = {}\n const serializedEvents: Record<string, any> = {}\n\n // Serialize states with optimized approach\n for (const [name, state] of this.states) {\n serializedStates[name as string] = this.serializeState(state)\n }\n\n // Serialize events with optimized approach\n for (const [name, event] of this.events) {\n serializedEvents[name as string] = this.serializeEvent(event)\n }\n\n const config = {\n initialState: this.initialState,\n stateAttribute: this.stateAttribute,\n states: serializedStates,\n events: serializedEvents,\n onError: this.serializeAction(this.onError, 'config_onError'),\n }\n\n return JSON.stringify({\n config,\n currentState: this.getCurrentState(),\n historyMap: Array.from(this.historyMap.entries()),\n stateEntryTimes: Array.from(this.stateEntryTimes.entries()),\n })\n }\n\n /**\n * Securely serializes the StateMachine to JSON (Async).\n * Generates cryptographic hashes for all functions.\n */\n public async toSecureJSON(): Promise<string> {\n const serializedStates: Record<string, any> = {}\n const serializedEvents: Record<string, any> = {}\n\n for (const [name, state] of this.states) {\n serializedStates[name as string] = await this.serializeStateAsync(state)\n }\n\n for (const [name, event] of this.events) {\n serializedEvents[name as string] = await this.serializeEventAsync(event)\n }\n\n const config = {\n initialState: this.initialState,\n stateAttribute: this.stateAttribute,\n states: serializedStates,\n events: serializedEvents,\n onError: await this.serializeActionAsync(this.onError, 'config_onError'),\n }\n\n return JSON.stringify({\n config,\n currentState: this.getCurrentState(),\n historyMap: Array.from(this.historyMap.entries()),\n stateEntryTimes: Array.from(this.stateEntryTimes.entries()),\n })\n }\n\n /**\n * Serialize state with optimized performance (Async)\n */\n private async serializeStateAsync(state: State<TOwner>): Promise<any> {\n const { name: _name, ...stateWithoutName } = state\n\n const serializedState: any = {\n ...stateWithoutName,\n onBeforeEnter: await this.serializeActionAsync(\n state.onBeforeEnter,\n 'onBeforeEnter',\n ),\n onEnter: await this.serializeActionAsync(state.onEnter, 'onEnter'),\n onAfterEnter: await this.serializeActionAsync(\n state.onAfterEnter,\n 'onAfterEnter',\n ),\n onBeforeExit: await this.serializeActionAsync(\n state.onBeforeExit,\n 'onBeforeExit',\n ),\n onExit: await this.serializeActionAsync(state.onExit, 'onExit'),\n onAfterExit: await this.serializeActionAsync(\n state.onAfterExit,\n 'onAfterExit',\n ),\n onError: await this.serializeActionAsync(state.onError, 'state_onError'),\n }\n\n if (state.invoke) {\n serializedState.invoke = await Promise.all(\n state.invoke.map(async (inv) => ({\n ...inv,\n cond: inv.cond != null\n ? await safeFunctionSerializer.serializeActionAsync(\n inv.cond,\n 'invoke_cond',\n )\n : undefined,\n action: inv.action != null\n ? await safeFunctionSerializer.serializeActionAsync(\n inv.action,\n 'invoke_action',\n )\n : undefined,\n })),\n )\n }\n\n return serializedState\n }\n\n /**\n * Serialize state with optimized performance\n */\n private serializeState(state: State<TOwner>): any {\n const { name: _name, ...stateWithoutName } = state\n\n const serializedState: any = {\n ...stateWithoutName,\n onBeforeEnter: this.serializeAction(state.onBeforeEnter, 'onBeforeEnter'),\n onEnter: this.serializeAction(state.onEnter, 'onEnter'),\n onAfterEnter: this.serializeAction(state.onAfterEnter, 'onAfterEnter'),\n onBeforeExit: this.serializeAction(state.onBeforeExit, 'onBeforeExit'),\n onExit: this.serializeAction(state.onExit, 'onExit'),\n onAfterExit: this.serializeAction(state.onAfterExit, 'onAfterExit'),\n onError: this.serializeAction(state.onError, 'state_onError'),\n }\n\n if (state.invoke) {\n serializedState.invoke = state.invoke.map((inv) => ({\n ...inv,\n cond: inv.cond != null\n ? safeFunctionSerializer.serializeAction(inv.cond, 'invoke_cond')\n : undefined,\n action: inv.action != null\n ? safeFunctionSerializer.serializeAction(inv.action, 'invoke_action')\n : undefined,\n }))\n }\n\n return serializedState\n }\n\n /**\n * Serialize event with optimized performance (Async)\n */\n private async serializeEventAsync(event: Event<TOwner, any>): Promise<any> {\n const { name: _name, ...eventWithoutName } = event\n\n return {\n ...eventWithoutName,\n onBefore: await this.serializeActionAsync(\n event.onBefore,\n 'event_onBefore',\n ),\n onAfter: await this.serializeActionAsync(event.onAfter, 'event_onAfter'),\n onSuccess: await this.serializeActionAsync(\n event.onSuccess,\n 'event_onSuccess',\n ),\n onError: await this.serializeActionAsync(event.onError, 'event_onError'),\n transitions: await Promise.all(\n event.transitions.map((t) => this.serializeTransitionAsync(t)),\n ),\n }\n }\n\n /**\n * Serialize transition (Async)\n */\n private async serializeTransitionAsync(\n transition: Transition<TOwner, any>,\n ): Promise<any> {\n return {\n ...transition,\n guard: await this.serializeActionAsync(\n transition.guard,\n 'transition_guard',\n ),\n onTransition: await this.serializeActionAsync(\n transition.onTransition,\n 'transition_onTransition',\n ),\n onError: await this.serializeActionAsync(\n transition.onError,\n 'transition_onError',\n ),\n }\n }\n\n /**\n * Serialize event with optimized performance\n */\n private serializeEvent(event: Event<TOwner, any>): any {\n const { name: _name, ...eventWithoutName } = event\n\n return {\n ...eventWithoutName,\n onBefore: this.serializeAction(event.onBefore, 'event_onBefore'),\n onAfter: this.serializeAction(event.onAfter, 'event_onAfter'),\n onSuccess: this.serializeAction(event.onSuccess, 'event_onSuccess'),\n onError: this.serializeAction(event.onError, 'event_onError'),\n transitions: event.transitions.map((transition) => ({\n ...transition,\n guard: this.serializeAction(transition.guard, 'transition_guard'),\n onTransition: this.serializeAction(\n transition.onTransition,\n 'transition_onTransition',\n ),\n onError: this.serializeAction(transition.onError, 'transition_onError'),\n })),\n }\n }\n\n private async serializeActionAsync(\n action: any,\n name: string,\n ): Promise<SafeSerializedAction | undefined> {\n if (!action) return undefined\n return safeFunctionSerializer.serializeActionAsync(action, name)\n }\n\n /**\n * Optimized action serialization using safe serializer\n */\n private serializeAction(action: any, functionName?: string): any {\n if (typeof action === 'function') {\n return safeFunctionSerializer.serializeAction(action, functionName)\n }\n return action\n }\n}\n","// src/lite.ts (INTERNAL module; the public API is exposed via src/index.ts)\n// This file holds the createMachine factory. Do NOT add subsystem re-exports here—\n// they belong in src/index.ts. Adding them here creates duplicate exports under\n// node16 moduleResolution.\n\nimport { StateMachine } from './state_machine'\nimport {\n type Adapter,\n MemoryAdapter,\n type StateMachineConfig,\n type StateMachineOptions,\n} from './types'\n\n/**\n * Public factory for @vedmalex/statemachine. DI-free; the only factory in this package.\n */\nexport function createMachine<T extends object>(\n config: StateMachineConfig<T>,\n owner?: T | Adapter<T>,\n options?: StateMachineOptions,\n): StateMachine<T, any> {\n if (owner && 'get' in owner) {\n return new StateMachine(config, owner as any, options)\n } else if (owner) {\n const adapter = new MemoryAdapter(owner)\n return new StateMachine(config, adapter as any, options)\n } else {\n return new StateMachine(config, undefined, options)\n }\n}\n","/**\n * Configuration validation module for StateMachine library\n * Validates StateMachine configurations to prevent runtime errors\n */\n\n// Removed unused imports from error_handling\nimport { stateMachineLogger } from './logger'\nimport type { Event, Events, State, StateMachineConfig, States } from './types'\n\n// Validation result types\nexport interface ValidationResult {\n isValid: boolean\n errors: ValidationError[]\n warnings: ValidationWarning[]\n}\n\nexport interface ValidationError {\n code: string\n message: string\n severity: 'error' | 'warning'\n path: string\n details?: Record<string, any>\n // ✅ НОВЫЕ ПОЛЯ\n suggestion?: string // Текстовая подсказка \"Как исправить\"\n documentationUrl?: string // Ссылка на раздел документации\n}\n\nexport interface ValidationWarning extends ValidationError {\n severity: 'warning'\n}\n\n// ✅ НОВЫЕ ИНТЕРФЕЙСЫ ДЛЯ КАСТОМНЫХ ПРАВИЛ\ninterface ValidationContext {\n addError(\n code: string,\n message: string,\n path: string,\n suggestion?: string,\n ): void\n addWarning(\n code: string,\n message: string,\n path: string,\n suggestion?: string,\n ): void\n}\n\ntype CustomRule<T extends object = any> = {\n id: string\n validate: (config: StateMachineConfig<T>, context: ValidationContext) => void\n}\n\n// Validation rules configuration\nexport interface ValidationConfig {\n strictMode: boolean\n allowEmptyStates: boolean\n allowEmptyEvents: boolean\n maxStateDepth: number\n maxStatesCount: number\n maxEventsCount: number\n requireInitialState: boolean\n validateTransitionPaths: boolean\n validateActionReferences: boolean\n customRules?: CustomRule[] // ✅ Добавлено\n}\n\nexport const DEFAULT_VALIDATION_CONFIG: ValidationConfig = {\n strictMode: false,\n allowEmptyStates: false,\n allowEmptyEvents: false,\n maxStateDepth: 10,\n maxStatesCount: 1000,\n maxEventsCount: 1000,\n requireInitialState: true,\n validateTransitionPaths: true,\n validateActionReferences: false, // Disabled by default as actions might be dynamic\n}\n\n// Configuration validator class\nexport class ConfigValidator {\n private config: ValidationConfig\n private errors: ValidationError[] = []\n private warnings: ValidationWarning[] = []\n\n constructor(config: Partial<ValidationConfig> = {}) {\n this.config = { ...DEFAULT_VALIDATION_CONFIG, ...config }\n }\n\n /**\n * Validates a complete StateMachine configuration\n */\n validate<T extends object>(\n smConfig: StateMachineConfig<T>,\n ): ValidationResult {\n this.errors = []\n this.warnings = []\n\n try {\n // Basic structure validation\n this.validateBasicStructure(smConfig)\n\n // States validation\n this.validateStates(smConfig.states, 'states')\n\n // Events validation\n this.validateEvents(smConfig.events, smConfig.states, 'events')\n\n // Initial state validation\n this.validateInitialState(smConfig)\n\n // Cross-references validation\n this.validateCrossReferences(smConfig)\n\n // Performance validation\n this.validatePerformanceConstraints(smConfig)\n\n // ✅ Запуск кастомных правил\n this.runCustomRules(smConfig)\n } catch (error) {\n const msg = error instanceof Error ? error.message : String(error)\n this.addError(\n 'VALIDATION_FAILED',\n `Validation process failed: ${msg}`,\n 'validation',\n )\n }\n\n const result: ValidationResult = {\n isValid: this.errors.length === 0,\n errors: this.errors,\n warnings: this.warnings,\n }\n\n // Log validation results\n if (!result.isValid) {\n stateMachineLogger.error('StateMachine configuration validation failed', {\n errorCount: this.errors.length,\n warningCount: this.warnings.length,\n configName: smConfig.name,\n })\n } else if (this.warnings.length > 0) {\n stateMachineLogger.warn('StateMachine configuration has warnings', {\n warningCount: this.warnings.length,\n configName: smConfig.name,\n })\n }\n\n return result\n }\n\n /**\n * Runs custom validation rules\n */\n private runCustomRules<T extends object>(\n smConfig: StateMachineConfig<T>,\n ): void {\n if (!this.config.customRules || this.config.customRules.length === 0) return\n\n const context: ValidationContext = {\n addError: (code, msg, path, sugg) =>\n this.addError(code, msg, path, undefined, sugg),\n addWarning: (code, msg, path, sugg) =>\n this.addWarning(code, msg, path, undefined, sugg),\n }\n\n for (const rule of this.config.customRules) {\n try {\n rule.validate(smConfig, context)\n } catch (e) {\n this.addError(\n 'CUSTOM_RULE_ERROR',\n `Rule ${rule.id} failed: ${e instanceof Error ? e.message : String(e)}`,\n 'root',\n )\n }\n }\n }\n\n private validateBasicStructure<T extends object>(\n smConfig: StateMachineConfig<T>,\n ): void {\n // Required fields\n if (!smConfig.name || typeof smConfig.name !== 'string') {\n this.addError(\n 'MISSING_NAME',\n 'StateMachine must have a valid name',\n 'name',\n )\n }\n\n if (\n !smConfig.stateAttribute ||\n typeof smConfig.stateAttribute !== 'string'\n ) {\n this.addError(\n 'MISSING_STATE_ATTRIBUTE',\n 'StateMachine must have a valid stateAttribute',\n 'stateAttribute',\n )\n }\n\n if (!smConfig.states || typeof smConfig.states !== 'object') {\n this.addError(\n 'MISSING_STATES',\n 'StateMachine must have states configuration',\n 'states',\n )\n return\n }\n\n if (!smConfig.events || typeof smConfig.events !== 'object') {\n this.addError(\n 'MISSING_EVENTS',\n 'StateMachine must have events configuration',\n 'events',\n )\n return\n }\n\n // Empty collections check\n if (\n !this.config.allowEmptyStates &&\n Object.keys(smConfig.states).length === 0\n ) {\n this.addError(\n 'EMPTY_STATES',\n 'StateMachine cannot have empty states collection',\n 'states',\n )\n }\n\n if (\n !this.config.allowEmptyEvents &&\n Object.keys(smConfig.events).length === 0\n ) {\n this.addError(\n 'EMPTY_EVENTS',\n 'StateMachine cannot have empty events collection',\n 'events',\n )\n }\n }\n\n private validateStates<T extends object>(\n states: States<T>,\n basePath: string,\n depth = 0,\n ): void {\n if (depth > this.config.maxStateDepth) {\n this.addError(\n 'MAX_DEPTH_EXCEEDED',\n `State nesting depth exceeds maximum of ${this.config.maxStateDepth}`,\n basePath,\n )\n return\n }\n\n for (const [stateName, stateConfig] of Object.entries(states)) {\n const statePath = `${basePath}.${stateName}`\n this.validateState(stateConfig, statePath, depth)\n }\n }\n\n private validateState<T extends object>(\n state: Omit<State<T>, 'name'>,\n path: string,\n depth: number,\n ): void {\n // State name validation\n if (!path.split('.').pop()) {\n this.addError('INVALID_STATE_NAME', 'State name cannot be empty', path)\n }\n\n // Display name validation\n if (state.display && typeof state.display !== 'string') {\n this.addWarning(\n 'INVALID_DISPLAY',\n 'State display should be a string',\n `${path}.display`,\n )\n }\n\n // Regions validation\n if (state.regions) {\n if (typeof state.regions !== 'object') {\n this.addError(\n 'INVALID_REGIONS',\n 'State regions must be an object',\n `${path}.regions`,\n )\n } else {\n for (const [regionName, regionStates] of Object.entries(\n state.regions,\n )) {\n if (!regionName) {\n this.addError(\n 'EMPTY_REGION_NAME',\n 'Region name cannot be empty',\n `${path}.regions`,\n )\n continue\n }\n\n this.validateStates(\n regionStates,\n `${path}.regions.${regionName}`,\n depth + 1,\n )\n }\n }\n }\n\n // History validation\n if (state.history && !['deep', 'shallow'].includes(state.history)) {\n this.addError(\n 'INVALID_HISTORY',\n 'State history must be \"deep\" or \"shallow\"',\n `${path}.history`,\n )\n }\n\n // Initial state validation for regions\n if (state.regions && state.initial) {\n const hasInitialState = Object.values(state.regions).some(\n (regionStates) => Object.keys(regionStates).includes(state.initial!),\n )\n if (!hasInitialState) {\n this.addError(\n 'INVALID_INITIAL_STATE',\n `Initial state \"${state.initial}\" not found in any region`,\n `${path}.initial`,\n )\n }\n }\n\n // Invoke (StateInvocation) validation\n if (state.invoke) {\n if (!Array.isArray(state.invoke)) {\n this.addError(\n 'INVALID_INVOKE',\n 'State \"invoke\" must be an array of StateInvocation',\n `${path}.invoke`,\n )\n } else {\n state.invoke.forEach((inv, index) => {\n const invPath = `${path}.invoke[${index}]`\n if (typeof inv.delay !== 'number' || inv.delay < 0) {\n this.addError(\n 'INVALID_DELAY',\n 'Delay must be a positive number',\n `${invPath}.delay`,\n )\n }\n if (!inv.event || typeof inv.event !== 'string') {\n this.addError(\n 'INVALID_EVENT_NAME',\n 'Event name must be a string',\n `${invPath}.event`,\n )\n }\n if (inv.cond && typeof inv.cond !== 'function') {\n this.addError(\n 'INVALID_COND',\n 'Condition must be a function',\n `${invPath}.cond`,\n )\n }\n })\n }\n }\n }\n\n private validateEvents<T extends object>(\n events: Events<T, States<T>>,\n states: States<T>,\n basePath: string,\n ): void {\n for (const [eventName, eventConfig] of Object.entries(events)) {\n const eventPath = `${basePath}.${eventName}`\n this.validateEvent(eventConfig, eventPath, states)\n }\n }\n\n private validateEvent<T extends object>(\n event: Omit<Event<T, States<T>>, 'name'>,\n path: string,\n states: States<T>,\n ): void {\n // Transitions validation\n if (!event.transitions || !Array.isArray(event.transitions)) {\n this.addError(\n 'MISSING_TRANSITIONS',\n 'Event must have transitions array',\n `${path}.transitions`,\n )\n return\n }\n\n if (event.transitions.length === 0) {\n this.addWarning(\n 'EMPTY_TRANSITIONS',\n 'Event has no transitions',\n `${path}.transitions`,\n )\n }\n\n // Validate each transition\n event.transitions.forEach((transition, index) => {\n this.validateTransition(\n transition,\n `${path}.transitions[${index}]`,\n states,\n )\n })\n\n // Priority validation\n const priorities = event.transitions\n .map((t) => t.priority)\n .filter((p) => p !== undefined) as number[]\n\n if (\n priorities.length > 0 &&\n priorities.length !== event.transitions.length\n ) {\n this.addWarning(\n 'MIXED_PRIORITIES',\n 'Some transitions have priority while others do not',\n `${path}.transitions`,\n )\n }\n }\n\n private validateTransition<T extends object>(\n transition: any,\n path: string,\n states: States<T>,\n ): void {\n // From state validation\n if (!transition.from || typeof transition.from !== 'string') {\n this.addError(\n 'INVALID_FROM_STATE',\n 'Transition must have a valid from state',\n `${path}.from`,\n )\n } else if (this.config.validateTransitionPaths) {\n this.validateStatePath(transition.from, states, `${path}.from`)\n }\n\n // To state validation\n if (!transition.to || typeof transition.to !== 'string') {\n this.addError(\n 'INVALID_TO_STATE',\n 'Transition must have a valid to state',\n `${path}.to`,\n )\n } else if (this.config.validateTransitionPaths) {\n this.validateStatePath(transition.to, states, `${path}.to`)\n }\n\n // Priority validation\n if (\n transition.priority !== undefined &&\n typeof transition.priority !== 'number'\n ) {\n this.addError(\n 'INVALID_PRIORITY',\n 'Transition priority must be a number',\n `${path}.priority`,\n )\n }\n\n // Self-transition warning\n if (transition.from === transition.to) {\n this.addWarning(\n 'SELF_TRANSITION',\n 'Transition from and to states are the same',\n path,\n )\n }\n }\n\n private validateStatePath<T extends object>(\n statePath: string,\n states: States<T>,\n path: string,\n ): void {\n // Handle composite states (separated by |)\n const stateParts = statePath.split('|')\n\n for (const part of stateParts) {\n if (!this.isValidStatePath(part, states)) {\n this.addError(\n 'INVALID_STATE_PATH',\n `State path \"${part}\" does not exist`,\n path,\n )\n }\n }\n }\n\n private isValidStatePath<T extends object>(\n statePath: string,\n states: States<T>,\n ): boolean {\n const parts = statePath.split('.')\n let currentStates = states\n\n for (let i = 0; i < parts.length; i++) {\n const part = parts[i]\n if (part === undefined) return false\n\n if (i === 0) {\n // Root state\n if (!currentStates[part]) {\n return false\n }\n const state = currentStates[part]\n if (parts.length === 1) {\n return true // Simple state path\n }\n if (!state.regions) {\n return false // No regions but path continues\n }\n // Continue with regions\n } else if (i === 1) {\n // Region name\n const rootStatePart = parts[0]\n if (rootStatePart === undefined) return false\n const rootState = currentStates[rootStatePart]\n if (!rootState || !rootState.regions || !rootState.regions[part]) {\n return false\n }\n currentStates = rootState.regions[part]\n } else {\n // Nested state in region\n if (!currentStates[part]) {\n return false\n }\n const state = currentStates[part]\n if (i === parts.length - 1) {\n return true // Last part\n }\n if (!state.regions) {\n return false\n }\n // Continue deeper...\n }\n }\n\n return true\n }\n\n private validateInitialState<T extends object>(\n smConfig: StateMachineConfig<T>,\n ): void {\n if (this.config.requireInitialState) {\n if (!smConfig.initialState) {\n this.addError(\n 'MISSING_INITIAL_STATE',\n 'StateMachine must have an initial state',\n 'initialState',\n )\n return\n }\n\n if (!smConfig.states[smConfig.initialState as string]) {\n this.addError(\n 'INVALID_INITIAL_STATE',\n `Initial state \"${smConfig.initialState}\" does not exist`,\n 'initialState',\n undefined,\n `Check the 'states' object. Ensure that '${smConfig.initialState}' is defined as a root state.`,\n )\n }\n }\n }\n\n private validateCrossReferences<T extends object>(\n smConfig: StateMachineConfig<T>,\n ): void {\n // Collect all state names (including nested)\n const allStateNames = new Set<string>()\n this.collectStateNames(smConfig.states, '', allStateNames)\n\n // Event names are available through Object.keys(smConfig.events)\n\n // Check for unreachable states\n const reachableStates = new Set<string>()\n if (smConfig.initialState) {\n reachableStates.add(smConfig.initialState as string)\n }\n\n // Add states reachable through transitions\n for (const event of Object.values(smConfig.events)) {\n for (const transition of event.transitions) {\n if (transition.to) {\n const toParts = transition.to.split('|')\n toParts.forEach((part) => reachableStates.add(part))\n }\n }\n }\n\n // Report unreachable states\n for (const stateName of allStateNames) {\n if (!reachableStates.has(stateName)) {\n this.addWarning(\n 'UNREACHABLE_STATE',\n `State \"${stateName}\" is not reachable`,\n `states.${stateName}`,\n )\n }\n }\n\n // Check for unused events (events with no valid transitions)\n for (const [eventName, event] of Object.entries(smConfig.events)) {\n const hasValidTransitions = event.transitions.some(\n (t) => allStateNames.has(t.from) && allStateNames.has(t.to),\n )\n if (!hasValidTransitions) {\n this.addWarning(\n 'UNUSED_EVENT',\n `Event \"${eventName}\" has no valid transitions`,\n `events.${eventName}`,\n )\n }\n }\n }\n\n private collectStateNames<T extends object>(\n states: States<T>,\n prefix: string,\n collector: Set<string>,\n ): void {\n for (const [stateName, state] of Object.entries(states)) {\n const fullName = prefix ? `${prefix}.${stateName}` : stateName\n collector.add(fullName)\n\n if (state.regions) {\n for (const [regionName, regionStates] of Object.entries(\n state.regions,\n )) {\n this.collectStateNames(\n regionStates,\n `${fullName}.${regionName}`,\n collector,\n )\n }\n }\n }\n }\n\n private validatePerformanceConstraints<T extends object>(\n smConfig: StateMachineConfig<T>,\n ): void {\n const stateCount = this.countStates(smConfig.states)\n const eventCount = Object.keys(smConfig.events).length\n\n if (stateCount > this.config.maxStatesCount) {\n this.addWarning(\n 'TOO_MANY_STATES',\n `State count (${stateCount}) exceeds recommended maximum (${this.config.maxStatesCount})`,\n 'states',\n )\n }\n\n if (eventCount > this.config.maxEventsCount) {\n this.addWarning(\n 'TOO_MANY_EVENTS',\n `Event count (${eventCount}) exceeds recommended maximum (${this.config.maxEventsCount})`,\n 'events',\n )\n }\n\n // Check for complex transition patterns\n let totalTransitions = 0\n for (const event of Object.values(smConfig.events)) {\n totalTransitions += event.transitions.length\n }\n\n if (totalTransitions > stateCount * 3) {\n this.addWarning(\n 'COMPLEX_TRANSITIONS',\n 'High transition-to-state ratio may impact performance',\n 'events',\n )\n }\n }\n\n private countStates<T extends object>(states: States<T>): number {\n let count = Object.keys(states).length\n\n for (const state of Object.values(states)) {\n if (state.regions) {\n for (const regionStates of Object.values(state.regions)) {\n count += this.countStates(regionStates)\n }\n }\n }\n\n return count\n }\n\n private addError(\n code: string,\n message: string,\n path: string,\n details?: Record<string, any>,\n suggestion?: string,\n ): void {\n this.errors.push({\n code,\n message,\n severity: 'error',\n path,\n ...(details !== undefined ? { details } : {}),\n ...(suggestion !== undefined ? { suggestion } : {}),\n })\n }\n\n private addWarning(\n code: string,\n message: string,\n path: string,\n details?: Record<string, any>,\n suggestion?: string,\n ): void {\n this.warnings.push({\n code,\n message,\n severity: 'warning',\n path,\n ...(details !== undefined ? { details } : {}),\n ...(suggestion !== undefined ? { suggestion } : {}),\n })\n }\n}\n\n// Utility functions\nexport function validateConfig<T extends object>(\n config: StateMachineConfig<T>,\n validationConfig?: Partial<ValidationConfig>,\n): ValidationResult {\n const validator = new ConfigValidator(validationConfig)\n return validator.validate(config)\n}\n\nexport function validateConfigStrict<T extends object>(\n config: StateMachineConfig<T>,\n): ValidationResult {\n return validateConfig(config, { strictMode: true })\n}\n\nexport function isValidConfig<T extends object>(\n config: StateMachineConfig<T>,\n): boolean {\n return validateConfig(config).isValid\n}\n"],"mappings":"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","names":["regions","adaptee","newState"]}
|