{"version":3,"file":"transaction.mjs","sources":["../../src/utils/transaction.ts"],"sourcesContent":["import { EventEmitter } from 'events';\nimport { randomUUID } from 'crypto';\nimport type { Core } from '@strapi/types';\n\nimport { Transaction, TransactionCallback } from '../../types/utils';\n\nexport const createTransaction = (strapi: Core.Strapi): Transaction => {\n  const fns: { fn: TransactionCallback; uuid: string }[] = [];\n\n  let done = false;\n  let resume: null | (() => void) = null;\n\n  const e = new EventEmitter();\n  e.on('spawn', (uuid, cb) => {\n    fns.push({ fn: cb, uuid });\n    resume?.();\n  });\n\n  e.on('close', () => {\n    e.removeAllListeners('rollback');\n    e.removeAllListeners('spawn');\n\n    done = true;\n    resume?.();\n  });\n\n  strapi.db.transaction(async ({ trx, rollback }) => {\n    e.once('rollback', async () => {\n      e.removeAllListeners('close');\n      e.removeAllListeners('spawn');\n\n      try {\n        await rollback();\n        e.emit('rollback_completed');\n      } catch {\n        e.emit('rollback_failed');\n      } finally {\n        done = true;\n        resume?.();\n      }\n    });\n\n    while (!done) {\n      while (fns.length) {\n        const item = fns.shift();\n\n        if (item) {\n          const { fn, uuid } = item;\n\n          try {\n            const res = await fn(trx);\n            e.emit(uuid, { data: res });\n          } catch (error) {\n            e.emit(uuid, { error });\n          }\n        }\n      }\n      if (!done && !fns.length) {\n        // eslint-disable-next-line @typescript-eslint/no-loop-func\n        await new Promise<void>((resolve) => {\n          resume = resolve;\n        });\n      }\n    }\n  });\n\n  return {\n    async attach<T = undefined>(callback: TransactionCallback): Promise<T | undefined> {\n      const uuid = randomUUID();\n      e.emit('spawn', uuid, callback);\n      return new Promise<T | undefined>((resolve, reject) => {\n        e.on(uuid, ({ data, error }) => {\n          if (data) {\n            resolve(data);\n          }\n\n          if (error) {\n            reject(error);\n          }\n          resolve(undefined);\n        });\n      });\n    },\n\n    end() {\n      return e.emit('close');\n    },\n\n    rollback() {\n      return new Promise<boolean>((resolve) => {\n        e.emit('rollback');\n\n        e.once('rollback_failed', () => resolve(false));\n        e.once('rollback_completed', () => resolve(true));\n      });\n    },\n  };\n};\n"],"names":["createTransaction","strapi","fns","done","resume","e","EventEmitter","on","uuid","cb","push","fn","removeAllListeners","db","transaction","trx","rollback","once","emit","length","item","shift","res","data","error","Promise","resolve","attach","callback","randomUUID","reject","undefined","end"],"mappings":"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"}