import { Observable } from 'rxjs'; import type { IStorage } from '../../core'; import { TypedAction } from '../effects'; import type { ActionExecutionOptions } from './standalone'; /** * Расширенное API для middleware */ export interface EnhancedMiddlewareAPI> { getState: () => T | Promise; dispatch: (action: Action) => Promise; storage: IStorage; actions$: Observable; actions: Record>; watchers: Record>; findActionByType: (actionType: string) => DispatchFunction | undefined; findWatcherByType: (actionType: string) => WatcherFunction | undefined; } /** * Расширенное определение middleware */ export interface EnhancedMiddleware = any> { (api: EnhancedMiddlewareAPI): (next: (action: Action) => Promise) => (action: Action) => Promise; } /** * Базовая структура действия */ export interface Action { type: string; payload?: T; meta?: Record; } /** * Параметры для создания действия */ export interface ActionDefinition { /** Тип действия для идентификации в потоке и эффектах. Если не указан — будет выведен из имени поля при финализации `Dispatcher`. */ type?: string; /** Функция, выполняющая действие и возвращающая результат (payload) */ action: (params: TParams) => Promise | TResult; /** Дополнительные метаданные (опционально) */ meta?: Record; } /** * Определение типа для watcher'а */ interface WatcherDefinition { /** Тип watcher'а для идентификации в потоке. Если не указан — будет выведен из имени поля при финализации `Dispatcher`. */ type?: string; selector: (state: T) => R; meta?: Record; shouldTrigger?: (prev: R | undefined, current: R) => boolean; notifyAfterSubscribe?: boolean; } /** * Тип для функции watcher */ export interface WatcherFunction { (): Observable>; actionType: string; meta?: Record; unsubscribe: VoidFunction; } /** * Расширенная функция диспетчеризации */ export interface DispatchFunction { /** Функция для вызова действия с параметрами */ (params: TParams): Promise; /** Тип действия для использования в эффектах */ actionType: string; /** Метаданные действия */ meta?: Record; /** Внутренний тип для идентификации */ _type?: 'dispatch' | 'watchers'; } /** * Тип для фабрики создателей действий */ type ActionCreatorFactory = (config: ActionDefinition, executionOptions?: ActionExecutionOptions) => DispatchFunction; /** * Извлекает тип результата из функции диспетчера */ export type ExtractResultType = T extends DispatchFunction ? R : never; /** * Извлекает типы из функции настройки действий */ export type ActionsResult = F extends (create: ActionCreatorFactory, storage: any, ...args: any[]) => infer R ? R : Record>; /** * Параметры для Dispatcher */ interface DispatcherOptions> { storage: IStorage; middlewares?: EnhancedMiddleware[]; } /** * Внутренний движок диспетчера для интеграции хранилищ с реактивной системой. * * Прежнее имя — `Dispatcher`. Переименован в `DispatcherCore`, поскольку публичным * `Dispatcher` теперь является abstract class-based слой (`dispatcher.base.ts`), * который строится поверх этого движка. * * `TActionsFn` — фантомный слот для вывода форм экшенов (`ActionsResult`); сам движок * его не использует в рантайме. */ export declare class DispatcherCore, TActionsFn extends (...args: any[]) => any = (...args: any[]) => Record>> { private actions$; readonly actions: Observable; dispatch: Record>; watchers: Record>; private storage; private middlewareFunctions; private dispatchChain; private actionRegistry; private actionParams; private middlewareAPI; /** * Создает новый экземпляр Dispatcher */ constructor(options: DispatcherOptions); /** * Добавляет middleware в цепочку обработки */ use(...middlewares: EnhancedMiddleware[]): this; /** * Base executor: runs the registered action handler or passes through */ private baseExecute; /** * Executes action through middleware chain and emits to actions$ (single emission point) */ private executeChain; /** * Rebuilds the pre-composed middleware chain. Called once on use(), not on every dispatch. */ private rebuildChain; /** * Получает все действия с улучшенной типизацией */ getActions(): ActionsResult; /** * Находит действие по типу */ findActionByType(actionType: string): DispatchFunction | undefined; /** * Находит наблюдатель по типу */ findWatcherByType(actionType: string): WatcherFunction | undefined; /** * Уничтожает dispatcher: отписывает watchers, завершает поток действий, очищает состояние */ destroy(): void; /** * Создает действие */ createAction(actionConfig: ActionDefinition, executionOptions?: ActionExecutionOptions): DispatchFunction; /** * Создает watcher для отслеживания изменений в хранилище */ createWatcher(config: WatcherDefinition): WatcherFunction; } export {};