UNPKG

@datorama/akita

Version:

State Management Tailored-Made for JS Applications

164 lines 10.9 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 {?} */ var transactionFinished = new Subject(); // @internal /** @type {?} */ var transactionInProcess = new BehaviorSubject(false); // @internal /** @type {?} */ export var 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) { if (thisArg === void 0) { 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 {?} */ var originalMethod = descriptor.value; descriptor.value = (/** * @param {...?} args * @return {?} */ function () { var _this = this; var args = []; for (var _i = 0; _i < arguments.length; _i++) { args[_i] = arguments[_i]; } return applyTransaction((/** * @return {?} */ function () { 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 {?} */ function (value) { return applyTransaction((/** * @return {?} */ function () { return transactionFn(value); })); }))); }); } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNhY3Rpb24uanMiLCJzb3VyY2VSb290Ijoibmc6Ly9AZGF0b3JhbWEvYWtpdGEvIiwic291cmNlcyI6WyJzcmMvdHJhbnNhY3Rpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sRUFBRSxlQUFlLEVBQWMsRUFBRSxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNoRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ3RDLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7O0lBRy9CLG1CQUFtQixHQUFHLElBQUksT0FBTyxFQUFFOzs7SUFHbkMsb0JBQW9CLEdBQUcsSUFBSSxlQUFlLENBQUMsS0FBSyxDQUFDOzs7QUFRdkQsTUFBTSxLQUFPLGtCQUFrQixHQUF1QjtJQUNwRCxrQkFBa0IsRUFBRSxDQUFDO0lBQ3JCLGdCQUFnQixFQUFFLElBQUk7Q0FDdkI7Ozs7O0FBR0QsTUFBTSxVQUFVLFVBQVU7SUFDeEIsSUFBRyxDQUFDLHNCQUFzQixFQUFFLEVBQUU7UUFDNUIsa0JBQWtCLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQztLQUNyRDtJQUNELGtCQUFrQixDQUFDLGtCQUFrQixFQUFFLENBQUM7SUFDeEMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ2xDLENBQUM7Ozs7O0FBR0QsTUFBTSxVQUFVLFFBQVE7SUFDdEIsSUFBRyxFQUFFLGtCQUFrQixDQUFDLGtCQUFrQixLQUFLLENBQUMsRUFBRTtRQUNoRCxrQkFBa0IsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDL0Msa0JBQWtCLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDL0Msb0JBQW9CLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2pDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztLQUNoQztBQUNILENBQUM7Ozs7O0FBR0QsTUFBTSxVQUFVLHNCQUFzQjtJQUNwQyxPQUFPLGtCQUFrQixDQUFDLGtCQUFrQixHQUFHLENBQUMsQ0FBQztBQUNuRCxDQUFDOzs7OztBQUdELE1BQU0sVUFBVSxNQUFNO0lBQ3BCLE9BQU8sa0JBQWtCLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLGtCQUFrQixDQUFDLGdCQUFnQixDQUFDLFlBQVksRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDN0csQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFjRCxNQUFNLFVBQVUsZ0JBQWdCLENBQUksTUFBZSxFQUFFLE9BQW1CO0lBQW5CLHdCQUFBLEVBQUEsbUJBQW1CO0lBQ3RFLFVBQVUsRUFBRSxDQUFDO0lBQ2IsSUFBSTtRQUNGLE9BQU8sTUFBTSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztLQUM5QjtZQUFTO1FBQ1IsU0FBUyxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBQzFCLFFBQVEsRUFBRSxDQUFDO0tBQ1o7QUFDSCxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7OztBQWlCRCxNQUFNLFVBQVUsV0FBVztJQUN6Qjs7Ozs7O0lBQU8sVUFBUyxNQUFXLEVBQUUsV0FBbUIsRUFBRSxVQUE4Qjs7WUFDeEUsY0FBYyxHQUFHLFVBQVUsQ0FBQyxLQUFLO1FBRXZDLFVBQVUsQ0FBQyxLQUFLOzs7O1FBQUc7WUFBQSxpQkFJbEI7WUFKMkIsY0FBTztpQkFBUCxVQUFPLEVBQVAscUJBQU8sRUFBUCxJQUFPO2dCQUFQLHlCQUFPOztZQUNqQyxPQUFPLGdCQUFnQjs7O1lBQUM7Z0JBQ3RCLE9BQU8sY0FBYyxDQUFDLEtBQUssQ0FBQyxLQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDMUMsQ0FBQyxHQUFFLElBQUksQ0FBQyxDQUFDO1FBQ1gsQ0FBQyxDQUFBLENBQUM7UUFFRixPQUFPLFVBQVUsQ0FBQztJQUNwQixDQUFDLEVBQUM7QUFDSixDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBaUJELE1BQU0sVUFBVSxlQUFlLENBQUksYUFBdUI7SUFDeEQ7Ozs7SUFBTyxVQUFTLE1BQXFCO1FBQ25DLE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHOzs7O1FBQUMsVUFBQSxLQUFLLElBQUksT0FBQSxnQkFBZ0I7OztRQUFDLGNBQU0sT0FBQSxhQUFhLENBQUMsS0FBSyxDQUFDLEVBQXBCLENBQW9CLEVBQUMsRUFBNUMsQ0FBNEMsRUFBQyxDQUFDLENBQUM7SUFDakYsQ0FBQyxFQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgT2JzZXJ2YWJsZSwgb2YsIFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGxvZ0FjdGlvbiB9IGZyb20gJy4vYWN0aW9ucyc7XG5pbXBvcnQgeyB0YXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbi8vIEBpbnRlcm5hbFxuY29uc3QgdHJhbnNhY3Rpb25GaW5pc2hlZCA9IG5ldyBTdWJqZWN0KCk7XG5cbi8vIEBpbnRlcm5hbFxuY29uc3QgdHJhbnNhY3Rpb25JblByb2Nlc3MgPSBuZXcgQmVoYXZpb3JTdWJqZWN0KGZhbHNlKTtcblxuZXhwb3J0IHR5cGUgVHJhbnNhY3Rpb25NYW5hZ2VyID0ge1xuICBhY3RpdmVUcmFuc2FjdGlvbnM6IG51bWJlcjtcbiAgYmF0Y2hUcmFuc2FjdGlvbjogU3ViamVjdDxib29sZWFuPiB8IG51bGw7XG59O1xuXG4vLyBAaW50ZXJuYWxcbmV4cG9ydCBjb25zdCB0cmFuc2FjdGlvbk1hbmFnZXI6IFRyYW5zYWN0aW9uTWFuYWdlciA9IHtcbiAgYWN0aXZlVHJhbnNhY3Rpb25zOiAwLFxuICBiYXRjaFRyYW5zYWN0aW9uOiBudWxsXG59O1xuXG4vLyBAaW50ZXJuYWxcbmV4cG9ydCBmdW5jdGlvbiBzdGFydEJhdGNoKCkge1xuICBpZighaXNUcmFuc2FjdGlvbkluUHJvY2VzcygpKSB7XG4gICAgdHJhbnNhY3Rpb25NYW5hZ2VyLmJhdGNoVHJhbnNhY3Rpb24gPSBuZXcgU3ViamVjdCgpO1xuICB9XG4gIHRyYW5zYWN0aW9uTWFuYWdlci5hY3RpdmVUcmFuc2FjdGlvbnMrKztcbiAgdHJhbnNhY3Rpb25JblByb2Nlc3MubmV4dCh0cnVlKTtcbn1cblxuLy8gQGludGVybmFsXG5leHBvcnQgZnVuY3Rpb24gZW5kQmF0Y2goKSB7XG4gIGlmKC0tdHJhbnNhY3Rpb25NYW5hZ2VyLmFjdGl2ZVRyYW5zYWN0aW9ucyA9PT0gMCkge1xuICAgIHRyYW5zYWN0aW9uTWFuYWdlci5iYXRjaFRyYW5zYWN0aW9uLm5leHQodHJ1ZSk7XG4gICAgdHJhbnNhY3Rpb25NYW5hZ2VyLmJhdGNoVHJhbnNhY3Rpb24uY29tcGxldGUoKTtcbiAgICB0cmFuc2FjdGlvbkluUHJvY2Vzcy5uZXh0KGZhbHNlKTtcbiAgICB0cmFuc2FjdGlvbkZpbmlzaGVkLm5leHQodHJ1ZSk7XG4gIH1cbn1cblxuLy8gQGludGVybmFsXG5leHBvcnQgZnVuY3Rpb24gaXNUcmFuc2FjdGlvbkluUHJvY2VzcygpIHtcbiAgcmV0dXJuIHRyYW5zYWN0aW9uTWFuYWdlci5hY3RpdmVUcmFuc2FjdGlvbnMgPiAwO1xufVxuXG4vLyBAaW50ZXJuYWxcbmV4cG9ydCBmdW5jdGlvbiBjb21taXQoKTogT2JzZXJ2YWJsZTxib29sZWFuPiB7XG4gIHJldHVybiB0cmFuc2FjdGlvbk1hbmFnZXIuYmF0Y2hUcmFuc2FjdGlvbiA/IHRyYW5zYWN0aW9uTWFuYWdlci5iYXRjaFRyYW5zYWN0aW9uLmFzT2JzZXJ2YWJsZSgpIDogb2YodHJ1ZSk7XG59XG5cbi8qKlxuICogIEEgbG9naWNhbCB0cmFuc2FjdGlvbi5cbiAqICBVc2UgdGhpcyB0cmFuc2FjdGlvbiB0byBvcHRpbWl6ZSB0aGUgZGlzcGF0Y2ggb2YgYWxsIHRoZSBzdG9yZXMuXG4gKiAgVGhlIGZvbGxvd2luZyBjb2RlIHdpbGwgdXBkYXRlIHRoZSBzdG9yZSwgQlVUICBlbWl0cyBvbmx5IG9uY2VcbiAqXG4gKiAgQGV4YW1wbGVcbiAqICBhcHBseVRyYW5zYWN0aW9uKCgpID0+IHtcbiAqICAgIHRoaXMudG9kb3NTdG9yZS5hZGQobmV3IFRvZG8oMSwgdGl0bGUpKTtcbiAqICAgIHRoaXMudG9kb3NTdG9yZS5hZGQobmV3IFRvZG8oMiwgdGl0bGUpKTtcbiAqICB9KTtcbiAqXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhcHBseVRyYW5zYWN0aW9uPFQ+KGFjdGlvbjogKCkgPT4gVCwgdGhpc0FyZyA9IHVuZGVmaW5lZCk6IFQge1xuICBzdGFydEJhdGNoKCk7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGFjdGlvbi5hcHBseSh0aGlzQXJnKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBsb2dBY3Rpb24oJ0BUcmFuc2FjdGlvbicpO1xuICAgIGVuZEJhdGNoKCk7XG4gIH1cbn1cblxuLyoqXG4gKiAgQSBsb2dpY2FsIHRyYW5zYWN0aW9uLlxuICogIFVzZSB0aGlzIHRyYW5zYWN0aW9uIHRvIG9wdGltaXplIHRoZSBkaXNwYXRjaCBvZiBhbGwgdGhlIHN0b3Jlcy5cbiAqXG4gKiAgVGhlIGZvbGxvd2luZyBjb2RlIHdpbGwgdXBkYXRlIHRoZSBzdG9yZSwgQlVUICBlbWl0cyBvbmx5IG9uY2UuXG4gKlxuICogIEBleGFtcGxlXG4gKiAgQHRyYW5zYWN0aW9uXG4gKiAgYWRkVG9kb3MoKSB7XG4gKiAgICB0aGlzLnRvZG9zU3RvcmUuYWRkKG5ldyBUb2RvKDEsIHRpdGxlKSk7XG4gKiAgICB0aGlzLnRvZG9zU3RvcmUuYWRkKG5ldyBUb2RvKDIsIHRpdGxlKSk7XG4gKiAgfVxuICpcbiAqXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0cmFuc2FjdGlvbigpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKHRhcmdldDogYW55LCBwcm9wZXJ0eUtleTogc3RyaW5nLCBkZXNjcmlwdG9yOiBQcm9wZXJ0eURlc2NyaXB0b3IpIHtcbiAgICBjb25zdCBvcmlnaW5hbE1ldGhvZCA9IGRlc2NyaXB0b3IudmFsdWU7XG5cbiAgICBkZXNjcmlwdG9yLnZhbHVlID0gZnVuY3Rpb24oLi4uYXJncykge1xuICAgICAgcmV0dXJuIGFwcGx5VHJhbnNhY3Rpb24oKCkgPT4ge1xuICAgICAgICByZXR1cm4gb3JpZ2luYWxNZXRob2QuYXBwbHkodGhpcywgYXJncyk7XG4gICAgICB9LCB0aGlzKTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIGRlc2NyaXB0b3I7XG4gIH07XG59XG5cbi8qKlxuICpcbiAqIFJ4SlMgY3VzdG9tIG9wZXJhdG9yIHRoYXQgd3JhcHMgdGhlIGNhbGxiYWNrIGluc2lkZSB0cmFuc2FjdGlvblxuICpcbiAqIEBleGFtcGxlXG4gKlxuICogcmV0dXJuIGh0dHAuZ2V0KCkucGlwZShcbiAqICAgIHdpdGhUcmFuc2FjdGlvbihyZXNwb25zZSA+IHtcbiAqICAgICAgc3RvcmUuc2V0QWN0aXZlKDEpO1xuICogICAgICBzdG9yZS51cGRhdGUoKTtcbiAqICAgICAgc3RvcmUudXBkYXRlRW50aXR5KDEsIHt9KTtcbiAqICAgIH0pXG4gKiApXG4gKlxuICovXG5leHBvcnQgZnVuY3Rpb24gd2l0aFRyYW5zYWN0aW9uPFQ+KHRyYW5zYWN0aW9uRm46IEZ1bmN0aW9uKSB7XG4gIHJldHVybiBmdW5jdGlvbihzb3VyY2U6IE9ic2VydmFibGU8VD4pOiBPYnNlcnZhYmxlPFQ+IHtcbiAgICByZXR1cm4gc291cmNlLnBpcGUodGFwKHZhbHVlID0+IGFwcGx5VHJhbnNhY3Rpb24oKCkgPT4gdHJhbnNhY3Rpb25Gbih2YWx1ZSkpKSk7XG4gIH07XG59XG4iXX0=