synapse-storage
Version:
Набор инструментов для управления состоянием и апи-запросами
48 lines (47 loc) • 3.69 kB
TypeScript
import type { IStorage, Selectors } from '../../core';
import type { Dispatcher, Effect, Effects } from '../../reactive';
import type { SyncSynapseModule, SyncSynapseOptions } from './synapse.types';
import { type SyncEffectsContext } from './syncModule';
import type { DependencyInput } from './types';
/** Выводит форму состояния из типа хранилища: `IStorage<T>` → `T`. Даёт вывести `TState` из `storage: () => new MemoryStorage<State>()`. */
type StateOf<TStorage> = TStorage extends IStorage<infer TState> ? TState : never;
/** Что может вернуть фабрика `effects`: инстанс(ы) `Effects`/функции-эффекты, возможно асинхронно (ленивый резолв endpoints). */
type SyncEffectsResult<TState extends Record<string, any>> = Effects<TState, any, any> | Array<Effects<TState, any, any> | Effect> | undefined | Promise<Effects<TState, any, any> | Array<Effects<TState, any, any> | Effect> | undefined>;
/**
* Создаёт ленивый class-based synapse (C-форма): синхронная конструкция ядра
* (`storage`/`dispatcher`/`selectors`) + `dependencies` (гейт старта эффектов) + фабрика `effects`.
* Возвращает {@link SyncSynapseModule} — с синхронным доступом к main-ядру (`.selectors` и т.д.)
* для cross-store DI. `TState` выводится из `storage: () => new MemoryStorage<State>()`.
*
* @example
* ```ts
* export const postsSynapse = createSynapse({
* storage: () => new MemoryStorage<PostsState>({ name: 'posts', initialState }),
* dispatcher: (s) => new PostsDispatcher(s),
* selectors: (s) => new PostsSelectors(s, coreSynapse.selectors), // cross-store DI
* dependencies: [coreSynapse],
* effects: async () => new PostsEffects(await getPostsEndpoints(), coreSynapse.state$),
* })
* ```
*/
export declare function createSynapse<TStorage extends IStorage<any>, TDispatcher extends Dispatcher<StateOf<TStorage>> | undefined = undefined, TSelectors extends Selectors<StateOf<TStorage>> | undefined = undefined>(config: {
storage: () => TStorage;
dispatcher?: (storage: TStorage) => TDispatcher;
selectors?: (storage: TStorage) => TSelectors;
dependencies?: DependencyInput[];
dependencyTimeout?: number;
externalDispatchers?: Record<string, Dispatcher<any>> | ((ctx: SyncEffectsContext<StateOf<TStorage>, TDispatcher, TSelectors>) => Record<string, Dispatcher<any>>);
effects?: (ctx: SyncEffectsContext<StateOf<TStorage>, TDispatcher, TSelectors>) => SyncEffectsResult<StateOf<TStorage>>;
}, options?: SyncSynapseOptions<StateOf<TStorage>, TDispatcher, TSelectors>): SyncSynapseModule<StateOf<TStorage>, TDispatcher, TSelectors>;
export declare namespace createSynapse {
var of: <TState extends Record<string, any>, TDispatcher extends Dispatcher<TState> | undefined = undefined, TSelectors extends Selectors<TState> | undefined = undefined>(config: {
storage: () => IStorage<TState>;
dispatcher?: (storage: IStorage<TState>) => TDispatcher;
selectors?: (storage: IStorage<TState>) => TSelectors;
dependencies?: DependencyInput[];
dependencyTimeout?: number;
externalDispatchers?: Record<string, Dispatcher<any>> | ((ctx: SyncEffectsContext<TState, TDispatcher, TSelectors>) => Record<string, Dispatcher<any>>);
effects?: (ctx: SyncEffectsContext<TState, TDispatcher, TSelectors>) => SyncEffectsResult<TState>;
}, options?: SyncSynapseOptions<TState, TDispatcher, TSelectors>) => SyncSynapseModule<TState, TDispatcher, TSelectors>;
}
export {};