UNPKG

synapse-storage

Version:

Набор инструментов для управления состоянием и апи-запросами

162 lines (161 loc) 6.95 kB
import { Observable } from 'rxjs'; import type { IStorage } from '../../core'; import { TypedAction } from '../effects'; import type { ActionExecutionOptions } from './standalone'; /** * Расширенное API для middleware */ export interface EnhancedMiddlewareAPI<T extends Record<string, any>> { getState: () => T | Promise<T>; dispatch: (action: Action) => Promise<any>; storage: IStorage<T>; actions$: Observable<Action>; actions: Record<string, DispatchFunction<any, any>>; watchers: Record<string, WatcherFunction<any>>; findActionByType: (actionType: string) => DispatchFunction<any, any> | undefined; findWatcherByType: (actionType: string) => WatcherFunction<any> | undefined; } /** * Расширенное определение middleware */ export interface EnhancedMiddleware<T extends Record<string, any> = any> { (api: EnhancedMiddlewareAPI<T>): (next: (action: Action) => Promise<any>) => (action: Action) => Promise<any>; } /** * Базовая структура действия */ export interface Action<T = unknown> { type: string; payload?: T; meta?: Record<string, any>; } /** * Параметры для создания действия */ export interface ActionDefinition<TParams, TResult> { /** Тип действия для идентификации в потоке и эффектах. Если не указан — будет выведен из имени поля при финализации `Dispatcher`. */ type?: string; /** Функция, выполняющая действие и возвращающая результат (payload) */ action: (params: TParams) => Promise<TResult> | TResult; /** Дополнительные метаданные (опционально) */ meta?: Record<string, any>; } /** * Определение типа для watcher'а */ interface WatcherDefinition<T, R> { /** Тип watcher'а для идентификации в потоке. Если не указан — будет выведен из имени поля при финализации `Dispatcher`. */ type?: string; selector: (state: T) => R; meta?: Record<string, any>; shouldTrigger?: (prev: R | undefined, current: R) => boolean; notifyAfterSubscribe?: boolean; } /** * Тип для функции watcher */ export interface WatcherFunction<R> { (): Observable<TypedAction<R>>; actionType: string; meta?: Record<string, any>; unsubscribe: VoidFunction; } /** * Расширенная функция диспетчеризации */ export interface DispatchFunction<TParams, TResult> { /** Функция для вызова действия с параметрами */ (params: TParams): Promise<TResult>; /** Тип действия для использования в эффектах */ actionType: string; /** Метаданные действия */ meta?: Record<string, any>; /** Внутренний тип для идентификации */ _type?: 'dispatch' | 'watchers'; } /** * Тип для фабрики создателей действий */ type ActionCreatorFactory = <TParams = void, TResult = void>(config: ActionDefinition<TParams, TResult>, executionOptions?: ActionExecutionOptions<TParams, TResult>) => DispatchFunction<TParams, TResult>; /** * Извлекает тип результата из функции диспетчера */ export type ExtractResultType<T> = T extends DispatchFunction<any, infer R> ? R : never; /** * Извлекает типы из функции настройки действий */ export type ActionsResult<F> = F extends (create: ActionCreatorFactory, storage: any, ...args: any[]) => infer R ? R : Record<string, DispatchFunction<any, any>>; /** * Параметры для Dispatcher */ interface DispatcherOptions<T extends Record<string, any>> { storage: IStorage<T>; middlewares?: EnhancedMiddleware<T>[]; } /** * Внутренний движок диспетчера для интеграции хранилищ с реактивной системой. * * Прежнее имя — `Dispatcher`. Переименован в `DispatcherCore`, поскольку публичным * `Dispatcher` теперь является abstract class-based слой (`dispatcher.base.ts`), * который строится поверх этого движка. * * `TActionsFn` — фантомный слот для вывода форм экшенов (`ActionsResult`); сам движок * его не использует в рантайме. */ export declare class DispatcherCore<T extends Record<string, any>, TActionsFn extends (...args: any[]) => any = (...args: any[]) => Record<string, DispatchFunction<any, any>>> { private actions$; readonly actions: Observable<Action>; dispatch: Record<string, DispatchFunction<any, any>>; watchers: Record<string, WatcherFunction<any>>; private storage; private middlewareFunctions; private dispatchChain; private actionRegistry; private actionParams; private middlewareAPI; /** * Создает новый экземпляр Dispatcher */ constructor(options: DispatcherOptions<T>); /** * Добавляет middleware в цепочку обработки */ use(...middlewares: EnhancedMiddleware<T>[]): 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<TActionsFn>; /** * Находит действие по типу */ findActionByType(actionType: string): DispatchFunction<any, any> | undefined; /** * Находит наблюдатель по типу */ findWatcherByType(actionType: string): WatcherFunction<any> | undefined; /** * Уничтожает dispatcher: отписывает watchers, завершает поток действий, очищает состояние */ destroy(): void; /** * Создает действие */ createAction<TParams = void, TResult = void>(actionConfig: ActionDefinition<TParams, TResult>, executionOptions?: ActionExecutionOptions<TParams, TResult>): DispatchFunction<TParams, TResult>; /** * Создает watcher для отслеживания изменений в хранилище */ createWatcher<R>(config: WatcherDefinition<T, R>): WatcherFunction<R>; } export {};