123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174 |
- 'use strict';
- Object.defineProperty(exports, '__esModule', { value: true });
- var focusManager = require('./focusManager.js');
- var onlineManager = require('./onlineManager.js');
- var utils = require('./utils.js');
- function defaultRetryDelay(failureCount) {
- return Math.min(1000 * 2 ** failureCount, 30000);
- }
- function canFetch(networkMode) {
- return (networkMode != null ? networkMode : 'online') === 'online' ? onlineManager.onlineManager.isOnline() : true;
- }
- class CancelledError {
- constructor(options) {
- this.revert = options == null ? void 0 : options.revert;
- this.silent = options == null ? void 0 : options.silent;
- }
- }
- function isCancelledError(value) {
- return value instanceof CancelledError;
- }
- function createRetryer(config) {
- let isRetryCancelled = false;
- let failureCount = 0;
- let isResolved = false;
- let continueFn;
- let promiseResolve;
- let promiseReject;
- const promise = new Promise((outerResolve, outerReject) => {
- promiseResolve = outerResolve;
- promiseReject = outerReject;
- });
- const cancel = cancelOptions => {
- if (!isResolved) {
- reject(new CancelledError(cancelOptions));
- config.abort == null ? void 0 : config.abort();
- }
- };
- const cancelRetry = () => {
- isRetryCancelled = true;
- };
- const continueRetry = () => {
- isRetryCancelled = false;
- };
- const shouldPause = () => !focusManager.focusManager.isFocused() || config.networkMode !== 'always' && !onlineManager.onlineManager.isOnline();
- const resolve = value => {
- if (!isResolved) {
- isResolved = true;
- config.onSuccess == null ? void 0 : config.onSuccess(value);
- continueFn == null ? void 0 : continueFn();
- promiseResolve(value);
- }
- };
- const reject = value => {
- if (!isResolved) {
- isResolved = true;
- config.onError == null ? void 0 : config.onError(value);
- continueFn == null ? void 0 : continueFn();
- promiseReject(value);
- }
- };
- const pause = () => {
- return new Promise(continueResolve => {
- continueFn = value => {
- const canContinue = isResolved || !shouldPause();
- if (canContinue) {
- continueResolve(value);
- }
- return canContinue;
- };
- config.onPause == null ? void 0 : config.onPause();
- }).then(() => {
- continueFn = undefined;
- if (!isResolved) {
- config.onContinue == null ? void 0 : config.onContinue();
- }
- });
- }; // Create loop function
- const run = () => {
- // Do nothing if already resolved
- if (isResolved) {
- return;
- }
- let promiseOrValue; // Execute query
- try {
- promiseOrValue = config.fn();
- } catch (error) {
- promiseOrValue = Promise.reject(error);
- }
- Promise.resolve(promiseOrValue).then(resolve).catch(error => {
- var _config$retry, _config$retryDelay;
- // Stop if the fetch is already resolved
- if (isResolved) {
- return;
- } // Do we need to retry the request?
- const retry = (_config$retry = config.retry) != null ? _config$retry : 3;
- const retryDelay = (_config$retryDelay = config.retryDelay) != null ? _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) {
- // We are done if the query does not need to be retried
- reject(error);
- return;
- }
- failureCount++; // Notify on fail
- config.onFail == null ? void 0 : config.onFail(failureCount, error); // Delay
- utils.sleep(delay) // Pause if the document is not visible or when the device is offline
- .then(() => {
- if (shouldPause()) {
- return pause();
- }
- return;
- }).then(() => {
- if (isRetryCancelled) {
- reject(error);
- } else {
- run();
- }
- });
- });
- }; // Start loop
- if (canFetch(config.networkMode)) {
- run();
- } else {
- pause().then(run);
- }
- return {
- promise,
- cancel,
- continue: () => {
- const didContinue = continueFn == null ? void 0 : continueFn();
- return didContinue ? promise : Promise.resolve();
- },
- cancelRetry,
- continueRetry
- };
- }
- exports.CancelledError = CancelledError;
- exports.canFetch = canFetch;
- exports.createRetryer = createRetryer;
- exports.isCancelledError = isCancelledError;
- //# sourceMappingURL=retryer.js.map
|