@module-federation/retry-plugin 2.5.1 → 2.6.0

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/README.md CHANGED
@@ -93,18 +93,18 @@ export default () =>
93
93
 
94
94
  ### CommonRetryOptions
95
95
 
96
- | Option | Type | Default | Description |
97
- | ----------------- | --------------------- | ----------- | ---------------------------------------- |
98
- | `retryTimes` | `number` | `3` | Number of retry attempts |
99
- | `retryDelay` | `number` | `1000` | Delay between retries in milliseconds |
100
- | `successTimes` | `number` | `0` | Number of successful requests required |
101
- | `domains` | `string[]` | `[]` | Alternative domains for script resources |
102
- | `manifestDomains` | `string[]` | `[]` | Alternative domains for manifest files |
103
- | `addQuery` | `boolean \| function` | `false` | Add query parameters for cache busting |
104
- | `fetchOptions` | `RequestInit` | `{}` | Additional fetch options |
105
- | `onRetry` | `function` | `undefined` | Callback when retry occurs |
106
- | `onSuccess` | `function` | `undefined` | Callback when request succeeds |
107
- | `onError` | `function` | `undefined` | Callback when all retries fail |
96
+ | Option | Type | Default | Description |
97
+ | ----------------- | --------------------------------------- | ----------- | ------------------------------------------------------------------------------------------------ |
98
+ | `retryTimes` | `number` | `3` | Number of retry attempts |
99
+ | `retryDelay` | `number \| (attempt: number) => number` | `1000` | Delay between retries in milliseconds, or a function returning delay per 1-indexed retry attempt |
100
+ | `successTimes` | `number` | `0` | Number of successful requests required |
101
+ | `domains` | `string[]` | `[]` | Alternative domains for script resources |
102
+ | `manifestDomains` | `string[]` | `[]` | Alternative domains for manifest files |
103
+ | `addQuery` | `boolean \| function` | `false` | Add query parameters for cache busting |
104
+ | `fetchOptions` | `RequestInit` | `{}` | Additional fetch options |
105
+ | `onRetry` | `function` | `undefined` | Callback when retry occurs |
106
+ | `onSuccess` | `function` | `undefined` | Callback when request succeeds |
107
+ | `onError` | `function` | `undefined` | Callback when all retries fail |
108
108
 
109
109
  ### addQuery Function
110
110
 
@@ -142,7 +142,7 @@ onError: ({ domains, url, tagName }) => {
142
142
  ```ts
143
143
  RetryPlugin({
144
144
  retryTimes: 5,
145
- retryDelay: (attempt) => Math.pow(2, attempt) * 1000, // Exponential backoff
145
+ retryDelay: (attempt) => 1000 * 2 ** (attempt - 1), // Exponential backoff: 1s, 2s, 4s, ...
146
146
  domains: ['https://cdn1.example.com', 'https://cdn2.example.com', 'https://cdn3.example.com'],
147
147
  manifestDomains: ['https://api1.example.com', 'https://api2.example.com'],
148
148
  addQuery: ({ times, originalQuery }) => {
package/dist/CHANGELOG.md CHANGED
@@ -1,5 +1,15 @@
1
1
  # @module-federation/retry-plugin
2
2
 
3
+ ## 2.6.0
4
+
5
+ ### Minor Changes
6
+
7
+ - 64719e2: Support function-based `retryDelay` for per-attempt delay strategies such as exponential backoff.
8
+
9
+ ### Patch Changes
10
+
11
+ - @module-federation/sdk@2.6.0
12
+
3
13
  ## 2.5.1
4
14
 
5
15
  ### Patch Changes
package/dist/README.md CHANGED
@@ -93,18 +93,18 @@ export default () =>
93
93
 
94
94
  ### CommonRetryOptions
95
95
 
96
- | Option | Type | Default | Description |
97
- | ----------------- | --------------------- | ----------- | ---------------------------------------- |
98
- | `retryTimes` | `number` | `3` | Number of retry attempts |
99
- | `retryDelay` | `number` | `1000` | Delay between retries in milliseconds |
100
- | `successTimes` | `number` | `0` | Number of successful requests required |
101
- | `domains` | `string[]` | `[]` | Alternative domains for script resources |
102
- | `manifestDomains` | `string[]` | `[]` | Alternative domains for manifest files |
103
- | `addQuery` | `boolean \| function` | `false` | Add query parameters for cache busting |
104
- | `fetchOptions` | `RequestInit` | `{}` | Additional fetch options |
105
- | `onRetry` | `function` | `undefined` | Callback when retry occurs |
106
- | `onSuccess` | `function` | `undefined` | Callback when request succeeds |
107
- | `onError` | `function` | `undefined` | Callback when all retries fail |
96
+ | Option | Type | Default | Description |
97
+ | ----------------- | --------------------------------------- | ----------- | ------------------------------------------------------------------------------------------------ |
98
+ | `retryTimes` | `number` | `3` | Number of retry attempts |
99
+ | `retryDelay` | `number \| (attempt: number) => number` | `1000` | Delay between retries in milliseconds, or a function returning delay per 1-indexed retry attempt |
100
+ | `successTimes` | `number` | `0` | Number of successful requests required |
101
+ | `domains` | `string[]` | `[]` | Alternative domains for script resources |
102
+ | `manifestDomains` | `string[]` | `[]` | Alternative domains for manifest files |
103
+ | `addQuery` | `boolean \| function` | `false` | Add query parameters for cache busting |
104
+ | `fetchOptions` | `RequestInit` | `{}` | Additional fetch options |
105
+ | `onRetry` | `function` | `undefined` | Callback when retry occurs |
106
+ | `onSuccess` | `function` | `undefined` | Callback when request succeeds |
107
+ | `onError` | `function` | `undefined` | Callback when all retries fail |
108
108
 
109
109
  ### addQuery Function
110
110
 
@@ -142,7 +142,7 @@ onError: ({ domains, url, tagName }) => {
142
142
  ```ts
143
143
  RetryPlugin({
144
144
  retryTimes: 5,
145
- retryDelay: (attempt) => Math.pow(2, attempt) * 1000, // Exponential backoff
145
+ retryDelay: (attempt) => 1000 * 2 ** (attempt - 1), // Exponential backoff: 1s, 2s, 4s, ...
146
146
  domains: ['https://cdn1.example.com', 'https://cdn2.example.com', 'https://cdn3.example.com'],
147
147
  manifestDomains: ['https://api1.example.com', 'https://api2.example.com'],
148
148
  addQuery: ({ times, originalQuery }) => {
package/dist/esm/index.js CHANGED
@@ -144,7 +144,11 @@ async function fetchRetry(params, lastRequestUrl, originalTotal) {
144
144
  queryKey: "retryCount"
145
145
  });
146
146
  try {
147
- if (!isFirstAttempt && retryDelay > 0) await new Promise((resolve) => setTimeout(resolve, retryDelay));
147
+ if (!isFirstAttempt) {
148
+ const attemptIndex = total - retryTimes;
149
+ const delay = typeof retryDelay === "function" ? retryDelay(attemptIndex) : retryDelay;
150
+ if (delay > 0) await new Promise((resolve) => setTimeout(resolve, delay));
151
+ }
148
152
  const response = await fetch(requestUrl, fetchOptions);
149
153
  const responseClone = response.clone();
150
154
  if (!response.ok) throw new Error(`${PLUGIN_IDENTIFIER}: Request failed: ${response.status} ${response.statusText || ""} | url: ${requestUrl}`);
@@ -204,7 +208,8 @@ function scriptRetry({ retryOptions, retryFn, beforeExecuteRetry = () => {} }) {
204
208
  const maxAttempts = retryTimes;
205
209
  while (attempts < maxAttempts) try {
206
210
  beforeExecuteRetry();
207
- if (retryDelay > 0) await new Promise((resolve) => setTimeout(resolve, retryDelay));
211
+ const delay = typeof retryDelay === "function" ? retryDelay(attempts + 1) : retryDelay;
212
+ if (delay > 0) await new Promise((resolve) => setTimeout(resolve, delay));
208
213
  const retryIndex = attempts + 1;
209
214
  retryWrapper = await retryFn({
210
215
  ...params,
package/dist/index.d.ts CHANGED
@@ -776,9 +776,10 @@ type CommonRetryOptions = {
776
776
  */
777
777
  successTimes?: number;
778
778
  /**
779
- * retry delay
779
+ * retry delay in milliseconds, or a function that returns delay per attempt.
780
+ * When a function, `attempt` is 1-indexed (the nth retry, not the initial call).
780
781
  */
781
- retryDelay?: number;
782
+ retryDelay?: number | ((attempt: number) => number);
782
783
  /**
783
784
  * retry path
784
785
  */
package/dist/index.js CHANGED
@@ -145,7 +145,11 @@ async function fetchRetry(params, lastRequestUrl, originalTotal) {
145
145
  queryKey: "retryCount"
146
146
  });
147
147
  try {
148
- if (!isFirstAttempt && retryDelay > 0) await new Promise((resolve) => setTimeout(resolve, retryDelay));
148
+ if (!isFirstAttempt) {
149
+ const attemptIndex = total - retryTimes;
150
+ const delay = typeof retryDelay === "function" ? retryDelay(attemptIndex) : retryDelay;
151
+ if (delay > 0) await new Promise((resolve) => setTimeout(resolve, delay));
152
+ }
149
153
  const response = await fetch(requestUrl, fetchOptions);
150
154
  const responseClone = response.clone();
151
155
  if (!response.ok) throw new Error(`${PLUGIN_IDENTIFIER}: Request failed: ${response.status} ${response.statusText || ""} | url: ${requestUrl}`);
@@ -205,7 +209,8 @@ function scriptRetry({ retryOptions, retryFn, beforeExecuteRetry = () => {} }) {
205
209
  const maxAttempts = retryTimes;
206
210
  while (attempts < maxAttempts) try {
207
211
  beforeExecuteRetry();
208
- if (retryDelay > 0) await new Promise((resolve) => setTimeout(resolve, retryDelay));
212
+ const delay = typeof retryDelay === "function" ? retryDelay(attempts + 1) : retryDelay;
213
+ if (delay > 0) await new Promise((resolve) => setTimeout(resolve, delay));
209
214
  const retryIndex = attempts + 1;
210
215
  retryWrapper = await retryFn({
211
216
  ...params,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@module-federation/retry-plugin",
3
- "version": "2.5.1",
3
+ "version": "2.6.0",
4
4
  "author": "danpeen <dapeen.feng@gmail.com>",
5
5
  "main": "./dist/index.js",
6
6
  "module": "./dist/esm/index.js",
@@ -33,10 +33,10 @@
33
33
  }
34
34
  },
35
35
  "devDependencies": {
36
- "@module-federation/runtime": "2.5.1"
36
+ "@module-federation/runtime": "2.6.0"
37
37
  },
38
38
  "dependencies": {
39
- "@module-federation/sdk": "2.5.1"
39
+ "@module-federation/sdk": "2.6.0"
40
40
  },
41
41
  "scripts": {
42
42
  "build": "tsdown --config tsdown.config.ts && cp *.md dist",