synapse-storage
Version:
Набор инструментов для управления состоянием и апи-запросами
162 lines (161 loc) • 6.95 kB
TypeScript
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 {};