@tanstack/query-core 4.24.4 → 4.24.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/lib/mutation.d.ts +1 -1
- package/build/lib/mutation.esm.js +2 -5
- package/build/lib/mutation.esm.js.map +1 -1
- package/build/lib/mutation.js +2 -5
- package/build/lib/mutation.js.map +1 -1
- package/build/lib/mutation.mjs +2 -5
- package/build/lib/mutation.mjs.map +1 -1
- package/build/lib/mutationCache.d.ts +9 -8
- package/build/lib/mutationCache.esm.js +9 -2
- package/build/lib/mutationCache.esm.js.map +1 -1
- package/build/lib/mutationCache.js +9 -2
- package/build/lib/mutationCache.js.map +1 -1
- package/build/lib/mutationCache.mjs +9 -2
- package/build/lib/mutationCache.mjs.map +1 -1
- package/build/lib/queryCache.d.ts +9 -9
- package/build/lib/queryCache.esm.js.map +1 -1
- package/build/lib/queryCache.js.map +1 -1
- package/build/lib/queryCache.mjs.map +1 -1
- package/build/lib/queryClient.d.ts +1 -1
- package/build/lib/queryClient.esm.js.map +1 -1
- package/build/lib/queryClient.js.map +1 -1
- package/build/lib/queryClient.mjs.map +1 -1
- package/build/lib/retryer.d.ts +1 -1
- package/build/lib/retryer.esm.js +8 -3
- package/build/lib/retryer.esm.js.map +1 -1
- package/build/lib/retryer.js +8 -3
- package/build/lib/retryer.js.map +1 -1
- package/build/lib/retryer.mjs +8 -3
- package/build/lib/retryer.mjs.map +1 -1
- package/build/lib/types.d.ts +4 -0
- package/build/umd/index.development.js +19 -10
- package/build/umd/index.development.js.map +1 -1
- package/build/umd/index.production.js +1 -1
- package/build/umd/index.production.js.map +1 -1
- package/package.json +1 -1
- package/src/mutation.ts +2 -6
- package/src/mutationCache.ts +25 -16
- package/src/queryCache.ts +10 -10
- package/src/queryClient.ts +1 -1
- package/src/retryer.ts +8 -5
- package/src/tests/queryClient.test.tsx +77 -1
- package/src/types.ts +13 -0
package/build/lib/retryer.esm.js
CHANGED
|
@@ -69,9 +69,13 @@ function createRetryer(config) {
|
|
|
69
69
|
const pause = () => {
|
|
70
70
|
return new Promise(continueResolve => {
|
|
71
71
|
continueFn = value => {
|
|
72
|
-
|
|
73
|
-
|
|
72
|
+
const canContinue = isResolved || !shouldPause();
|
|
73
|
+
|
|
74
|
+
if (canContinue) {
|
|
75
|
+
continueResolve(value);
|
|
74
76
|
}
|
|
77
|
+
|
|
78
|
+
return canContinue;
|
|
75
79
|
};
|
|
76
80
|
|
|
77
81
|
config.onPause == null ? void 0 : config.onPause();
|
|
@@ -151,7 +155,8 @@ function createRetryer(config) {
|
|
|
151
155
|
promise,
|
|
152
156
|
cancel,
|
|
153
157
|
continue: () => {
|
|
154
|
-
continueFn == null ? void 0 : continueFn();
|
|
158
|
+
const didContinue = continueFn == null ? void 0 : continueFn();
|
|
159
|
+
return didContinue ? promise : Promise.resolve();
|
|
155
160
|
},
|
|
156
161
|
cancelRetry,
|
|
157
162
|
continueRetry
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"retryer.esm.js","sources":["../../src/retryer.ts"],"sourcesContent":["import { focusManager } from './focusManager'\nimport { onlineManager } from './onlineManager'\nimport { sleep } from './utils'\nimport type { CancelOptions, NetworkMode } from './types'\n\n// TYPES\n\ninterface RetryerConfig<TData = unknown, TError = unknown> {\n fn: () => TData | Promise<TData>\n abort?: () => void\n onError?: (error: TError) => void\n onSuccess?: (data: TData) => void\n onFail?: (failureCount: number, error: TError) => void\n onPause?: () => void\n onContinue?: () => void\n retry?: RetryValue<TError>\n retryDelay?: RetryDelayValue<TError>\n networkMode: NetworkMode | undefined\n}\n\nexport interface Retryer<TData = unknown> {\n promise: Promise<TData>\n cancel: (cancelOptions?: CancelOptions) => void\n continue: () => void\n cancelRetry: () => void\n continueRetry: () => void\n}\n\nexport type RetryValue<TError> = boolean | number | ShouldRetryFunction<TError>\n\ntype ShouldRetryFunction<TError> = (\n failureCount: number,\n error: TError,\n) => boolean\n\nexport type RetryDelayValue<TError> = number | RetryDelayFunction<TError>\n\ntype RetryDelayFunction<TError = unknown> = (\n failureCount: number,\n error: TError,\n) => number\n\nfunction defaultRetryDelay(failureCount: number) {\n return Math.min(1000 * 2 ** failureCount, 30000)\n}\n\nexport function canFetch(networkMode: NetworkMode | undefined): boolean {\n return (networkMode ?? 'online') === 'online'\n ? onlineManager.isOnline()\n : true\n}\n\nexport class CancelledError {\n revert?: boolean\n silent?: boolean\n constructor(options?: CancelOptions) {\n this.revert = options?.revert\n this.silent = options?.silent\n }\n}\n\nexport function isCancelledError(value: any): value is CancelledError {\n return value instanceof CancelledError\n}\n\nexport function createRetryer<TData = unknown, TError = unknown>(\n config: RetryerConfig<TData, TError>,\n): Retryer<TData> {\n let isRetryCancelled = false\n let failureCount = 0\n let isResolved = false\n let continueFn: ((value?: unknown) => void) | undefined\n let promiseResolve: (data: TData) => void\n let promiseReject: (error: TError) => void\n\n const promise = new Promise<TData>((outerResolve, outerReject) => {\n promiseResolve = outerResolve\n promiseReject = outerReject\n })\n\n const cancel = (cancelOptions?: CancelOptions): void => {\n if (!isResolved) {\n reject(new CancelledError(cancelOptions))\n\n config.abort?.()\n }\n }\n const cancelRetry = () => {\n isRetryCancelled = true\n }\n\n const continueRetry = () => {\n isRetryCancelled = false\n }\n\n const shouldPause = () =>\n !focusManager.isFocused() ||\n (config.networkMode !== 'always' && !onlineManager.isOnline())\n\n const resolve = (value: any) => {\n if (!isResolved) {\n isResolved = true\n config.onSuccess?.(value)\n continueFn?.()\n promiseResolve(value)\n }\n }\n\n const reject = (value: any) => {\n if (!isResolved) {\n isResolved = true\n config.onError?.(value)\n continueFn?.()\n promiseReject(value)\n }\n }\n\n const pause = () => {\n return new Promise((continueResolve) => {\n continueFn = (value) => {\n if (isResolved || !shouldPause()) {\n return continueResolve(value)\n }\n }\n config.onPause?.()\n }).then(() => {\n continueFn = undefined\n if (!isResolved) {\n config.onContinue?.()\n }\n })\n }\n\n // Create loop function\n const run = () => {\n // Do nothing if already resolved\n if (isResolved) {\n return\n }\n\n let promiseOrValue: any\n\n // Execute query\n try {\n promiseOrValue = config.fn()\n } catch (error) {\n promiseOrValue = Promise.reject(error)\n }\n\n Promise.resolve(promiseOrValue)\n .then(resolve)\n .catch((error) => {\n // Stop if the fetch is already resolved\n if (isResolved) {\n return\n }\n\n // Do we need to retry the request?\n const retry = config.retry ?? 3\n const retryDelay = config.retryDelay ?? defaultRetryDelay\n const delay =\n typeof retryDelay === 'function'\n ? retryDelay(failureCount, error)\n : retryDelay\n const shouldRetry =\n retry === true ||\n (typeof retry === 'number' && failureCount < retry) ||\n (typeof retry === 'function' && retry(failureCount, error))\n\n if (isRetryCancelled || !shouldRetry) {\n // We are done if the query does not need to be retried\n reject(error)\n return\n }\n\n failureCount++\n\n // Notify on fail\n config.onFail?.(failureCount, error)\n\n // Delay\n sleep(delay)\n // Pause if the document is not visible or when the device is offline\n .then(() => {\n if (shouldPause()) {\n return pause()\n }\n return\n })\n .then(() => {\n if (isRetryCancelled) {\n reject(error)\n } else {\n run()\n }\n })\n })\n }\n\n // Start loop\n if (canFetch(config.networkMode)) {\n run()\n } else {\n pause().then(run)\n }\n\n return {\n promise,\n cancel,\n continue: () => {\n continueFn?.()\n },\n cancelRetry,\n continueRetry,\n }\n}\n"],"names":["defaultRetryDelay","failureCount","Math","min","canFetch","networkMode","onlineManager","isOnline","CancelledError","constructor","options","revert","silent","isCancelledError","value","createRetryer","config","isRetryCancelled","isResolved","continueFn","promiseResolve","promiseReject","promise","Promise","outerResolve","outerReject","cancel","cancelOptions","reject","abort","cancelRetry","continueRetry","shouldPause","focusManager","isFocused","resolve","onSuccess","onError","pause","continueResolve","onPause","then","undefined","onContinue","run","promiseOrValue","fn","error","catch","retry","retryDelay","delay","shouldRetry","onFail","sleep","continue"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"retryer.esm.js","sources":["../../src/retryer.ts"],"sourcesContent":["import { focusManager } from './focusManager'\nimport { onlineManager } from './onlineManager'\nimport { sleep } from './utils'\nimport type { CancelOptions, NetworkMode } from './types'\n\n// TYPES\n\ninterface RetryerConfig<TData = unknown, TError = unknown> {\n fn: () => TData | Promise<TData>\n abort?: () => void\n onError?: (error: TError) => void\n onSuccess?: (data: TData) => void\n onFail?: (failureCount: number, error: TError) => void\n onPause?: () => void\n onContinue?: () => void\n retry?: RetryValue<TError>\n retryDelay?: RetryDelayValue<TError>\n networkMode: NetworkMode | undefined\n}\n\nexport interface Retryer<TData = unknown> {\n promise: Promise<TData>\n cancel: (cancelOptions?: CancelOptions) => void\n continue: () => Promise<unknown>\n cancelRetry: () => void\n continueRetry: () => void\n}\n\nexport type RetryValue<TError> = boolean | number | ShouldRetryFunction<TError>\n\ntype ShouldRetryFunction<TError> = (\n failureCount: number,\n error: TError,\n) => boolean\n\nexport type RetryDelayValue<TError> = number | RetryDelayFunction<TError>\n\ntype RetryDelayFunction<TError = unknown> = (\n failureCount: number,\n error: TError,\n) => number\n\nfunction defaultRetryDelay(failureCount: number) {\n return Math.min(1000 * 2 ** failureCount, 30000)\n}\n\nexport function canFetch(networkMode: NetworkMode | undefined): boolean {\n return (networkMode ?? 'online') === 'online'\n ? onlineManager.isOnline()\n : true\n}\n\nexport class CancelledError {\n revert?: boolean\n silent?: boolean\n constructor(options?: CancelOptions) {\n this.revert = options?.revert\n this.silent = options?.silent\n }\n}\n\nexport function isCancelledError(value: any): value is CancelledError {\n return value instanceof CancelledError\n}\n\nexport function createRetryer<TData = unknown, TError = unknown>(\n config: RetryerConfig<TData, TError>,\n): Retryer<TData> {\n let isRetryCancelled = false\n let failureCount = 0\n let isResolved = false\n let continueFn: ((value?: unknown) => boolean) | undefined\n let promiseResolve: (data: TData) => void\n let promiseReject: (error: TError) => void\n\n const promise = new Promise<TData>((outerResolve, outerReject) => {\n promiseResolve = outerResolve\n promiseReject = outerReject\n })\n\n const cancel = (cancelOptions?: CancelOptions): void => {\n if (!isResolved) {\n reject(new CancelledError(cancelOptions))\n\n config.abort?.()\n }\n }\n const cancelRetry = () => {\n isRetryCancelled = true\n }\n\n const continueRetry = () => {\n isRetryCancelled = false\n }\n\n const shouldPause = () =>\n !focusManager.isFocused() ||\n (config.networkMode !== 'always' && !onlineManager.isOnline())\n\n const resolve = (value: any) => {\n if (!isResolved) {\n isResolved = true\n config.onSuccess?.(value)\n continueFn?.()\n promiseResolve(value)\n }\n }\n\n const reject = (value: any) => {\n if (!isResolved) {\n isResolved = true\n config.onError?.(value)\n continueFn?.()\n promiseReject(value)\n }\n }\n\n const pause = () => {\n return new Promise((continueResolve) => {\n continueFn = (value) => {\n const canContinue = isResolved || !shouldPause()\n if (canContinue) {\n continueResolve(value)\n }\n return canContinue\n }\n config.onPause?.()\n }).then(() => {\n continueFn = undefined\n if (!isResolved) {\n config.onContinue?.()\n }\n })\n }\n\n // Create loop function\n const run = () => {\n // Do nothing if already resolved\n if (isResolved) {\n return\n }\n\n let promiseOrValue: any\n\n // Execute query\n try {\n promiseOrValue = config.fn()\n } catch (error) {\n promiseOrValue = Promise.reject(error)\n }\n\n Promise.resolve(promiseOrValue)\n .then(resolve)\n .catch((error) => {\n // Stop if the fetch is already resolved\n if (isResolved) {\n return\n }\n\n // Do we need to retry the request?\n const retry = config.retry ?? 3\n const retryDelay = config.retryDelay ?? defaultRetryDelay\n const delay =\n typeof retryDelay === 'function'\n ? retryDelay(failureCount, error)\n : retryDelay\n const shouldRetry =\n retry === true ||\n (typeof retry === 'number' && failureCount < retry) ||\n (typeof retry === 'function' && retry(failureCount, error))\n\n if (isRetryCancelled || !shouldRetry) {\n // We are done if the query does not need to be retried\n reject(error)\n return\n }\n\n failureCount++\n\n // Notify on fail\n config.onFail?.(failureCount, error)\n\n // Delay\n sleep(delay)\n // Pause if the document is not visible or when the device is offline\n .then(() => {\n if (shouldPause()) {\n return pause()\n }\n return\n })\n .then(() => {\n if (isRetryCancelled) {\n reject(error)\n } else {\n run()\n }\n })\n })\n }\n\n // Start loop\n if (canFetch(config.networkMode)) {\n run()\n } else {\n pause().then(run)\n }\n\n return {\n promise,\n cancel,\n continue: () => {\n const didContinue = continueFn?.()\n return didContinue ? promise : Promise.resolve()\n },\n cancelRetry,\n continueRetry,\n }\n}\n"],"names":["defaultRetryDelay","failureCount","Math","min","canFetch","networkMode","onlineManager","isOnline","CancelledError","constructor","options","revert","silent","isCancelledError","value","createRetryer","config","isRetryCancelled","isResolved","continueFn","promiseResolve","promiseReject","promise","Promise","outerResolve","outerReject","cancel","cancelOptions","reject","abort","cancelRetry","continueRetry","shouldPause","focusManager","isFocused","resolve","onSuccess","onError","pause","continueResolve","canContinue","onPause","then","undefined","onContinue","run","promiseOrValue","fn","error","catch","retry","retryDelay","delay","shouldRetry","onFail","sleep","continue","didContinue"],"mappings":"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"}
|
package/build/lib/retryer.js
CHANGED
|
@@ -73,9 +73,13 @@ function createRetryer(config) {
|
|
|
73
73
|
const pause = () => {
|
|
74
74
|
return new Promise(continueResolve => {
|
|
75
75
|
continueFn = value => {
|
|
76
|
-
|
|
77
|
-
|
|
76
|
+
const canContinue = isResolved || !shouldPause();
|
|
77
|
+
|
|
78
|
+
if (canContinue) {
|
|
79
|
+
continueResolve(value);
|
|
78
80
|
}
|
|
81
|
+
|
|
82
|
+
return canContinue;
|
|
79
83
|
};
|
|
80
84
|
|
|
81
85
|
config.onPause == null ? void 0 : config.onPause();
|
|
@@ -155,7 +159,8 @@ function createRetryer(config) {
|
|
|
155
159
|
promise,
|
|
156
160
|
cancel,
|
|
157
161
|
continue: () => {
|
|
158
|
-
continueFn == null ? void 0 : continueFn();
|
|
162
|
+
const didContinue = continueFn == null ? void 0 : continueFn();
|
|
163
|
+
return didContinue ? promise : Promise.resolve();
|
|
159
164
|
},
|
|
160
165
|
cancelRetry,
|
|
161
166
|
continueRetry
|
package/build/lib/retryer.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"retryer.js","sources":["../../src/retryer.ts"],"sourcesContent":["import { focusManager } from './focusManager'\nimport { onlineManager } from './onlineManager'\nimport { sleep } from './utils'\nimport type { CancelOptions, NetworkMode } from './types'\n\n// TYPES\n\ninterface RetryerConfig<TData = unknown, TError = unknown> {\n fn: () => TData | Promise<TData>\n abort?: () => void\n onError?: (error: TError) => void\n onSuccess?: (data: TData) => void\n onFail?: (failureCount: number, error: TError) => void\n onPause?: () => void\n onContinue?: () => void\n retry?: RetryValue<TError>\n retryDelay?: RetryDelayValue<TError>\n networkMode: NetworkMode | undefined\n}\n\nexport interface Retryer<TData = unknown> {\n promise: Promise<TData>\n cancel: (cancelOptions?: CancelOptions) => void\n continue: () => void\n cancelRetry: () => void\n continueRetry: () => void\n}\n\nexport type RetryValue<TError> = boolean | number | ShouldRetryFunction<TError>\n\ntype ShouldRetryFunction<TError> = (\n failureCount: number,\n error: TError,\n) => boolean\n\nexport type RetryDelayValue<TError> = number | RetryDelayFunction<TError>\n\ntype RetryDelayFunction<TError = unknown> = (\n failureCount: number,\n error: TError,\n) => number\n\nfunction defaultRetryDelay(failureCount: number) {\n return Math.min(1000 * 2 ** failureCount, 30000)\n}\n\nexport function canFetch(networkMode: NetworkMode | undefined): boolean {\n return (networkMode ?? 'online') === 'online'\n ? onlineManager.isOnline()\n : true\n}\n\nexport class CancelledError {\n revert?: boolean\n silent?: boolean\n constructor(options?: CancelOptions) {\n this.revert = options?.revert\n this.silent = options?.silent\n }\n}\n\nexport function isCancelledError(value: any): value is CancelledError {\n return value instanceof CancelledError\n}\n\nexport function createRetryer<TData = unknown, TError = unknown>(\n config: RetryerConfig<TData, TError>,\n): Retryer<TData> {\n let isRetryCancelled = false\n let failureCount = 0\n let isResolved = false\n let continueFn: ((value?: unknown) => void) | undefined\n let promiseResolve: (data: TData) => void\n let promiseReject: (error: TError) => void\n\n const promise = new Promise<TData>((outerResolve, outerReject) => {\n promiseResolve = outerResolve\n promiseReject = outerReject\n })\n\n const cancel = (cancelOptions?: CancelOptions): void => {\n if (!isResolved) {\n reject(new CancelledError(cancelOptions))\n\n config.abort?.()\n }\n }\n const cancelRetry = () => {\n isRetryCancelled = true\n }\n\n const continueRetry = () => {\n isRetryCancelled = false\n }\n\n const shouldPause = () =>\n !focusManager.isFocused() ||\n (config.networkMode !== 'always' && !onlineManager.isOnline())\n\n const resolve = (value: any) => {\n if (!isResolved) {\n isResolved = true\n config.onSuccess?.(value)\n continueFn?.()\n promiseResolve(value)\n }\n }\n\n const reject = (value: any) => {\n if (!isResolved) {\n isResolved = true\n config.onError?.(value)\n continueFn?.()\n promiseReject(value)\n }\n }\n\n const pause = () => {\n return new Promise((continueResolve) => {\n continueFn = (value) => {\n if (isResolved || !shouldPause()) {\n return continueResolve(value)\n }\n }\n config.onPause?.()\n }).then(() => {\n continueFn = undefined\n if (!isResolved) {\n config.onContinue?.()\n }\n })\n }\n\n // Create loop function\n const run = () => {\n // Do nothing if already resolved\n if (isResolved) {\n return\n }\n\n let promiseOrValue: any\n\n // Execute query\n try {\n promiseOrValue = config.fn()\n } catch (error) {\n promiseOrValue = Promise.reject(error)\n }\n\n Promise.resolve(promiseOrValue)\n .then(resolve)\n .catch((error) => {\n // Stop if the fetch is already resolved\n if (isResolved) {\n return\n }\n\n // Do we need to retry the request?\n const retry = config.retry ?? 3\n const retryDelay = config.retryDelay ?? defaultRetryDelay\n const delay =\n typeof retryDelay === 'function'\n ? retryDelay(failureCount, error)\n : retryDelay\n const shouldRetry =\n retry === true ||\n (typeof retry === 'number' && failureCount < retry) ||\n (typeof retry === 'function' && retry(failureCount, error))\n\n if (isRetryCancelled || !shouldRetry) {\n // We are done if the query does not need to be retried\n reject(error)\n return\n }\n\n failureCount++\n\n // Notify on fail\n config.onFail?.(failureCount, error)\n\n // Delay\n sleep(delay)\n // Pause if the document is not visible or when the device is offline\n .then(() => {\n if (shouldPause()) {\n return pause()\n }\n return\n })\n .then(() => {\n if (isRetryCancelled) {\n reject(error)\n } else {\n run()\n }\n })\n })\n }\n\n // Start loop\n if (canFetch(config.networkMode)) {\n run()\n } else {\n pause().then(run)\n }\n\n return {\n promise,\n cancel,\n continue: () => {\n continueFn?.()\n },\n cancelRetry,\n continueRetry,\n }\n}\n"],"names":["defaultRetryDelay","failureCount","Math","min","canFetch","networkMode","onlineManager","isOnline","CancelledError","constructor","options","revert","silent","isCancelledError","value","createRetryer","config","isRetryCancelled","isResolved","continueFn","promiseResolve","promiseReject","promise","Promise","outerResolve","outerReject","cancel","cancelOptions","reject","abort","cancelRetry","continueRetry","shouldPause","focusManager","isFocused","resolve","onSuccess","onError","pause","continueResolve","onPause","then","undefined","onContinue","run","promiseOrValue","fn","error","catch","retry","retryDelay","delay","shouldRetry","onFail","sleep","continue"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"retryer.js","sources":["../../src/retryer.ts"],"sourcesContent":["import { focusManager } from './focusManager'\nimport { onlineManager } from './onlineManager'\nimport { sleep } from './utils'\nimport type { CancelOptions, NetworkMode } from './types'\n\n// TYPES\n\ninterface RetryerConfig<TData = unknown, TError = unknown> {\n fn: () => TData | Promise<TData>\n abort?: () => void\n onError?: (error: TError) => void\n onSuccess?: (data: TData) => void\n onFail?: (failureCount: number, error: TError) => void\n onPause?: () => void\n onContinue?: () => void\n retry?: RetryValue<TError>\n retryDelay?: RetryDelayValue<TError>\n networkMode: NetworkMode | undefined\n}\n\nexport interface Retryer<TData = unknown> {\n promise: Promise<TData>\n cancel: (cancelOptions?: CancelOptions) => void\n continue: () => Promise<unknown>\n cancelRetry: () => void\n continueRetry: () => void\n}\n\nexport type RetryValue<TError> = boolean | number | ShouldRetryFunction<TError>\n\ntype ShouldRetryFunction<TError> = (\n failureCount: number,\n error: TError,\n) => boolean\n\nexport type RetryDelayValue<TError> = number | RetryDelayFunction<TError>\n\ntype RetryDelayFunction<TError = unknown> = (\n failureCount: number,\n error: TError,\n) => number\n\nfunction defaultRetryDelay(failureCount: number) {\n return Math.min(1000 * 2 ** failureCount, 30000)\n}\n\nexport function canFetch(networkMode: NetworkMode | undefined): boolean {\n return (networkMode ?? 'online') === 'online'\n ? onlineManager.isOnline()\n : true\n}\n\nexport class CancelledError {\n revert?: boolean\n silent?: boolean\n constructor(options?: CancelOptions) {\n this.revert = options?.revert\n this.silent = options?.silent\n }\n}\n\nexport function isCancelledError(value: any): value is CancelledError {\n return value instanceof CancelledError\n}\n\nexport function createRetryer<TData = unknown, TError = unknown>(\n config: RetryerConfig<TData, TError>,\n): Retryer<TData> {\n let isRetryCancelled = false\n let failureCount = 0\n let isResolved = false\n let continueFn: ((value?: unknown) => boolean) | undefined\n let promiseResolve: (data: TData) => void\n let promiseReject: (error: TError) => void\n\n const promise = new Promise<TData>((outerResolve, outerReject) => {\n promiseResolve = outerResolve\n promiseReject = outerReject\n })\n\n const cancel = (cancelOptions?: CancelOptions): void => {\n if (!isResolved) {\n reject(new CancelledError(cancelOptions))\n\n config.abort?.()\n }\n }\n const cancelRetry = () => {\n isRetryCancelled = true\n }\n\n const continueRetry = () => {\n isRetryCancelled = false\n }\n\n const shouldPause = () =>\n !focusManager.isFocused() ||\n (config.networkMode !== 'always' && !onlineManager.isOnline())\n\n const resolve = (value: any) => {\n if (!isResolved) {\n isResolved = true\n config.onSuccess?.(value)\n continueFn?.()\n promiseResolve(value)\n }\n }\n\n const reject = (value: any) => {\n if (!isResolved) {\n isResolved = true\n config.onError?.(value)\n continueFn?.()\n promiseReject(value)\n }\n }\n\n const pause = () => {\n return new Promise((continueResolve) => {\n continueFn = (value) => {\n const canContinue = isResolved || !shouldPause()\n if (canContinue) {\n continueResolve(value)\n }\n return canContinue\n }\n config.onPause?.()\n }).then(() => {\n continueFn = undefined\n if (!isResolved) {\n config.onContinue?.()\n }\n })\n }\n\n // Create loop function\n const run = () => {\n // Do nothing if already resolved\n if (isResolved) {\n return\n }\n\n let promiseOrValue: any\n\n // Execute query\n try {\n promiseOrValue = config.fn()\n } catch (error) {\n promiseOrValue = Promise.reject(error)\n }\n\n Promise.resolve(promiseOrValue)\n .then(resolve)\n .catch((error) => {\n // Stop if the fetch is already resolved\n if (isResolved) {\n return\n }\n\n // Do we need to retry the request?\n const retry = config.retry ?? 3\n const retryDelay = config.retryDelay ?? defaultRetryDelay\n const delay =\n typeof retryDelay === 'function'\n ? retryDelay(failureCount, error)\n : retryDelay\n const shouldRetry =\n retry === true ||\n (typeof retry === 'number' && failureCount < retry) ||\n (typeof retry === 'function' && retry(failureCount, error))\n\n if (isRetryCancelled || !shouldRetry) {\n // We are done if the query does not need to be retried\n reject(error)\n return\n }\n\n failureCount++\n\n // Notify on fail\n config.onFail?.(failureCount, error)\n\n // Delay\n sleep(delay)\n // Pause if the document is not visible or when the device is offline\n .then(() => {\n if (shouldPause()) {\n return pause()\n }\n return\n })\n .then(() => {\n if (isRetryCancelled) {\n reject(error)\n } else {\n run()\n }\n })\n })\n }\n\n // Start loop\n if (canFetch(config.networkMode)) {\n run()\n } else {\n pause().then(run)\n }\n\n return {\n promise,\n cancel,\n continue: () => {\n const didContinue = continueFn?.()\n return didContinue ? promise : Promise.resolve()\n },\n cancelRetry,\n continueRetry,\n }\n}\n"],"names":["defaultRetryDelay","failureCount","Math","min","canFetch","networkMode","onlineManager","isOnline","CancelledError","constructor","options","revert","silent","isCancelledError","value","createRetryer","config","isRetryCancelled","isResolved","continueFn","promiseResolve","promiseReject","promise","Promise","outerResolve","outerReject","cancel","cancelOptions","reject","abort","cancelRetry","continueRetry","shouldPause","focusManager","isFocused","resolve","onSuccess","onError","pause","continueResolve","canContinue","onPause","then","undefined","onContinue","run","promiseOrValue","fn","error","catch","retry","retryDelay","delay","shouldRetry","onFail","sleep","continue","didContinue"],"mappings":"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"}
|
package/build/lib/retryer.mjs
CHANGED
|
@@ -69,9 +69,13 @@ function createRetryer(config) {
|
|
|
69
69
|
const pause = () => {
|
|
70
70
|
return new Promise(continueResolve => {
|
|
71
71
|
continueFn = value => {
|
|
72
|
-
|
|
73
|
-
|
|
72
|
+
const canContinue = isResolved || !shouldPause();
|
|
73
|
+
|
|
74
|
+
if (canContinue) {
|
|
75
|
+
continueResolve(value);
|
|
74
76
|
}
|
|
77
|
+
|
|
78
|
+
return canContinue;
|
|
75
79
|
};
|
|
76
80
|
|
|
77
81
|
config.onPause == null ? void 0 : config.onPause();
|
|
@@ -151,7 +155,8 @@ function createRetryer(config) {
|
|
|
151
155
|
promise,
|
|
152
156
|
cancel,
|
|
153
157
|
continue: () => {
|
|
154
|
-
continueFn == null ? void 0 : continueFn();
|
|
158
|
+
const didContinue = continueFn == null ? void 0 : continueFn();
|
|
159
|
+
return didContinue ? promise : Promise.resolve();
|
|
155
160
|
},
|
|
156
161
|
cancelRetry,
|
|
157
162
|
continueRetry
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"retryer.mjs","sources":["../../src/retryer.ts"],"sourcesContent":["import { focusManager } from './focusManager'\nimport { onlineManager } from './onlineManager'\nimport { sleep } from './utils'\nimport type { CancelOptions, NetworkMode } from './types'\n\n// TYPES\n\ninterface RetryerConfig<TData = unknown, TError = unknown> {\n fn: () => TData | Promise<TData>\n abort?: () => void\n onError?: (error: TError) => void\n onSuccess?: (data: TData) => void\n onFail?: (failureCount: number, error: TError) => void\n onPause?: () => void\n onContinue?: () => void\n retry?: RetryValue<TError>\n retryDelay?: RetryDelayValue<TError>\n networkMode: NetworkMode | undefined\n}\n\nexport interface Retryer<TData = unknown> {\n promise: Promise<TData>\n cancel: (cancelOptions?: CancelOptions) => void\n continue: () => void\n cancelRetry: () => void\n continueRetry: () => void\n}\n\nexport type RetryValue<TError> = boolean | number | ShouldRetryFunction<TError>\n\ntype ShouldRetryFunction<TError> = (\n failureCount: number,\n error: TError,\n) => boolean\n\nexport type RetryDelayValue<TError> = number | RetryDelayFunction<TError>\n\ntype RetryDelayFunction<TError = unknown> = (\n failureCount: number,\n error: TError,\n) => number\n\nfunction defaultRetryDelay(failureCount: number) {\n return Math.min(1000 * 2 ** failureCount, 30000)\n}\n\nexport function canFetch(networkMode: NetworkMode | undefined): boolean {\n return (networkMode ?? 'online') === 'online'\n ? onlineManager.isOnline()\n : true\n}\n\nexport class CancelledError {\n revert?: boolean\n silent?: boolean\n constructor(options?: CancelOptions) {\n this.revert = options?.revert\n this.silent = options?.silent\n }\n}\n\nexport function isCancelledError(value: any): value is CancelledError {\n return value instanceof CancelledError\n}\n\nexport function createRetryer<TData = unknown, TError = unknown>(\n config: RetryerConfig<TData, TError>,\n): Retryer<TData> {\n let isRetryCancelled = false\n let failureCount = 0\n let isResolved = false\n let continueFn: ((value?: unknown) => void) | undefined\n let promiseResolve: (data: TData) => void\n let promiseReject: (error: TError) => void\n\n const promise = new Promise<TData>((outerResolve, outerReject) => {\n promiseResolve = outerResolve\n promiseReject = outerReject\n })\n\n const cancel = (cancelOptions?: CancelOptions): void => {\n if (!isResolved) {\n reject(new CancelledError(cancelOptions))\n\n config.abort?.()\n }\n }\n const cancelRetry = () => {\n isRetryCancelled = true\n }\n\n const continueRetry = () => {\n isRetryCancelled = false\n }\n\n const shouldPause = () =>\n !focusManager.isFocused() ||\n (config.networkMode !== 'always' && !onlineManager.isOnline())\n\n const resolve = (value: any) => {\n if (!isResolved) {\n isResolved = true\n config.onSuccess?.(value)\n continueFn?.()\n promiseResolve(value)\n }\n }\n\n const reject = (value: any) => {\n if (!isResolved) {\n isResolved = true\n config.onError?.(value)\n continueFn?.()\n promiseReject(value)\n }\n }\n\n const pause = () => {\n return new Promise((continueResolve) => {\n continueFn = (value) => {\n if (isResolved || !shouldPause()) {\n return continueResolve(value)\n }\n }\n config.onPause?.()\n }).then(() => {\n continueFn = undefined\n if (!isResolved) {\n config.onContinue?.()\n }\n })\n }\n\n // Create loop function\n const run = () => {\n // Do nothing if already resolved\n if (isResolved) {\n return\n }\n\n let promiseOrValue: any\n\n // Execute query\n try {\n promiseOrValue = config.fn()\n } catch (error) {\n promiseOrValue = Promise.reject(error)\n }\n\n Promise.resolve(promiseOrValue)\n .then(resolve)\n .catch((error) => {\n // Stop if the fetch is already resolved\n if (isResolved) {\n return\n }\n\n // Do we need to retry the request?\n const retry = config.retry ?? 3\n const retryDelay = config.retryDelay ?? defaultRetryDelay\n const delay =\n typeof retryDelay === 'function'\n ? retryDelay(failureCount, error)\n : retryDelay\n const shouldRetry =\n retry === true ||\n (typeof retry === 'number' && failureCount < retry) ||\n (typeof retry === 'function' && retry(failureCount, error))\n\n if (isRetryCancelled || !shouldRetry) {\n // We are done if the query does not need to be retried\n reject(error)\n return\n }\n\n failureCount++\n\n // Notify on fail\n config.onFail?.(failureCount, error)\n\n // Delay\n sleep(delay)\n // Pause if the document is not visible or when the device is offline\n .then(() => {\n if (shouldPause()) {\n return pause()\n }\n return\n })\n .then(() => {\n if (isRetryCancelled) {\n reject(error)\n } else {\n run()\n }\n })\n })\n }\n\n // Start loop\n if (canFetch(config.networkMode)) {\n run()\n } else {\n pause().then(run)\n }\n\n return {\n promise,\n cancel,\n continue: () => {\n continueFn?.()\n },\n cancelRetry,\n continueRetry,\n }\n}\n"],"names":["defaultRetryDelay","failureCount","Math","min","canFetch","networkMode","onlineManager","isOnline","CancelledError","constructor","options","revert","silent","isCancelledError","value","createRetryer","config","isRetryCancelled","isResolved","continueFn","promiseResolve","promiseReject","promise","Promise","outerResolve","outerReject","cancel","cancelOptions","reject","abort","cancelRetry","continueRetry","shouldPause","focusManager","isFocused","resolve","onSuccess","onError","pause","continueResolve","onPause","then","undefined","onContinue","run","promiseOrValue","fn","error","catch","retry","retryDelay","delay","shouldRetry","onFail","sleep","continue"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"retryer.mjs","sources":["../../src/retryer.ts"],"sourcesContent":["import { focusManager } from './focusManager'\nimport { onlineManager } from './onlineManager'\nimport { sleep } from './utils'\nimport type { CancelOptions, NetworkMode } from './types'\n\n// TYPES\n\ninterface RetryerConfig<TData = unknown, TError = unknown> {\n fn: () => TData | Promise<TData>\n abort?: () => void\n onError?: (error: TError) => void\n onSuccess?: (data: TData) => void\n onFail?: (failureCount: number, error: TError) => void\n onPause?: () => void\n onContinue?: () => void\n retry?: RetryValue<TError>\n retryDelay?: RetryDelayValue<TError>\n networkMode: NetworkMode | undefined\n}\n\nexport interface Retryer<TData = unknown> {\n promise: Promise<TData>\n cancel: (cancelOptions?: CancelOptions) => void\n continue: () => Promise<unknown>\n cancelRetry: () => void\n continueRetry: () => void\n}\n\nexport type RetryValue<TError> = boolean | number | ShouldRetryFunction<TError>\n\ntype ShouldRetryFunction<TError> = (\n failureCount: number,\n error: TError,\n) => boolean\n\nexport type RetryDelayValue<TError> = number | RetryDelayFunction<TError>\n\ntype RetryDelayFunction<TError = unknown> = (\n failureCount: number,\n error: TError,\n) => number\n\nfunction defaultRetryDelay(failureCount: number) {\n return Math.min(1000 * 2 ** failureCount, 30000)\n}\n\nexport function canFetch(networkMode: NetworkMode | undefined): boolean {\n return (networkMode ?? 'online') === 'online'\n ? onlineManager.isOnline()\n : true\n}\n\nexport class CancelledError {\n revert?: boolean\n silent?: boolean\n constructor(options?: CancelOptions) {\n this.revert = options?.revert\n this.silent = options?.silent\n }\n}\n\nexport function isCancelledError(value: any): value is CancelledError {\n return value instanceof CancelledError\n}\n\nexport function createRetryer<TData = unknown, TError = unknown>(\n config: RetryerConfig<TData, TError>,\n): Retryer<TData> {\n let isRetryCancelled = false\n let failureCount = 0\n let isResolved = false\n let continueFn: ((value?: unknown) => boolean) | undefined\n let promiseResolve: (data: TData) => void\n let promiseReject: (error: TError) => void\n\n const promise = new Promise<TData>((outerResolve, outerReject) => {\n promiseResolve = outerResolve\n promiseReject = outerReject\n })\n\n const cancel = (cancelOptions?: CancelOptions): void => {\n if (!isResolved) {\n reject(new CancelledError(cancelOptions))\n\n config.abort?.()\n }\n }\n const cancelRetry = () => {\n isRetryCancelled = true\n }\n\n const continueRetry = () => {\n isRetryCancelled = false\n }\n\n const shouldPause = () =>\n !focusManager.isFocused() ||\n (config.networkMode !== 'always' && !onlineManager.isOnline())\n\n const resolve = (value: any) => {\n if (!isResolved) {\n isResolved = true\n config.onSuccess?.(value)\n continueFn?.()\n promiseResolve(value)\n }\n }\n\n const reject = (value: any) => {\n if (!isResolved) {\n isResolved = true\n config.onError?.(value)\n continueFn?.()\n promiseReject(value)\n }\n }\n\n const pause = () => {\n return new Promise((continueResolve) => {\n continueFn = (value) => {\n const canContinue = isResolved || !shouldPause()\n if (canContinue) {\n continueResolve(value)\n }\n return canContinue\n }\n config.onPause?.()\n }).then(() => {\n continueFn = undefined\n if (!isResolved) {\n config.onContinue?.()\n }\n })\n }\n\n // Create loop function\n const run = () => {\n // Do nothing if already resolved\n if (isResolved) {\n return\n }\n\n let promiseOrValue: any\n\n // Execute query\n try {\n promiseOrValue = config.fn()\n } catch (error) {\n promiseOrValue = Promise.reject(error)\n }\n\n Promise.resolve(promiseOrValue)\n .then(resolve)\n .catch((error) => {\n // Stop if the fetch is already resolved\n if (isResolved) {\n return\n }\n\n // Do we need to retry the request?\n const retry = config.retry ?? 3\n const retryDelay = config.retryDelay ?? defaultRetryDelay\n const delay =\n typeof retryDelay === 'function'\n ? retryDelay(failureCount, error)\n : retryDelay\n const shouldRetry =\n retry === true ||\n (typeof retry === 'number' && failureCount < retry) ||\n (typeof retry === 'function' && retry(failureCount, error))\n\n if (isRetryCancelled || !shouldRetry) {\n // We are done if the query does not need to be retried\n reject(error)\n return\n }\n\n failureCount++\n\n // Notify on fail\n config.onFail?.(failureCount, error)\n\n // Delay\n sleep(delay)\n // Pause if the document is not visible or when the device is offline\n .then(() => {\n if (shouldPause()) {\n return pause()\n }\n return\n })\n .then(() => {\n if (isRetryCancelled) {\n reject(error)\n } else {\n run()\n }\n })\n })\n }\n\n // Start loop\n if (canFetch(config.networkMode)) {\n run()\n } else {\n pause().then(run)\n }\n\n return {\n promise,\n cancel,\n continue: () => {\n const didContinue = continueFn?.()\n return didContinue ? promise : Promise.resolve()\n },\n cancelRetry,\n continueRetry,\n }\n}\n"],"names":["defaultRetryDelay","failureCount","Math","min","canFetch","networkMode","onlineManager","isOnline","CancelledError","constructor","options","revert","silent","isCancelledError","value","createRetryer","config","isRetryCancelled","isResolved","continueFn","promiseResolve","promiseReject","promise","Promise","outerResolve","outerReject","cancel","cancelOptions","reject","abort","cancelRetry","continueRetry","shouldPause","focusManager","isFocused","resolve","onSuccess","onError","pause","continueResolve","canContinue","onPause","then","undefined","onContinue","run","promiseOrValue","fn","error","catch","retry","retryDelay","delay","shouldRetry","onFail","sleep","continue","didContinue"],"mappings":"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"}
|
package/build/lib/types.d.ts
CHANGED
|
@@ -423,3 +423,7 @@ export interface CancelOptions {
|
|
|
423
423
|
export interface SetDataOptions {
|
|
424
424
|
updatedAt?: number;
|
|
425
425
|
}
|
|
426
|
+
export declare type NotifyEventType = 'added' | 'removed' | 'updated' | 'observerAdded' | 'observerRemoved' | 'observerResultsUpdated' | 'observerOptionsUpdated';
|
|
427
|
+
export interface NotifyEvent {
|
|
428
|
+
type: NotifyEventType;
|
|
429
|
+
}
|
|
@@ -581,9 +581,13 @@
|
|
|
581
581
|
const pause = () => {
|
|
582
582
|
return new Promise(continueResolve => {
|
|
583
583
|
continueFn = value => {
|
|
584
|
-
|
|
585
|
-
|
|
584
|
+
const canContinue = isResolved || !shouldPause();
|
|
585
|
+
|
|
586
|
+
if (canContinue) {
|
|
587
|
+
continueResolve(value);
|
|
586
588
|
}
|
|
589
|
+
|
|
590
|
+
return canContinue;
|
|
587
591
|
};
|
|
588
592
|
|
|
589
593
|
config.onPause == null ? void 0 : config.onPause();
|
|
@@ -663,7 +667,8 @@
|
|
|
663
667
|
promise,
|
|
664
668
|
cancel,
|
|
665
669
|
continue: () => {
|
|
666
|
-
continueFn == null ? void 0 : continueFn();
|
|
670
|
+
const didContinue = continueFn == null ? void 0 : continueFn();
|
|
671
|
+
return didContinue ? promise : Promise.resolve();
|
|
667
672
|
},
|
|
668
673
|
cancelRetry,
|
|
669
674
|
continueRetry
|
|
@@ -1439,12 +1444,9 @@
|
|
|
1439
1444
|
}
|
|
1440
1445
|
|
|
1441
1446
|
continue() {
|
|
1442
|
-
|
|
1443
|
-
this.retryer.continue();
|
|
1444
|
-
return this.retryer.promise;
|
|
1445
|
-
}
|
|
1447
|
+
var _this$retryer$continu, _this$retryer;
|
|
1446
1448
|
|
|
1447
|
-
return this.execute();
|
|
1449
|
+
return (_this$retryer$continu = (_this$retryer = this.retryer) == null ? void 0 : _this$retryer.continue()) != null ? _this$retryer$continu : this.execute();
|
|
1448
1450
|
}
|
|
1449
1451
|
|
|
1450
1452
|
async execute() {
|
|
@@ -1697,8 +1699,15 @@
|
|
|
1697
1699
|
}
|
|
1698
1700
|
|
|
1699
1701
|
resumePausedMutations() {
|
|
1700
|
-
|
|
1701
|
-
|
|
1702
|
+
var _this$resuming;
|
|
1703
|
+
|
|
1704
|
+
this.resuming = ((_this$resuming = this.resuming) != null ? _this$resuming : Promise.resolve()).then(() => {
|
|
1705
|
+
const pausedMutations = this.mutations.filter(x => x.state.isPaused);
|
|
1706
|
+
return notifyManager.batch(() => pausedMutations.reduce((promise, mutation) => promise.then(() => mutation.continue().catch(noop)), Promise.resolve()));
|
|
1707
|
+
}).then(() => {
|
|
1708
|
+
this.resuming = undefined;
|
|
1709
|
+
});
|
|
1710
|
+
return this.resuming;
|
|
1702
1711
|
}
|
|
1703
1712
|
|
|
1704
1713
|
}
|