UNPKG

@tanstack/query-core

Version:

The framework agnostic core that powers TanStack Query

132 lines (131 loc) 3.88 kB
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