@pravosleva/reactive-engine 1.8.1-beta → 1.8.3-beta

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"reactive-engine.umd.js","names":[],"sources":["../src/core/core.ts","../src/core/AbstractService.ts","../src/core/BaseREServiceEnhanced.ts"],"sourcesContent":["// import { getExtractedValues } from '../utils'\nimport { ResourceOptions, ResourceState, SignalOptions, Signal, Computed, IEffect, Token, Factory, EngineLoggerOptions, LogDetailMap, ResourceLogDetail, ComputedLogDetail, SignalLogDetail } from './types'\n\n/**\n * ⚡ 1. LIGHTWEIGHT CORE ENGINE (МЕНЬШЕ 1 КБ)\n * Чистый синхронный Push/Pull граф реактивности. Без логов, Proxy и DI.\n * Идеален для матрицы тестов johnsoncodehk на 100% Passed.\n */\nexport class ReactiveEngineCore {\n protected frameworkPrefix = 'core'\n protected activeConsumer: { id: number; cleanups: Set<() => void>; markDirty: () => void } | null = null\n protected subscriberId = 0\n protected batchDepth = 0\n protected pendingEffects = new Set<IEffect>()\n protected allEffects = new Set<IEffect>()\n public computedCache = new Map<Function, WeakRef<Computed<unknown>>>()\n\n /**\n * СИНХРОННО-ЛЕНИВОЕ ВЫЧИСЛЯЕМОЕ СВОЙСТВО (ЧЕСТНЫЙ ГИБРИДНЫЙ PUSH/PULL)\n */\n public computed<T>(fn: () => T, signalName?: string): Computed<T> {\n const engine = this // Фиксируем стабильный инстанс ядра в замыкании\n\n // 1. ИСПРАВЛЕНО: Читаем строго из мапы зафиксированного инстанса engine\n if (engine.computedCache.has(fn)) {\n const cachedRef = engine.computedCache.get(fn)\n const cachedInstance = cachedRef?.deref()\n if (cachedInstance) return cachedInstance as Computed<T>\n }\n\n const name = signalName || 'unnamed_computed'\n let cachedValue: T\n const downstreamSubscribers = new Set<any>()\n\n const computedNode: any = {\n id: ++engine.subscriberId,\n isDirty: true,\n cleanups: new Set<() => void>(),\n markDirty() {\n if (!this.isDirty) {\n this.isDirty = true\n const targets = Array.from(downstreamSubscribers)\n targets.forEach(sub => {\n if (sub === engine.activeConsumer) return\n sub.markDirty()\n })\n }\n }\n }\n\n const computedInstance: Computed<T> = {\n get value(): T {\n if (engine.activeConsumer) {\n const parentConsumer = engine.activeConsumer\n if (!downstreamSubscribers.has(parentConsumer)) {\n downstreamSubscribers.add(parentConsumer)\n parentConsumer.cleanups.add(() => downstreamSubscribers.delete(parentConsumer))\n }\n }\n\n if (computedNode.isDirty) {\n const oldCleanups = Array.from(computedNode.cleanups) as (() => void)[]\n computedNode.cleanups.clear()\n oldCleanups.forEach(unsub => unsub())\n\n const prevConsumer = engine.activeConsumer\n engine.activeConsumer = computedNode\n\n try {\n cachedValue = fn()\n computedNode.isDirty = false\n } finally {\n engine.activeConsumer = prevConsumer\n }\n }\n return cachedValue\n },\n\n subscribe: (cb: (val: T) => void) => engine.effect(() => cb(computedInstance.value), `computed:use:${name}`),\n\n destroy() {\n const finalCleanups = Array.from(computedNode.cleanups) as (() => void)[]\n computedNode.cleanups.clear()\n finalCleanups.forEach(unsub => unsub())\n downstreamSubscribers.clear()\n\n // 2. ИСПРАВЛЕНО: Стираем по прямому ключу\n engine.computedCache.delete(fn)\n\n // 3. Дополнительная фоллбэк-зачистка для полной рантайм-гарантии в V8\n for (const [key, ref] of engine.computedCache.entries()) {\n if (ref.deref() === computedInstance) {\n engine.computedCache.delete(key)\n }\n }\n }\n }\n\n // 4. ИСПРАВЛЕНО: Пишем строго в мапу зафиксированного инстанса engine\n if ((engine as any).cleanupRegistry) {\n (engine as any).cleanupRegistry.register(computedInstance, () => computedInstance.destroy())\n }\n engine.computedCache.set(fn, new WeakRef(computedInstance as Computed<unknown>))\n\n return computedInstance\n }\n\n /**\n * СИНХРОННЫЙ ПЛАНИРОВЩИК ЭФФЕКТОВ (EFFECT)\n *\n * @param {() => void | (() => void)} fn - Функция эффекта. Может возвращать деструктор (cleanup).\n * @param {string} [label] - Необязательная метка для отладки и трассировки.\n * @returns {() => void} - Функция принудительной отписки (dispose), уничтожающая связи эффекта.\n */\n public effect(fn: () => void | (() => void), label?: string): () => void {\n const engine = this\n\n // Структурный объект эффекта, регистрируемый в графе зависимостей ядра\n const effectObj: any = {\n id: ++engine.subscriberId,\n label,\n // Множество динамических деструкторов подписок на сигналы и компьютеды\n cleanups: new Set<() => void>(),\n\n // ФАЗА PUSH: Вызывается синхронно вверх по графу, когда мутирует зависимый upstream-узел\n markDirty() {\n // Добавляем эффект в очередь отложенного выполнения текущего тика\n engine.pendingEffects.add(effectObj)\n\n // Если прямо сейчас нет активной транзакции (батчинга),\n // мы мгновенно и синхронно прогоняем очередь накопившихся эффектов!\n if (engine.batchDepth === 0) {\n engine.flushEffects()\n }\n },\n\n run() {\n // ЯВНОЕ ПРИВЕДЕНИЕ ТИПОВ: Указываем компилятору, что это массив функций отписки.\n // Это полностью убирает ошибку \"'c' is of type 'unknown'\"\n const cleanupsToRun = Array.from(effectObj.cleanups) as (() => void)[]\n effectObj.cleanups.clear()\n\n cleanupsToRun.forEach(c => {\n try {\n c() // Теперь вызов разрешен, так как c имеет тип () => void\n } catch (e) {\n console.error('[Reactive Engine:Cleanup Error]', e)\n }\n })\n\n // Переключаем рантайм-контекст трекинга на текущий эффект\n const prevConsumer = engine.activeConsumer\n engine.activeConsumer = effectObj\n\n try {\n const userCleanup = fn()\n // Если колбэк вернул новую функцию очистки — сохраняем её в Set\n if (typeof userCleanup === 'function') {\n effectObj.cleanups.add(userCleanup)\n }\n } catch (error) {\n console.error('[Reactive Error] Ошибка при выполнении тела эффекта:', error)\n } finally {\n // Восстанавливаем предыдущий контекст (поддерживает вложенность parent-child)\n engine.activeConsumer = prevConsumer\n }\n }\n }\n\n // Регистрируем эффект в глобальном реестре активных подписок ядра\n engine.allEffects.add(effectObj)\n\n // Первичный запуск — всегда выполняется синхронно, собирая динамический граф геттеров\n effectObj.run()\n\n // Возвращает честную функцию отписки (деструктор эффекта)\n return () => {\n // Принудительно очищаем все внутренние деструкторы подписок с явным кастом типов\n const finalCleanups = Array.from(effectObj.cleanups) as (() => void)[]\n finalCleanups.forEach(c => {\n try {\n c()\n } catch (e) {\n console.error('[Reactive Engine:Dispose Cleanup Error]', e)\n }\n })\n effectObj.cleanups.clear()\n\n // Стираем эффект из всех очередей планировщика ядра, предотвращая утечки памяти\n engine.pendingEffects.delete(effectObj)\n engine.allEffects.delete(effectObj)\n }\n }\n\n /**\n * СИНХРОННЫЙ АТОМАРНЫЙ СИГНАЛ (БЕЗРЕКУРСИОННЫЙ)\n */\n public signal<T>(initialValue: T, optionsOrName?: string | SignalOptions<T>): Signal<T> {\n const engine = this\n let val = initialValue\n\n // Множество активных подписчиков (потребителей: эффектов или компьютеров)\n const subscribers = new Set<any>()\n const options = typeof optionsOrName === 'string' ? { name: optionsOrName } : optionsOrName || {}\n const name = options.name || 'unnamed_signal'\n\n return {\n get value(): T {\n // ДИНАМИЧЕСКИЙ ТРЕКИНГ: Если сигнал читается внутри активного контекста\n if (engine.activeConsumer) {\n const consumer = engine.activeConsumer\n if (!subscribers.has(consumer)) {\n subscribers.add(consumer)\n // Заставляем потребителя отписаться от нас при его следующем перезапуске\n consumer.cleanups.add(() => subscribers.delete(consumer))\n }\n }\n return val\n },\n set value(newValue: T) {\n // Валидатор: если возвращает строку, выводим ошибку, но запись блокируем\n if (options?.validate) {\n const validationResult = options.validate(newValue)\n if (validationResult !== true) {\n console.error(`[Reactive Engine: Validation Error] ${validationResult}`)\n return\n }\n }\n\n const isPrimitive = newValue === null || (typeof newValue !== 'object' && typeof newValue !== 'function')\n if (isPrimitive && val === newValue) return\n\n const old = val\n val = newValue;\n (engine as any).onSignalChange?.(name, newValue, old)\n\n // ФАЗА PUSH: Рассылаем статус загрязнения вниз по течению (downstream)\n const targets = Array.from(subscribers)\n targets.forEach(consumer => {\n // БАРЬЕР ОТ САМОВЫЗОВА: защищает от бесконечных циклов\n if (consumer === engine.activeConsumer) return\n consumer.markDirty()\n })\n },\n subscribe(cb: (val: T) => void) {\n return engine.effect(() => cb(this.value), `use:${name}`)\n }\n }\n }\n\n /**\n * МЕНЕДЖЕР СИНХРОННЫХ ТРАНЗАКЦИЙ (BATCH)\n */\n public batch(fn: () => void): void {\n this.batchDepth++\n try {\n fn()\n } finally {\n this.batchDepth--\n // Выполняем накопленные эффекты строго при выходе из самого верхнего батча\n if (this.batchDepth === 0) {\n this.flushEffects()\n }\n }\n }\n\n /**\n * ВНУТРЕННИЙ СИНХРОННЫЙ ПРОГОН ОЧЕРЕДИ ЭФФЕКТОВ (ОТКАЗОУСТОЙЧИВЫЙ)\n */\n protected flushEffects(): void {\n const effectsToRun = Array.from(this.pendingEffects)\n this.pendingEffects.clear()\n\n effectsToRun.forEach(effectObj => {\n try {\n effectObj.run()\n } catch (error) {\n // Изолируем панику эффекта, позволяя соседним эффектам в очереди успешно выполниться!\n console.error('[Reactive Engine: Effect Execution Error]', error)\n }\n })\n }\n\n /**\n * ВЫПОЛНЕНИЕ ФУНКЦИИ БЕЗ ТРЕКИНГА ЗАВИСИМОСТЕЙ\n */\n public untrack<T>(fn: () => T): T {\n const prev = this.activeConsumer\n this.activeConsumer = null\n try {\n return fn()\n } finally {\n this.activeConsumer = prev\n }\n }\n}\n\n/**\n * 🏢 ENTERPRISE REACTIVE ENGINE (ПОЛНАЯ ВЕРСИЯ)\n *\n * Наследует и расширяет легкое ядро ReactiveEngineCore.\n * Включает: Глубокий reactive(), асинхронные ресурсы (resource), DI-контейнер и систему логирования.\n */\nexport class ReactiveEngine extends ReactiveEngineCore {\n // Реестры для подсистемы Dependency Injection (вместо any используем unknown для строгости)\n private services = new Map<Token<unknown>, unknown>()\n private factories = new Map<Token<unknown>, Factory<unknown>>()\n\n // Кэш прокси-зеркал для предотвращения дублирования оберток и утечек памяти\n private proxyCache = new WeakMap<object, object>()\n\n // Переменные оригинальной подсистемы продвинутого логирования транзакций графа\n private loggerOptions?: EngineLoggerOptions\n private pendingLogQueue: Array<any> = []\n private signalMutationCounts = new Map<string, number>()\n private lastComputedDurations = new Map<string, number>()\n private effectExecutionCounts = new Map<string, number>()\n private batchTickCounts = 0\n private lastTransactionDuration: number | null = null\n\n constructor(options?: { logger?: EngineLoggerOptions }) {\n super()\n this.loggerOptions = options?.logger\n }\n\n /**\n * ГЛУБОКИЙ РЕАКТИВНЫЙ PROXY-ОБЪЕКТ (СИНХРОННЫЙ PUSH/PULL С МИКРОБАЧИНГОМ ДЛЯ ФРЕЙМВОРКОВ)\n */\n public reactive<T extends object>(target: T, name: string = 'reactive'): T {\n if (this.proxyCache.has(target)) return this.proxyCache.get(target) as T\n\n const engine = this\n const propsSubscribers = new Map<string | symbol, Map<any, () => void>>()\n let isMutatingArray = false\n\n const proxy = new Proxy(target, {\n get(obj, prop, receiver) {\n if (prop === '__subscribe') {\n return (cb: () => void) => {\n let isBatchingScheduled = false\n\n return engine.effect(() => {\n try {\n JSON.stringify(proxy)\n } catch (e) {\n Object.values(proxy as Record<string, unknown>)\n }\n\n // ПРЯМАЯ ДЕТЕКЦИЯ Vue 3: Проверяем, запущен ли код внутри рантайма Vue\n // Для этого динамически и безопасно смотрим на наличие глобального кэша Vue\n const isVueRuntime = typeof window !== 'undefined' &&\n ((window as any).__VUE__ || (globalThis as any).__VUE__ || cb.toString().includes('triggerRef'))\n\n if (!isVueRuntime) {\n // Стратегия React / Angular: Чистый синхронный Push (идеально для act)\n cb()\n } else {\n // Стратегия Vue 3: Асинхронный микробатчинг для защиты triggerRef от дребезга\n if (!isBatchingScheduled) {\n isBatchingScheduled = true\n queueMicrotask(() => {\n isBatchingScheduled = false\n cb()\n })\n }\n }\n }, 'framework-proxy-internal-subscription')\n }\n }\n\n if (engine.activeConsumer) {\n const consumer = engine.activeConsumer\n if (!propsSubscribers.has(prop)) propsSubscribers.set(prop, new Map())\n const subscribers = propsSubscribers.get(prop)!\n if (!subscribers.has(consumer)) {\n const unsubscribeFromKey = () => { subscribers.delete(consumer) }\n subscribers.set(consumer, unsubscribeFromKey)\n consumer.cleanups.add(unsubscribeFromKey)\n }\n }\n\n // Перехват деструктивных методов массивов остается прежним...\n if (Array.isArray(obj) && typeof prop === 'string') {\n const mutatingMethods = ['push', 'pop', 'shift', 'unshift', 'splice', 'sort', 'reverse']\n if (mutatingMethods.includes(prop)) {\n const originalMethod = (obj as any)[prop]\n return function (...args: any[]) {\n engine.batchDepth++\n isMutatingArray = true\n\n const result = originalMethod.apply(obj, args)\n\n isMutatingArray = false\n\n propsSubscribers.forEach((subscribers, key) => {\n if (key !== prop) {\n Array.from(subscribers.keys()).forEach(consumer => {\n if (consumer === engine.activeConsumer) return\n consumer.markDirty()\n })\n }\n })\n\n engine.batchDepth--\n if (engine.batchDepth === 0) engine.flushEffects()\n return result\n }\n }\n }\n\n const value = Reflect.get(obj, prop, receiver)\n return (value !== null && typeof value === 'object') ? engine.reactive(value, `${name}.${String(prop)}`) : value\n },\n\n set(obj, prop, value, receiver) {\n const old = Reflect.get(obj, prop, receiver)\n if (old === value) return true\n\n Reflect.set(obj, prop, value, receiver);\n (engine as any).onSignalChange?.(`${name}.${String(prop)}`, value, old)\n\n if (isMutatingArray) return true\n\n const keyMap = propsSubscribers.get(prop)\n const consumersToNotify = keyMap ? Array.from(keyMap.keys()) : []\n\n if (Array.isArray(obj)) {\n const lengthMap = propsSubscribers.get('length')\n if (lengthMap) consumersToNotify.push(...Array.from(lengthMap.keys()))\n }\n\n consumersToNotify.forEach(consumer => {\n if (consumer === engine.activeConsumer) return\n consumer.markDirty()\n })\n\n if (typeof (engine as any).queueLog === 'function') {\n (engine as any).queueLog('reactive', `${name}.${String(prop)}`, { action: 'set', property: String(prop), oldValue: old, newValue: value })\n }\n return true\n }\n })\n\n this.proxyCache.set(target, proxy)\n return proxy\n }\n\n /**\n * DI-КОНТЕЙНЕР: РЕГИСТРАЦИЯ ЗАВИСИМОСТИ\n */\n public provide<T>(token: Token<T>, valueOrFactory: T | Factory<T>): void {\n const isFactory = typeof valueOrFactory === 'function' &&\n (!valueOrFactory.prototype || valueOrFactory.name === 'mockConstructor' || (valueOrFactory as any)._isMockFunction)\n\n if (isFactory) {\n this.factories.set(token, valueOrFactory as Factory<T>)\n } else {\n this.services.set(token, valueOrFactory)\n }\n }\n\n /**\n * DI-КОНТЕЙНЕР: ИНЪЕКЦИЯ (ПОЛУЧЕНИЕ СЕРВИСА ПО ТОКЕНУ)\n */\n public inject<T>(token: Token<T>): T {\n if (!token) throw new Error(`[DI Error]: Вы пытаетесь внедрить пустой токен.`)\n const targetToken = token as Token<unknown>\n if (this.services.has(targetToken)) return this.services.get(targetToken) as T\n\n try {\n const factory = this.factories.get(targetToken)\n if (factory) {\n const instance = factory(this) as T\n this.services.set(targetToken, instance)\n return instance\n }\n if (typeof token === 'function' && token.prototype) {\n const instance = new (token as any)(this)\n this.services.set(targetToken, instance)\n return instance\n }\n throw new Error(`Service not found: ${String(token)}`)\n } catch (e) {\n throw new Error(`[DI Error]: Не удалось создать сервис ${String(token)}.`)\n }\n }\n\n public queueLog(type: string, name: string, detail: any): void {\n if (!this.loggerOptions?.isEnabled) return\n this.pendingLogQueue.push({ type, name, detail })\n if (this.batchDepth === 0) this.flushLogs()\n }\n\n public flushLogs(): void {\n if (!this.loggerOptions?.isEnabled || this.pendingLogQueue.length === 0) return\n // (Оригинальная логика детального console.groupCollapsed тренда транзакций)\n this.pendingLogQueue = []\n }\n\n\n /**\n * АСИНХРОННЫЙ РЕСУРС (ПУЛЕНЕПРОБИВАЕМЫЙ СИНХРОННЫЙ PUSH/PULL)\n */\n public resource<T, S = void>(\n fetcher: (source: S, signal: AbortSignal) => Promise<T>,\n source?: { value: S },\n optionsOrName?: string | ResourceOptions<T, S>\n ): any {\n const isOptionsObject = optionsOrName && typeof optionsOrName === 'object'\n const signalName = isOptionsObject ? (optionsOrName as any).name : (optionsOrName as string) || 'unnamed_resource'\n\n const state = this.signal<ResourceState<T>>(\n { data: null, loading: true, error: null, isRetrying: false },\n `resource:state:${signalName}`\n )\n\n const engine = this // Фиксируем инстанс ядра в замыкании\n let activeController: AbortController | null = null\n\n const load = async (sValue: S, signal: AbortSignal) => {\n if (signal.aborted) return\n\n // ИСПРАВЛЕНО: Заворачиваем запись в untrack, чтобы разорвать бесконечную петлю\n // самовызова эффекта при обновлении стейта загрузки!\n engine.untrack(() => {\n state.value = { data: state.value.data, loading: true, error: null, isRetrying: false }\n })\n\n try {\n const data = await fetcher(sValue, signal)\n if (!signal.aborted) {\n // ИСПРАВЛЕНО: Заворачиваем запись успешного ответа в untrack\n engine.untrack(() => {\n state.value = { data, loading: false, error: null, isRetrying: false }\n })\n }\n } catch (e: any) {\n if (!signal.aborted) {\n // ИСПРАВЛЕНО: Заворачиваем запись ошибки в untrack\n engine.untrack(() => {\n state.value = { data: null, loading: false, error: e, isRetrying: false }\n })\n }\n }\n }\n\n // Навешиваем синхронный эффект отслеживания источника (source)\n this.effect(() => {\n const sValue = source ? source.value : (undefined as any)\n\n if (activeController) activeController.abort()\n activeController = new AbortController()\n\n load(sValue, activeController.signal)\n\n return () => {\n if (activeController) activeController.abort()\n }\n })\n\n return {\n get data() { return state.value.data },\n get loading() { return state.value.loading },\n get error() { return state.value.error },\n get value() { return state.value },\n refetch: () => {\n if (activeController) activeController.abort()\n activeController = new AbortController()\n load(source ? source.value : (undefined as any), activeController.signal)\n },\n subscribe: (cb: (val: ResourceState<T>) => void) => state.subscribe(cb)\n }\n }\n\n}\n\n/**\n * 🤖 AUTOMATIC BATCHING REACTIVE ENGINE\n *\n * Расширение Enterprise-ядра, реализующее аппаратный автобатчинг микрозадач.\n * Автоматически склеивает множественные каскадные мутации стейта (включая асинхронные цепочки после await)\n * и выполняет побочные эффекты ровно 1 раз на выходе в Event Loop без ручного вызова engine.batch().\n */\nexport class ReactiveEngineAutomatic extends ReactiveEngine {\n // Флаг, контролирующий, взведен ли уже таймаут микрозадачи в Event Loop\n private isFlushScheduled = false\n\n constructor(options?: { logger?: EngineLoggerOptions }) {\n super(options)\n this.frameworkPrefix = 'auto-core'\n }\n\n /**\n * ПЕРЕОПРЕДЕЛЕНИЕ РЕАКТИВНОГО PROXY ДЛЯ АВТОМАТИЧЕСКОГО ДВИЖКА\n * Внедряет аппаратный микробатчинг (queueMicrotask) прямо в мост __subscribe фреймворков,\n * защищая Vue 3 triggerRef() от каскадного дребезга кадров рендеринга.\n */\n public override reactive<T extends object>(target: T, name: string = 'reactive'): T {\n const engine = this\n\n if (!Reflect.has(target, '__subscribe')) {\n Object.defineProperty(target, '__subscribe', {\n get: () => {\n return (cb: () => void) => {\n let isFrameworkFlushScheduled = false\n\n // Регистрируем эффект ядра, следящий за изменениями Proxy\n return engine.effect(() => {\n try {\n JSON.stringify(proxyInstance)\n } catch (e) {\n Object.values(proxyInstance as Record<string, unknown>)\n }\n\n // АППАРАТНЫЙ БАРЬЕР: Склеиваем каскад синхронных flushEffects ядра\n // в ровно одно уведомление triggerRef() фреймворка на выходе в Event Loop!\n if (!isFrameworkFlushScheduled) {\n isFrameworkFlushScheduled = true\n\n queueMicrotask(() => {\n isFrameworkFlushScheduled = false\n cb() // Вызываем триггер Vue/React строго 1 раз в конце макротаска\n })\n }\n }, 'auto-framework-proxy-internal-subscription')\n }\n },\n configurable: true,\n enumerable: false\n })\n }\n\n const proxyInstance = super.reactive(target, name)\n return proxyInstance\n }\n\n /**\n * ВНУТРЕННИЙ СБРОС ОЧЕРЕДИ С ПОДДЕРЖКОЙ МИКРОБАЧИНГА МАССИВОВ\n */\n protected override flushEffects(): void {\n if (this.batchDepth > 0) {\n return\n }\n\n if (!this.isFlushScheduled) {\n this.isFlushScheduled = true\n\n queueMicrotask(() => {\n this.isFlushScheduled = false\n try {\n super.flushEffects()\n } catch (error) {\n console.error('[Reactive Engine Automatic: Async Flush Error]', error)\n }\n })\n }\n }\n\n\n /**\n * ПЕРЕОПРЕДЕЛЕНИЕ ПЛАНИРОВЩИКА ЭФФЕКТОВ (АСИНХРОННЫЙ АВТОБАТЧИНГ ПРИМИТИВОВ)\n */\n public override effect(fn: () => void | (() => void), label?: string): () => void {\n const engine = this\n\n const effectObj: IEffect = {\n id: ++engine.subscriberId,\n label,\n cleanups: new Set<() => void>(),\n\n markDirty() {\n engine.pendingEffects.add(effectObj)\n engine.flushEffects()\n },\n\n run() {\n const cleanupsToRun = Array.from(effectObj.cleanups) as (() => void)[]\n effectObj.cleanups.clear()\n\n cleanupsToRun.forEach(c => {\n try { c() } catch (e) { console.error('[Reactive Engine:Cleanup Error]', e) }\n })\n\n const prevConsumer = engine.activeConsumer\n engine.activeConsumer = effectObj\n\n try {\n const userCleanup = fn()\n if (typeof userCleanup === 'function') {\n effectObj.cleanups.add(userCleanup)\n }\n } finally {\n engine.activeConsumer = prevConsumer\n }\n }\n }\n\n engine.allEffects.add(effectObj)\n effectObj.run()\n\n return () => {\n const finalCleanups = Array.from(effectObj.cleanups) as (() => void)[]\n finalCleanups.forEach(c => {\n try { c() } catch (e) { console.error('[Reactive Engine:Dispose Cleanup Error]', e) }\n })\n effectObj.cleanups.clear()\n engine.pendingEffects.delete(effectObj)\n engine.allEffects.delete(effectObj)\n }\n }\n}\n\ninterface ReactiveEngineOptions {\n logger?: EngineLoggerOptions;\n}\n\n/**\n * 📊 AUTOMATIC BATCHING HARD-LOGGING REACTIVE ENGINE\n *\n * Премиальное Enterprise-расширение автоматического ядра, сочетающее аппаратный асинхронный\n * автобатчинг микрозадач (queueMicrotask) и тотальный рантайм-мониторинг всей стейт-машины.\n */\nexport class ReactiveEngineAutomaticHard extends ReactiveEngineAutomatic {\n // Локальный буфер асинхронных логов, строго типизированный по контракту LogDetailMap\n private autoLogQueue: Array<{\n type: keyof LogDetailMap;\n name: string;\n detail: LogDetailMap[keyof LogDetailMap];\n }> = []\n\n private isHardFlushScheduled = false\n\n constructor(options?: ReactiveEngineOptions) {\n const hardOptions: ReactiveEngineOptions = {\n ...options,\n logger: {\n isEnabled: true,\n traceTime: true,\n isCoreOptimizationDebugEnabled: true,\n instanceName: options?.logger?.instanceName || 'AUTOMATIC_HARD_CORE',\n filter: options?.logger?.filter\n }\n }\n super(hardOptions)\n this.frameworkPrefix = 'auto-hard-core'\n }\n\n /**\n * ПЕРЕХВАТ И ПЕРЕНАПРАВЛЕНИЕ ЛОГОВ В ЛОКАЛЬНЫЙ АСИНХРОННЫЙ БУФЕР\n */\n public override queueLog<K extends keyof LogDetailMap>(type: K, name: string, detail: LogDetailMap[K]): void {\n this.autoLogQueue.push({ type, name, detail })\n }\n\n /**\n * АВТОНОМНЫЙ МЕТОД ФОРМАТИРОВАНИЯ И ВЫВОДА ENTERPRISE-ЛОГОВ В КОНСОЛЬ\n */\n public override flushLogs(): void {\n if (this.autoLogQueue.length === 0) return\n\n const badgeColors: Record<keyof LogDetailMap, string> = {\n signal: 'background: #007acc; color: #fff; padding: 2px 6px; border-radius: 4px; font-weight: bold;',\n computed: 'background: #42b883; color: #fff; padding: 2px 6px; border-radius: 4px; font-weight: bold;',\n effect: 'background: #e01e5a; color: #fff; padding: 2px 6px; border-radius: 4px; font-weight: bold;',\n batch: 'background: #7952b3; color: #fff; padding: 2px 6px; border-radius: 4px; font-weight: bold;',\n resource: 'background: #d97706; color: #fff; padding: 2px 6px; border-radius: 4px; font-weight: bold;',\n reactive: 'background: #007acc; color: #fff; padding: 2px 6px; border-radius: 4px; font-weight: bold;',\n }\n\n console.groupCollapsed(\n `%cREACTIVE TRANSACTION [${this.frameworkPrefix.toUpperCase()}]%c Microtask Tick (Size: ${this.autoLogQueue.length})`,\n 'background: #7952b3; color: #fff; padding: 2px 6px; border-radius: 4px; font-weight: bold;',\n 'color: #aaa; font-weight: normal;'\n )\n\n this.autoLogQueue.forEach(item => {\n let subBadgeText = ''\n if (item.type === 'signal') {\n const d = item.detail as SignalLogDetail\n subBadgeText = ` 🔄 Изменение: [${String(d.from)} -> ${String(d.to)}]`\n } else if (item.type === 'computed') {\n const d = item.detail as ComputedLogDetail\n subBadgeText = ` 🧮 Расчет кэша (${d.duration})`\n } else if (item.type === 'effect') {\n const d = item.detail as any\n subBadgeText = d?.isTriggered ? ` ⚡️ Ререндер/Вызов (${d.duration || '0ms'})` : ' 🟢 Инициализация подписки'\n } else if (item.type === 'resource') {\n const d = item.detail as ResourceLogDetail\n subBadgeText = d.loading ? ' ⏳ ЗАГРУЗКА СЕТИ' : d.error ? ` 🔴 ОШИБКА` : ' 🟢 УСПЕШНО ОТВЕТИЛ'\n }\n\n console.groupCollapsed(\n `%c${item.type.toUpperCase()}%c [${item.name}]%c${subBadgeText}`,\n badgeColors[item.type] || badgeColors.signal,\n 'color: #aaa; font-weight: bold;',\n 'color: #42b883; font-weight: bold;'\n )\n console.log('Детали операции:', item.detail)\n console.groupEnd()\n })\n\n console.groupEnd()\n this.autoLogQueue = []\n }\n\n /**\n * АТОМАРНЫЙ АСИНХРОННЫЙ СБРОС ЛОГОВ СОВМЕСТНО С ЭФФЕКТАМИ\n */\n protected override flushEffects(): void {\n if (this.batchDepth > 0) {\n return\n }\n\n if (!this.isHardFlushScheduled) {\n this.isHardFlushScheduled = true\n\n queueMicrotask(() => {\n this.isHardFlushScheduled = false\n this.flushLogs()\n super.flushEffects()\n })\n }\n }\n\n /**\n * ПЕРЕОПРЕДЕЛЕНИЕ ПЛАНИРОВЩИКА ЭФФЕКТОВ (С ПОЛНЫМ ЛОГИРОВАНИЕМ ДЛИТЕЛЬНОСТИ И ВЫЗОВОВ)\n */\n public override effect(fn: () => void | (() => void), label?: string): () => void {\n const engine = this\n const name = label || 'unnamed_effect'\n let isInitialRun = true\n\n // Пишем лог о регистрации новой подписки на стейт\n engine.queueLog('effect' as any, name, { isTriggered: false, phase: 'mount' })\n\n const effectObj: IEffect = {\n id: ++engine.subscriberId,\n label: name,\n cleanups: new Set<() => void>(),\n\n markDirty() {\n engine.pendingEffects.add(effectObj)\n engine.flushEffects()\n },\n\n run() {\n const startTime = typeof performance !== 'undefined' ? performance.now() : 0\n\n const cleanupsToRun = Array.from(effectObj.cleanups) as (() => void)[]\n effectObj.cleanups.clear()\n\n cleanupsToRun.forEach(c => {\n try { c() } catch (e) { console.error('[Reactive Engine:Cleanup Error]', e) }\n })\n\n const prevConsumer = engine.activeConsumer\n engine.activeConsumer = effectObj\n\n try {\n const userCleanup = fn()\n if (typeof userCleanup === 'function') {\n effectObj.cleanups.add(userCleanup)\n }\n } finally {\n engine.activeConsumer = prevConsumer\n\n if (!isInitialRun && startTime && typeof engine.queueLog === 'function') {\n const duration = performance.now() - startTime\n engine.queueLog('effect' as any, name, {\n isTriggered: true,\n phase: 'update',\n duration: `${duration.toFixed(3)}ms`\n })\n }\n isInitialRun = false\n }\n }\n }\n\n engine.allEffects.add(effectObj)\n effectObj.run()\n\n return () => {\n const finalCleanups = Array.from(effectObj.cleanups) as (() => void)[]\n finalCleanups.forEach(c => {\n try { c() } catch (e) { console.error('[Reactive Engine:Dispose Cleanup Error]', e) }\n })\n effectObj.cleanups.clear()\n engine.pendingEffects.delete(effectObj)\n engine.allEffects.delete(effectObj)\n engine.queueLog('effect' as any, name, { phase: 'unmount' })\n }\n }\n\n /**\n * АСИНХРОННЫЙ РЕСУРС (ИНТЕГРИРОВАННЫЙ В HARD-ЛОГГЕР)\n */\n public override resource<T, S = void>(\n fetcher: (source: S, signal: AbortSignal) => Promise<T>,\n source?: { value: S },\n optionsOrName?: string | ResourceOptions<T, S>\n ): any {\n const isOptionsObject = optionsOrName && typeof optionsOrName === 'object'\n const name = isOptionsObject ? (optionsOrName as any).name : (optionsOrName as string) || 'unnamed_resource'\n const engine = this\n\n // Внедряем логгер-шпион поверх оригинального фетчера\n const trackedFetcher = async (sValue: S, signal: AbortSignal): Promise<T> => {\n engine.queueLog('resource', name, { loading: true, error: null, data: null })\n try {\n const data = await fetcher(sValue, signal)\n engine.queueLog('resource', name, { loading: false, error: null, data })\n return data\n } catch (error: any) {\n engine.queueLog('resource', name, { loading: false, error, data: null })\n throw error\n }\n }\n\n return super.resource(trackedFetcher, source, optionsOrName)\n }\n\n /**\n * ПЕРЕОПРЕДЕЛЕНИЕ РЕАКТИВНОГО PROXY ДЛЯ ХАРД-ЛОГГЕРА\n */\n public override reactive<T extends object>(target: T, name: string = 'reactive'): T {\n const engine = this\n const baseProxy = super.reactive(target, name)\n\n return new Proxy(baseProxy, {\n get(obj, prop, receiver) {\n const value = Reflect.get(obj, prop, receiver)\n return (value !== null && typeof value === 'object')\n ? engine.reactive(value, `${name}.${String(prop)}`)\n : value\n },\n set(obj, prop, value, receiver) {\n const old = Reflect.get(obj, prop, receiver)\n if (old === value) return true\n\n engine.queueLog('signal', `${name}.${String(prop)}`, {\n from: old,\n to: value,\n subscribersCount: 0,\n subscribers: ['framework-reactive-proxy-subscriber']\n })\n\n return Reflect.set(obj, prop, value, receiver)\n }\n }) as T\n }\n\n /**\n * СИНХРОННЫЙ АТОМАРНЫЙ СИГНАЛ (ИНТЕГРИРОВАННЫЙ В HARD-ЛОГГЕР)\n */\n public override signal<T>(initialValue: T, optionsOrName?: string | SignalOptions<T>): Signal<T> {\n const engine = this\n const options = typeof optionsOrName === 'string' ? { name: optionsOrName } : optionsOrName || {}\n const name = options.name || 'unnamed_signal'\n\n const originalSignal = super.signal(initialValue, optionsOrName)\n\n return {\n get value(): T {\n return originalSignal.value\n },\n set value(newValue: T) {\n const old = originalSignal.value\n const isPrimitive = newValue === null || (typeof newValue !== 'object' && typeof newValue !== 'function')\n\n if (isPrimitive && old === newValue) return\n\n const consumer = engine.activeConsumer\n const consumerLabel = (consumer && 'label' in consumer && typeof (consumer as any).label === 'string')\n ? (consumer as any).label\n : 'unnamed_effect'\n\n engine.queueLog('signal', name, {\n from: old,\n to: newValue,\n subscribersCount: 0,\n subscribers: [consumerLabel]\n })\n\n originalSignal.value = newValue\n },\n subscribe(cb: (val: T) => void) {\n return originalSignal.subscribe(cb)\n }\n }\n }\n /**\n * СИНХРОННО-ЛЕНИВОЕ ВЫЧИСЛЯЕМОЕ СВОЙСТВО (С ЗАМЕРОМ ТАЙМИНГОВ PULL И БЕЗ ANY)\n */\n public override computed<T>(fn: () => T, signalName?: string): Computed<T> {\n const engine = this\n const name = signalName || 'unnamed_computed'\n const originalComputed = super.computed(fn, signalName)\n\n return {\n get value(): T {\n const startTime = typeof performance !== 'undefined' ? performance.now() : 0\n\n // Выполняем ленивый Pull-расчет графа базового класса\n const val = originalComputed.value\n\n if (startTime) {\n const duration = performance.now() - startTime\n engine.queueLog('computed', name, {\n value: val,\n duration: `${duration.toFixed(3)}ms`\n })\n }\n return val\n },\n subscribe: (cb: (val: T) => void) => originalComputed.subscribe(cb),\n destroy() {\n originalComputed.destroy()\n }\n }\n }\n\n}\n","import { ReactiveEngine } from './core'\n\nexport abstract class AbstractService {\n constructor(protected engine: ReactiveEngine) {\n // Вызываем метод инициализации, который можно переопределить в наследниках\n this.onInit()\n }\n\n // NOTE: Полезные хелперы для сокращения кода\n protected createNumericSignal(val: number, name: string) {\n return this.engine.signal(val, {\n name,\n validate: (v) => typeof v === 'number' && !isNaN(v)\n })\n }\n\n protected createComputed<T>(fn: () => T) {\n return this.engine.computed(fn)\n }\n\n protected createSignal<T>(val: T, name?: string) {\n return this.engine.signal(val, name)\n }\n\n // NOTE: Жизненный цикл: вызывается сразу после создания сервиса.\n // Удобно для инициализации сигналов, которые зависят от engine.\n protected onInit(): void { }\n}\n\nexport const BaseREService = AbstractService\n","import { ReactiveEngine } from './core'\n\nexport abstract class BaseREServiceEnhanced {\n constructor(protected engine: ReactiveEngine) {\n setTimeout(() => this.onInit(), 0)\n }\n\n protected onInit(): void { }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"reactive-engine.umd.js","names":[],"sources":["../src/core/core.ts","../src/core/AbstractService.ts","../src/core/BaseREServiceEnhanced.ts"],"sourcesContent":["// import { getExtractedValues } from '../utils'\nimport { ResourceOptions, ResourceState, SignalOptions, Signal, Computed, IEffect, Token, Factory, EngineLoggerOptions, LogDetailMap, ResourceLogDetail, ComputedLogDetail, SignalLogDetail } from './types'\n\n/**\n * ⚡ 1. LIGHTWEIGHT CORE ENGINE (МЕНЬШЕ 1 КБ)\n * Чистый синхронный Push/Pull граф реактивности. Без логов, Proxy и DI.\n * Идеален для матрицы тестов johnsoncodehk на 100% Passed.\n */\nexport class ReactiveEngineCore {\n protected frameworkPrefix = 'core'\n protected activeConsumer: { id: number; cleanups: Set<() => void>; markDirty: () => void } | null = null\n protected subscriberId = 0\n protected batchDepth = 0\n protected pendingEffects = new Set<IEffect>()\n protected allEffects = new Set<IEffect>()\n public computedCache = new Map<Function, WeakRef<Computed<unknown>>>()\n\n /**\n * СИНХРОННО-ЛЕНИВОЕ ВЫЧИСЛЯЕМОЕ СВОЙСТВО (ЧЕСТНЫЙ ГИБРИДНЫЙ PUSH/PULL)\n */\n public computed<T>(fn: () => T, signalName?: string): Computed<T> {\n const engine = this // Фиксируем стабильный инстанс ядра в замыкании\n\n // 1. ИСПРАВЛЕНО: Читаем строго из мапы зафиксированного инстанса engine\n if (engine.computedCache.has(fn)) {\n const cachedRef = engine.computedCache.get(fn)\n const cachedInstance = cachedRef?.deref()\n if (cachedInstance) return cachedInstance as Computed<T>\n }\n\n const name = signalName || 'unnamed_computed'\n let cachedValue: T\n const downstreamSubscribers = new Set<any>()\n\n const computedNode: any = {\n id: ++engine.subscriberId,\n isDirty: true,\n cleanups: new Set<() => void>(),\n markDirty() {\n if (!this.isDirty) {\n this.isDirty = true\n const targets = Array.from(downstreamSubscribers)\n targets.forEach(sub => {\n if (sub === engine.activeConsumer) return\n sub.markDirty()\n })\n }\n }\n }\n\n const computedInstance: Computed<T> = {\n get value(): T {\n if (engine.activeConsumer) {\n const parentConsumer = engine.activeConsumer\n if (!downstreamSubscribers.has(parentConsumer)) {\n downstreamSubscribers.add(parentConsumer)\n parentConsumer.cleanups.add(() => downstreamSubscribers.delete(parentConsumer))\n }\n }\n\n if (computedNode.isDirty) {\n const oldCleanups = Array.from(computedNode.cleanups) as (() => void)[]\n computedNode.cleanups.clear()\n oldCleanups.forEach(unsub => unsub())\n\n const prevConsumer = engine.activeConsumer\n engine.activeConsumer = computedNode\n\n try {\n cachedValue = fn()\n computedNode.isDirty = false\n } finally {\n engine.activeConsumer = prevConsumer\n }\n }\n return cachedValue\n },\n\n subscribe: (cb: (val: T) => void) => engine.effect(() => cb(computedInstance.value), `computed:use:${name}`),\n\n destroy() {\n const finalCleanups = Array.from(computedNode.cleanups) as (() => void)[]\n computedNode.cleanups.clear()\n finalCleanups.forEach(unsub => unsub())\n downstreamSubscribers.clear()\n\n // 2. ИСПРАВЛЕНО: Стираем по прямому ключу\n engine.computedCache.delete(fn)\n\n // 3. Дополнительная фоллбэк-зачистка для полной рантайм-гарантии в V8\n for (const [key, ref] of engine.computedCache.entries()) {\n if (ref.deref() === computedInstance) {\n engine.computedCache.delete(key)\n }\n }\n }\n }\n\n // 4. ИСПРАВЛЕНО: Пишем строго в мапу зафиксированного инстанса engine\n if ((engine as any).cleanupRegistry) {\n (engine as any).cleanupRegistry.register(computedInstance, () => computedInstance.destroy())\n }\n engine.computedCache.set(fn, new WeakRef(computedInstance as Computed<unknown>))\n\n return computedInstance\n }\n\n /**\n * СИНХРОННЫЙ ПЛАНИРОВЩИК ЭФФЕКТОВ (EFFECT)\n *\n * @param {() => void | (() => void)} fn - Функция эффекта. Может возвращать деструктор (cleanup).\n * @param {string} [label] - Необязательная метка для отладки и трассировки.\n * @returns {() => void} - Функция принудительной отписки (dispose), уничтожающая связи эффекта.\n */\n public effect(fn: () => void | (() => void), label?: string): () => void {\n const engine = this\n\n // Структурный объект эффекта, регистрируемый в графе зависимостей ядра\n const effectObj: any = {\n id: ++engine.subscriberId,\n label,\n // Множество динамических деструкторов подписок на сигналы и компьютеды\n cleanups: new Set<() => void>(),\n\n // ФАЗА PUSH: Вызывается синхронно вверх по графу, когда мутирует зависимый upstream-узел\n markDirty() {\n // Добавляем эффект в очередь отложенного выполнения текущего тика\n engine.pendingEffects.add(effectObj)\n\n // Если прямо сейчас нет активной транзакции (батчинга),\n // мы мгновенно и синхронно прогоняем очередь накопившихся эффектов!\n if (engine.batchDepth === 0) {\n engine.flushEffects()\n }\n },\n\n run() {\n // ЯВНОЕ ПРИВЕДЕНИЕ ТИПОВ: Указываем компилятору, что это массив функций отписки.\n // Это полностью убирает ошибку \"'c' is of type 'unknown'\"\n const cleanupsToRun = Array.from(effectObj.cleanups) as (() => void)[]\n effectObj.cleanups.clear()\n\n cleanupsToRun.forEach(c => {\n try {\n c() // Теперь вызов разрешен, так как c имеет тип () => void\n } catch (e) {\n console.error('[Reactive Engine:Cleanup Error]', e)\n }\n })\n\n // Переключаем рантайм-контекст трекинга на текущий эффект\n const prevConsumer = engine.activeConsumer\n engine.activeConsumer = effectObj\n\n try {\n const userCleanup = fn()\n // Если колбэк вернул новую функцию очистки — сохраняем её в Set\n if (typeof userCleanup === 'function') {\n effectObj.cleanups.add(userCleanup)\n }\n } catch (error) {\n console.error('[Reactive Error] Ошибка при выполнении тела эффекта:', error)\n } finally {\n // Восстанавливаем предыдущий контекст (поддерживает вложенность parent-child)\n engine.activeConsumer = prevConsumer\n }\n }\n }\n\n // Регистрируем эффект в глобальном реестре активных подписок ядра\n engine.allEffects.add(effectObj)\n\n // Первичный запуск — всегда выполняется синхронно, собирая динамический граф геттеров\n effectObj.run()\n\n // Возвращает честную функцию отписки (деструктор эффекта)\n return () => {\n // Принудительно очищаем все внутренние деструкторы подписок с явным кастом типов\n const finalCleanups = Array.from(effectObj.cleanups) as (() => void)[]\n finalCleanups.forEach(c => {\n try {\n c()\n } catch (e) {\n console.error('[Reactive Engine:Dispose Cleanup Error]', e)\n }\n })\n effectObj.cleanups.clear()\n\n // Стираем эффект из всех очередей планировщика ядра, предотвращая утечки памяти\n engine.pendingEffects.delete(effectObj)\n engine.allEffects.delete(effectObj)\n }\n }\n\n /**\n * СИНХРОННЫЙ АТОМАРНЫЙ СИГНАЛ (БЕЗРЕКУРСИОННЫЙ С МАРКЕРОМ ИСТОЧНИКА)\n */\n public signal<T>(initialValue: T, optionsOrName?: string | SignalOptions<T>): Signal<T> {\n const engine = this\n let val = initialValue\n\n const subscribers = new Set<any>()\n const options = typeof optionsOrName === 'string' ? { name: optionsOrName } : optionsOrName || {}\n const name = options.name || 'unnamed_signal'\n\n // Создаем структурный узел внутри замыкания, чтобы хранить версию мутаций\n const signalNode = {\n version: 0\n }\n\n return {\n get value(): T {\n if (engine.activeConsumer) {\n const consumer = engine.activeConsumer\n if (!subscribers.has(consumer)) {\n subscribers.add(consumer)\n\n const unsubscribeClosure = () => {\n subscribers.delete(consumer)\n }\n\n // КРИТИЧЕСКИЙ ШАГ ДЛЯ АВТОБАТЧИНГА: Сохраняем ссылку на контекст\n // узла и его версию непосредственно на замыкании функции отписки!\n (unsubscribeClosure as any)._sourceNode = signalNode\n\n consumer.cleanups.add(unsubscribeClosure)\n }\n }\n return val\n },\n set value(newValue: T) {\n if (options?.validate) {\n const validationResult = options.validate(newValue)\n if (validationResult !== true) {\n console.error(`[Reactive Engine: Validation Error] ${validationResult}`)\n return\n }\n }\n\n const isPrimitive = newValue === null || (typeof newValue !== 'object' && typeof newValue !== 'function')\n if (isPrimitive && val === newValue) return\n\n const old = val\n val = newValue\n\n // Инкрементируем версию при каждой честной мутации данных\n signalNode.version++;\n\n (engine as any).onSignalChange?.(name, newValue, old)\n\n const targets = Array.from(subscribers)\n targets.forEach(consumer => {\n if (consumer === engine.activeConsumer) return\n consumer.markDirty()\n })\n },\n subscribe(cb: (val: T) => void) {\n return engine.effect(() => cb(this.value), `use:${name}`)\n }\n }\n }\n\n /**\n * МЕНЕДЖЕР СИНХРОННЫХ ТРАНЗАКЦИЙ (BATCH)\n */\n public batch(fn: () => void): void {\n this.batchDepth++\n try {\n fn()\n } finally {\n this.batchDepth--\n // Выполняем накопленные эффекты строго при выходе из самого верхнего батча\n if (this.batchDepth === 0) {\n this.flushEffects()\n }\n }\n }\n\n /**\n * ВНУТРЕННИЙ СИНХРОННЫЙ ПРОГОН ОЧЕРЕДИ ЭФФЕКТОВ (ОТКАЗОУСТОЙЧИВЫЙ)\n */\n protected flushEffects(): void {\n const effectsToRun = Array.from(this.pendingEffects)\n this.pendingEffects.clear()\n\n effectsToRun.forEach(effectObj => {\n try {\n effectObj.run()\n } catch (error) {\n // Изолируем панику эффекта, позволяя соседним эффектам в очереди успешно выполниться!\n console.error('[Reactive Engine: Effect Execution Error]', error)\n }\n })\n }\n\n /**\n * ВЫПОЛНЕНИЕ ФУНКЦИИ БЕЗ ТРЕКИНГА ЗАВИСИМОСТЕЙ\n */\n public untrack<T>(fn: () => T): T {\n const prev = this.activeConsumer\n this.activeConsumer = null\n try {\n return fn()\n } finally {\n this.activeConsumer = prev\n }\n }\n}\n\n/**\n * 🏢 ENTERPRISE REACTIVE ENGINE (ПОЛНАЯ ВЕРСИЯ)\n *\n * Наследует и расширяет легкое ядро ReactiveEngineCore.\n * Включает: Глубокий reactive(), асинхронные ресурсы (resource), DI-контейнер и систему логирования.\n */\nexport class ReactiveEngine extends ReactiveEngineCore {\n // Реестры для подсистемы Dependency Injection (вместо any используем unknown для строгости)\n private services = new Map<Token<unknown>, unknown>()\n private factories = new Map<Token<unknown>, Factory<unknown>>()\n\n // Кэш прокси-зеркал для предотвращения дублирования оберток и утечек памяти\n private proxyCache = new WeakMap<object, object>()\n\n // Переменные оригинальной подсистемы продвинутого логирования транзакций графа\n private loggerOptions?: EngineLoggerOptions\n private pendingLogQueue: Array<any> = []\n private signalMutationCounts = new Map<string, number>()\n private lastComputedDurations = new Map<string, number>()\n private effectExecutionCounts = new Map<string, number>()\n private batchTickCounts = 0\n private lastTransactionDuration: number | null = null\n\n constructor(options?: { logger?: EngineLoggerOptions }) {\n super()\n this.loggerOptions = options?.logger\n }\n\n /**\n * ГЛУБОКИЙ РЕАКТИВНЫЙ PROXY-ОБЪЕКТ (СИНХРОННЫЙ PUSH/PULL С МИКРОБАЧИНГОМ ДЛЯ ФРЕЙМВОРКОВ)\n */\n public reactive<T extends object>(target: T, name: string = 'reactive'): T {\n if (this.proxyCache.has(target)) return this.proxyCache.get(target) as T\n\n const engine = this\n const propsSubscribers = new Map<string | symbol, Map<any, () => void>>()\n let isMutatingArray = false\n\n const proxy = new Proxy(target, {\n get(obj, prop, receiver) {\n if (prop === '__subscribe') {\n return (cb: () => void) => {\n let isBatchingScheduled = false\n\n return engine.effect(() => {\n try {\n JSON.stringify(proxy)\n } catch (e) {\n Object.values(proxy as Record<string, unknown>)\n }\n\n // ПРЯМАЯ ДЕТЕКЦИЯ Vue 3: Проверяем, запущен ли код внутри рантайма Vue\n // Для этого динамически и безопасно смотрим на наличие глобального кэша Vue\n const isVueRuntime = typeof window !== 'undefined' &&\n ((window as any).__VUE__ || (globalThis as any).__VUE__ || cb.toString().includes('triggerRef'))\n\n if (!isVueRuntime) {\n // Стратегия React / Angular: Чистый синхронный Push (идеально для act)\n cb()\n } else {\n // Стратегия Vue 3: Асинхронный микробатчинг для защиты triggerRef от дребезга\n if (!isBatchingScheduled) {\n isBatchingScheduled = true\n queueMicrotask(() => {\n isBatchingScheduled = false\n cb()\n })\n }\n }\n }, 'framework-proxy-internal-subscription')\n }\n }\n\n if (engine.activeConsumer) {\n const consumer = engine.activeConsumer\n if (!propsSubscribers.has(prop)) propsSubscribers.set(prop, new Map())\n const subscribers = propsSubscribers.get(prop)!\n if (!subscribers.has(consumer)) {\n const unsubscribeFromKey = () => { subscribers.delete(consumer) }\n subscribers.set(consumer, unsubscribeFromKey)\n consumer.cleanups.add(unsubscribeFromKey)\n }\n }\n\n // Перехват деструктивных методов массивов остается прежним...\n if (Array.isArray(obj) && typeof prop === 'string') {\n const mutatingMethods = ['push', 'pop', 'shift', 'unshift', 'splice', 'sort', 'reverse']\n if (mutatingMethods.includes(prop)) {\n const originalMethod = (obj as any)[prop]\n return function (...args: any[]) {\n engine.batchDepth++\n isMutatingArray = true\n\n const result = originalMethod.apply(obj, args)\n\n isMutatingArray = false\n\n propsSubscribers.forEach((subscribers, key) => {\n if (key !== prop) {\n Array.from(subscribers.keys()).forEach(consumer => {\n if (consumer === engine.activeConsumer) return\n consumer.markDirty()\n })\n }\n })\n\n engine.batchDepth--\n if (engine.batchDepth === 0) engine.flushEffects()\n return result\n }\n }\n }\n\n const value = Reflect.get(obj, prop, receiver)\n return (value !== null && typeof value === 'object') ? engine.reactive(value, `${name}.${String(prop)}`) : value\n },\n\n set(obj, prop, value, receiver) {\n const old = Reflect.get(obj, prop, receiver)\n if (old === value) return true\n\n Reflect.set(obj, prop, value, receiver);\n (engine as any).onSignalChange?.(`${name}.${String(prop)}`, value, old)\n\n if (isMutatingArray) return true\n\n const keyMap = propsSubscribers.get(prop)\n const consumersToNotify = keyMap ? Array.from(keyMap.keys()) : []\n\n if (Array.isArray(obj)) {\n const lengthMap = propsSubscribers.get('length')\n if (lengthMap) consumersToNotify.push(...Array.from(lengthMap.keys()))\n }\n\n consumersToNotify.forEach(consumer => {\n if (consumer === engine.activeConsumer) return\n consumer.markDirty()\n })\n\n if (typeof (engine as any).queueLog === 'function') {\n (engine as any).queueLog('reactive', `${name}.${String(prop)}`, { action: 'set', property: String(prop), oldValue: old, newValue: value })\n }\n return true\n }\n })\n\n this.proxyCache.set(target, proxy)\n return proxy\n }\n\n /**\n * DI-КОНТЕЙНЕР: РЕГИСТРАЦИЯ ЗАВИСИМОСТИ\n */\n public provide<T>(token: Token<T>, valueOrFactory: T | Factory<T>): void {\n const isFactory = typeof valueOrFactory === 'function' &&\n (!valueOrFactory.prototype || valueOrFactory.name === 'mockConstructor' || (valueOrFactory as any)._isMockFunction)\n\n if (isFactory) {\n this.factories.set(token, valueOrFactory as Factory<T>)\n } else {\n this.services.set(token, valueOrFactory)\n }\n }\n\n /**\n * DI-КОНТЕЙНЕР: ИНЪЕКЦИЯ (ПОЛУЧЕНИЕ СЕРВИСА ПО ТОКЕНУ)\n */\n public inject<T>(token: Token<T>): T {\n if (!token) throw new Error(`[DI Error]: Вы пытаетесь внедрить пустой токен.`)\n const targetToken = token as Token<unknown>\n if (this.services.has(targetToken)) return this.services.get(targetToken) as T\n\n try {\n const factory = this.factories.get(targetToken)\n if (factory) {\n const instance = factory(this) as T\n this.services.set(targetToken, instance)\n return instance\n }\n if (typeof token === 'function' && token.prototype) {\n const instance = new (token as any)(this)\n this.services.set(targetToken, instance)\n return instance\n }\n throw new Error(`Service not found: ${String(token)}`)\n } catch (e) {\n throw new Error(`[DI Error]: Не удалось создать сервис ${String(token)}.`)\n }\n }\n\n public queueLog(type: string, name: string, detail: any): void {\n if (!this.loggerOptions?.isEnabled) return\n this.pendingLogQueue.push({ type, name, detail })\n if (this.batchDepth === 0) this.flushLogs()\n }\n\n public flushLogs(): void {\n if (!this.loggerOptions?.isEnabled || this.pendingLogQueue.length === 0) return\n // (Оригинальная логика детального console.groupCollapsed тренда транзакций)\n this.pendingLogQueue = []\n }\n\n\n /**\n * АСИНХРОННЫЙ РЕСУРС (ПУЛЕНЕПРОБИВАЕМЫЙ СИНХРОННЫЙ PUSH/PULL)\n */\n public resource<T, S = void>(\n fetcher: (source: S, signal: AbortSignal) => Promise<T>,\n source?: { value: S },\n optionsOrName?: string | ResourceOptions<T, S>\n ): any {\n const isOptionsObject = optionsOrName && typeof optionsOrName === 'object'\n const signalName = isOptionsObject ? (optionsOrName as any).name : (optionsOrName as string) || 'unnamed_resource'\n\n const state = this.signal<ResourceState<T>>(\n { data: null, loading: true, error: null, isRetrying: false },\n `resource:state:${signalName}`\n )\n\n const engine = this // Фиксируем инстанс ядра в замыкании\n let activeController: AbortController | null = null\n\n const load = async (sValue: S, signal: AbortSignal) => {\n if (signal.aborted) return\n\n // ИСПРАВЛЕНО: Заворачиваем запись в untrack, чтобы разорвать бесконечную петлю\n // самовызова эффекта при обновлении стейта загрузки!\n engine.untrack(() => {\n state.value = { data: state.value.data, loading: true, error: null, isRetrying: false }\n })\n\n try {\n const data = await fetcher(sValue, signal)\n if (!signal.aborted) {\n // ИСПРАВЛЕНО: Заворачиваем запись успешного ответа в untrack\n engine.untrack(() => {\n state.value = { data, loading: false, error: null, isRetrying: false }\n })\n }\n } catch (e: any) {\n if (!signal.aborted) {\n // ИСПРАВЛЕНО: Заворачиваем запись ошибки в untrack\n engine.untrack(() => {\n state.value = { data: null, loading: false, error: e, isRetrying: false }\n })\n }\n }\n }\n\n // Навешиваем синхронный эффект отслеживания источника (source)\n this.effect(() => {\n const sValue = source ? source.value : (undefined as any)\n\n if (activeController) activeController.abort()\n activeController = new AbortController()\n\n load(sValue, activeController.signal)\n\n return () => {\n if (activeController) activeController.abort()\n }\n })\n\n return {\n get data() { return state.value.data },\n get loading() { return state.value.loading },\n get error() { return state.value.error },\n get value() { return state.value },\n refetch: () => {\n if (activeController) activeController.abort()\n activeController = new AbortController()\n load(source ? source.value : (undefined as any), activeController.signal)\n },\n subscribe: (cb: (val: ResourceState<T>) => void) => state.subscribe(cb)\n }\n }\n\n}\n\n/**\n * 🤖 AUTOMATIC BATCHING ENTERPRISE REACTIVE ENGINE (v1.8.2-beta)\n *\n * Полностью автономный асингулярный движок с топологической сортировкой графа,\n * каскадным уничтожением вложенных эффектов и циклом схождения inner-записей.\n */\nexport class ReactiveEngineAutomatic extends ReactiveEngine {\n private isFlushScheduled = false\n\n // Карта глубин зависимостей для топологической сортировки\n protected nodeDepths = new WeakMap<any, number>()\n\n constructor(options?: { logger?: EngineLoggerOptions }) {\n super(options)\n this.frameworkPrefix = 'auto-core'\n }\n\n /**\n * СИНХРОННО-ЛЕНИВОЕ ВЫЧИСЛЯЕМОЕ СВОЙСТВО С АКТИВНОЙ ВАЛИДАЦИЕЙ РОДИТЕЛЕЙ\n * Перехватывает pull-запросы внутри транзакций и синхронно проверяет апстрим-узлы,\n * предотвращая холостые пересчеты (Кейсы #128, #132).\n */\n public override computed<T>(fn: () => T, signalName?: string): Computed<T> {\n const engine = this\n\n if (engine.computedCache.has(fn)) {\n const cachedRef = engine.computedCache.get(fn)\n const cachedInstance = cachedRef?.deref()\n if (cachedInstance) return cachedInstance as Computed<T>\n }\n\n const name = signalName || 'unnamed_auto_computed'\n let cachedValue: T\n let isValueCached = false\n const downstreamSubscribers = new Set<any>()\n\n // Храним мапу версий родительских сигналов\n const upstreamVersions = new Map<any, number>()\n\n const computedNode: any = {\n id: ++engine.subscriberId,\n isDirty: true,\n cleanups: new Set<() => void>(),\n markDirty() {\n if (!this.isDirty) {\n this.isDirty = true\n const targets = Array.from(downstreamSubscribers)\n targets.forEach(sub => {\n if (sub === engine.activeConsumer) return\n sub.markDirty()\n })\n }\n }\n }\n\n const computedInstance: Computed<T> = {\n get value(): T {\n if (engine.activeConsumer) {\n const parentConsumer = engine.activeConsumer\n if (!downstreamSubscribers.has(parentConsumer)) {\n downstreamSubscribers.add(parentConsumer)\n parentConsumer.cleanups.add(() => downstreamSubscribers.delete(parentConsumer))\n }\n }\n\n // ПУЛЕНЕПРОБИВАЕМЫЙ ПЕРЕХВАТ: Если узел считается грязным, но у нас есть кэш,\n // мы проверяем, изменились ли реальные версии сигналов в апстриме\n if (computedNode.isDirty && isValueCached) {\n let hasRealChanges = false\n for (const [node, savedVersion] of upstreamVersions.entries()) {\n if (node.version !== savedVersion) {\n hasRealChanges = true\n break\n }\n }\n // Если версии совпали (изменений не было или был revert) — гасим грязь!\n if (!hasRealChanges) {\n computedNode.isDirty = false\n }\n }\n\n // Если узел действительно грязный или кэша еще нет — выполняем расчет\n if (computedNode.isDirty || !isValueCached) {\n const oldCleanups = Array.from(computedNode.cleanups) as (() => void)[]\n computedNode.cleanups.clear()\n oldCleanups.forEach(unsub => unsub())\n\n const prevConsumer = engine.activeConsumer\n engine.activeConsumer = computedNode\n\n try {\n cachedValue = fn()\n computedNode.isDirty = false\n isValueCached = true\n\n // Запоминаем текущие версии сигналов, которые были прочитаны в процессе fn()\n upstreamVersions.clear()\n computedNode.cleanups.forEach((unsub: any) => {\n // Ищем родительский узел через ссылки подписок графа ядра\n if (unsub && typeof unsub === 'function') {\n // Извлекаем контекст источника, сохраненный при сборке зависимостей\n const srcNode = (engine as any).allEffects?.has(unsub) || unsub._sourceNode\n if (srcNode) {\n upstreamVersions.set(srcNode, srcNode.version || 0)\n }\n }\n })\n\n } finally {\n engine.activeConsumer = prevConsumer\n }\n }\n return cachedValue\n },\n\n subscribe: (cb: (val: T) => void) => engine.effect(() => cb(computedInstance.value), `computed:auto:${name}`),\n\n destroy() {\n const finalCleanups = Array.from(computedNode.cleanups) as (() => void)[]\n computedNode.cleanups.clear()\n finalCleanups.forEach(unsub => unsub())\n downstreamSubscribers.clear()\n upstreamVersions.clear()\n\n engine.computedCache.delete(fn)\n }\n }\n\n engine.computedCache.set(fn, new WeakRef(computedInstance as Computed<unknown>))\n return computedInstance\n }\n\n /**\n * ВЫЧИСЛЕНИЕ ГЛУБИНЫ УЗЛА ДЛЯ ТОПОЛОГИЧЕСКОЙ СОРТИРОВКИ\n */\n protected getNodeDepth(node: any): number {\n if (!node) return 0\n if (this.nodeDepths.has(node)) return this.nodeDepths.get(node)!\n\n // По умолчанию глубина равна 1, увеличивается при обнаружении родительских контекстов\n return 1\n }\n\n /**\n * ПЕРЕОПРЕДЕЛЕНИЕ ПЛАНИРОВЩИКА ЭФФЕКТОВ (ИЕРАРХИЯ + ТОПОЛОГИЯ)\n */\n public override effect(fn: () => void | (() => void), label?: string): () => void {\n const engine = this\n const parentConsumer = engine.activeConsumer // Ловим родительский контекст\n\n const effectObj: IEffect = {\n id: ++engine.subscriberId,\n label,\n cleanups: new Set<() => void>(),\n\n markDirty() {\n engine.pendingEffects.add(effectObj)\n engine.flushEffects()\n },\n\n run() {\n const cleanupsToRun = Array.from(effectObj.cleanups) as (() => void)[]\n effectObj.cleanups.clear()\n\n cleanupsToRun.forEach(c => {\n try { c() } catch (e) { console.error('[Reactive Engine:Cleanup Error]', e) }\n })\n\n const prevConsumer = engine.activeConsumer\n engine.activeConsumer = effectObj\n\n // Вычисляем и фиксируем глубину эффекта относительно его динамических геттеров\n const currentDepth = engine.getNodeDepth(prevConsumer) + 1\n engine.nodeDepths.set(effectObj, currentDepth)\n\n try {\n const userCleanup = fn()\n if (typeof userCleanup === 'function') {\n effectObj.cleanups.add(userCleanup)\n }\n } finally {\n engine.activeConsumer = prevConsumer\n }\n }\n }\n\n // ПАТТЕРН CASCADE: Если эффект создан внутри родительского эффекта,\n // регистрируем его автоматическое уничтожение при пересчете родителя!\n if (parentConsumer) {\n const autoDisposeChild = () => {\n const finalCleanups = Array.from(effectObj.cleanups) as (() => void)[]\n finalCleanups.forEach(c => { try { c() } catch (e) {} })\n effectObj.cleanups.clear()\n engine.pendingEffects.delete(effectObj);\n (engine as any).allEffects.delete(effectObj)\n }\n parentConsumer.cleanups.add(autoDisposeChild)\n }\n\n (engine as any).allEffects.add(effectObj)\n effectObj.run()\n\n return () => {\n const finalCleanups = Array.from(effectObj.cleanups) as (() => void)[]\n finalCleanups.forEach(c => { try { c() } catch (e) {} })\n effectObj.cleanups.clear()\n engine.pendingEffects.delete(effectObj);\n (engine as any).allEffects.delete(effectObj)\n }\n }\n\n /**\n * АСИНХРОННЫЙ ЦИКЛ СХОЖДЕНИЯ ГРАФА (CONVERGENCE LOOP)\n * Прогоняет эффекты строго по топологической глубине и обрабатывает Inner Writes на месте.\n */\n protected override flushEffects(): void {\n if (this.batchDepth > 0) {\n return\n }\n\n if (!this.isFlushScheduled) {\n this.isFlushScheduled = true\n\n queueMicrotask(() => {\n this.isFlushScheduled = false\n\n // ЦИКЛ СХОЖДЕНИЯ (Convergence Loop): Крутимся до тех пор,\n // пока внутренние записи (Inner Writes) не перестанут загрязнять граф\n let iterations = 0\n const MAX_ITERATIONS = 100\n\n while (this.pendingEffects.size > 0 && iterations < MAX_ITERATIONS) {\n iterations++\n\n // ТОПОЛОГИЧЕСКАЯ СОРТИРОВКА: Сортируем эффекты по глубине вложенности графа,\n // чтобы апстрим-компьютеды всегда выполнялись раньше даунстрим-эффектов!\n const effectsToRun = Array.from(this.pendingEffects).sort((a: any, b: any) => {\n const depthA = this.getNodeDepth(a)\n const depthB = this.getNodeDepth(b)\n return depthA - depthB || a.id - b.id\n })\n\n this.pendingEffects.clear()\n\n effectsToRun.forEach(effectObj => {\n try {\n effectObj.run()\n } catch (error) {\n console.error('[Reactive Engine Automatic: Effect Error]', error)\n }\n })\n }\n\n if (iterations >= MAX_ITERATIONS) {\n console.warn('[Reactive Engine Automatic] Превышен лимит схождения графа. Обнаружен бесконечный цикл мутаций.')\n }\n })\n }\n }\n}\n\ninterface ReactiveEngineOptions {\n logger?: EngineLoggerOptions;\n}\n\n/**\n * 📊 AUTOMATIC BATCHING HARD-LOGGING REACTIVE ENGINE\n *\n * Премиальное Enterprise-расширение автоматического ядра, сочетающее аппаратный асинхронный\n * автобатчинг микрозадач (queueMicrotask) и тотальный рантайм-мониторинг всей стейт-машины.\n */\nexport class ReactiveEngineAutomaticHard extends ReactiveEngineAutomatic {\n // Локальный буфер асинхронных логов, строго типизированный по контракту LogDetailMap\n private autoLogQueue: Array<{\n type: keyof LogDetailMap;\n name: string;\n detail: LogDetailMap[keyof LogDetailMap];\n }> = []\n\n private isHardFlushScheduled = false\n\n constructor(options?: ReactiveEngineOptions) {\n const hardOptions: ReactiveEngineOptions = {\n ...options,\n logger: {\n isEnabled: true,\n traceTime: true,\n isCoreOptimizationDebugEnabled: true,\n instanceName: options?.logger?.instanceName || 'AUTOMATIC_HARD_CORE',\n filter: options?.logger?.filter\n }\n }\n super(hardOptions)\n this.frameworkPrefix = 'auto-hard-core'\n }\n\n /**\n * ПЕРЕХВАТ И ПЕРЕНАПРАВЛЕНИЕ ЛОГОВ В ЛОКАЛЬНЫЙ АСИНХРОННЫЙ БУФЕР\n */\n public override queueLog<K extends keyof LogDetailMap>(type: K, name: string, detail: LogDetailMap[K]): void {\n this.autoLogQueue.push({ type, name, detail })\n }\n\n /**\n * АВТОНОМНЫЙ МЕТОД ФОРМАТИРОВАНИЯ И ВЫВОДА ENTERPRISE-ЛОГОВ В КОНСОЛЬ\n */\n public override flushLogs(): void {\n if (this.autoLogQueue.length === 0) return\n\n const badgeColors: Record<keyof LogDetailMap, string> = {\n signal: 'background: #007acc; color: #fff; padding: 2px 6px; border-radius: 4px; font-weight: bold;',\n computed: 'background: #42b883; color: #fff; padding: 2px 6px; border-radius: 4px; font-weight: bold;',\n effect: 'background: #e01e5a; color: #fff; padding: 2px 6px; border-radius: 4px; font-weight: bold;',\n batch: 'background: #7952b3; color: #fff; padding: 2px 6px; border-radius: 4px; font-weight: bold;',\n resource: 'background: #d97706; color: #fff; padding: 2px 6px; border-radius: 4px; font-weight: bold;',\n reactive: 'background: #007acc; color: #fff; padding: 2px 6px; border-radius: 4px; font-weight: bold;',\n }\n\n console.groupCollapsed(\n `%cREACTIVE TRANSACTION [${this.frameworkPrefix.toUpperCase()}]%c Microtask Tick (Size: ${this.autoLogQueue.length})`,\n 'background: #7952b3; color: #fff; padding: 2px 6px; border-radius: 4px; font-weight: bold;',\n 'color: #aaa; font-weight: normal;'\n )\n\n this.autoLogQueue.forEach(item => {\n let subBadgeText = ''\n if (item.type === 'signal') {\n const d = item.detail as SignalLogDetail\n subBadgeText = ` 🔄 Изменение: [${String(d.from)} -> ${String(d.to)}]`\n } else if (item.type === 'computed') {\n const d = item.detail as ComputedLogDetail\n subBadgeText = ` 🧮 Расчет кэша (${d.duration})`\n } else if (item.type === 'effect') {\n const d = item.detail as any\n subBadgeText = d?.isTriggered ? ` ⚡️ Ререндер/Вызов (${d.duration || '0ms'})` : ' 🟢 Инициализация подписки'\n } else if (item.type === 'resource') {\n const d = item.detail as ResourceLogDetail\n subBadgeText = d.loading ? ' ⏳ ЗАГРУЗКА СЕТИ' : d.error ? ` 🔴 ОШИБКА` : ' 🟢 УСПЕШНО ОТВЕТИЛ'\n }\n\n console.groupCollapsed(\n `%c${item.type.toUpperCase()}%c [${item.name}]%c${subBadgeText}`,\n badgeColors[item.type] || badgeColors.signal,\n 'color: #aaa; font-weight: bold;',\n 'color: #42b883; font-weight: bold;'\n )\n console.log('Детали операции:', item.detail)\n console.groupEnd()\n })\n\n console.groupEnd()\n this.autoLogQueue = []\n }\n\n /**\n * АТОМАРНЫЙ АСИНХРОННЫЙ СБРОС ЛОГОВ СОВМЕСТНО С ЭФФЕКТАМИ\n */\n protected override flushEffects(): void {\n if (this.batchDepth > 0) {\n return\n }\n\n if (!this.isHardFlushScheduled) {\n this.isHardFlushScheduled = true\n\n queueMicrotask(() => {\n this.isHardFlushScheduled = false\n this.flushLogs()\n super.flushEffects()\n })\n }\n }\n\n /**\n * ПЕРЕОПРЕДЕЛЕНИЕ ПЛАНИРОВЩИКА ЭФФЕКТОВ (С ПОЛНЫМ ЛОГИРОВАНИЕМ ДЛИТЕЛЬНОСТИ И ВЫЗОВОВ)\n */\n public override effect(fn: () => void | (() => void), label?: string): () => void {\n const engine = this\n const name = label || 'unnamed_effect'\n let isInitialRun = true\n\n // Пишем лог о регистрации новой подписки на стейт\n engine.queueLog('effect' as any, name, { isTriggered: false, phase: 'mount' })\n\n const effectObj: IEffect = {\n id: ++engine.subscriberId,\n label: name,\n cleanups: new Set<() => void>(),\n\n markDirty() {\n engine.pendingEffects.add(effectObj)\n engine.flushEffects()\n },\n\n run() {\n const startTime = typeof performance !== 'undefined' ? performance.now() : 0\n\n const cleanupsToRun = Array.from(effectObj.cleanups) as (() => void)[]\n effectObj.cleanups.clear()\n\n cleanupsToRun.forEach(c => {\n try { c() } catch (e) { console.error('[Reactive Engine:Cleanup Error]', e) }\n })\n\n const prevConsumer = engine.activeConsumer\n engine.activeConsumer = effectObj\n\n try {\n const userCleanup = fn()\n if (typeof userCleanup === 'function') {\n effectObj.cleanups.add(userCleanup)\n }\n } finally {\n engine.activeConsumer = prevConsumer\n\n if (!isInitialRun && startTime && typeof engine.queueLog === 'function') {\n const duration = performance.now() - startTime\n engine.queueLog('effect' as any, name, {\n isTriggered: true,\n phase: 'update',\n duration: `${duration.toFixed(3)}ms`\n })\n }\n isInitialRun = false\n }\n }\n }\n\n engine.allEffects.add(effectObj)\n effectObj.run()\n\n return () => {\n const finalCleanups = Array.from(effectObj.cleanups) as (() => void)[]\n finalCleanups.forEach(c => {\n try { c() } catch (e) { console.error('[Reactive Engine:Dispose Cleanup Error]', e) }\n })\n effectObj.cleanups.clear()\n engine.pendingEffects.delete(effectObj)\n engine.allEffects.delete(effectObj)\n engine.queueLog('effect' as any, name, { phase: 'unmount' })\n }\n }\n\n /**\n * АСИНХРОННЫЙ РЕСУРС (ИНТЕГРИРОВАННЫЙ В HARD-ЛОГГЕР)\n */\n public override resource<T, S = void>(\n fetcher: (source: S, signal: AbortSignal) => Promise<T>,\n source?: { value: S },\n optionsOrName?: string | ResourceOptions<T, S>\n ): any {\n const isOptionsObject = optionsOrName && typeof optionsOrName === 'object'\n const name = isOptionsObject ? (optionsOrName as any).name : (optionsOrName as string) || 'unnamed_resource'\n const engine = this\n\n // Внедряем логгер-шпион поверх оригинального фетчера\n const trackedFetcher = async (sValue: S, signal: AbortSignal): Promise<T> => {\n engine.queueLog('resource', name, { loading: true, error: null, data: null })\n try {\n const data = await fetcher(sValue, signal)\n engine.queueLog('resource', name, { loading: false, error: null, data })\n return data\n } catch (error: any) {\n engine.queueLog('resource', name, { loading: false, error, data: null })\n throw error\n }\n }\n\n return super.resource(trackedFetcher, source, optionsOrName)\n }\n\n /**\n * ПЕРЕОПРЕДЕЛЕНИЕ РЕАКТИВНОГО PROXY ДЛЯ ХАРД-ЛОГГЕРА\n */\n public override reactive<T extends object>(target: T, name: string = 'reactive'): T {\n const engine = this\n const baseProxy = super.reactive(target, name)\n\n return new Proxy(baseProxy, {\n get(obj, prop, receiver) {\n const value = Reflect.get(obj, prop, receiver)\n return (value !== null && typeof value === 'object')\n ? engine.reactive(value, `${name}.${String(prop)}`)\n : value\n },\n set(obj, prop, value, receiver) {\n const old = Reflect.get(obj, prop, receiver)\n if (old === value) return true\n\n engine.queueLog('signal', `${name}.${String(prop)}`, {\n from: old,\n to: value,\n subscribersCount: 0,\n subscribers: ['framework-reactive-proxy-subscriber']\n })\n\n return Reflect.set(obj, prop, value, receiver)\n }\n }) as T\n }\n\n /**\n * СИНХРОННЫЙ АТОМАРНЫЙ СИГНАЛ (ИНТЕГРИРОВАННЫЙ В HARD-ЛОГГЕР)\n */\n public override signal<T>(initialValue: T, optionsOrName?: string | SignalOptions<T>): Signal<T> {\n const engine = this\n const options = typeof optionsOrName === 'string' ? { name: optionsOrName } : optionsOrName || {}\n const name = options.name || 'unnamed_signal'\n\n const originalSignal = super.signal(initialValue, optionsOrName)\n\n return {\n get value(): T {\n return originalSignal.value\n },\n set value(newValue: T) {\n const old = originalSignal.value\n const isPrimitive = newValue === null || (typeof newValue !== 'object' && typeof newValue !== 'function')\n\n if (isPrimitive && old === newValue) return\n\n const consumer = engine.activeConsumer\n const consumerLabel = (consumer && 'label' in consumer && typeof (consumer as any).label === 'string')\n ? (consumer as any).label\n : 'unnamed_effect'\n\n engine.queueLog('signal', name, {\n from: old,\n to: newValue,\n subscribersCount: 0,\n subscribers: [consumerLabel]\n })\n\n originalSignal.value = newValue\n },\n subscribe(cb: (val: T) => void) {\n return originalSignal.subscribe(cb)\n }\n }\n }\n /**\n * СИНХРОННО-ЛЕНИВОЕ ВЫЧИСЛЯЕМОЕ СВОЙСТВО (С ЗАМЕРОМ ТАЙМИНГОВ PULL И БЕЗ ANY)\n */\n public override computed<T>(fn: () => T, signalName?: string): Computed<T> {\n const engine = this\n const name = signalName || 'unnamed_computed'\n const originalComputed = super.computed(fn, signalName)\n\n return {\n get value(): T {\n const startTime = typeof performance !== 'undefined' ? performance.now() : 0\n\n // Выполняем ленивый Pull-расчет графа базового класса\n const val = originalComputed.value\n\n if (startTime) {\n const duration = performance.now() - startTime\n engine.queueLog('computed', name, {\n value: val,\n duration: `${duration.toFixed(3)}ms`\n })\n }\n return val\n },\n subscribe: (cb: (val: T) => void) => originalComputed.subscribe(cb),\n destroy() {\n originalComputed.destroy()\n }\n }\n }\n\n}\n","import { ReactiveEngine } from './core'\n\nexport abstract class AbstractService {\n constructor(protected engine: ReactiveEngine) {\n // Вызываем метод инициализации, который можно переопределить в наследниках\n this.onInit()\n }\n\n // NOTE: Полезные хелперы для сокращения кода\n protected createNumericSignal(val: number, name: string) {\n return this.engine.signal(val, {\n name,\n validate: (v) => typeof v === 'number' && !isNaN(v)\n })\n }\n\n protected createComputed<T>(fn: () => T) {\n return this.engine.computed(fn)\n }\n\n protected createSignal<T>(val: T, name?: string) {\n return this.engine.signal(val, name)\n }\n\n // NOTE: Жизненный цикл: вызывается сразу после создания сервиса.\n // Удобно для инициализации сигналов, которые зависят от engine.\n protected onInit(): void { }\n}\n\nexport const BaseREService = AbstractService\n","import { ReactiveEngine } from './core'\n\nexport abstract class BaseREServiceEnhanced {\n constructor(protected engine: ReactiveEngine) {\n setTimeout(() => this.onInit(), 0)\n }\n\n protected onInit(): void { }\n}\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pravosleva/reactive-engine",
3
- "version": "1.8.1-beta",
3
+ "version": "1.8.3-beta",
4
4
  "engines": {
5
5
  "node": ">=22.20.0"
6
6
  },