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
JavaScript
;
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