synapse-storage
Version:
Набор инструментов для управления состоянием и апи-запросами
41 lines (34 loc) • 1.85 kB
JavaScript
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