@nestjs-cls/transactional-adapter-prisma
Version:
A Prisma adapter for @nestjs-cls/transactional
45 lines (44 loc) • 1.9 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.TransactionalAdapterPrisma = void 0;
const savepoint_syntax_1 = require("./savepoint-syntax");
const crypto_1 = require("crypto");
class TransactionalAdapterPrisma {
constructor(options) {
this.optionsFactory = (prisma) => ({
wrapWithTransaction: async (options, fn, setClient) => {
return await prisma.$transaction(async (p) => {
setClient(p);
return fn();
}, options);
},
wrapWithNestedTransaction: this.sqlFlavor
? this.wrapWithNestedTransaction
: undefined,
getFallbackInstance: () => prisma,
});
this.wrapWithNestedTransaction = async (_options, fn, setClient, tx) => {
const client = tx;
const savepointId = generateSavePointId();
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
const statements = (0, savepoint_syntax_1.getSavepointStatements)(this.sqlFlavor, savepointId);
setClient(client);
try {
await client.$executeRawUnsafe(statements.save);
const result = await fn();
statements.release &&
(await client.$executeRawUnsafe(statements.release));
return result;
}
catch (e) {
await client.$executeRawUnsafe(statements.rollback);
throw e;
}
};
this.connectionToken = options.prismaInjectionToken;
this.defaultTxOptions = options.defaultTxOptions;
this.sqlFlavor = options.sqlFlavor;
}
}
exports.TransactionalAdapterPrisma = TransactionalAdapterPrisma;
const generateSavePointId = () => `savepoint_${(0, crypto_1.randomUUID)().replace(/-/g, '_')}`;