UNPKG

@nestjs-cls/transactional-adapter-prisma

Version:

A Prisma adapter for @nestjs-cls/transactional

45 lines (44 loc) 1.9 kB
"use strict"; 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, '_')}`;