@hazae41/piscine
Version:
Create async pools with automatic retry
140 lines (137 loc) • 2.85 kB
JavaScript
;
var _a;
class TooManyRetriesError extends Error {
#class = _a;
name = this.#class.name;
constructor(options) {
super(`Too many retries`, options);
}
static from(cause) {
return new _a({ cause });
}
}
_a = TooManyRetriesError;
class Cancel {
inner;
constructor(inner) {
this.inner = inner;
}
static new(inner) {
return new Cancel(inner);
}
isCancel() {
return true;
}
isRetry() {
return false;
}
isSkip() {
return false;
}
}
class Retry {
inner;
constructor(inner) {
this.inner = inner;
}
static new(inner) {
return new Retry(inner);
}
isCancel() {
return false;
}
isRetry() {
return true;
}
isSkip() {
return false;
}
}
(function (Retry) {
function runSync(f) {
try {
return f();
}
catch (error) {
throw new Retry(error);
}
}
Retry.runSync = runSync;
async function run(f) {
try {
return await f();
}
catch (error) {
throw new Retry(error);
}
}
Retry.run = run;
})(Retry || (Retry = {}));
class Skip {
inner;
constructor(inner) {
this.inner = inner;
}
static new(inner) {
return new Skip(inner);
}
isCancel() {
return false;
}
isRetry() {
return false;
}
isSkip() {
return true;
}
}
(function (Skip) {
function runSync(f) {
try {
return f();
}
catch (error) {
throw new Skip(error);
}
}
Skip.runSync = runSync;
async function run(f) {
try {
return await f();
}
catch (error) {
throw new Skip(error);
}
}
Skip.run = run;
})(Skip || (Skip = {}));
async function loopOrThrow(looper, options = {}) {
const { init = 1000, base = 2, max = 3 } = options;
const errors = new Array();
for (let i = 0; i < max; i++) {
try {
return await looper(i);
}
catch (error) {
if (error instanceof Cancel)
throw error.inner;
if (error instanceof Skip) {
errors.push(error);
continue;
}
if (error instanceof Retry) {
errors.push(error);
await new Promise(ok => setTimeout(ok, init * (base ** i)));
continue;
}
throw error;
}
}
throw TooManyRetriesError.from(errors);
}
exports.Cancel = Cancel;
exports.Retry = Retry;
exports.Skip = Skip;
exports.TooManyRetriesError = TooManyRetriesError;
exports.loopOrThrow = loopOrThrow;
//# sourceMappingURL=loop.cjs.map