import { IEventEmitter, ILogger, ISyncStorage, StorageType, SyncDefaultMiddlewares, SyncStorageConfig } from '../storage.interface';
import { StorageKeyType } from '../utils/storage-key';
import { PathSelector, StorageCore } from './storage-core';
/**
 * Базовый класс для синхронных хранилищ (Memory, LocalStorage).
 *
 * Все CRUD-операции выполняются синхронно.
 * Lifecycle (initialize, destroy) остаётся async.
 * subscribeByKey упрощён — нет race condition без async get.
 */
export declare abstract class SyncBaseStorage<T extends Record<string, any>> extends StorageCore<T> implements ISyncStorage<T> {
    protected readonly config: SyncStorageConfig<T>;
    abstract readonly type: StorageType;
    /** Sync-хранилище: доступно синхронное чтение кэша (getStateSync). */
    readonly isSync = true;
    private middlewareModule;
    private initializedMiddlewares;
    private selectorPathCache;
    constructor(config: SyncStorageConfig<T>, eventEmitter?: IEventEmitter, logger?: ILogger);
    protected abstract doGet(key: StorageKeyType): any;
    protected abstract doSet(key: StorageKeyType, value: any): void;
    protected abstract doUpdate(updates: Array<{
        key: StorageKeyType;
        value: any;
    }>): void;
    protected abstract doRemove(key: StorageKeyType): boolean;
    protected abstract doClear(): void;
    protected abstract doKeys(): string[];
    protected abstract doHas(key: StorageKeyType): boolean;
    /** Lifecycle — всегда async */
    protected abstract doInitialize(): Promise<this>;
    /** Lifecycle — всегда async */
    protected abstract doDestroy(): Promise<void>;
    protected performInitialize(): Promise<void>;
    /**
     * Синхронная инициализация sync-хранилища. Вся работа Memory/LocalStorage
     * (`initializeMiddlewares` + `initializeWithMiddlewares`) синхронна — здесь она
     * выполняется без `await`, чтобы {@link StorageCore.initializeSync} мог довести
     * хранилище до `READY` в пределах одного тика (SSR sync-shell).
     */
    protected performInitializeSync(): void;
    /**
     * Дефолт для `config.clearOnDestroy`, если он не задан.
     * Memory: `true` (эфемерное). LocalStorage переопределяет на `false` (персистентное).
     */
    protected get clearOnDestroyDefault(): boolean;
    protected performCleanup(): Promise<void>;
    protected initializeMiddlewares(): void;
    protected getDefaultMiddleware(): SyncDefaultMiddlewares;
    protected initializeWithMiddlewares(): void;
    /** Читает сохранённую версию схемы. По умолчанию `undefined` (эфемерные хранилища). */
    protected readPersistedVersion(): number | undefined;
    /** Сохраняет версию схемы рядом с данными. По умолчанию no-op (эфемерные хранилища). */
    protected writePersistedVersion(_version: number): void;
    /** Удаляет сохранённую версию схемы (вызывается при destroy с `clearOnDestroy`). */
    protected clearPersistedVersion(): void;
    private getRawState;
    get<R>(key: StorageKeyType): R | undefined;
    set<R>(key: StorageKeyType, value: R): void;
    update(updater: (state: T) => void): void;
    remove(key: StorageKeyType): void;
    clear(): void;
    reset(): void;
    /**
     * SSR-гидрация: заменяет всё состояние переданным снапшотом. Намеренно НЕ требует
     * `ready()` — типичный сценарий вызвать её до `initialize()`, чтобы инициализация
     * не перезатёрла серверное состояние `initialState`-ом (см. `initializeWithMiddlewares`).
     */
    hydrate(state: T): void;
    /** Уведомляет подписчиков о замене состояния гидрацией (no-op до initialize/без подписок). */
    private notifyHydration;
    keys(): string[];
    has(key: StorageKeyType): boolean;
    getState(): T;
    /**
     * Sync-версия subscribeByKey.
     * Нет race condition (get() синхронный) → не нужен keyVersions tracking.
     */
    protected subscribeByKey(key: string, callback: (value: any) => void): VoidFunction;
    protected subscribeBySelector<R>(pathSelector: PathSelector<T, R>, callback: (value: R) => void): VoidFunction;
}
