UNPKG

@datorama/akita

Version:

State Management Tailored-Made for JS Applications

158 lines 10.6 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { BehaviorSubject, of, Subject } from 'rxjs'; import { logAction } from './actions'; import { tap } from 'rxjs/operators'; // @internal /** @type {?} */ const transactionFinished = new Subject(); // @internal /** @type {?} */ const transactionInProcess = new BehaviorSubject(false); // @internal /** @type {?} */ export const transactionManager = { activeTransactions: 0, batchTransaction: null }; // @internal /** * @return {?} */ export function startBatch() { if (!isTransactionInProcess()) { transactionManager.batchTransaction = new Subject(); } transactionManager.activeTransactions++; transactionInProcess.next(true); } // @internal /** * @return {?} */ export function endBatch() { if (--transactionManager.activeTransactions === 0) { transactionManager.batchTransaction.next(true); transactionManager.batchTransaction.complete(); transactionInProcess.next(false); transactionFinished.next(true); } } // @internal /** * @return {?} */ export function isTransactionInProcess() { return transactionManager.activeTransactions > 0; } // @internal /** * @return {?} */ export function commit() { return transactionManager.batchTransaction ? transactionManager.batchTransaction.asObservable() : of(true); } /** * A logical transaction. * Use this transaction to optimize the dispatch of all the stores. * The following code will update the store, BUT emits only once * * \@example * applyTransaction(() => { * this.todosStore.add(new Todo(1, title)); * this.todosStore.add(new Todo(2, title)); * }); * * @template T * @param {?} action * @param {?=} thisArg * @return {?} */ export function applyTransaction(action, thisArg = undefined) { startBatch(); try { return action.apply(thisArg); } finally { logAction('@Transaction'); endBatch(); } } /** * A logical transaction. * Use this transaction to optimize the dispatch of all the stores. * * The following code will update the store, BUT emits only once. * * \@example * \@transaction * addTodos() { * this.todosStore.add(new Todo(1, title)); * this.todosStore.add(new Todo(2, title)); * } * * * @return {?} */ export function transaction() { return (/** * @param {?} target * @param {?} propertyKey * @param {?} descriptor * @return {?} */ function (target, propertyKey, descriptor) { /** @type {?} */ const originalMethod = descriptor.value; descriptor.value = (/** * @param {...?} args * @return {?} */ function (...args) { return applyTransaction((/** * @return {?} */ () => { return originalMethod.apply(this, args); }), this); }); return descriptor; }); } /** * * RxJS custom operator that wraps the callback inside transaction * * \@example * * return http.get().pipe( * withTransaction(response > { * store.setActive(1); * store.update(); * store.updateEntity(1, {}); * }) * ) * * @template T * @param {?} transactionFn * @return {?} */ export function withTransaction(transactionFn) { return (/** * @param {?} source * @return {?} */ function (source) { return source.pipe(tap((/** * @param {?} value * @return {?} */ value => applyTransaction((/** * @return {?} */ () => transactionFn(value)))))); }); } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNhY3Rpb24uanMiLCJzb3VyY2VSb290Ijoibmc6Ly9AZGF0b3JhbWEvYWtpdGEvIiwic291cmNlcyI6WyJzcmMvdHJhbnNhY3Rpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sRUFBRSxlQUFlLEVBQWMsRUFBRSxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNoRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ3RDLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7O01BRy9CLG1CQUFtQixHQUFHLElBQUksT0FBTyxFQUFFOzs7TUFHbkMsb0JBQW9CLEdBQUcsSUFBSSxlQUFlLENBQUMsS0FBSyxDQUFDOzs7QUFRdkQsTUFBTSxPQUFPLGtCQUFrQixHQUF1QjtJQUNwRCxrQkFBa0IsRUFBRSxDQUFDO0lBQ3JCLGdCQUFnQixFQUFFLElBQUk7Q0FDdkI7Ozs7O0FBR0QsTUFBTSxVQUFVLFVBQVU7SUFDeEIsSUFBRyxDQUFDLHNCQUFzQixFQUFFLEVBQUU7UUFDNUIsa0JBQWtCLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQztLQUNyRDtJQUNELGtCQUFrQixDQUFDLGtCQUFrQixFQUFFLENBQUM7SUFDeEMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ2xDLENBQUM7Ozs7O0FBR0QsTUFBTSxVQUFVLFFBQVE7SUFDdEIsSUFBRyxFQUFFLGtCQUFrQixDQUFDLGtCQUFrQixLQUFLLENBQUMsRUFBRTtRQUNoRCxrQkFBa0IsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDL0Msa0JBQWtCLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDL0Msb0JBQW9CLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2pDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztLQUNoQztBQUNILENBQUM7Ozs7O0FBR0QsTUFBTSxVQUFVLHNCQUFzQjtJQUNwQyxPQUFPLGtCQUFrQixDQUFDLGtCQUFrQixHQUFHLENBQUMsQ0FBQztBQUNuRCxDQUFDOzs7OztBQUdELE1BQU0sVUFBVSxNQUFNO0lBQ3BCLE9BQU8sa0JBQWtCLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLGtCQUFrQixDQUFDLGdCQUFnQixDQUFDLFlBQVksRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDN0csQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFjRCxNQUFNLFVBQVUsZ0JBQWdCLENBQUksTUFBZSxFQUFFLE9BQU8sR0FBRyxTQUFTO0lBQ3RFLFVBQVUsRUFBRSxDQUFDO0lBQ2IsSUFBSTtRQUNGLE9BQU8sTUFBTSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztLQUM5QjtZQUFTO1FBQ1IsU0FBUyxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBQzFCLFFBQVEsRUFBRSxDQUFDO0tBQ1o7QUFDSCxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7OztBQWlCRCxNQUFNLFVBQVUsV0FBVztJQUN6Qjs7Ozs7O0lBQU8sVUFBUyxNQUFXLEVBQUUsV0FBbUIsRUFBRSxVQUE4Qjs7Y0FDeEUsY0FBYyxHQUFHLFVBQVUsQ0FBQyxLQUFLO1FBRXZDLFVBQVUsQ0FBQyxLQUFLOzs7O1FBQUcsVUFBUyxHQUFHLElBQUk7WUFDakMsT0FBTyxnQkFBZ0I7OztZQUFDLEdBQUcsRUFBRTtnQkFDM0IsT0FBTyxjQUFjLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztZQUMxQyxDQUFDLEdBQUUsSUFBSSxDQUFDLENBQUM7UUFDWCxDQUFDLENBQUEsQ0FBQztRQUVGLE9BQU8sVUFBVSxDQUFDO0lBQ3BCLENBQUMsRUFBQztBQUNKLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFpQkQsTUFBTSxVQUFVLGVBQWUsQ0FBSSxhQUF1QjtJQUN4RDs7OztJQUFPLFVBQVMsTUFBcUI7UUFDbkMsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUc7Ozs7UUFBQyxLQUFLLENBQUMsRUFBRSxDQUFDLGdCQUFnQjs7O1FBQUMsR0FBRyxFQUFFLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxFQUFDLEVBQUMsQ0FBQyxDQUFDO0lBQ2pGLENBQUMsRUFBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIE9ic2VydmFibGUsIG9mLCBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBsb2dBY3Rpb24gfSBmcm9tICcuL2FjdGlvbnMnO1xuaW1wb3J0IHsgdGFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG4vLyBAaW50ZXJuYWxcbmNvbnN0IHRyYW5zYWN0aW9uRmluaXNoZWQgPSBuZXcgU3ViamVjdCgpO1xuXG4vLyBAaW50ZXJuYWxcbmNvbnN0IHRyYW5zYWN0aW9uSW5Qcm9jZXNzID0gbmV3IEJlaGF2aW9yU3ViamVjdChmYWxzZSk7XG5cbmV4cG9ydCB0eXBlIFRyYW5zYWN0aW9uTWFuYWdlciA9IHtcbiAgYWN0aXZlVHJhbnNhY3Rpb25zOiBudW1iZXI7XG4gIGJhdGNoVHJhbnNhY3Rpb246IFN1YmplY3Q8Ym9vbGVhbj4gfCBudWxsO1xufTtcblxuLy8gQGludGVybmFsXG5leHBvcnQgY29uc3QgdHJhbnNhY3Rpb25NYW5hZ2VyOiBUcmFuc2FjdGlvbk1hbmFnZXIgPSB7XG4gIGFjdGl2ZVRyYW5zYWN0aW9uczogMCxcbiAgYmF0Y2hUcmFuc2FjdGlvbjogbnVsbFxufTtcblxuLy8gQGludGVybmFsXG5leHBvcnQgZnVuY3Rpb24gc3RhcnRCYXRjaCgpIHtcbiAgaWYoIWlzVHJhbnNhY3Rpb25JblByb2Nlc3MoKSkge1xuICAgIHRyYW5zYWN0aW9uTWFuYWdlci5iYXRjaFRyYW5zYWN0aW9uID0gbmV3IFN1YmplY3QoKTtcbiAgfVxuICB0cmFuc2FjdGlvbk1hbmFnZXIuYWN0aXZlVHJhbnNhY3Rpb25zKys7XG4gIHRyYW5zYWN0aW9uSW5Qcm9jZXNzLm5leHQodHJ1ZSk7XG59XG5cbi8vIEBpbnRlcm5hbFxuZXhwb3J0IGZ1bmN0aW9uIGVuZEJhdGNoKCkge1xuICBpZigtLXRyYW5zYWN0aW9uTWFuYWdlci5hY3RpdmVUcmFuc2FjdGlvbnMgPT09IDApIHtcbiAgICB0cmFuc2FjdGlvbk1hbmFnZXIuYmF0Y2hUcmFuc2FjdGlvbi5uZXh0KHRydWUpO1xuICAgIHRyYW5zYWN0aW9uTWFuYWdlci5iYXRjaFRyYW5zYWN0aW9uLmNvbXBsZXRlKCk7XG4gICAgdHJhbnNhY3Rpb25JblByb2Nlc3MubmV4dChmYWxzZSk7XG4gICAgdHJhbnNhY3Rpb25GaW5pc2hlZC5uZXh0KHRydWUpO1xuICB9XG59XG5cbi8vIEBpbnRlcm5hbFxuZXhwb3J0IGZ1bmN0aW9uIGlzVHJhbnNhY3Rpb25JblByb2Nlc3MoKSB7XG4gIHJldHVybiB0cmFuc2FjdGlvbk1hbmFnZXIuYWN0aXZlVHJhbnNhY3Rpb25zID4gMDtcbn1cblxuLy8gQGludGVybmFsXG5leHBvcnQgZnVuY3Rpb24gY29tbWl0KCk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xuICByZXR1cm4gdHJhbnNhY3Rpb25NYW5hZ2VyLmJhdGNoVHJhbnNhY3Rpb24gPyB0cmFuc2FjdGlvbk1hbmFnZXIuYmF0Y2hUcmFuc2FjdGlvbi5hc09ic2VydmFibGUoKSA6IG9mKHRydWUpO1xufVxuXG4vKipcbiAqICBBIGxvZ2ljYWwgdHJhbnNhY3Rpb24uXG4gKiAgVXNlIHRoaXMgdHJhbnNhY3Rpb24gdG8gb3B0aW1pemUgdGhlIGRpc3BhdGNoIG9mIGFsbCB0aGUgc3RvcmVzLlxuICogIFRoZSBmb2xsb3dpbmcgY29kZSB3aWxsIHVwZGF0ZSB0aGUgc3RvcmUsIEJVVCAgZW1pdHMgb25seSBvbmNlXG4gKlxuICogIEBleGFtcGxlXG4gKiAgYXBwbHlUcmFuc2FjdGlvbigoKSA9PiB7XG4gKiAgICB0aGlzLnRvZG9zU3RvcmUuYWRkKG5ldyBUb2RvKDEsIHRpdGxlKSk7XG4gKiAgICB0aGlzLnRvZG9zU3RvcmUuYWRkKG5ldyBUb2RvKDIsIHRpdGxlKSk7XG4gKiAgfSk7XG4gKlxuICovXG5leHBvcnQgZnVuY3Rpb24gYXBwbHlUcmFuc2FjdGlvbjxUPihhY3Rpb246ICgpID0+IFQsIHRoaXNBcmcgPSB1bmRlZmluZWQpOiBUIHtcbiAgc3RhcnRCYXRjaCgpO1xuICB0cnkge1xuICAgIHJldHVybiBhY3Rpb24uYXBwbHkodGhpc0FyZyk7XG4gIH0gZmluYWxseSB7XG4gICAgbG9nQWN0aW9uKCdAVHJhbnNhY3Rpb24nKTtcbiAgICBlbmRCYXRjaCgpO1xuICB9XG59XG5cbi8qKlxuICogIEEgbG9naWNhbCB0cmFuc2FjdGlvbi5cbiAqICBVc2UgdGhpcyB0cmFuc2FjdGlvbiB0byBvcHRpbWl6ZSB0aGUgZGlzcGF0Y2ggb2YgYWxsIHRoZSBzdG9yZXMuXG4gKlxuICogIFRoZSBmb2xsb3dpbmcgY29kZSB3aWxsIHVwZGF0ZSB0aGUgc3RvcmUsIEJVVCAgZW1pdHMgb25seSBvbmNlLlxuICpcbiAqICBAZXhhbXBsZVxuICogIEB0cmFuc2FjdGlvblxuICogIGFkZFRvZG9zKCkge1xuICogICAgdGhpcy50b2Rvc1N0b3JlLmFkZChuZXcgVG9kbygxLCB0aXRsZSkpO1xuICogICAgdGhpcy50b2Rvc1N0b3JlLmFkZChuZXcgVG9kbygyLCB0aXRsZSkpO1xuICogIH1cbiAqXG4gKlxuICovXG5leHBvcnQgZnVuY3Rpb24gdHJhbnNhY3Rpb24oKSB7XG4gIHJldHVybiBmdW5jdGlvbih0YXJnZXQ6IGFueSwgcHJvcGVydHlLZXk6IHN0cmluZywgZGVzY3JpcHRvcjogUHJvcGVydHlEZXNjcmlwdG9yKSB7XG4gICAgY29uc3Qgb3JpZ2luYWxNZXRob2QgPSBkZXNjcmlwdG9yLnZhbHVlO1xuXG4gICAgZGVzY3JpcHRvci52YWx1ZSA9IGZ1bmN0aW9uKC4uLmFyZ3MpIHtcbiAgICAgIHJldHVybiBhcHBseVRyYW5zYWN0aW9uKCgpID0+IHtcbiAgICAgICAgcmV0dXJuIG9yaWdpbmFsTWV0aG9kLmFwcGx5KHRoaXMsIGFyZ3MpO1xuICAgICAgfSwgdGhpcyk7XG4gICAgfTtcblxuICAgIHJldHVybiBkZXNjcmlwdG9yO1xuICB9O1xufVxuXG4vKipcbiAqXG4gKiBSeEpTIGN1c3RvbSBvcGVyYXRvciB0aGF0IHdyYXBzIHRoZSBjYWxsYmFjayBpbnNpZGUgdHJhbnNhY3Rpb25cbiAqXG4gKiBAZXhhbXBsZVxuICpcbiAqIHJldHVybiBodHRwLmdldCgpLnBpcGUoXG4gKiAgICB3aXRoVHJhbnNhY3Rpb24ocmVzcG9uc2UgPiB7XG4gKiAgICAgIHN0b3JlLnNldEFjdGl2ZSgxKTtcbiAqICAgICAgc3RvcmUudXBkYXRlKCk7XG4gKiAgICAgIHN0b3JlLnVwZGF0ZUVudGl0eSgxLCB7fSk7XG4gKiAgICB9KVxuICogKVxuICpcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHdpdGhUcmFuc2FjdGlvbjxUPih0cmFuc2FjdGlvbkZuOiBGdW5jdGlvbikge1xuICByZXR1cm4gZnVuY3Rpb24oc291cmNlOiBPYnNlcnZhYmxlPFQ+KTogT2JzZXJ2YWJsZTxUPiB7XG4gICAgcmV0dXJuIHNvdXJjZS5waXBlKHRhcCh2YWx1ZSA9PiBhcHBseVRyYW5zYWN0aW9uKCgpID0+IHRyYW5zYWN0aW9uRm4odmFsdWUpKSkpO1xuICB9O1xufVxuIl19