@datorama/akita
Version:
State Management Tailored-Made for JS Applications
158 lines • 10.6 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 {?} */
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