UNPKG

nestjs-transaction

Version:

A library that extracts and provides only some of the functions of the 'typeorm-transactional' npm module that are needed to operate in the Nestjs + TypeORM environment

154 lines 8.34 kB
"use strict"; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; Object.defineProperty(exports, "__esModule", { value: true }); exports.wrapInTransaction = void 0; const common_1 = require("../common"); const enums_1 = require("../enums"); const errors_1 = require("../errors"); const storage_1 = require("../storage"); const transaciton_hooks_1 = require("./transaciton-hooks"); const wrapInTransaction = (fn, options) => { function wrapper(...args) { const runOriginal = () => fn.apply(this, args); const propagation = (options === null || options === void 0 ? void 0 : options.propagation) || enums_1.Propagation.REQUIRED; const dataSourceName = (options === null || options === void 0 ? void 0 : options.connectionName) || common_1.TYPEORM_DEFAULT_DATA_SOURCE_NAME; const isolationLevel = (options === null || options === void 0 ? void 0 : options.isolationLevel) || enums_1.IsolationLevel.READ_COMMITTED; return storage_1.storage.run(() => __awaiter(this, void 0, void 0, function* () { const storedQueryRunner = storage_1.storage.get(dataSourceName); const isTransactionActive = storedQueryRunner !== undefined && storedQueryRunner.isTransactionActive; switch (propagation) { case enums_1.Propagation.NESTED: if (isTransactionActive) { const queryRunner = storage_1.storage.get(dataSourceName); if (!queryRunner) throw new errors_1.TransactionalError('AsyncLocalStorage throw system error, please re-run your application'); try { yield queryRunner.startTransaction(isolationLevel); const result = yield runOriginal(); yield queryRunner.commitTransaction(); return result; } catch (e) { yield queryRunner.rollbackTransaction(); throw new errors_1.NotRollBackError(e); } } else { const queryRunner = (0, common_1.getDataSource)(dataSourceName).createQueryRunner(); storage_1.storage.set(dataSourceName, queryRunner); try { yield queryRunner.startTransaction(isolationLevel); const result = yield runOriginal(); yield queryRunner.commitTransaction(); yield (0, transaciton_hooks_1.emitAsyncOnCommitEvent)(); return result; } catch (e) { if (e instanceof errors_1.NotRollBackError) { yield queryRunner.commitTransaction(); yield (0, transaciton_hooks_1.emitAsyncOnCommitEvent)(); throw e.originError; } else { yield queryRunner.rollbackTransaction(); yield (0, transaciton_hooks_1.emitAsyncOnRollBackEvent)(e); throw e; } } finally { yield queryRunner.release(); storage_1.storage.set(dataSourceName, undefined); } } case enums_1.Propagation.REQUIRED: if (isTransactionActive) { return runOriginal(); } else { const queryRunner = (0, common_1.getDataSource)(dataSourceName).createQueryRunner(); storage_1.storage.set(dataSourceName, queryRunner); try { yield queryRunner.startTransaction(isolationLevel); const result = yield runOriginal(); yield queryRunner.commitTransaction(); yield (0, transaciton_hooks_1.emitAsyncOnCommitEvent)(); return result; } catch (e) { if (e instanceof errors_1.NotRollBackError) { yield queryRunner.commitTransaction(); yield (0, transaciton_hooks_1.emitAsyncOnCommitEvent)(); throw e.originError; } else { yield queryRunner.rollbackTransaction(); yield (0, transaciton_hooks_1.emitAsyncOnRollBackEvent)(e); throw e; } } finally { yield queryRunner.release(); storage_1.storage.set(dataSourceName, undefined); } } case enums_1.Propagation.SUPPORTS: try { const result = yield runOriginal(); if (isTransactionActive) return result; else { yield (0, transaciton_hooks_1.emitAsyncOnCommitEvent)(); return result; } } catch (e) { if (e instanceof errors_1.NotRollBackError) { throw e.originError; } throw e; } case enums_1.Propagation.REQUIRES_NEW: const queryRunner = (0, common_1.getDataSource)(dataSourceName).createQueryRunner(); storage_1.storage.set(dataSourceName, queryRunner); try { yield queryRunner.startTransaction(isolationLevel); const result = yield runOriginal(); yield queryRunner.commitTransaction(); yield (0, transaciton_hooks_1.emitAsyncOnCommitEvent)(); return result; } catch (e) { if (e instanceof errors_1.NotRollBackError) { yield queryRunner.commitTransaction(); yield (0, transaciton_hooks_1.emitAsyncOnCommitEvent)(); throw e.originError; } else { yield queryRunner.rollbackTransaction(); yield (0, transaciton_hooks_1.emitAsyncOnRollBackEvent)(e); if (!isTransactionActive) throw e; throw new errors_1.NotRollBackError(e); } } finally { yield queryRunner.release(); storage_1.storage.set(dataSourceName, undefined); } default: throw new errors_1.TransactionalError('Not supported propagation type'); } })); } return wrapper; }; exports.wrapInTransaction = wrapInTransaction; //# sourceMappingURL=wrap-in-transaction.js.map