synapse-storage
Version:
Набор инструментов для управления состоянием и апи-запросами
37 lines (30 loc) • 1.58 kB
JavaScript
import { VALUE_NOT_CHANGED } from "../utils/middleware-module.js";
import { shallowEqual } from "../utils/state-diff.util.js";
const shallowCompareMiddleware = (options = {})=>{
const { comparator = shallowEqual, segments = [] } = options;
// Кэш последних значений
const valueCache = new Map();
return {
name: 'shallow-compare',
setup: (api)=>{},
reducer: (api)=>(next)=>async (action)=>{
// Пропускаем действия кроме set
if (action.type !== 'set' || segments.length && !segments.includes(action.metadata?.segment ?? 'default')) {
return next(action);
}
const cacheKey = action.key;
const prevValue = valueCache.get(cacheKey);
const nextValue = action.value;
// Если значения равны, возвращаем sentinel — не модифицируем значение
if (prevValue !== undefined && comparator(prevValue, nextValue)) {
return VALUE_NOT_CHANGED;
}
// Иначе обновляем кэш и продолжаем
const result = await next(action);
valueCache.set(cacheKey, result !== undefined ? result : nextValue);
return result;
}
};
};
export { shallowCompareMiddleware };
//# sourceMappingURL=storage-shallow-compare.middleware.js.map