mirror of
https://github.com/hanzoai/agency.git
synced 2026-11-02 19:13:28 +00:00
161 lines
4.8 KiB
Plaintext
161 lines
4.8 KiB
Plaintext
"use strict";
|
|
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/retryer.ts
|
|
var retryer_exports = {};
|
|
__export(retryer_exports, {
|
|
CancelledError: () => CancelledError,
|
|
canFetch: () => canFetch,
|
|
createRetryer: () => createRetryer,
|
|
isCancelledError: () => isCancelledError
|
|
});
|
|
module.exports = __toCommonJS(retryer_exports);
|
|
var import_focusManager = require("./focusManager.cjs");
|
|
var import_onlineManager = require("./onlineManager.cjs");
|
|
var import_thenable = require("./thenable.cjs");
|
|
var import_utils = require("./utils.cjs");
|
|
function defaultRetryDelay(failureCount) {
|
|
return Math.min(1e3 * 2 ** failureCount, 3e4);
|
|
}
|
|
function canFetch(networkMode) {
|
|
return (networkMode ?? "online") === "online" ? import_onlineManager.onlineManager.isOnline() : true;
|
|
}
|
|
var CancelledError = class extends Error {
|
|
constructor(options) {
|
|
super("CancelledError");
|
|
this.revert = options?.revert;
|
|
this.silent = options?.silent;
|
|
}
|
|
};
|
|
function isCancelledError(value) {
|
|
return value instanceof CancelledError;
|
|
}
|
|
function createRetryer(config) {
|
|
let isRetryCancelled = false;
|
|
let failureCount = 0;
|
|
let continueFn;
|
|
const thenable = (0, import_thenable.pendingThenable)();
|
|
const isResolved = () => thenable.status !== "pending";
|
|
const cancel = (cancelOptions) => {
|
|
if (!isResolved()) {
|
|
const error = new CancelledError(cancelOptions);
|
|
reject(error);
|
|
config.onCancel?.(error);
|
|
}
|
|
};
|
|
const cancelRetry = () => {
|
|
isRetryCancelled = true;
|
|
};
|
|
const continueRetry = () => {
|
|
isRetryCancelled = false;
|
|
};
|
|
const canContinue = () => import_focusManager.focusManager.isFocused() && (config.networkMode === "always" || import_onlineManager.onlineManager.isOnline()) && config.canRun();
|
|
const canStart = () => canFetch(config.networkMode) && config.canRun();
|
|
const resolve = (value) => {
|
|
if (!isResolved()) {
|
|
continueFn?.();
|
|
thenable.resolve(value);
|
|
}
|
|
};
|
|
const reject = (value) => {
|
|
if (!isResolved()) {
|
|
continueFn?.();
|
|
thenable.reject(value);
|
|
}
|
|
};
|
|
const pause = () => {
|
|
return new Promise((continueResolve) => {
|
|
continueFn = (value) => {
|
|
if (isResolved() || canContinue()) {
|
|
continueResolve(value);
|
|
}
|
|
};
|
|
config.onPause?.();
|
|
}).then(() => {
|
|
continueFn = void 0;
|
|
if (!isResolved()) {
|
|
config.onContinue?.();
|
|
}
|
|
});
|
|
};
|
|
const run = () => {
|
|
if (isResolved()) {
|
|
return;
|
|
}
|
|
let promiseOrValue;
|
|
const initialPromise = failureCount === 0 ? config.initialPromise : void 0;
|
|
try {
|
|
promiseOrValue = initialPromise ?? config.fn();
|
|
} catch (error) {
|
|
promiseOrValue = Promise.reject(error);
|
|
}
|
|
Promise.resolve(promiseOrValue).then(resolve).catch((error) => {
|
|
if (isResolved()) {
|
|
return;
|
|
}
|
|
const retry = config.retry ?? (import_utils.isServer ? 0 : 3);
|
|
const retryDelay = config.retryDelay ?? defaultRetryDelay;
|
|
const delay = typeof retryDelay === "function" ? retryDelay(failureCount, error) : retryDelay;
|
|
const shouldRetry = retry === true || typeof retry === "number" && failureCount < retry || typeof retry === "function" && retry(failureCount, error);
|
|
if (isRetryCancelled || !shouldRetry) {
|
|
reject(error);
|
|
return;
|
|
}
|
|
failureCount++;
|
|
config.onFail?.(failureCount, error);
|
|
(0, import_utils.sleep)(delay).then(() => {
|
|
return canContinue() ? void 0 : pause();
|
|
}).then(() => {
|
|
if (isRetryCancelled) {
|
|
reject(error);
|
|
} else {
|
|
run();
|
|
}
|
|
});
|
|
});
|
|
};
|
|
return {
|
|
promise: thenable,
|
|
status: () => thenable.status,
|
|
cancel,
|
|
continue: () => {
|
|
continueFn?.();
|
|
return thenable;
|
|
},
|
|
cancelRetry,
|
|
continueRetry,
|
|
canStart,
|
|
start: () => {
|
|
if (canStart()) {
|
|
run();
|
|
} else {
|
|
pause().then(run);
|
|
}
|
|
return thenable;
|
|
}
|
|
};
|
|
}
|
|
// Annotate the CommonJS export names for ESM import in node:
|
|
0 && (module.exports = {
|
|
CancelledError,
|
|
canFetch,
|
|
createRetryer,
|
|
isCancelledError
|
|
});
|
|
//# sourceMappingURL=retryer.cjs.map |