{"version":3,"file":"transaction-context.mjs","sources":["../src/transaction-context.ts"],"sourcesContent":["import { AsyncLocalStorage } from 'node:async_hooks';\nimport { Knex } from 'knex';\n\nexport type Callback = (...args: any[]) => Promise<any> | any;\n\nexport interface TransactionObject {\n  commit: () => Promise<void>;\n  rollback: () => Promise<void>;\n  get: () => Knex.Transaction;\n}\nexport interface Store {\n  trx: Knex.Transaction | null;\n  commitCallbacks: Callback[];\n  rollbackCallbacks: Callback[];\n}\n\nconst storage = new AsyncLocalStorage<Store>();\n\nconst transactionCtx = {\n  async run<TCallback extends Callback>(trx: Knex.Transaction, cb: TCallback) {\n    const store = storage.getStore();\n    return storage.run<ReturnType<TCallback>, void[]>(\n      {\n        trx,\n        // Fill with existing callbacks if nesting transactions\n        commitCallbacks: store?.commitCallbacks || [],\n        rollbackCallbacks: store?.rollbackCallbacks || [],\n      },\n      cb\n    );\n  },\n\n  get() {\n    const store = storage.getStore();\n    return store?.trx;\n  },\n\n  async commit(trx: Knex.Transaction) {\n    const store = storage.getStore();\n\n    // Clear transaction from store\n    if (store?.trx) {\n      store.trx = null;\n    }\n\n    // Commit transaction\n    await trx.commit();\n\n    if (!store?.commitCallbacks.length) {\n      return;\n    }\n\n    // Run callbacks\n    store.commitCallbacks.forEach((cb) => cb());\n    store.commitCallbacks = [];\n  },\n\n  async rollback(trx: Knex.Transaction) {\n    const store = storage.getStore();\n\n    // Clear transaction from store\n    if (store?.trx) {\n      store.trx = null;\n    }\n\n    // Rollback transaction\n    await trx.rollback();\n\n    if (!store?.rollbackCallbacks.length) {\n      return;\n    }\n\n    // Run callbacks\n    store.rollbackCallbacks.forEach((cb) => cb());\n    store.rollbackCallbacks = [];\n  },\n\n  onCommit(cb: Callback) {\n    const store = storage.getStore();\n    if (store?.commitCallbacks) {\n      store.commitCallbacks.push(cb);\n    }\n  },\n\n  onRollback(cb: Callback) {\n    const store = storage.getStore();\n    if (store?.rollbackCallbacks) {\n      store.rollbackCallbacks.push(cb);\n    }\n  },\n};\n\nexport { transactionCtx };\n"],"names":["storage","AsyncLocalStorage","transactionCtx","run","trx","cb","store","getStore","commitCallbacks","rollbackCallbacks","get","commit","length","forEach","rollback","onCommit","push","onRollback"],"mappings":";;AAgBA,MAAMA,UAAU,IAAIC,iBAAAA,EAAAA;AAEpB,MAAMC,cAAiB,GAAA;IACrB,MAAMC,GAAAA,CAAAA,CAAgCC,GAAqB,EAAEC,EAAa,EAAA;QACxE,MAAMC,KAAAA,GAAQN,QAAQO,QAAQ,EAAA;QAC9B,OAAOP,OAAAA,CAAQG,GAAG,CAChB;AACEC,YAAAA,GAAAA;;YAEAI,eAAiBF,EAAAA,KAAAA,EAAOE,mBAAmB,EAAE;YAC7CC,iBAAmBH,EAAAA,KAAAA,EAAOG,qBAAqB;SAEjDJ,EAAAA,EAAAA,CAAAA;AAEJ,KAAA;AAEAK,IAAAA,GAAAA,CAAAA,GAAAA;QACE,MAAMJ,KAAAA,GAAQN,QAAQO,QAAQ,EAAA;AAC9B,QAAA,OAAOD,KAAOF,EAAAA,GAAAA;AAChB,KAAA;AAEA,IAAA,MAAMO,QAAOP,GAAqB,EAAA;QAChC,MAAME,KAAAA,GAAQN,QAAQO,QAAQ,EAAA;;AAG9B,QAAA,IAAID,OAAOF,GAAK,EAAA;AACdE,YAAAA,KAAAA,CAAMF,GAAG,GAAG,IAAA;AACd;;AAGA,QAAA,MAAMA,IAAIO,MAAM,EAAA;QAEhB,IAAI,CAACL,KAAOE,EAAAA,eAAAA,CAAgBI,MAAQ,EAAA;AAClC,YAAA;AACF;;AAGAN,QAAAA,KAAAA,CAAME,eAAe,CAACK,OAAO,CAAC,CAACR,EAAOA,GAAAA,EAAAA,EAAAA,CAAAA;QACtCC,KAAME,CAAAA,eAAe,GAAG,EAAE;AAC5B,KAAA;AAEA,IAAA,MAAMM,UAASV,GAAqB,EAAA;QAClC,MAAME,KAAAA,GAAQN,QAAQO,QAAQ,EAAA;;AAG9B,QAAA,IAAID,OAAOF,GAAK,EAAA;AACdE,YAAAA,KAAAA,CAAMF,GAAG,GAAG,IAAA;AACd;;AAGA,QAAA,MAAMA,IAAIU,QAAQ,EAAA;QAElB,IAAI,CAACR,KAAOG,EAAAA,iBAAAA,CAAkBG,MAAQ,EAAA;AACpC,YAAA;AACF;;AAGAN,QAAAA,KAAAA,CAAMG,iBAAiB,CAACI,OAAO,CAAC,CAACR,EAAOA,GAAAA,EAAAA,EAAAA,CAAAA;QACxCC,KAAMG,CAAAA,iBAAiB,GAAG,EAAE;AAC9B,KAAA;AAEAM,IAAAA,QAAAA,CAAAA,CAASV,EAAY,EAAA;QACnB,MAAMC,KAAAA,GAAQN,QAAQO,QAAQ,EAAA;AAC9B,QAAA,IAAID,OAAOE,eAAiB,EAAA;YAC1BF,KAAME,CAAAA,eAAe,CAACQ,IAAI,CAACX,EAAAA,CAAAA;AAC7B;AACF,KAAA;AAEAY,IAAAA,UAAAA,CAAAA,CAAWZ,EAAY,EAAA;QACrB,MAAMC,KAAAA,GAAQN,QAAQO,QAAQ,EAAA;AAC9B,QAAA,IAAID,OAAOG,iBAAmB,EAAA;YAC5BH,KAAMG,CAAAA,iBAAiB,CAACO,IAAI,CAACX,EAAAA,CAAAA;AAC/B;AACF;AACF;;;;"}