UNPKG

@strapi/data-transfer

Version:

Data transfer capabilities for Strapi

1 lines 5.35 kB
{"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":";;;AAMO,MAAMA,oBAAoB,CAACC,MAAAA,GAAAA;AAChC,IAAA,MAAMC,MAAmD,EAAE;AAE3D,IAAA,IAAIC,IAAO,GAAA,KAAA;AACX,IAAA,IAAIC,MAA8B,GAAA,IAAA;AAElC,IAAA,MAAMC,IAAI,IAAIC,YAAAA,EAAAA;AACdD,IAAAA,CAAAA,CAAEE,EAAE,CAAC,OAAS,EAAA,CAACC,IAAMC,EAAAA,EAAAA,GAAAA;AACnBP,QAAAA,GAAAA,CAAIQ,IAAI,CAAC;YAAEC,EAAIF,EAAAA,EAAAA;AAAID,YAAAA;AAAK,SAAA,CAAA;AACxBJ,QAAAA,MAAAA,IAAAA;AACF,KAAA,CAAA;IAEAC,CAAEE,CAAAA,EAAE,CAAC,OAAS,EAAA,IAAA;AACZF,QAAAA,CAAAA,CAAEO,kBAAkB,CAAC,UAAA,CAAA;AACrBP,QAAAA,CAAAA,CAAEO,kBAAkB,CAAC,OAAA,CAAA;QAErBT,IAAO,GAAA,IAAA;AACPC,QAAAA,MAAAA,IAAAA;AACF,KAAA,CAAA;IAEAH,MAAOY,CAAAA,EAAE,CAACC,WAAW,CAAC,OAAO,EAAEC,GAAG,EAAEC,QAAQ,EAAE,GAAA;QAC5CX,CAAEY,CAAAA,IAAI,CAAC,UAAY,EAAA,UAAA;AACjBZ,YAAAA,CAAAA,CAAEO,kBAAkB,CAAC,OAAA,CAAA;AACrBP,YAAAA,CAAAA,CAAEO,kBAAkB,CAAC,OAAA,CAAA;YAErB,IAAI;gBACF,MAAMI,QAAAA,EAAAA;AACNX,gBAAAA,CAAAA,CAAEa,IAAI,CAAC,oBAAA,CAAA;AACT,aAAA,CAAE,OAAM;AACNb,gBAAAA,CAAAA,CAAEa,IAAI,CAAC,iBAAA,CAAA;aACC,QAAA;gBACRf,IAAO,GAAA,IAAA;AACPC,gBAAAA,MAAAA,IAAAA;AACF;AACF,SAAA,CAAA;AAEA,QAAA,MAAO,CAACD,IAAM,CAAA;YACZ,MAAOD,GAAAA,CAAIiB,MAAM,CAAE;gBACjB,MAAMC,IAAAA,GAAOlB,IAAImB,KAAK,EAAA;AAEtB,gBAAA,IAAID,IAAM,EAAA;AACR,oBAAA,MAAM,EAAET,EAAE,EAAEH,IAAI,EAAE,GAAGY,IAAAA;oBAErB,IAAI;wBACF,MAAME,GAAAA,GAAM,MAAMX,EAAGI,CAAAA,GAAAA,CAAAA;wBACrBV,CAAEa,CAAAA,IAAI,CAACV,IAAM,EAAA;4BAAEe,IAAMD,EAAAA;AAAI,yBAAA,CAAA;AAC3B,qBAAA,CAAE,OAAOE,KAAO,EAAA;wBACdnB,CAAEa,CAAAA,IAAI,CAACV,IAAM,EAAA;AAAEgB,4BAAAA;AAAM,yBAAA,CAAA;AACvB;AACF;AACF;AACA,YAAA,IAAI,CAACrB,IAAAA,IAAQ,CAACD,GAAAA,CAAIiB,MAAM,EAAE;;gBAExB,MAAM,IAAIM,QAAc,CAACC,OAAAA,GAAAA;oBACvBtB,MAASsB,GAAAA,OAAAA;AACX,iBAAA,CAAA;AACF;AACF;AACF,KAAA,CAAA;IAEA,OAAO;AACL,QAAA,MAAMC,QAAsBC,QAA6B,EAAA;AACvD,YAAA,MAAMpB,IAAOqB,GAAAA,UAAAA,EAAAA;YACbxB,CAAEa,CAAAA,IAAI,CAAC,OAAA,EAASV,IAAMoB,EAAAA,QAAAA,CAAAA;YACtB,OAAO,IAAIH,OAAuB,CAAA,CAACC,OAASI,EAAAA,MAAAA,GAAAA;gBAC1CzB,CAAEE,CAAAA,EAAE,CAACC,IAAM,EAAA,CAAC,EAAEe,IAAI,EAAEC,KAAK,EAAE,GAAA;AACzB,oBAAA,IAAID,IAAM,EAAA;wBACRG,OAAQH,CAAAA,IAAAA,CAAAA;AACV;AAEA,oBAAA,IAAIC,KAAO,EAAA;wBACTM,MAAON,CAAAA,KAAAA,CAAAA;AACT;oBACAE,OAAQK,CAAAA,SAAAA,CAAAA;AACV,iBAAA,CAAA;AACF,aAAA,CAAA;AACF,SAAA;AAEAC,QAAAA,GAAAA,CAAAA,GAAAA;YACE,OAAO3B,CAAAA,CAAEa,IAAI,CAAC,OAAA,CAAA;AAChB,SAAA;AAEAF,QAAAA,QAAAA,CAAAA,GAAAA;YACE,OAAO,IAAIS,QAAiB,CAACC,OAAAA,GAAAA;AAC3BrB,gBAAAA,CAAAA,CAAEa,IAAI,CAAC,UAAA,CAAA;AAEPb,gBAAAA,CAAAA,CAAEY,IAAI,CAAC,iBAAmB,EAAA,IAAMS,OAAQ,CAAA,KAAA,CAAA,CAAA;AACxCrB,gBAAAA,CAAAA,CAAEY,IAAI,CAAC,oBAAsB,EAAA,IAAMS,OAAQ,CAAA,IAAA,CAAA,CAAA;AAC7C,aAAA,CAAA;AACF;AACF,KAAA;AACF;;;;"}