nukak
Version:
flexible and efficient ORM, with declarative JSON syntax and smart type-safety
48 lines • 6.78 kB
JavaScript
import { getQuerierPool } from '../../options.js';
import { getInjectedQuerierIndex } from './injectQuerier.js';
export function Transactional({ propagation = 'required', querierPool, } = {}) {
return (target, key, propDescriptor) => {
const theClass = target.constructor;
const originalMethod = propDescriptor.value;
const injectedQuerierIndex = getInjectedQuerierIndex(theClass, key);
if (injectedQuerierIndex === undefined) {
throw TypeError(`missing decorator @InjectQuerier() in '${target.constructor.name}.${key}'`);
}
propDescriptor.value = async function func(...args) {
const params = [...args];
let isOwnTransaction;
let querier;
if (params[injectedQuerierIndex]) {
querier = params[injectedQuerierIndex];
}
else {
isOwnTransaction = true;
const pool = querierPool ?? getQuerierPool();
querier = await pool.getQuerier();
params[injectedQuerierIndex] = querier;
}
try {
if (propagation === 'required' && !querier.hasOpenTransaction) {
await querier.beginTransaction();
}
const resp = await originalMethod.apply(this, params);
if (isOwnTransaction && querier.hasOpenTransaction) {
await querier.commitTransaction();
}
return resp;
}
catch (err) {
if (isOwnTransaction && querier.hasOpenTransaction) {
await querier.rollbackTransaction();
}
throw err;
}
finally {
if (isOwnTransaction) {
await querier.release();
}
}
};
};
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNhY3Rpb25hbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9xdWVyaWVyL2RlY29yYXRvci90cmFuc2FjdGlvbmFsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNsRCxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUU3RCxNQUFNLFVBQVUsYUFBYSxDQUFDLEVBQzVCLFdBQVcsR0FBRyxVQUFVLEVBQ3hCLFdBQVcsTUFJVCxFQUFFO0lBQ0osT0FBTyxDQUFDLE1BQWMsRUFBRSxHQUFXLEVBQUUsY0FBa0MsRUFBUSxFQUFFO1FBQy9FLE1BQU0sUUFBUSxHQUFHLE1BQU0sQ0FBQyxXQUF3QixDQUFDO1FBQ2pELE1BQU0sY0FBYyxHQUFHLGNBQWMsQ0FBQyxLQUFLLENBQUM7UUFDNUMsTUFBTSxvQkFBb0IsR0FBRyx1QkFBdUIsQ0FBQyxRQUFRLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFFcEUsSUFBSSxvQkFBb0IsS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUN2QyxNQUFNLFNBQVMsQ0FBQywwQ0FBMEMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxJQUFJLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQztRQUMvRixDQUFDO1FBRUQsY0FBYyxDQUFDLEtBQUssR0FBRyxLQUFLLFVBQVUsSUFBSSxDQUFlLEdBQUcsSUFBVztZQUNyRSxNQUFNLE1BQU0sR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUM7WUFDekIsSUFBSSxnQkFBeUIsQ0FBQztZQUM5QixJQUFJLE9BQWdCLENBQUM7WUFFckIsSUFBSSxNQUFNLENBQUMsb0JBQW9CLENBQUMsRUFBRSxDQUFDO2dCQUNqQyxPQUFPLEdBQUcsTUFBTSxDQUFDLG9CQUFvQixDQUFDLENBQUM7WUFDekMsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLGdCQUFnQixHQUFHLElBQUksQ0FBQztnQkFDeEIsTUFBTSxJQUFJLEdBQUcsV0FBVyxJQUFJLGNBQWMsRUFBRSxDQUFDO2dCQUM3QyxPQUFPLEdBQUcsTUFBTSxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7Z0JBQ2xDLE1BQU0sQ0FBQyxvQkFBb0IsQ0FBQyxHQUFHLE9BQU8sQ0FBQztZQUN6QyxDQUFDO1lBRUQsSUFBSSxDQUFDO2dCQUNILElBQUksV0FBVyxLQUFLLFVBQVUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO29CQUM5RCxNQUFNLE9BQU8sQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO2dCQUNuQyxDQUFDO2dCQUNELE1BQU0sSUFBSSxHQUFHLE1BQU0sY0FBYyxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUM7Z0JBQ3RELElBQUksZ0JBQWdCLElBQUksT0FBTyxDQUFDLGtCQUFrQixFQUFFLENBQUM7b0JBQ25ELE1BQU0sT0FBTyxDQUFDLGlCQUFpQixFQUFFLENBQUM7Z0JBQ3BDLENBQUM7Z0JBQ0QsT0FBTyxJQUFJLENBQUM7WUFDZCxDQUFDO1lBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztnQkFDYixJQUFJLGdCQUFnQixJQUFJLE9BQU8sQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO29CQUNuRCxNQUFNLE9BQU8sQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO2dCQUN0QyxDQUFDO2dCQUNELE1BQU0sR0FBRyxDQUFDO1lBQ1osQ0FBQztvQkFBUyxDQUFDO2dCQUNULElBQUksZ0JBQWdCLEVBQUUsQ0FBQztvQkFDckIsTUFBTSxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUM7Z0JBQzFCLENBQUM7WUFDSCxDQUFDO1FBQ0gsQ0FBQyxDQUFDO0lBQ0osQ0FBQyxDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgUXVlcmllciwgUXVlcmllclBvb2wsIFR5cGUgfSBmcm9tICcuLi8uLi90eXBlL2luZGV4LmpzJztcbmltcG9ydCB7IGdldFF1ZXJpZXJQb29sIH0gZnJvbSAnLi4vLi4vb3B0aW9ucy5qcyc7XG5pbXBvcnQgeyBnZXRJbmplY3RlZFF1ZXJpZXJJbmRleCB9IGZyb20gJy4vaW5qZWN0UXVlcmllci5qcyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBUcmFuc2FjdGlvbmFsKHtcbiAgcHJvcGFnYXRpb24gPSAncmVxdWlyZWQnLFxuICBxdWVyaWVyUG9vbCxcbn06IHtcbiAgcmVhZG9ubHkgcHJvcGFnYXRpb24/OiAnc3VwcG9ydGVkJyB8ICdyZXF1aXJlZCc7XG4gIHJlYWRvbmx5IHF1ZXJpZXJQb29sPzogUXVlcmllclBvb2w7XG59ID0ge30pIHtcbiAgcmV0dXJuICh0YXJnZXQ6IG9iamVjdCwga2V5OiBzdHJpbmcsIHByb3BEZXNjcmlwdG9yOiBQcm9wZXJ0eURlc2NyaXB0b3IpOiB2b2lkID0+IHtcbiAgICBjb25zdCB0aGVDbGFzcyA9IHRhcmdldC5jb25zdHJ1Y3RvciBhcyBUeXBlPGFueT47XG4gICAgY29uc3Qgb3JpZ2luYWxNZXRob2QgPSBwcm9wRGVzY3JpcHRvci52YWx1ZTtcbiAgICBjb25zdCBpbmplY3RlZFF1ZXJpZXJJbmRleCA9IGdldEluamVjdGVkUXVlcmllckluZGV4KHRoZUNsYXNzLCBrZXkpO1xuXG4gICAgaWYgKGluamVjdGVkUXVlcmllckluZGV4ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IFR5cGVFcnJvcihgbWlzc2luZyBkZWNvcmF0b3IgQEluamVjdFF1ZXJpZXIoKSBpbiAnJHt0YXJnZXQuY29uc3RydWN0b3IubmFtZX0uJHtrZXl9J2ApO1xuICAgIH1cblxuICAgIHByb3BEZXNjcmlwdG9yLnZhbHVlID0gYXN5bmMgZnVuY3Rpb24gZnVuYyh0aGlzOiBvYmplY3QsIC4uLmFyZ3M6IGFueVtdKSB7XG4gICAgICBjb25zdCBwYXJhbXMgPSBbLi4uYXJnc107XG4gICAgICBsZXQgaXNPd25UcmFuc2FjdGlvbjogYm9vbGVhbjtcbiAgICAgIGxldCBxdWVyaWVyOiBRdWVyaWVyO1xuXG4gICAgICBpZiAocGFyYW1zW2luamVjdGVkUXVlcmllckluZGV4XSkge1xuICAgICAgICBxdWVyaWVyID0gcGFyYW1zW2luamVjdGVkUXVlcmllckluZGV4XTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlzT3duVHJhbnNhY3Rpb24gPSB0cnVlO1xuICAgICAgICBjb25zdCBwb29sID0gcXVlcmllclBvb2wgPz8gZ2V0UXVlcmllclBvb2woKTtcbiAgICAgICAgcXVlcmllciA9IGF3YWl0IHBvb2wuZ2V0UXVlcmllcigpO1xuICAgICAgICBwYXJhbXNbaW5qZWN0ZWRRdWVyaWVySW5kZXhdID0gcXVlcmllcjtcbiAgICAgIH1cblxuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKHByb3BhZ2F0aW9uID09PSAncmVxdWlyZWQnICYmICFxdWVyaWVyLmhhc09wZW5UcmFuc2FjdGlvbikge1xuICAgICAgICAgIGF3YWl0IHF1ZXJpZXIuYmVnaW5UcmFuc2FjdGlvbigpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJlc3AgPSBhd2FpdCBvcmlnaW5hbE1ldGhvZC5hcHBseSh0aGlzLCBwYXJhbXMpO1xuICAgICAgICBpZiAoaXNPd25UcmFuc2FjdGlvbiAmJiBxdWVyaWVyLmhhc09wZW5UcmFuc2FjdGlvbikge1xuICAgICAgICAgIGF3YWl0IHF1ZXJpZXIuY29tbWl0VHJhbnNhY3Rpb24oKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzcDtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBpZiAoaXNPd25UcmFuc2FjdGlvbiAmJiBxdWVyaWVyLmhhc09wZW5UcmFuc2FjdGlvbikge1xuICAgICAgICAgIGF3YWl0IHF1ZXJpZXIucm9sbGJhY2tUcmFuc2FjdGlvbigpO1xuICAgICAgICB9XG4gICAgICAgIHRocm93IGVycjtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIGlmIChpc093blRyYW5zYWN0aW9uKSB7XG4gICAgICAgICAgYXdhaXQgcXVlcmllci5yZWxlYXNlKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuICB9O1xufVxuIl19