UNPKG

synapse-storage

Version:

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

41 lines (34 loc) 1.85 kB
import { Observable } from "rxjs"; import { distinctUntilChanged, map, shareReplay } from "rxjs/operators"; function toObservable(storage, selector, equals) { const base = new Observable((observer)=>{ observer.next(storage.getStateSync()); const unsubscribe = storage.subscribeToAll(()=>{ observer.next(storage.getStateSync()); }); return ()=>unsubscribe(); }); // refCount: true — критично против утечки: при падении числа подписчиков до нуля // shareReplay отписывается от `base`, снимая регистрацию `storage.subscribeToAll`. // С дефолтным `shareReplay(1)` (refCount: false) источник остаётся подписан навсегда, // и каждый смонтированный поток копит слушателей на сторе до его destroy(). // Безопасно: `base` синхронно эмитит текущее состояние (getStateSync) при каждой // новой подписке, так что поздний подписчик сразу получает актуальное значение. if (!selector) { return base.pipe(shareReplay({ bufferSize: 1, refCount: true })); } return base.pipe(map(selector), distinctUntilChanged(equals), shareReplay({ bufferSize: 1, refCount: true })); } /** * Проверяет, является ли значение хранилищем (IStorageBase) */ function isStorage(value) { return value && typeof value === 'object' && typeof value.subscribeToAll === 'function' && typeof value.getState === 'function'; } export { isStorage, toObservable }; //# sourceMappingURL=toObservable.js.map