UNPKG

ngrx-run

Version:

Return side-effects as data from your NgRx reducers

92 lines 14.3 kB
import { Store } from '@ngrx/store'; import { Subscription } from 'rxjs'; import { addEffectDescriptions } from './effect-description'; import { hasDependencies, isObservableEffect, isObservableOperand, isPromiseEffect, isPromiseOperand, 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)) { const [state, ...effects] = slicedState; effects.map(effect => handleStateWithEffect(effect, runtime, injector.get(Store), injector)); return addEffectDescriptions(state, effects); } else { return slicedState; } } } function isStateWithEffects(state) { return state && state[1] && state[1].__isEffect === true; } function handleStateWithEffect(effect, runtime, store, injector) { let operand; const deps = hasDependencies(effect) ? effect.using.map((dep) => injector.get(dep)) : []; try { // @ts-ignore operand = effect.call(...deps); } catch (err) { if (effect.error) { try { store.dispatch(effect.error(err)); } catch (innerError) { console.error(`Unhandled error occurred when creating error action for effect "${effect.type}"`, innerError); } } else { console.error(`Unhandled error occurred when creating operation for effect "${effect.type}"`, err); } } if (isObservableEffect(effect, operand) && isObservableOperand(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.subscribed) { store.dispatch(effect.subscribed(token)); } } else if (isPromiseEffect(effect, operand) && isPromiseOperand(operand)) { operand.then((value) => effect.complete && store.dispatch(effect.complete(value)), (err) => effect.error && store.dispatch(effect.error(err))); } else if (isUnsubscriptionEffect(effect, operand)) { handleUnsubscribe(operand, effect, runtime, store); } else { const complete = effect.complete; if (complete) { store.dispatch(complete()); } } } 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.complete) { store.dispatch(effect.complete()); } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGFuZGxlLWVmZmVjdHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9tb2R1bGVzL2xpYi9zcmMvaGFuZGxlLWVmZmVjdHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFDLEtBQUssRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUNsQyxPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0sTUFBTSxDQUFDO0FBRWxDLE9BQU8sRUFBQyxxQkFBcUIsRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBQzNELE9BQU8sRUFHTCxlQUFlLEVBRWYsa0JBQWtCLEVBQ2xCLG1CQUFtQixFQUNuQixlQUFlLEVBQ2YsZ0JBQWdCLEVBQ2hCLHNCQUFzQixHQUl2QixNQUFNLFVBQVUsQ0FBQztBQU1sQixNQUFNLFVBQVUsYUFBYSxDQUMzQixRQUFrQixFQUNsQixPQUFnQjtJQUVoQixPQUFPLENBQUMsT0FBTyxFQUFFLEVBQUU7UUFDakIsSUFBSSxRQUFRLEdBQU0sa0JBQWtCLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDOUMsaUNBQWlDO1FBQ2pDLEtBQUssTUFBTSxHQUFHLElBQUksUUFBUSxFQUFFO1lBQzFCLFFBQVEsbUNBQU8sUUFBUSxLQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsa0JBQWtCLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUMsQ0FBQztTQUNwRTtRQUNELE9BQU8sUUFBUSxDQUFDO0lBQ2xCLENBQUMsQ0FBQztJQUVGLFNBQVMsa0JBQWtCLENBQUksV0FBNkI7UUFDMUQsSUFBSSxrQkFBa0IsQ0FBQyxXQUFXLENBQUMsRUFBRTtZQUNuQyxNQUFNLENBQUMsS0FBSyxFQUFFLEdBQUcsT0FBTyxDQUFDLEdBQUcsV0FBVyxDQUFDO1lBQ3hDLE9BQU8sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxxQkFBcUIsQ0FBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLFFBQVEsQ0FBQyxHQUFHLENBQUMsS0FB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bkIsS0FBSyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztLQUNuQztBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0luamVjdG9yfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7U3RvcmV9IGZyb20gJ0BuZ3J4L3N0b3JlJztcbmltcG9ydCB7U3Vic2NyaXB0aW9ufSBmcm9tICdyeGpzJztcbmltcG9ydCB7UmVkdWNlclJlc3VsdH0gZnJvbSAnLi9yZWR1Y2VyJztcbmltcG9ydCB7YWRkRWZmZWN0RGVzY3JpcHRpb25zfSBmcm9tICcuL2VmZmVjdC1kZXNjcmlwdGlvbic7XG5pbXBvcnQge1xuICBDYW5jZWxsYWJsZSxcbiAgRGVwZW5kZW5jaWVzLFxuICBoYXNEZXBlbmRlbmNpZXMsXG4gIEltbWVkaWF0ZUVmZmVjdCxcbiAgaXNPYnNlcnZhYmxlRWZmZWN0LFxuICBpc09ic2VydmFibGVPcGVyYW5kLFxuICBpc1Byb21pc2VFZmZlY3QsXG4gIGlzUHJvbWlzZU9wZXJhbmQsXG4gIGlzVW5zdWJzY3JpcHRpb25FZmZlY3QsXG4gIE9wZXJhbmQsXG4gIFN1YnNjcmlwdGlvblRva2VuLFxuICBVbnN1YnNjcmliZU9wZXJhdGlvbixcbn0gZnJvbSAnLi9lZmZlY3QnO1xuaW1wb3J0IHtFZmZlY3RDb25maWd9IGZyb20gJy4vZWZmZWN0LWNvbmZpZyc7XG5pbXBvcnQge1N0YXRlV2l0aEVmZmVjdH0gZnJvbSAnLi9zdGF0ZS13aXRoLWVmZmVjdCc7XG5cbmV4cG9ydCB0eXBlIFJ1bnRpbWUgPSBNYXA8U3Vic2NyaXB0aW9uVG9rZW4sIENhbmNlbGxhYmxlPGFueT4+O1xuXG5leHBvcnQgZnVuY3Rpb24gaGFuZGxlRWZmZWN0czxUPihcbiAgaW5qZWN0b3I6IEluamVjdG9yLFxuICBydW50aW1lOiBSdW50aW1lXG4pOiAocmVkdWNlZDogUmVkdWNlclJlc3VsdDxUPikgPT4gVCB7XG4gIHJldHVybiAocmVkdWNlZCkgPT4ge1xuICAgIGxldCBuZXdTdGF0ZTogVCA9IGhhbmRsZVNsaWNlRWZmZWN0cyhyZWR1Y2VkKTtcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6Zm9yaW5cbiAgICBmb3IgKGNvbnN0IGtleSBpbiBuZXdTdGF0ZSkge1xuICAgICAgbmV3U3RhdGUgPSB7Li4ubmV3U3RhdGUsIFtrZXldOiBoYW5kbGVTbGljZUVmZmVjdHMobmV3U3RhdGVba2V5XSl9O1xuICAgIH1cbiAgICByZXR1cm4gbmV3U3RhdGU7XG4gIH07XG5cbiAgZnVuY3Rpb24gaGFuZGxlU2xpY2VFZmZlY3RzPFM+KHNsaWNlZFN0YXRlOiBSZWR1Y2VyUmVzdWx0PFM+KTogUyB7XG4gICAgaWYgKGlzU3RhdGVXaXRoRWZmZWN0cyhzbGljZWRTdGF0ZSkpIHtcbiAgICAgIGNvbnN0IFtzdGF0ZSwgLi4uZWZmZWN0c10gPSBzbGljZWRTdGF0ZTtcbiAgICAgIGVmZmVjdHMubWFwKGVmZmVjdCA9PiBoYW5kbGVTdGF0ZVdpdGhFZmZlY3QoZWZmZWN0LCBydW50aW1lLCBpbmplY3Rvci5nZXQoU3RvcmUpLCBpbmplY3RvcikpO1xuICAgICAgcmV0dXJuIGFkZEVmZmVjdERlc2NyaXB0aW9ucyhzdGF0ZSwgZWZmZWN0cyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBzbGljZWRTdGF0ZSBhcyBTO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBpc1N0YXRlV2l0aEVmZmVjdHMoXG4gIHN0YXRlOiBhbnkgfCBbYW55LCBFZmZlY3RDb25maWc8YW55LCBhbnk+XVxuKTogc3RhdGUgaXMgU3RhdGVXaXRoRWZmZWN0PGFueSwgYW55LCBhbnk+IHtcbiAgcmV0dXJuIHN0YXRlICYmIHN0YXRlWzFdICYmIHN0YXRlWzFdLl9faXNFZmZlY3QgPT09IHRydWU7XG59XG5cbmZ1bmN0aW9uIGhhbmRsZVN0YXRlV2l0aEVmZmVjdDxURGVwcyBleHRlbmRzIERlcGVuZGVuY2llcywgVFJlc3VsdD4oXG4gIGVmZmVjdDogRWZmZWN0Q29uZmlnPFREZXBzLCBUUmVzdWx0PixcbiAgcnVudGltZTogUnVudGltZSxcbiAgc3RvcmU6IFN0b3JlLFxuICBpbmplY3RvcjogSW5qZWN0b3Jcbik6IHZvaWQge1xuICBsZXQgb3BlcmFuZDogT3BlcmFuZDxUUmVzdWx0PjtcbiAgY29uc3QgZGVwcyA9IGhhc0RlcGVuZGVuY2llcyhlZmZlY3QpXG4gICAgPyBlZmZlY3QudXNpbmcubWFwKChkZXApID0+IGluamVjdG9yLmdldChkZXApKVxuICAgIDogW107XG4gIHRyeSB7XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIG9wZXJhbmQgPSBlZmZlY3QuY2FsbCguLi5kZXBzKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgaWYgKGVmZmVjdC5lcnJvcikge1xuICAgICAgdHJ5IHtcbiAgICAgICAgc3RvcmUuZGlzcGF0Y2goZWZmZWN0LmVycm9yKGVycikpO1xuICAgICAgfSBjYXRjaCAoaW5uZXJFcnJvcikge1xuICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgIGBVbmhhbmRsZWQgZXJyb3Igb2NjdXJyZWQgd2hlbiBjcmVhdGluZyBlcnJvciBhY3Rpb24gZm9yIGVmZmVjdCBcIiR7ZWZmZWN0LnR5cGV9XCJgLFxuICAgICAgICAgIGlubmVyRXJyb3JcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgYFVuaGFuZGxlZCBlcnJvciBvY2N1cnJlZCB3aGVuIGNyZWF0aW5nIG9wZXJhdGlvbiBmb3IgZWZmZWN0IFwiJHtlZmZlY3QudHlwZX1cImAsXG4gICAgICAgIGVyclxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBpZiAoaXNPYnNlcnZhYmxlRWZmZWN0KGVmZmVjdCwgb3BlcmFuZCkgJiYgaXNPYnNlcnZhYmxlT3BlcmFuZChvcGVyYW5kKSkge1xuICAgIGNvbnN0IHRva2VuID0gKE1hdGgubWF4KC4uLnJ1bnRpbWUua2V5cygpKSArIDEpIGFzIFN1YnNjcmlwdGlvblRva2VuO1xuICAgIGNvbnN0IHN1YnNjcmlwdGlvbiA9IG9wZXJhbmQuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6ICh2YWx1ZSkgPT4gZWZmZWN0Lm5leHQgJiYgc3RvcmUuZGlzcGF0Y2goZWZmZWN0Lm5leHQodmFsdWUpKSxcbiAgICAgIGVycm9yOiAoZXJyKSA9PiBlZmZlY3QuZXJyb3IgJiYgc3RvcmUuZGlzcGF0Y2goZWZmZWN0LmVycm9yKGVycikpLFxuICAgICAgY29tcGxldGU6ICgpID0+IGVmZmVjdC5jb21wbGV0ZSAmJiBzdG9yZS5kaXNwYXRjaChlZmZlY3QuY29tcGxldGUoKSlcbiAgICB9KTtcbiAgICBydW50aW1lLnNldCh0b2tlbiwgc3Vic2NyaXB0aW9uKTtcbiAgICBpZiAoZWZmZWN0LnN1YnNjcmliZWQpIHtcbiAgICAgIHN0b3JlLmRpc3BhdGNoKGVmZmVjdC5zdWJzY3JpYmVkKHRva2VuKSk7XG4gICAgfVxuICB9IGVsc2UgaWYgKGlzUHJvbWlzZUVmZmVjdChlZmZlY3QsIG9wZXJhbmQpICYmIGlzUHJvbWlzZU9wZXJhbmQob3BlcmFuZCkpIHtcbiAgICBvcGVyYW5kLnRoZW4oXG4gICAgICAodmFsdWUpID0+IGVmZmVjdC5jb21wbGV0ZSAmJiBzdG9yZS5kaXNwYXRjaChlZmZlY3QuY29tcGxldGUodmFsdWUpKSxcbiAgICAgIChlcnIpID0+IGVmZmVjdC5lcnJvciAmJiBzdG9yZS5kaXNwYXRjaChlZmZlY3QuZXJyb3IoZXJyKSlcbiAgICApO1xuICB9IGVsc2UgaWYgKGlzVW5zdWJzY3JpcHRpb25FZmZlY3QoZWZmZWN0LCBvcGVyYW5kKSkge1xuICAgIGhhbmRsZVVuc3Vic2NyaWJlKG9wZXJhbmQgYXMgVW5zdWJzY3JpYmVPcGVyYXRpb24sIGVmZmVjdCwgcnVudGltZSwgc3RvcmUpO1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IGNvbXBsZXRlID0gKGVmZmVjdCBhcyBJbW1lZGlhdGVFZmZlY3Q8YW55PikuY29tcGxldGU7XG4gICAgaWYgKGNvbXBsZXRlKSB7XG4gICAgICBzdG9yZS5kaXNwYXRjaChjb21wbGV0ZSgpKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gaGFuZGxlVW5zdWJzY3JpYmUoXG4gIG9wZXJhdGlvbjogVW5zdWJzY3JpYmVPcGVyYXRpb24sXG4gIGVmZmVjdDogSW1tZWRpYXRlRWZmZWN0PGFueT4sXG4gIHJ1bnRpbWU6IFJ1bnRpbWUsXG4gIHN0b3JlOiBTdG9yZVxuKTogdm9pZCB7XG4gIGNvbnN0IGNhbmNlbGxhYmxlID0gcnVudGltZS5nZXQob3BlcmF0aW9uLnN1YnNjcmlwdGlvblRva2VuKTtcbiAgaWYgKGNhbmNlbGxhYmxlIGluc3RhbmNlb2YgU3Vic2NyaXB0aW9uKSB7XG4gICAgcnVudGltZS5kZWxldGUob3BlcmF0aW9uLnN1YnNjcmlwdGlvblRva2VuKTtcbiAgICBjYW5jZWxsYWJsZS51bnN1YnNjcmliZSgpO1xuICB9IGVsc2UgaWYgKGNhbmNlbGxhYmxlIGluc3RhbmNlb2YgQWJvcnRDb250cm9sbGVyKSB7XG4gICAgcnVudGltZS5kZWxldGUob3BlcmF0aW9uLnN1YnNjcmlwdGlvblRva2VuKTtcbiAgICBjYW5jZWxsYWJsZS5hYm9ydCgpO1xuICB9IGVsc2Uge1xuICAgIGNvbnNvbGUud2FybihcbiAgICAgIGBTdWJzY3JpcHRpb25Ub2tlbiAke29wZXJhdGlvbi5zdWJzY3JpcHRpb25Ub2tlbn0gbm90IHJlY29nbml6ZWQuIERpZCB5b3UgY2FuY2VsIHRoaXMgYWxyZWFkeT9gXG4gICAgKTtcbiAgfVxuICBpZiAoZWZmZWN0LmNvbXBsZXRlKSB7XG4gICAgc3RvcmUuZGlzcGF0Y2goZWZmZWN0LmNvbXBsZXRlKCkpO1xuICB9XG59XG4iXX0=