@strapi/data-transfer
Version:
Data transfer capabilities for Strapi
92 lines (89 loc) • 2.65 kB
JavaScript
import { EventEmitter } from 'events';
import { randomUUID } from 'crypto';
const createTransaction = (strapi)=>{
const fns = [];
let done = false;
let resume = null;
const e = new EventEmitter();
e.on('spawn', (uuid, cb)=>{
fns.push({
fn: cb,
uuid
});
resume?.();
});
e.on('close', ()=>{
e.removeAllListeners('rollback');
e.removeAllListeners('spawn');
done = true;
resume?.();
});
strapi.db.transaction(async ({ trx, rollback })=>{
e.once('rollback', async ()=>{
e.removeAllListeners('close');
e.removeAllListeners('spawn');
try {
await rollback();
e.emit('rollback_completed');
} catch {
e.emit('rollback_failed');
} finally{
done = true;
resume?.();
}
});
while(!done){
while(fns.length){
const item = fns.shift();
if (item) {
const { fn, uuid } = item;
try {
const res = await fn(trx);
e.emit(uuid, {
data: res
});
} catch (error) {
e.emit(uuid, {
error
});
}
}
}
if (!done && !fns.length) {
// eslint-disable-next-line @typescript-eslint/no-loop-func
await new Promise((resolve)=>{
resume = resolve;
});
}
}
});
return {
async attach (callback) {
const uuid = randomUUID();
e.emit('spawn', uuid, callback);
return new Promise((resolve, reject)=>{
e.on(uuid, ({ data, error })=>{
if (data) {
resolve(data);
}
if (error) {
reject(error);
}
resolve(undefined);
});
});
},
end () {
return e.emit('close');
},
rollback () {
return new Promise((resolve)=>{
e.emit('rollback');
e.once('rollback_failed', ()=>resolve(false));
e.once('rollback_completed', ()=>resolve(true));
});
}
};
};
export { createTransaction };
//# sourceMappingURL=transaction.mjs.map