@datorama/akita
Version:
State Management Tailored-Made for JS Applications
164 lines • 10.9 kB
JavaScript
/**
* @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=