@randajan/revert
Version:
A minimalist utility for running sequential steps with automatic rollback on failure.
70 lines (68 loc) • 1.95 kB
JavaScript
var __defProp = Object.defineProperty;
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
var __getOwnPropNames = Object.getOwnPropertyNames;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __export = (target, all) => {
for (var name in all)
__defProp(target, name, { get: all[name], enumerable: true });
};
var __copyProps = (to, from, except, desc) => {
if (from && typeof from === "object" || typeof from === "function") {
for (let key of __getOwnPropNames(from))
if (!__hasOwnProp.call(to, key) && key !== except)
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
}
return to;
};
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
// src/async/utils.js
var utils_exports = {};
__export(utils_exports, {
attempt: () => attempt,
revertable: () => revertable,
sleep: () => sleep
});
module.exports = __toCommonJS(utils_exports);
var revertable = async (value, steps, fn, onError) => {
let dir = true, s = 1;
const r = { status: "pass", pass: value };
while (s > 0 && s <= steps) {
try {
r.pass = await fn(r.pass, dir, s, steps);
} catch (err) {
if (onError) {
await onError(err, dir, s, steps);
}
r.status = dir ? "undo" : "fail";
r[r.status] = err;
r[r.status + "Step"] = s;
if (dir) {
dir = false;
} else {
break;
}
}
s += dir * 2 - 1;
}
if (r.pass === void 0) {
delete r.pass;
}
return Object.freeze(r);
};
var sleep = async (ms) => new Promise((res) => setTimeout(res, ms));
var attempt = async (exec, attemptCount = 3, delay = 2e3) => {
let a = 1, e;
while (true) {
try {
return await exec(a);
} catch (err) {
e = err;
}
if (a >= attemptCount) {
throw e;
}
await sleep(delay);
a++;
}
};
//# sourceMappingURL=utils.js.map