UNPKG

fireodm

Version:

A basic and extensible ODM for the Firestore Admin SDK in Node.js with decorators, relationships, and validation.

60 lines 3.07 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.runInTransaction = runInTransaction; exports.runInBatch = runInBatch; const firestore_instance_1 = require("../config/firestore-instance"); const context_1 = require("./context"); // Adjust path if needed /** * Runs a Firestore transaction with implicit ORM context management. * ORM methods (save, update, delete) called within the callback will automatically use the transaction. * * @template T The return type of the transaction callback. * @param callback The function to execute within the transaction. It receives the Firestore Transaction object. * All reads should occur before writes. * @param transactionOptions Optional Firestore transaction options. * @returns A Promise resolving with the value returned by the callback. * @throws Throws an error if the transaction fails or if the callback throws an error. */ async function runInTransaction(callback, transactionOptions) { const db = (0, firestore_instance_1.getFirestoreInstance)(); // Use Firestore's runTransaction return db.runTransaction(async (transaction) => { // Use AsyncLocalStorage.run to set the context *inside* the Firestore transaction callback // The value stored is the transaction object itself. return context_1.transactionContext.run(transaction, () => { return callback(transaction); }); }, transactionOptions); } /** * Executes a series of ORM operations within a Firestore Batched Write. * ORM methods (save, update, delete) called within the callback will automatically be added to the batch. * The batch is committed automatically after the callback completes successfully. * * @template T The return type of the batch callback function. * @param callback The function to execute. It receives the Firestore WriteBatch object. * This function queues ORM operations using `save`, `update`, `delete`. * It can be sync or async. * @returns A Promise resolving with an object containing the commit results and the callback's return value. * @throws Throws an error if the callback throws or if the batch commit fails. */ async function runInBatch(callback) { const db = (0, firestore_instance_1.getFirestoreInstance)(); const batch = db.batch(); let callbackResult; try { // Run the user's callback within the ALS context for the batch // The value stored is the batch object itself. await context_1.transactionContext.run(batch, async () => { callbackResult = await Promise.resolve(callback(batch)); // Execute user logic to queue operations }); // Commit the batch *after* the user's callback finishes and outside the ALS context const commitResults = await batch.commit(); return { commitResults: commitResults, callbackResult: callbackResult }; } catch (error) { console.error("[runInBatch] Error during batch execution or commit:", error); throw error; } } //# sourceMappingURL=transaction-manager.js.map