@tanstack/query-core
Version:
The framework agnostic core that powers TanStack Query
132 lines (131 loc) • 3.88 kB
JavaScript
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
const require_utils = require("./utils.cjs");
const require_environmentManager = require("./environmentManager.cjs");
const require_focusManager = require("./focusManager.cjs");
const require_onlineManager = require("./onlineManager.cjs");
//#region src/retryer.ts
function defaultRetryDelay(failureCount) {
return Math.min(1e3 * 2 ** failureCount, 3e4);
}
function canFetch(networkMode) {
return (networkMode ?? "online") === "online" ? require_onlineManager.onlineManager.isOnline() : true;
}
var CancelledError = class extends Error {
constructor(options) {
super("CancelledError");
this.revert = options?.revert;
this.silent = options?.silent;
}
};
/**
* @deprecated Use instanceof `CancelledError` instead.
*/
function isCancelledError(value) {
return value instanceof CancelledError;
}
function createRetryer(config) {
let isRetryCancelled = false;
let failureCount = 0;
let continueFn;
let status = "pending";
let promiseResolve;
let promiseReject;
const promise = new Promise((resolve, reject) => {
promiseResolve = resolve;
promiseReject = reject;
});
promise.catch(require_utils.noop);
const isResolved = () => 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 = () => require_focusManager.focusManager.isFocused() && (config.networkMode === "always" || require_onlineManager.onlineManager.isOnline()) && config.canRun();
const canStart = () => canFetch(config.networkMode) && config.canRun();
const resolve = (value) => {
if (!isResolved()) {
continueFn?.();
status = "resolved";
promiseResolve(value);
}
};
const reject = (value) => {
if (!isResolved()) {
continueFn?.();
status = "rejected";
promiseReject(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 ?? (require_environmentManager.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);
require_utils.sleep(delay).then(() => {
return canContinue() ? void 0 : pause();
}).then(() => {
if (isRetryCancelled) reject(error);
else run();
});
});
};
return {
promise,
status: () => status,
cancel,
continue: () => {
continueFn?.();
return promise;
},
cancelRetry,
continueRetry,
canStart,
start: () => {
if (canStart()) run();
else pause().then(run);
return promise;
}
};
}
//#endregion
exports.CancelledError = CancelledError;
exports.canFetch = canFetch;
exports.createRetryer = createRetryer;
exports.isCancelledError = isCancelledError;
//# sourceMappingURL=retryer.cjs.map