@smithy/middleware-retry 4.4.46 → 4.5.1

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.
Files changed (37) hide show
  1. package/dist-cjs/index.js +70 -29
  2. package/dist-es/index.js +5 -4
  3. package/dist-es/longPollMiddleware.js +15 -0
  4. package/dist-es/parseRetryAfterHeader.js +49 -0
  5. package/dist-es/{StandardRetryStrategy.js → retry-pre-sra-deprecated/StandardRetryStrategy.js} +1 -1
  6. package/dist-es/retryMiddleware.js +13 -20
  7. package/dist-types/configurations.d.ts +3 -1
  8. package/dist-types/index.d.ts +5 -4
  9. package/dist-types/longPollMiddleware.d.ts +15 -0
  10. package/dist-types/omitRetryHeadersMiddleware.d.ts +2 -0
  11. package/dist-types/parseRetryAfterHeader.d.ts +10 -0
  12. package/dist-types/{AdaptiveRetryStrategy.d.ts → retry-pre-sra-deprecated/AdaptiveRetryStrategy.d.ts} +2 -1
  13. package/dist-types/{defaultRetryQuota.d.ts → retry-pre-sra-deprecated/defaultRetryQuota.d.ts} +2 -0
  14. package/dist-types/{delayDecider.d.ts → retry-pre-sra-deprecated/delayDecider.d.ts} +2 -1
  15. package/dist-types/retryMiddleware.d.ts +0 -4
  16. package/package.json +16 -16
  17. package/dist-types/ts3.4/AdaptiveRetryStrategy.d.ts +0 -23
  18. package/dist-types/ts3.4/StandardRetryStrategy.d.ts +0 -33
  19. package/dist-types/ts3.4/configurations.d.ts +0 -66
  20. package/dist-types/ts3.4/defaultRetryQuota.d.ts +0 -24
  21. package/dist-types/ts3.4/delayDecider.d.ts +0 -5
  22. package/dist-types/ts3.4/index.d.ts +0 -7
  23. package/dist-types/ts3.4/isStreamingPayload/isStreamingPayload.browser.d.ts +0 -5
  24. package/dist-types/ts3.4/isStreamingPayload/isStreamingPayload.d.ts +0 -5
  25. package/dist-types/ts3.4/omitRetryHeadersMiddleware.d.ts +0 -13
  26. package/dist-types/ts3.4/retryDecider.d.ts +0 -6
  27. package/dist-types/ts3.4/retryMiddleware.d.ts +0 -18
  28. package/dist-types/ts3.4/types.d.ts +0 -65
  29. package/dist-types/ts3.4/util.d.ts +0 -2
  30. /package/dist-es/{AdaptiveRetryStrategy.js → retry-pre-sra-deprecated/AdaptiveRetryStrategy.js} +0 -0
  31. /package/dist-es/{defaultRetryQuota.js → retry-pre-sra-deprecated/defaultRetryQuota.js} +0 -0
  32. /package/dist-es/{delayDecider.js → retry-pre-sra-deprecated/delayDecider.js} +0 -0
  33. /package/dist-es/{retryDecider.js → retry-pre-sra-deprecated/retryDecider.js} +0 -0
  34. /package/dist-es/{types.js → retry-pre-sra-deprecated/types.js} +0 -0
  35. /package/dist-types/{StandardRetryStrategy.d.ts → retry-pre-sra-deprecated/StandardRetryStrategy.d.ts} +0 -0
  36. /package/dist-types/{retryDecider.d.ts → retry-pre-sra-deprecated/retryDecider.d.ts} +0 -0
  37. /package/dist-types/{types.d.ts → retry-pre-sra-deprecated/types.d.ts} +0 -0
package/dist-cjs/index.js CHANGED
@@ -7,6 +7,17 @@ var uuid = require('@smithy/uuid');
7
7
  var utilMiddleware = require('@smithy/util-middleware');
8
8
  var smithyClient = require('@smithy/smithy-client');
9
9
  var isStreamingPayload = require('./isStreamingPayload/isStreamingPayload');
10
+ var serde = require('@smithy/core/serde');
11
+
12
+ const asSdkError = (error) => {
13
+ if (error instanceof Error)
14
+ return error;
15
+ if (error instanceof Object)
16
+ return Object.assign(new Error(), error);
17
+ if (typeof error === "string")
18
+ return new Error(error);
19
+ return new Error(`AWS SDK error wrapper for ${error}`);
20
+ };
10
21
 
11
22
  const getDefaultRetryQuota = (initialRetryTokens, options) => {
12
23
  const MAX_CAPACITY = initialRetryTokens;
@@ -44,16 +55,6 @@ const defaultRetryDecider = (error) => {
44
55
  return serviceErrorClassification.isRetryableByTrait(error) || serviceErrorClassification.isClockSkewError(error) || serviceErrorClassification.isThrottlingError(error) || serviceErrorClassification.isTransientError(error);
45
56
  };
46
57
 
47
- const asSdkError = (error) => {
48
- if (error instanceof Error)
49
- return error;
50
- if (error instanceof Object)
51
- return Object.assign(new Error(), error);
52
- if (typeof error === "string")
53
- return new Error(error);
54
- return new Error(`AWS SDK error wrapper for ${error}`);
55
- };
56
-
57
58
  class StandardRetryStrategy {
58
59
  maxAttemptsProvider;
59
60
  retryDecider;
@@ -229,12 +230,60 @@ const getOmitRetryHeadersPlugin = (options) => ({
229
230
  },
230
231
  });
231
232
 
233
+ function parseRetryAfterHeader(response, logger) {
234
+ if (!protocolHttp.HttpResponse.isInstance(response)) {
235
+ return;
236
+ }
237
+ for (const header of Object.keys(response.headers)) {
238
+ const h = header.toLowerCase();
239
+ if (h === "retry-after") {
240
+ const retryAfter = response.headers[header];
241
+ let retryAfterSeconds = NaN;
242
+ if (retryAfter.endsWith("GMT")) {
243
+ try {
244
+ const date = serde.parseRfc7231DateTime(retryAfter);
245
+ retryAfterSeconds = (date.getTime() - Date.now()) / 1000;
246
+ }
247
+ catch (e) {
248
+ logger?.trace?.("Failed to parse retry-after header");
249
+ logger?.trace?.(e);
250
+ }
251
+ }
252
+ else if (retryAfter.match(/ GMT, ((\d+)|(\d+\.\d+))$/)) {
253
+ retryAfterSeconds = Number(retryAfter.match(/ GMT, ([\d.]+)$/)?.[1]);
254
+ }
255
+ else if (retryAfter.match(/^((\d+)|(\d+\.\d+))$/)) {
256
+ retryAfterSeconds = Number(retryAfter);
257
+ }
258
+ else if (Date.parse(retryAfter) >= Date.now()) {
259
+ retryAfterSeconds = (Date.parse(retryAfter) - Date.now()) / 1000;
260
+ }
261
+ if (isNaN(retryAfterSeconds)) {
262
+ return;
263
+ }
264
+ return new Date(Date.now() + retryAfterSeconds * 1000);
265
+ }
266
+ else if (h === "x-amz-retry-after") {
267
+ const v = response.headers[header];
268
+ const backoffMilliseconds = Number(v);
269
+ if (isNaN(backoffMilliseconds)) {
270
+ logger?.trace?.(`Failed to parse x-amz-retry-after=${v}`);
271
+ return;
272
+ }
273
+ return new Date(Date.now() + backoffMilliseconds);
274
+ }
275
+ }
276
+ }
277
+ function getRetryAfterHint(response, logger) {
278
+ return parseRetryAfterHeader(response, logger);
279
+ }
280
+
232
281
  const retryMiddleware = (options) => (next, context) => async (args) => {
233
282
  let retryStrategy = await options.retryStrategy();
234
283
  const maxAttempts = await options.maxAttempts();
235
284
  if (isRetryStrategyV2(retryStrategy)) {
236
285
  retryStrategy = retryStrategy;
237
- let retryToken = await retryStrategy.acquireInitialRetryToken(context["partition_id"]);
286
+ let retryToken = await retryStrategy.acquireInitialRetryToken((context["partition_id"] ?? "") + (context.__retryLongPoll ? ":longpoll" : ""));
238
287
  let lastError = new Error();
239
288
  let attempts = 0;
240
289
  let totalRetryDelay = 0;
@@ -255,7 +304,7 @@ const retryMiddleware = (options) => (next, context) => async (args) => {
255
304
  return { response, output };
256
305
  }
257
306
  catch (e) {
258
- const retryErrorInfo = getRetryErrorInfo(e);
307
+ const retryErrorInfo = getRetryErrorInfo(e, options.logger);
259
308
  lastError = asSdkError(e);
260
309
  if (isRequest && isStreamingPayload.isStreamingPayload(request)) {
261
310
  (context.logger instanceof smithyClient.NoOpLogger ? console : context.logger)?.warn("An error was encountered in a non-retryable streaming request.");
@@ -265,6 +314,9 @@ const retryMiddleware = (options) => (next, context) => async (args) => {
265
314
  retryToken = await retryStrategy.refreshRetryTokenForRetry(retryToken, retryErrorInfo);
266
315
  }
267
316
  catch (refreshError) {
317
+ if (typeof refreshError.$backoff === "number") {
318
+ await cooldown(refreshError.$backoff);
319
+ }
268
320
  if (!lastError.$metadata) {
269
321
  lastError.$metadata = {};
270
322
  }
@@ -275,26 +327,28 @@ const retryMiddleware = (options) => (next, context) => async (args) => {
275
327
  attempts = retryToken.getRetryCount();
276
328
  const delay = retryToken.getRetryDelay();
277
329
  totalRetryDelay += delay;
278
- await new Promise((resolve) => setTimeout(resolve, delay));
330
+ await cooldown(delay);
279
331
  }
280
332
  }
281
333
  }
282
334
  else {
283
335
  retryStrategy = retryStrategy;
284
- if (retryStrategy?.mode)
336
+ if (retryStrategy?.mode) {
285
337
  context.userAgent = [...(context.userAgent || []), ["cfg/retry-mode", retryStrategy.mode]];
338
+ }
286
339
  return retryStrategy.retry(next, args);
287
340
  }
288
341
  };
342
+ const cooldown = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
289
343
  const isRetryStrategyV2 = (retryStrategy) => typeof retryStrategy.acquireInitialRetryToken !== "undefined" &&
290
344
  typeof retryStrategy.refreshRetryTokenForRetry !== "undefined" &&
291
345
  typeof retryStrategy.recordSuccess !== "undefined";
292
- const getRetryErrorInfo = (error) => {
346
+ const getRetryErrorInfo = (error, logger) => {
293
347
  const errorInfo = {
294
348
  error,
295
349
  errorType: getRetryErrorType(error),
296
350
  };
297
- const retryAfterHint = getRetryAfterHint(error.$response);
351
+ const retryAfterHint = parseRetryAfterHeader(error.$response, logger);
298
352
  if (retryAfterHint) {
299
353
  errorInfo.retryAfterHint = retryAfterHint;
300
354
  }
@@ -321,19 +375,6 @@ const getRetryPlugin = (options) => ({
321
375
  clientStack.add(retryMiddleware(options), retryMiddlewareOptions);
322
376
  },
323
377
  });
324
- const getRetryAfterHint = (response) => {
325
- if (!protocolHttp.HttpResponse.isInstance(response))
326
- return;
327
- const retryAfterHeaderName = Object.keys(response.headers).find((key) => key.toLowerCase() === "retry-after");
328
- if (!retryAfterHeaderName)
329
- return;
330
- const retryAfter = response.headers[retryAfterHeaderName];
331
- const retryAfterSeconds = Number(retryAfter);
332
- if (!Number.isNaN(retryAfterSeconds))
333
- return new Date(retryAfterSeconds * 1000);
334
- const retryAfterDate = new Date(retryAfter);
335
- return retryAfterDate;
336
- };
337
378
 
338
379
  exports.AdaptiveRetryStrategy = AdaptiveRetryStrategy;
339
380
  exports.CONFIG_MAX_ATTEMPTS = CONFIG_MAX_ATTEMPTS;
package/dist-es/index.js CHANGED
@@ -1,7 +1,8 @@
1
- export * from "./AdaptiveRetryStrategy";
2
- export * from "./StandardRetryStrategy";
1
+ export * from "./retry-pre-sra-deprecated/AdaptiveRetryStrategy";
2
+ export * from "./retry-pre-sra-deprecated/StandardRetryStrategy";
3
+ export * from "./retry-pre-sra-deprecated/delayDecider";
4
+ export * from "./retry-pre-sra-deprecated/retryDecider";
3
5
  export * from "./configurations";
4
- export * from "./delayDecider";
5
6
  export * from "./omitRetryHeadersMiddleware";
6
- export * from "./retryDecider";
7
7
  export * from "./retryMiddleware";
8
+ export { getRetryAfterHint } from "./parseRetryAfterHeader";
@@ -0,0 +1,15 @@
1
+ export const longPollMiddleware = () => (next, context) => async (args) => {
2
+ context.__retryLongPoll = true;
3
+ return next(args);
4
+ };
5
+ export const longPollMiddlewareOptions = {
6
+ name: "longPollMiddleware",
7
+ tags: ["RETRY"],
8
+ step: "initialize",
9
+ override: true,
10
+ };
11
+ export const getLongPollPlugin = (options) => ({
12
+ applyToStack: (clientStack) => {
13
+ clientStack.add(longPollMiddleware(), longPollMiddlewareOptions);
14
+ },
15
+ });
@@ -0,0 +1,49 @@
1
+ import { parseRfc7231DateTime } from "@smithy/core/serde";
2
+ import { HttpResponse } from "@smithy/protocol-http";
3
+ export function parseRetryAfterHeader(response, logger) {
4
+ if (!HttpResponse.isInstance(response)) {
5
+ return;
6
+ }
7
+ for (const header of Object.keys(response.headers)) {
8
+ const h = header.toLowerCase();
9
+ if (h === "retry-after") {
10
+ const retryAfter = response.headers[header];
11
+ let retryAfterSeconds = NaN;
12
+ if (retryAfter.endsWith("GMT")) {
13
+ try {
14
+ const date = parseRfc7231DateTime(retryAfter);
15
+ retryAfterSeconds = (date.getTime() - Date.now()) / 1000;
16
+ }
17
+ catch (e) {
18
+ logger?.trace?.("Failed to parse retry-after header");
19
+ logger?.trace?.(e);
20
+ }
21
+ }
22
+ else if (retryAfter.match(/ GMT, ((\d+)|(\d+\.\d+))$/)) {
23
+ retryAfterSeconds = Number(retryAfter.match(/ GMT, ([\d.]+)$/)?.[1]);
24
+ }
25
+ else if (retryAfter.match(/^((\d+)|(\d+\.\d+))$/)) {
26
+ retryAfterSeconds = Number(retryAfter);
27
+ }
28
+ else if (Date.parse(retryAfter) >= Date.now()) {
29
+ retryAfterSeconds = (Date.parse(retryAfter) - Date.now()) / 1000;
30
+ }
31
+ if (isNaN(retryAfterSeconds)) {
32
+ return;
33
+ }
34
+ return new Date(Date.now() + retryAfterSeconds * 1000);
35
+ }
36
+ else if (h === "x-amz-retry-after") {
37
+ const v = response.headers[header];
38
+ const backoffMilliseconds = Number(v);
39
+ if (isNaN(backoffMilliseconds)) {
40
+ logger?.trace?.(`Failed to parse x-amz-retry-after=${v}`);
41
+ return;
42
+ }
43
+ return new Date(Date.now() + backoffMilliseconds);
44
+ }
45
+ }
46
+ }
47
+ export function getRetryAfterHint(response, logger) {
48
+ return parseRetryAfterHeader(response, logger);
49
+ }
@@ -2,10 +2,10 @@ import { HttpRequest, HttpResponse } from "@smithy/protocol-http";
2
2
  import { isThrottlingError } from "@smithy/service-error-classification";
3
3
  import { DEFAULT_MAX_ATTEMPTS, DEFAULT_RETRY_DELAY_BASE, INITIAL_RETRY_TOKENS, INVOCATION_ID_HEADER, REQUEST_HEADER, RETRY_MODES, THROTTLING_RETRY_DELAY_BASE, } from "@smithy/util-retry";
4
4
  import { v4 } from "@smithy/uuid";
5
+ import { asSdkError } from "../util";
5
6
  import { getDefaultRetryQuota } from "./defaultRetryQuota";
6
7
  import { defaultDelayDecider } from "./delayDecider";
7
8
  import { defaultRetryDecider } from "./retryDecider";
8
- import { asSdkError } from "./util";
9
9
  export class StandardRetryStrategy {
10
10
  maxAttemptsProvider;
11
11
  retryDecider;
@@ -1,16 +1,17 @@
1
- import { HttpRequest, HttpResponse } from "@smithy/protocol-http";
1
+ import { HttpRequest } from "@smithy/protocol-http";
2
2
  import { isServerError, isThrottlingError, isTransientError } from "@smithy/service-error-classification";
3
3
  import { NoOpLogger } from "@smithy/smithy-client";
4
4
  import { INVOCATION_ID_HEADER, REQUEST_HEADER } from "@smithy/util-retry";
5
5
  import { v4 } from "@smithy/uuid";
6
6
  import { isStreamingPayload } from "./isStreamingPayload/isStreamingPayload";
7
+ import { parseRetryAfterHeader } from "./parseRetryAfterHeader";
7
8
  import { asSdkError } from "./util";
8
9
  export const retryMiddleware = (options) => (next, context) => async (args) => {
9
10
  let retryStrategy = await options.retryStrategy();
10
11
  const maxAttempts = await options.maxAttempts();
11
12
  if (isRetryStrategyV2(retryStrategy)) {
12
13
  retryStrategy = retryStrategy;
13
- let retryToken = await retryStrategy.acquireInitialRetryToken(context["partition_id"]);
14
+ let retryToken = await retryStrategy.acquireInitialRetryToken((context["partition_id"] ?? "") + (context.__retryLongPoll ? ":longpoll" : ""));
14
15
  let lastError = new Error();
15
16
  let attempts = 0;
16
17
  let totalRetryDelay = 0;
@@ -31,7 +32,7 @@ export const retryMiddleware = (options) => (next, context) => async (args) => {
31
32
  return { response, output };
32
33
  }
33
34
  catch (e) {
34
- const retryErrorInfo = getRetryErrorInfo(e);
35
+ const retryErrorInfo = getRetryErrorInfo(e, options.logger);
35
36
  lastError = asSdkError(e);
36
37
  if (isRequest && isStreamingPayload(request)) {
37
38
  (context.logger instanceof NoOpLogger ? console : context.logger)?.warn("An error was encountered in a non-retryable streaming request.");
@@ -41,6 +42,9 @@ export const retryMiddleware = (options) => (next, context) => async (args) => {
41
42
  retryToken = await retryStrategy.refreshRetryTokenForRetry(retryToken, retryErrorInfo);
42
43
  }
43
44
  catch (refreshError) {
45
+ if (typeof refreshError.$backoff === "number") {
46
+ await cooldown(refreshError.$backoff);
47
+ }
44
48
  if (!lastError.$metadata) {
45
49
  lastError.$metadata = {};
46
50
  }
@@ -51,26 +55,28 @@ export const retryMiddleware = (options) => (next, context) => async (args) => {
51
55
  attempts = retryToken.getRetryCount();
52
56
  const delay = retryToken.getRetryDelay();
53
57
  totalRetryDelay += delay;
54
- await new Promise((resolve) => setTimeout(resolve, delay));
58
+ await cooldown(delay);
55
59
  }
56
60
  }
57
61
  }
58
62
  else {
59
63
  retryStrategy = retryStrategy;
60
- if (retryStrategy?.mode)
64
+ if (retryStrategy?.mode) {
61
65
  context.userAgent = [...(context.userAgent || []), ["cfg/retry-mode", retryStrategy.mode]];
66
+ }
62
67
  return retryStrategy.retry(next, args);
63
68
  }
64
69
  };
70
+ const cooldown = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
65
71
  const isRetryStrategyV2 = (retryStrategy) => typeof retryStrategy.acquireInitialRetryToken !== "undefined" &&
66
72
  typeof retryStrategy.refreshRetryTokenForRetry !== "undefined" &&
67
73
  typeof retryStrategy.recordSuccess !== "undefined";
68
- const getRetryErrorInfo = (error) => {
74
+ const getRetryErrorInfo = (error, logger) => {
69
75
  const errorInfo = {
70
76
  error,
71
77
  errorType: getRetryErrorType(error),
72
78
  };
73
- const retryAfterHint = getRetryAfterHint(error.$response);
79
+ const retryAfterHint = parseRetryAfterHeader(error.$response, logger);
74
80
  if (retryAfterHint) {
75
81
  errorInfo.retryAfterHint = retryAfterHint;
76
82
  }
@@ -97,16 +103,3 @@ export const getRetryPlugin = (options) => ({
97
103
  clientStack.add(retryMiddleware(options), retryMiddlewareOptions);
98
104
  },
99
105
  });
100
- export const getRetryAfterHint = (response) => {
101
- if (!HttpResponse.isInstance(response))
102
- return;
103
- const retryAfterHeaderName = Object.keys(response.headers).find((key) => key.toLowerCase() === "retry-after");
104
- if (!retryAfterHeaderName)
105
- return;
106
- const retryAfter = response.headers[retryAfterHeaderName];
107
- const retryAfterSeconds = Number(retryAfter);
108
- if (!Number.isNaN(retryAfterSeconds))
109
- return new Date(retryAfterSeconds * 1000);
110
- const retryAfterDate = new Date(retryAfter);
111
- return retryAfterDate;
112
- };
@@ -1,5 +1,5 @@
1
1
  import type { LoadedConfigSelectors } from "@smithy/node-config-provider";
2
- import type { Provider, RetryStrategy, RetryStrategyV2 } from "@smithy/types";
2
+ import type { Logger, Provider, RetryStrategy, RetryStrategyV2 } from "@smithy/types";
3
3
  /**
4
4
  * @internal
5
5
  */
@@ -34,6 +34,7 @@ export interface PreviouslyResolved {
34
34
  * @internal
35
35
  */
36
36
  retryMode: string | Provider<string>;
37
+ logger?: Logger;
37
38
  }
38
39
  /**
39
40
  * @internal
@@ -47,6 +48,7 @@ export interface RetryResolvedConfig {
47
48
  * Resolved value for input config {@link RetryInputConfig.retryStrategy}
48
49
  */
49
50
  retryStrategy: Provider<RetryStrategyV2 | RetryStrategy>;
51
+ logger?: Logger;
50
52
  }
51
53
  /**
52
54
  * @internal
@@ -1,7 +1,8 @@
1
- export * from "./AdaptiveRetryStrategy";
2
- export * from "./StandardRetryStrategy";
1
+ export * from "./retry-pre-sra-deprecated/AdaptiveRetryStrategy";
2
+ export * from "./retry-pre-sra-deprecated/StandardRetryStrategy";
3
+ export * from "./retry-pre-sra-deprecated/delayDecider";
4
+ export * from "./retry-pre-sra-deprecated/retryDecider";
3
5
  export * from "./configurations";
4
- export * from "./delayDecider";
5
6
  export * from "./omitRetryHeadersMiddleware";
6
- export * from "./retryDecider";
7
7
  export * from "./retryMiddleware";
8
+ export { getRetryAfterHint } from "./parseRetryAfterHeader";
@@ -0,0 +1,15 @@
1
+ import type { HandlerExecutionContext, InitializeHandler, InitializeHandlerOptions, MetadataBearer, Pluggable } from "@smithy/types";
2
+ import type { RetryResolvedConfig } from "./configurations";
3
+ /**
4
+ * This middleware is attached to operations designated as long-polling.
5
+ * @internal
6
+ */
7
+ export declare const longPollMiddleware: () => <Output extends MetadataBearer = MetadataBearer>(next: InitializeHandler<any, Output>, context: HandlerExecutionContext) => InitializeHandler<any, Output>;
8
+ /**
9
+ * @internal
10
+ */
11
+ export declare const longPollMiddlewareOptions: InitializeHandlerOptions;
12
+ /**
13
+ * @internal
14
+ */
15
+ export declare const getLongPollPlugin: (options: RetryResolvedConfig) => Pluggable<any, any>;
@@ -1,5 +1,7 @@
1
1
  import type { FinalizeHandler, MetadataBearer, Pluggable, RelativeMiddlewareOptions } from "@smithy/types";
2
2
  /**
3
+ * This is still in use.
4
+ * See AddOmitRetryHeadersDependency.java.
3
5
  * @internal
4
6
  */
5
7
  export declare const omitRetryHeadersMiddleware: () => <Output extends MetadataBearer = MetadataBearer>(next: FinalizeHandler<any, Output>) => FinalizeHandler<any, Output>;
@@ -0,0 +1,10 @@
1
+ import type { Logger } from "@smithy/types";
2
+ /**
3
+ * @internal
4
+ */
5
+ export declare function parseRetryAfterHeader(response: unknown, logger?: Logger): Date | undefined;
6
+ /**
7
+ * Backwards-compatibility alias.
8
+ * @internal
9
+ */
10
+ export declare function getRetryAfterHint(response: unknown, logger?: Logger): Date | undefined;
@@ -3,8 +3,9 @@ import type { RateLimiter } from "@smithy/util-retry";
3
3
  import type { StandardRetryStrategyOptions } from "./StandardRetryStrategy";
4
4
  import { StandardRetryStrategy } from "./StandardRetryStrategy";
5
5
  /**
6
- * @public
7
6
  * Strategy options to be passed to AdaptiveRetryStrategy
7
+ * @public
8
+ * @deprecated replaced by \@smithy/util-retry (SRA).
8
9
  */
9
10
  export interface AdaptiveRetryStrategyOptions extends StandardRetryStrategyOptions {
10
11
  rateLimiter?: RateLimiter;
@@ -1,6 +1,7 @@
1
1
  import type { RetryQuota } from "./types";
2
2
  /**
3
3
  * @internal
4
+ * @deprecated replaced by \@smithy/util-retry (SRA).
4
5
  */
5
6
  export interface DefaultRetryQuotaOptions {
6
7
  /**
@@ -20,5 +21,6 @@ export interface DefaultRetryQuotaOptions {
20
21
  }
21
22
  /**
22
23
  * @internal
24
+ * @deprecated replaced by \@smithy/util-retry (SRA).
23
25
  */
24
26
  export declare const getDefaultRetryQuota: (initialRetryTokens: number, options?: DefaultRetryQuotaOptions) => RetryQuota;
@@ -1,5 +1,6 @@
1
1
  /**
2
- * @internal
3
2
  * Calculate a capped, fully-jittered exponential backoff time.
3
+ * @internal
4
+ * @deprecated replaced by \@smithy/util-retry (SRA).
4
5
  */
5
6
  export declare const defaultDelayDecider: (delayBase: number, attempts: number) => number;
@@ -12,7 +12,3 @@ export declare const retryMiddlewareOptions: FinalizeRequestHandlerOptions & Abs
12
12
  * @internal
13
13
  */
14
14
  export declare const getRetryPlugin: (options: RetryResolvedConfig) => Pluggable<any, any>;
15
- /**
16
- * @internal
17
- */
18
- export declare const getRetryAfterHint: (response: unknown) => Date | undefined;
package/package.json CHANGED
@@ -1,21 +1,20 @@
1
1
  {
2
2
  "name": "@smithy/middleware-retry",
3
- "version": "4.4.46",
3
+ "version": "4.5.1",
4
4
  "scripts": {
5
- "build": "concurrently 'yarn:build:cjs' 'yarn:build:es' 'yarn:build:types && yarn build:types:downlevel'",
6
- "build:cjs": "node ../../scripts/inline middleware-retry",
7
- "build:es": "yarn g:tsc -p tsconfig.es.json",
5
+ "build": "concurrently 'yarn:build:types' 'yarn:build:es:cjs'",
6
+ "build:es:cjs": "yarn g:tsc -p tsconfig.es.json && node ../../scripts/inline middleware-retry",
8
7
  "build:types": "yarn g:tsc -p tsconfig.types.json",
9
8
  "build:types:downlevel": "premove dist-types/ts3.4 && downlevel-dts dist-types dist-types/ts3.4",
10
- "stage-release": "premove .release && yarn pack && mkdir ./.release && tar zxvf ./package.tgz --directory ./.release && rm ./package.tgz",
11
9
  "clean": "premove dist-cjs dist-es dist-types tsconfig.cjs.tsbuildinfo tsconfig.es.tsbuildinfo tsconfig.types.tsbuildinfo",
12
- "lint": "eslint -c ../../.eslintrc.js \"src/**/*.ts\"",
13
- "format": "prettier --config ../../prettier.config.js --ignore-path ../../.prettierignore --write \"**/*.{ts,md,json}\"",
14
10
  "extract:docs": "api-extractor run --local",
11
+ "format": "prettier --config ../../prettier.config.js --ignore-path ../../.prettierignore --write \"**/*.{ts,md,json}\"",
12
+ "lint": "eslint -c ../../.eslintrc.js \"src/**/*.ts\"",
13
+ "stage-release": "premove .release && yarn pack && mkdir ./.release && tar zxvf ./package.tgz --directory ./.release && rm ./package.tgz",
15
14
  "test": "yarn g:vitest run",
16
15
  "test:integration": "yarn g:vitest run -c vitest.config.integ.mts",
17
- "test:watch": "yarn g:vitest watch",
18
- "test:integration:watch": "yarn g:vitest watch -c vitest.config.integ.mts"
16
+ "test:integration:watch": "yarn g:vitest watch -c vitest.config.integ.mts",
17
+ "test:watch": "yarn g:vitest watch"
19
18
  },
20
19
  "main": "./dist-cjs/index.js",
21
20
  "module": "./dist-es/index.js",
@@ -34,13 +33,14 @@
34
33
  "license": "Apache-2.0",
35
34
  "sideEffects": false,
36
35
  "dependencies": {
37
- "@smithy/node-config-provider": "^4.3.12",
38
- "@smithy/protocol-http": "^5.3.12",
39
- "@smithy/service-error-classification": "^4.2.12",
40
- "@smithy/smithy-client": "^4.12.8",
41
- "@smithy/types": "^4.13.1",
42
- "@smithy/util-middleware": "^4.2.12",
43
- "@smithy/util-retry": "^4.2.13",
36
+ "@smithy/core": "^3.23.14",
37
+ "@smithy/node-config-provider": "^4.3.13",
38
+ "@smithy/protocol-http": "^5.3.13",
39
+ "@smithy/service-error-classification": "^4.2.13",
40
+ "@smithy/smithy-client": "^4.12.9",
41
+ "@smithy/types": "^4.14.0",
42
+ "@smithy/util-middleware": "^4.2.13",
43
+ "@smithy/util-retry": "^4.3.1",
44
44
  "@smithy/uuid": "^1.1.2",
45
45
  "tslib": "^2.6.2"
46
46
  },
@@ -1,23 +0,0 @@
1
- import { FinalizeHandler, FinalizeHandlerArguments, MetadataBearer, Provider } from "@smithy/types";
2
- import { RateLimiter } from "@smithy/util-retry";
3
- import { StandardRetryStrategyOptions } from "./StandardRetryStrategy";
4
- import { StandardRetryStrategy } from "./StandardRetryStrategy";
5
- /**
6
- * @public
7
- * Strategy options to be passed to AdaptiveRetryStrategy
8
- */
9
- export interface AdaptiveRetryStrategyOptions extends StandardRetryStrategyOptions {
10
- rateLimiter?: RateLimiter;
11
- }
12
- /**
13
- * @public
14
- * @deprecated use AdaptiveRetryStrategy from @smithy/util-retry
15
- */
16
- export declare class AdaptiveRetryStrategy extends StandardRetryStrategy {
17
- private rateLimiter;
18
- constructor(maxAttemptsProvider: Provider<number>, options?: AdaptiveRetryStrategyOptions);
19
- retry<Input extends object, Ouput extends MetadataBearer>(next: FinalizeHandler<Input, Ouput>, args: FinalizeHandlerArguments<Input>): Promise<{
20
- response: unknown;
21
- output: Ouput;
22
- }>;
23
- }
@@ -1,33 +0,0 @@
1
- import { FinalizeHandler, FinalizeHandlerArguments, MetadataBearer, Provider, RetryStrategy } from "@smithy/types";
2
- import { DelayDecider, RetryDecider, RetryQuota } from "./types";
3
- /**
4
- * Strategy options to be passed to StandardRetryStrategy
5
- * @public
6
- * @deprecated use StandardRetryStrategy from @smithy/util-retry
7
- */
8
- export interface StandardRetryStrategyOptions {
9
- retryDecider?: RetryDecider;
10
- delayDecider?: DelayDecider;
11
- retryQuota?: RetryQuota;
12
- }
13
- /**
14
- * @public
15
- * @deprecated use StandardRetryStrategy from @smithy/util-retry
16
- */
17
- export declare class StandardRetryStrategy implements RetryStrategy {
18
- private readonly maxAttemptsProvider;
19
- private retryDecider;
20
- private delayDecider;
21
- private retryQuota;
22
- mode: string;
23
- constructor(maxAttemptsProvider: Provider<number>, options?: StandardRetryStrategyOptions);
24
- private shouldRetry;
25
- private getMaxAttempts;
26
- retry<Input extends object, Ouput extends MetadataBearer>(next: FinalizeHandler<Input, Ouput>, args: FinalizeHandlerArguments<Input>, options?: {
27
- beforeRequest: Function;
28
- afterRequest: Function;
29
- }): Promise<{
30
- response: unknown;
31
- output: Ouput;
32
- }>;
33
- }
@@ -1,66 +0,0 @@
1
- import { LoadedConfigSelectors } from "@smithy/node-config-provider";
2
- import { Provider, RetryStrategy, RetryStrategyV2 } from "@smithy/types";
3
- /**
4
- * @internal
5
- */
6
- export declare const ENV_MAX_ATTEMPTS = "AWS_MAX_ATTEMPTS";
7
- /**
8
- * @internal
9
- */
10
- export declare const CONFIG_MAX_ATTEMPTS = "max_attempts";
11
- /**
12
- * @internal
13
- */
14
- export declare const NODE_MAX_ATTEMPT_CONFIG_OPTIONS: LoadedConfigSelectors<number>;
15
- /**
16
- * @public
17
- */
18
- export interface RetryInputConfig {
19
- /**
20
- * The maximum number of times requests that encounter retryable failures should be attempted.
21
- */
22
- maxAttempts?: number | Provider<number>;
23
- /**
24
- * The strategy to retry the request. Using built-in exponential backoff strategy by default.
25
- */
26
- retryStrategy?: RetryStrategy | RetryStrategyV2;
27
- }
28
- /**
29
- * @internal
30
- */
31
- export interface PreviouslyResolved {
32
- /**
33
- * Specifies provider for retry algorithm to use.
34
- * @internal
35
- */
36
- retryMode: string | Provider<string>;
37
- }
38
- /**
39
- * @internal
40
- */
41
- export interface RetryResolvedConfig {
42
- /**
43
- * Resolved value for input config {@link RetryInputConfig.maxAttempts}
44
- */
45
- maxAttempts: Provider<number>;
46
- /**
47
- * Resolved value for input config {@link RetryInputConfig.retryStrategy}
48
- */
49
- retryStrategy: Provider<RetryStrategyV2 | RetryStrategy>;
50
- }
51
- /**
52
- * @internal
53
- */
54
- export declare const resolveRetryConfig: <T>(input: T & PreviouslyResolved & RetryInputConfig) => T & RetryResolvedConfig;
55
- /**
56
- * @internal
57
- */
58
- export declare const ENV_RETRY_MODE = "AWS_RETRY_MODE";
59
- /**
60
- * @internal
61
- */
62
- export declare const CONFIG_RETRY_MODE = "retry_mode";
63
- /**
64
- * @internal
65
- */
66
- export declare const NODE_RETRY_MODE_CONFIG_OPTIONS: LoadedConfigSelectors<string>;
@@ -1,24 +0,0 @@
1
- import { RetryQuota } from "./types";
2
- /**
3
- * @internal
4
- */
5
- export interface DefaultRetryQuotaOptions {
6
- /**
7
- * The total amount of retry token to be incremented from retry token balance
8
- * if an SDK operation invocation succeeds without requiring a retry request.
9
- */
10
- noRetryIncrement?: number;
11
- /**
12
- * The total amount of retry tokens to be decremented from retry token balance.
13
- */
14
- retryCost?: number;
15
- /**
16
- * The total amount of retry tokens to be decremented from retry token balance
17
- * when a throttling error is encountered.
18
- */
19
- timeoutRetryCost?: number;
20
- }
21
- /**
22
- * @internal
23
- */
24
- export declare const getDefaultRetryQuota: (initialRetryTokens: number, options?: DefaultRetryQuotaOptions) => RetryQuota;
@@ -1,5 +0,0 @@
1
- /**
2
- * @internal
3
- * Calculate a capped, fully-jittered exponential backoff time.
4
- */
5
- export declare const defaultDelayDecider: (delayBase: number, attempts: number) => number;
@@ -1,7 +0,0 @@
1
- export * from "./AdaptiveRetryStrategy";
2
- export * from "./StandardRetryStrategy";
3
- export * from "./configurations";
4
- export * from "./delayDecider";
5
- export * from "./omitRetryHeadersMiddleware";
6
- export * from "./retryDecider";
7
- export * from "./retryMiddleware";
@@ -1,5 +0,0 @@
1
- import { HttpRequest } from "@smithy/protocol-http";
2
- /**
3
- * @internal
4
- */
5
- export declare const isStreamingPayload: (request: HttpRequest) => boolean;
@@ -1,5 +0,0 @@
1
- import { HttpRequest } from "@smithy/protocol-http";
2
- /**
3
- * @internal
4
- */
5
- export declare const isStreamingPayload: (request: HttpRequest) => boolean;
@@ -1,13 +0,0 @@
1
- import { FinalizeHandler, MetadataBearer, Pluggable, RelativeMiddlewareOptions } from "@smithy/types";
2
- /**
3
- * @internal
4
- */
5
- export declare const omitRetryHeadersMiddleware: () => <Output extends MetadataBearer = MetadataBearer>(next: FinalizeHandler<any, Output>) => FinalizeHandler<any, Output>;
6
- /**
7
- * @internal
8
- */
9
- export declare const omitRetryHeadersMiddlewareOptions: RelativeMiddlewareOptions;
10
- /**
11
- * @internal
12
- */
13
- export declare const getOmitRetryHeadersPlugin: (options: unknown) => Pluggable<any, any>;
@@ -1,6 +0,0 @@
1
- import { SdkError } from "@smithy/types";
2
- /**
3
- * @internal
4
- * @deprecated this is only used in the deprecated StandardRetryStrategy. Do not use in new code.
5
- */
6
- export declare const defaultRetryDecider: (error: SdkError) => boolean;
@@ -1,18 +0,0 @@
1
- import { AbsoluteLocation, FinalizeHandler, FinalizeRequestHandlerOptions, HandlerExecutionContext, MetadataBearer, Pluggable } from "@smithy/types";
2
- import { RetryResolvedConfig } from "./configurations";
3
- /**
4
- * @internal
5
- */
6
- export declare const retryMiddleware: (options: RetryResolvedConfig) => <Output extends MetadataBearer = MetadataBearer>(next: FinalizeHandler<any, Output>, context: HandlerExecutionContext) => FinalizeHandler<any, Output>;
7
- /**
8
- * @internal
9
- */
10
- export declare const retryMiddlewareOptions: FinalizeRequestHandlerOptions & AbsoluteLocation;
11
- /**
12
- * @internal
13
- */
14
- export declare const getRetryPlugin: (options: RetryResolvedConfig) => Pluggable<any, any>;
15
- /**
16
- * @internal
17
- */
18
- export declare const getRetryAfterHint: (response: unknown) => Date | undefined;
@@ -1,65 +0,0 @@
1
- import { SdkError } from "@smithy/types";
2
- /**
3
- * Determines whether an error is retryable based on the number of retries
4
- * already attempted, the HTTP status code, and the error received (if any).
5
- *
6
- * @param error - The error encountered.
7
- *
8
- * @deprecated
9
- * @internal
10
- */
11
- export interface RetryDecider {
12
- (error: SdkError): boolean;
13
- }
14
- /**
15
- * Determines the number of milliseconds to wait before retrying an action.
16
- *
17
- * @param delayBase - The base delay (in milliseconds).
18
- * @param attempts - The number of times the action has already been tried.
19
- *
20
- * @deprecated
21
- * @internal
22
- */
23
- export interface DelayDecider {
24
- (delayBase: number, attempts: number): number;
25
- }
26
- /**
27
- * Interface that specifies the retry quota behavior.
28
- * @deprecated
29
- * @internal
30
- */
31
- export interface RetryQuota {
32
- /**
33
- * returns true if retry tokens are available from the retry quota bucket.
34
- */
35
- hasRetryTokens: (error: SdkError) => boolean;
36
- /**
37
- * returns token amount from the retry quota bucket.
38
- * throws error is retry tokens are not available.
39
- */
40
- retrieveRetryTokens: (error: SdkError) => number;
41
- /**
42
- * releases tokens back to the retry quota.
43
- */
44
- releaseRetryTokens: (releaseCapacityAmount?: number) => void;
45
- }
46
- /**
47
- * @deprecated
48
- * @internal
49
- */
50
- export interface RateLimiter {
51
- /**
52
- * If there is sufficient capacity (tokens) available, it immediately returns.
53
- * If there is not sufficient capacity, it will either sleep a certain amount
54
- * of time until the rate limiter can retrieve a token from its token bucket
55
- * or raise an exception indicating there is insufficient capacity.
56
- */
57
- getSendToken: () => Promise<void>;
58
- /**
59
- * Updates the client sending rate based on response.
60
- * If the response was successful, the capacity and fill rate are increased.
61
- * If the response was a throttling response, the capacity and fill rate are
62
- * decreased. Transient errors do not affect the rate limiter.
63
- */
64
- updateClientSendingRate: (response: any) => void;
65
- }
@@ -1,2 +0,0 @@
1
- import { SdkError } from "@smithy/types";
2
- export declare const asSdkError: (error: unknown) => SdkError;