UNPKG

ngrx-reducer-effects

Version:

Return side-effects as data from your NgRx reducers

65 lines 11.5 kB
import { Store } from '@ngrx/store'; import { Subscription } from 'rxjs'; import { addEffectDescriptions } from './effect-description'; import { isObservableEffect, isPromiseEffect, isUnsubscriptionEffect } from './effect'; export function handleEffects(injector, runtime) { return (reduced) => { let newState = handleSliceEffects(reduced); // tslint:disable-next-line:forin for (const key in newState) { newState = Object.assign(Object.assign({}, newState), { [key]: handleSliceEffects(newState[key]) }); } return newState; }; function handleSliceEffects(slicedState) { if (isStateWithEffects(slicedState)) { slicedState.effects.forEach((effect) => handleStateWithEffect(effect, runtime, injector.get(Store), injector)); return addEffectDescriptions(slicedState.state, slicedState.effects); } else { return slicedState; } } } function isStateWithEffects(state) { return (state === null || state === void 0 ? void 0 : state.__brand) === 'StateWithEffects'; } function handleStateWithEffect(effect, runtime, store, injector) { const operand = effect.operation(injector.get.bind(injector)); if (isObservableEffect(effect, operand)) { const token = (Math.max(...runtime.keys()) + 1); const subscription = operand.subscribe({ next: (value) => effect.next && store.dispatch(effect.next(value)), error: (err) => effect.error && store.dispatch(effect.error(err)), complete: () => effect.complete && store.dispatch(effect.complete()) }); runtime.set(token, subscription); if (effect.subscribe) { store.dispatch(effect.subscribe(token)); } } else if (isPromiseEffect(effect, operand)) { operand.then((value) => effect.resolve && store.dispatch(effect.resolve(value)), (err) => effect.reject && store.dispatch(effect.reject(err))); } else if (isUnsubscriptionEffect(effect, operand)) { handleUnsubscribe(operand, effect, runtime, store); } } function handleUnsubscribe(operation, effect, runtime, store) { const cancellable = runtime.get(operation.subscriptionToken); if (cancellable instanceof Subscription) { runtime.delete(operation.subscriptionToken); cancellable.unsubscribe(); } else if (cancellable instanceof AbortController) { runtime.delete(operation.subscriptionToken); cancellable.abort(); } else { console.warn(`SubscriptionToken ${operation.subscriptionToken} not recognized. Did you cancel this already?`); } if (effect.unsubscribe) { store.dispatch(effect.unsubscribe(0)); } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGFuZGxlLWVmZmVjdHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9tb2R1bGVzL2xpYi9zcmMvaGFuZGxlLWVmZmVjdHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUNwQyxPQUFPLEVBQWMsWUFBWSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRWhELE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQzdELE9BQU8sRUFHTCxrQkFBa0IsRUFDbEIsZUFBZSxFQUNmLHNCQUFzQixFQUd2QixNQUFNLFVBQVUsQ0FBQztBQU1sQixNQUFNLFVBQVUsYUFBYSxDQUFJLFFBQWtCLEVBQUUsT0FBZ0I7SUFDbkUsT0FBTyxDQUFDLE9BQU8sRUFBRSxFQUFFO1FBQ2pCLElBQUksUUFBUSxHQUFNLGtCQUFrQixDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzlDLGlDQUFpQztRQUNqQyxLQUFLLE1BQU0sR0FBRyxJQUFJLFFBQVEsRUFBRTtZQUMxQixRQUFRLG1DQUFRLFFBQVEsS0FBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLGtCQUFrQixDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFFLENBQUM7U0FDdEU7UUFDRCxPQUFPLFFBQVEsQ0FBQztJQUNsQixDQUFDLENBQUM7SUFFRixTQUFTLGtCQUFrQixDQUFJLFdBQTZCO1FBQzFELElBQUksa0JBQWtCLENBQUMsV0FBVyxDQUFDLEVBQUU7WUFDbkMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLHFCQUFxQixDQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsUUFBUSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDO1lBQy9HLE9BQU8scUJBQXFCLENBQUMsV0FBVyxDQUFDLEtBQUssRUFBRSxXQUFX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QUssRUFBRSxDQUFDO0tBQ3JCO1NBQU07UUFDTCxPQUFPLENBQUMsSUFBSSxDQUFDLHFCQUFxQixTQUFTLENBQUMsaUJBQWlCLCtDQUErQyxDQUFDLENBQUM7S0FDL0c7SUFDRCxJQUFJLE1BQU0sQ0FBQyxXQUFXLEVBQUU7UUFDdEIsS0FBSyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQXNCLENBQUMsQ0FBQyxDQUFDO0tBQzVEO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdG9yIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IFN0b3JlIH0gZnJvbSAnQG5ncngvc3RvcmUnO1xyXG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgUmVkdWNlclJlc3VsdCB9IGZyb20gJy4vcmVkdWNlcic7XHJcbmltcG9ydCB7IGFkZEVmZmVjdERlc2NyaXB0aW9ucyB9IGZyb20gJy4vZWZmZWN0LWRlc2NyaXB0aW9uJztcclxuaW1wb3J0IHtcclxuICBDYW5jZWxsYWJsZSxcclxuICBDYW5jZWxsYXRpb25Ub2tlbixcclxuICBpc09ic2VydmFibGVFZmZlY3QsXHJcbiAgaXNQcm9taXNlRWZmZWN0LFxyXG4gIGlzVW5zdWJzY3JpcHRpb25FZmZlY3QsIFN1YnNjcmlwdGlvblRva2VuLFxyXG4gIFVuc3Vic2NyaWJlT3BlcmF0aW9uLFxyXG4gIFVuc3Vic2NyaXB0aW9uRWZmZWN0XHJcbn0gZnJvbSAnLi9lZmZlY3QnO1xyXG5pbXBvcnQge0VmZmVjdENvbmZpZ30gZnJvbSAnLi9lZmZlY3QtY29uZmlnJztcclxuaW1wb3J0IHtTdGF0ZVdpdGhFZmZlY3RzfSBmcm9tICcuL3N0YXRlLXdpdGgtZWZmZWN0cyc7XHJcblxyXG5leHBvcnQgdHlwZSBSdW50aW1lID0gTWFwPFN1YnNjcmlwdGlvblRva2VuLCBDYW5jZWxsYWJsZTxhbnk+PjtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBoYW5kbGVFZmZlY3RzPFQ+KGluamVjdG9yOiBJbmplY3RvciwgcnVudGltZTogUnVudGltZSk6IChyZWR1Y2VkOiBSZWR1Y2VyUmVzdWx0PFQ+KSA9PiBUIHtcclxuICByZXR1cm4gKHJlZHVjZWQpID0+IHtcclxuICAgIGxldCBuZXdTdGF0ZTogVCA9IGhhbmRsZVNsaWNlRWZmZWN0cyhyZWR1Y2VkKTtcclxuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpmb3JpblxyXG4gICAgZm9yIChjb25zdCBrZXkgaW4gbmV3U3RhdGUpIHtcclxuICAgICAgbmV3U3RhdGUgPSB7IC4uLm5ld1N0YXRlLCBba2V5XTogaGFuZGxlU2xpY2VFZmZlY3RzKG5ld1N0YXRlW2tleV0pIH07XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbmV3U3RhdGU7XHJcbiAgfTtcclxuXHJcbiAgZnVuY3Rpb24gaGFuZGxlU2xpY2VFZmZlY3RzPFM+KHNsaWNlZFN0YXRlOiBSZWR1Y2VyUmVzdWx0PFM+KTogUyB7XHJcbiAgICBpZiAoaXNTdGF0ZVdpdGhFZmZlY3RzKHNsaWNlZFN0YXRlKSkge1xyXG4gICAgICBzbGljZWRTdGF0ZS5lZmZlY3RzLmZvckVhY2goKGVmZmVjdCkgPT4gaGFuZGxlU3RhdGVXaXRoRWZmZWN0KGVmZmVjdCwgcnVudGltZSwgaW5qZWN0b3IuZ2V0KFN0b3JlKSwgaW5qZWN0b3IpKTtcclxuICAgICAgcmV0dXJuIGFkZEVmZmVjdERlc2NyaXB0aW9ucyhzbGljZWRTdGF0ZS5zdGF0ZSwgc2xpY2VkU3RhdGUuZWZmZWN0cyk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gc2xpY2VkU3RhdGU7XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcblxyXG5mdW5jdGlvbiBpc1N0YXRlV2l0aEVmZmVjdHMoc3RhdGU6IGFueSk6IHN0YXRlIGlzIFN0YXRlV2l0aEVmZmVjdHM8YW55LCBhbnk+IHtcclxuICByZXR1cm4gc3RhdGU/Ll9fYnJhbmQgPT09ICdTdGF0ZVdpdGhFZmZlY3RzJztcclxufVxyXG5cclxuZnVuY3Rpb24gaGFuZGxlU3RhdGVXaXRoRWZmZWN0PFRFZmZlY3Q+KGVmZmVjdDogRWZmZWN0Q29uZmlnPFRFZmZlY3Q+LCBydW50aW1lOiBSdW50aW1lLCBzdG9yZTogU3RvcmUsIGluamVjdG9yOiBJbmplY3Rvcik6IHZvaWQge1xyXG4gIGNvbnN0IG9wZXJhbmQgPSBlZmZlY3Qub3BlcmF0aW9uKGluamVjdG9yLmdldC5iaW5kKGluamVjdG9yKSk7XHJcbiAgaWYgKGlzT2JzZXJ2YWJsZUVmZmVjdChlZmZlY3QsIG9wZXJhbmQpKSB7XHJcbiAgICBjb25zdCB0b2tlbiA9IChNYXRoLm1heCguLi5ydW50aW1lLmtleXMoKSkgKyAxKSBhcyBTdWJzY3JpcHRpb25Ub2tlbjtcclxuXHJcbiAgICBjb25zdCBzdWJzY3JpcHRpb24gPSAob3BlcmFuZCBhcyBPYnNlcnZhYmxlPFRFZmZlY3Q+KS5zdWJzY3JpYmUoe1xyXG4gICAgICBuZXh0OiAodmFsdWUpID0+IGVmZmVjdC5uZXh0ICYmIHN0b3JlLmRpc3BhdGNoKGVmZmVjdC5uZXh0KHZhbHVlKSksXHJcbiAgICAgIGVycm9yOiAoZXJyKSA9PiBlZmZlY3QuZXJyb3IgJiYgc3RvcmUuZGlzcGF0Y2goZWZmZWN0LmVycm9yKGVycikpLFxyXG4gICAgICBjb21wbGV0ZTogKCkgPT4gZWZmZWN0LmNvbXBsZXRlICYmIHN0b3JlLmRpc3BhdGNoKGVmZmVjdC5jb21wbGV0ZSgpKVxyXG4gICAgfSk7XHJcbiAgICBydW50aW1lLnNldCh0b2tlbiwgc3Vic2NyaXB0aW9uKTtcclxuICAgIGlmIChlZmZlY3Quc3Vic2NyaWJlKSB7XHJcbiAgICAgIHN0b3JlLmRpc3BhdGNoKGVmZmVjdC5zdWJzY3JpYmUodG9rZW4pKTtcclxuICAgIH1cclxuICB9IGVsc2UgaWYgKGlzUHJvbWlzZUVmZmVjdChlZmZlY3QsIG9wZXJhbmQpKSB7XHJcbiAgICAob3BlcmFuZCBhcyBQcm9taXNlPFRFZmZlY3Q+KS50aGVuKFxyXG4gICAgICAodmFsdWUpID0+IGVmZmVjdC5yZXNvbHZlICYmIHN0b3JlLmRpc3BhdGNoKGVmZmVjdC5yZXNvbHZlKHZhbHVlKSksXHJcbiAgICAgIChlcnIpID0+IGVmZmVjdC5yZWplY3QgJiYgc3RvcmUuZGlzcGF0Y2goZWZmZWN0LnJlamVjdChlcnIpKVxyXG4gICAgKTtcclxuICB9IGVsc2UgaWYgKGlzVW5zdWJzY3JpcHRpb25FZmZlY3QoZWZmZWN0LCBvcGVyYW5kKSkge1xyXG4gICAgaGFuZGxlVW5zdWJzY3JpYmUob3BlcmFuZCBhcyBVbnN1YnNjcmliZU9wZXJhdGlvbiwgZWZmZWN0LCBydW50aW1lLCBzdG9yZSk7XHJcbiAgfVxyXG59XHJcblxyXG5mdW5jdGlvbiBoYW5kbGVVbnN1YnNjcmliZShcclxuICBvcGVyYXRpb246IFVuc3Vic2NyaWJlT3BlcmF0aW9uLFxyXG4gIGVmZmVjdDogVW5zdWJzY3JpcHRpb25FZmZlY3Q8YW55PixcclxuICBydW50aW1lOiBSdW50aW1lLFxyXG4gIHN0b3JlOiBTdG9yZVxyXG4pOiB2b2lkIHtcclxuICBjb25zdCBjYW5jZWxsYWJsZSA9IHJ1bnRpbWUuZ2V0KG9wZXJhdGlvbi5zdWJzY3JpcHRpb25Ub2tlbik7XHJcbiAgaWYgKGNhbmNlbGxhYmxlIGluc3RhbmNlb2YgU3Vic2NyaXB0aW9uKSB7XHJcbiAgICBydW50aW1lLmRlbGV0ZShvcGVyYXRpb24uc3Vic2NyaXB0aW9uVG9rZW4pO1xyXG4gICAgY2FuY2VsbGFibGUudW5zdWJzY3JpYmUoKTtcclxuICB9IGVsc2UgaWYgKGNhbmNlbGxhYmxlIGluc3RhbmNlb2YgQWJvcnRDb250cm9sbGVyKSB7XHJcbiAgICBydW50aW1lLmRlbGV0ZShvcGVyYXRpb24uc3Vic2NyaXB0aW9uVG9rZW4pO1xyXG4gICAgY2FuY2VsbGFibGUuYWJvcnQoKTtcclxuICB9IGVsc2Uge1xyXG4gICAgY29uc29sZS53YXJuKGBTdWJzY3JpcHRpb25Ub2tlbiAke29wZXJhdGlvbi5zdWJzY3JpcHRpb25Ub2tlbn0gbm90IHJlY29nbml6ZWQuIERpZCB5b3UgY2FuY2VsIHRoaXMgYWxyZWFkeT9gKTtcclxuICB9XHJcbiAgaWYgKGVmZmVjdC51bnN1YnNjcmliZSkge1xyXG4gICAgc3RvcmUuZGlzcGF0Y2goZWZmZWN0LnVuc3Vic2NyaWJlKDAgYXMgQ2FuY2VsbGF0aW9uVG9rZW4pKTtcclxuICB9XHJcbn1cclxuIl19