@smithy/middleware-retry 4.5.6 → 4.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.
Files changed (35) hide show
  1. package/dist-cjs/index.js +22 -396
  2. package/dist-es/index.js +1 -8
  3. package/dist-types/index.d.ts +3 -8
  4. package/package.json +5 -44
  5. package/README.md +0 -24
  6. package/dist-cjs/isStreamingPayload/isStreamingPayload.browser.js +0 -5
  7. package/dist-cjs/isStreamingPayload/isStreamingPayload.js +0 -7
  8. package/dist-es/configurations.js +0 -48
  9. package/dist-es/isStreamingPayload/isStreamingPayload.browser.js +0 -1
  10. package/dist-es/isStreamingPayload/isStreamingPayload.js +0 -3
  11. package/dist-es/longPollMiddleware.js +0 -15
  12. package/dist-es/omitRetryHeadersMiddleware.js +0 -22
  13. package/dist-es/parseRetryAfterHeader.js +0 -49
  14. package/dist-es/retry-pre-sra-deprecated/AdaptiveRetryStrategy.js +0 -21
  15. package/dist-es/retry-pre-sra-deprecated/StandardRetryStrategy.js +0 -94
  16. package/dist-es/retry-pre-sra-deprecated/defaultRetryQuota.js +0 -27
  17. package/dist-es/retry-pre-sra-deprecated/delayDecider.js +0 -2
  18. package/dist-es/retry-pre-sra-deprecated/retryDecider.js +0 -7
  19. package/dist-es/retry-pre-sra-deprecated/types.js +0 -1
  20. package/dist-es/retryMiddleware.js +0 -105
  21. package/dist-es/util.js +0 -9
  22. package/dist-types/configurations.d.ts +0 -68
  23. package/dist-types/isStreamingPayload/isStreamingPayload.browser.d.ts +0 -5
  24. package/dist-types/isStreamingPayload/isStreamingPayload.d.ts +0 -5
  25. package/dist-types/longPollMiddleware.d.ts +0 -15
  26. package/dist-types/omitRetryHeadersMiddleware.d.ts +0 -15
  27. package/dist-types/parseRetryAfterHeader.d.ts +0 -10
  28. package/dist-types/retry-pre-sra-deprecated/AdaptiveRetryStrategy.d.ts +0 -24
  29. package/dist-types/retry-pre-sra-deprecated/StandardRetryStrategy.d.ts +0 -33
  30. package/dist-types/retry-pre-sra-deprecated/defaultRetryQuota.d.ts +0 -26
  31. package/dist-types/retry-pre-sra-deprecated/delayDecider.d.ts +0 -6
  32. package/dist-types/retry-pre-sra-deprecated/retryDecider.d.ts +0 -6
  33. package/dist-types/retry-pre-sra-deprecated/types.d.ts +0 -65
  34. package/dist-types/retryMiddleware.d.ts +0 -14
  35. package/dist-types/util.d.ts +0 -2
package/dist-cjs/index.js CHANGED
@@ -1,396 +1,22 @@
1
- 'use strict';
2
-
3
- var utilRetry = require('@smithy/util-retry');
4
- var protocolHttp = require('@smithy/protocol-http');
5
- var serviceErrorClassification = require('@smithy/service-error-classification');
6
- var uuid = require('@smithy/uuid');
7
- var utilMiddleware = require('@smithy/util-middleware');
8
- var smithyClient = require('@smithy/smithy-client');
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
- };
21
-
22
- const getDefaultRetryQuota = (initialRetryTokens, options) => {
23
- const MAX_CAPACITY = initialRetryTokens;
24
- const noRetryIncrement = utilRetry.NO_RETRY_INCREMENT;
25
- const retryCost = utilRetry.RETRY_COST;
26
- const timeoutRetryCost = utilRetry.TIMEOUT_RETRY_COST;
27
- let availableCapacity = initialRetryTokens;
28
- const getCapacityAmount = (error) => (error.name === "TimeoutError" ? timeoutRetryCost : retryCost);
29
- const hasRetryTokens = (error) => getCapacityAmount(error) <= availableCapacity;
30
- const retrieveRetryTokens = (error) => {
31
- if (!hasRetryTokens(error)) {
32
- throw new Error("No retry token available");
33
- }
34
- const capacityAmount = getCapacityAmount(error);
35
- availableCapacity -= capacityAmount;
36
- return capacityAmount;
37
- };
38
- const releaseRetryTokens = (capacityReleaseAmount) => {
39
- availableCapacity += capacityReleaseAmount ?? noRetryIncrement;
40
- availableCapacity = Math.min(availableCapacity, MAX_CAPACITY);
41
- };
42
- return Object.freeze({
43
- hasRetryTokens,
44
- retrieveRetryTokens,
45
- releaseRetryTokens,
46
- });
47
- };
48
-
49
- const defaultDelayDecider = (delayBase, attempts) => Math.floor(Math.min(utilRetry.MAXIMUM_RETRY_DELAY, Math.random() * 2 ** attempts * delayBase));
50
-
51
- const defaultRetryDecider = (error) => {
52
- if (!error) {
53
- return false;
54
- }
55
- return serviceErrorClassification.isRetryableByTrait(error) || serviceErrorClassification.isClockSkewError(error) || serviceErrorClassification.isThrottlingError(error) || serviceErrorClassification.isTransientError(error);
56
- };
57
-
58
- class StandardRetryStrategy {
59
- maxAttemptsProvider;
60
- retryDecider;
61
- delayDecider;
62
- retryQuota;
63
- mode = utilRetry.RETRY_MODES.STANDARD;
64
- constructor(maxAttemptsProvider, options) {
65
- this.maxAttemptsProvider = maxAttemptsProvider;
66
- this.retryDecider = options?.retryDecider ?? defaultRetryDecider;
67
- this.delayDecider = options?.delayDecider ?? defaultDelayDecider;
68
- this.retryQuota = options?.retryQuota ?? getDefaultRetryQuota(utilRetry.INITIAL_RETRY_TOKENS);
69
- }
70
- shouldRetry(error, attempts, maxAttempts) {
71
- return attempts < maxAttempts && this.retryDecider(error) && this.retryQuota.hasRetryTokens(error);
72
- }
73
- async getMaxAttempts() {
74
- let maxAttempts;
75
- try {
76
- maxAttempts = await this.maxAttemptsProvider();
77
- }
78
- catch (error) {
79
- maxAttempts = utilRetry.DEFAULT_MAX_ATTEMPTS;
80
- }
81
- return maxAttempts;
82
- }
83
- async retry(next, args, options) {
84
- let retryTokenAmount;
85
- let attempts = 0;
86
- let totalDelay = 0;
87
- const maxAttempts = await this.getMaxAttempts();
88
- const { request } = args;
89
- if (protocolHttp.HttpRequest.isInstance(request)) {
90
- request.headers[utilRetry.INVOCATION_ID_HEADER] = uuid.v4();
91
- }
92
- while (true) {
93
- try {
94
- if (protocolHttp.HttpRequest.isInstance(request)) {
95
- request.headers[utilRetry.REQUEST_HEADER] = `attempt=${attempts + 1}; max=${maxAttempts}`;
96
- }
97
- if (options?.beforeRequest) {
98
- await options.beforeRequest();
99
- }
100
- const { response, output } = await next(args);
101
- if (options?.afterRequest) {
102
- options.afterRequest(response);
103
- }
104
- this.retryQuota.releaseRetryTokens(retryTokenAmount);
105
- output.$metadata.attempts = attempts + 1;
106
- output.$metadata.totalRetryDelay = totalDelay;
107
- return { response, output };
108
- }
109
- catch (e) {
110
- const err = asSdkError(e);
111
- attempts++;
112
- if (this.shouldRetry(err, attempts, maxAttempts)) {
113
- retryTokenAmount = this.retryQuota.retrieveRetryTokens(err);
114
- const delayFromDecider = this.delayDecider(serviceErrorClassification.isThrottlingError(err) ? utilRetry.THROTTLING_RETRY_DELAY_BASE : utilRetry.DEFAULT_RETRY_DELAY_BASE, attempts);
115
- const delayFromResponse = getDelayFromRetryAfterHeader(err.$response);
116
- const delay = Math.max(delayFromResponse || 0, delayFromDecider);
117
- totalDelay += delay;
118
- await new Promise((resolve) => setTimeout(resolve, delay));
119
- continue;
120
- }
121
- if (!err.$metadata) {
122
- err.$metadata = {};
123
- }
124
- err.$metadata.attempts = attempts;
125
- err.$metadata.totalRetryDelay = totalDelay;
126
- throw err;
127
- }
128
- }
129
- }
130
- }
131
- const getDelayFromRetryAfterHeader = (response) => {
132
- if (!protocolHttp.HttpResponse.isInstance(response))
133
- return;
134
- const retryAfterHeaderName = Object.keys(response.headers).find((key) => key.toLowerCase() === "retry-after");
135
- if (!retryAfterHeaderName)
136
- return;
137
- const retryAfter = response.headers[retryAfterHeaderName];
138
- const retryAfterSeconds = Number(retryAfter);
139
- if (!Number.isNaN(retryAfterSeconds))
140
- return retryAfterSeconds * 1000;
141
- const retryAfterDate = new Date(retryAfter);
142
- return retryAfterDate.getTime() - Date.now();
143
- };
144
-
145
- class AdaptiveRetryStrategy extends StandardRetryStrategy {
146
- rateLimiter;
147
- constructor(maxAttemptsProvider, options) {
148
- const { rateLimiter, ...superOptions } = options ?? {};
149
- super(maxAttemptsProvider, superOptions);
150
- this.rateLimiter = rateLimiter ?? new utilRetry.DefaultRateLimiter();
151
- this.mode = utilRetry.RETRY_MODES.ADAPTIVE;
152
- }
153
- async retry(next, args) {
154
- return super.retry(next, args, {
155
- beforeRequest: async () => {
156
- return this.rateLimiter.getSendToken();
157
- },
158
- afterRequest: (response) => {
159
- this.rateLimiter.updateClientSendingRate(response);
160
- },
161
- });
162
- }
163
- }
164
-
165
- const ENV_MAX_ATTEMPTS = "AWS_MAX_ATTEMPTS";
166
- const CONFIG_MAX_ATTEMPTS = "max_attempts";
167
- const NODE_MAX_ATTEMPT_CONFIG_OPTIONS = {
168
- environmentVariableSelector: (env) => {
169
- const value = env[ENV_MAX_ATTEMPTS];
170
- if (!value)
171
- return undefined;
172
- const maxAttempt = parseInt(value);
173
- if (Number.isNaN(maxAttempt)) {
174
- throw new Error(`Environment variable ${ENV_MAX_ATTEMPTS} mast be a number, got "${value}"`);
175
- }
176
- return maxAttempt;
177
- },
178
- configFileSelector: (profile) => {
179
- const value = profile[CONFIG_MAX_ATTEMPTS];
180
- if (!value)
181
- return undefined;
182
- const maxAttempt = parseInt(value);
183
- if (Number.isNaN(maxAttempt)) {
184
- throw new Error(`Shared config file entry ${CONFIG_MAX_ATTEMPTS} mast be a number, got "${value}"`);
185
- }
186
- return maxAttempt;
187
- },
188
- default: utilRetry.DEFAULT_MAX_ATTEMPTS,
189
- };
190
- const resolveRetryConfig = (input) => {
191
- const { retryStrategy, retryMode } = input;
192
- const maxAttempts = utilMiddleware.normalizeProvider(input.maxAttempts ?? utilRetry.DEFAULT_MAX_ATTEMPTS);
193
- let controller = retryStrategy
194
- ? Promise.resolve(retryStrategy)
195
- : undefined;
196
- const getDefault = async () => (await utilMiddleware.normalizeProvider(retryMode)()) === utilRetry.RETRY_MODES.ADAPTIVE
197
- ? new utilRetry.AdaptiveRetryStrategy(maxAttempts)
198
- : new utilRetry.StandardRetryStrategy(maxAttempts);
199
- return Object.assign(input, {
200
- maxAttempts,
201
- retryStrategy: () => (controller ??= getDefault()),
202
- });
203
- };
204
- const ENV_RETRY_MODE = "AWS_RETRY_MODE";
205
- const CONFIG_RETRY_MODE = "retry_mode";
206
- const NODE_RETRY_MODE_CONFIG_OPTIONS = {
207
- environmentVariableSelector: (env) => env[ENV_RETRY_MODE],
208
- configFileSelector: (profile) => profile[CONFIG_RETRY_MODE],
209
- default: utilRetry.DEFAULT_RETRY_MODE,
210
- };
211
-
212
- const omitRetryHeadersMiddleware = () => (next) => async (args) => {
213
- const { request } = args;
214
- if (protocolHttp.HttpRequest.isInstance(request)) {
215
- delete request.headers[utilRetry.INVOCATION_ID_HEADER];
216
- delete request.headers[utilRetry.REQUEST_HEADER];
217
- }
218
- return next(args);
219
- };
220
- const omitRetryHeadersMiddlewareOptions = {
221
- name: "omitRetryHeadersMiddleware",
222
- tags: ["RETRY", "HEADERS", "OMIT_RETRY_HEADERS"],
223
- relation: "before",
224
- toMiddleware: "awsAuthMiddleware",
225
- override: true,
226
- };
227
- const getOmitRetryHeadersPlugin = (options) => ({
228
- applyToStack: (clientStack) => {
229
- clientStack.addRelativeTo(omitRetryHeadersMiddleware(), omitRetryHeadersMiddlewareOptions);
230
- },
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
-
281
- const retryMiddleware = (options) => (next, context) => async (args) => {
282
- let retryStrategy = await options.retryStrategy();
283
- const maxAttempts = await options.maxAttempts();
284
- if (isRetryStrategyV2(retryStrategy)) {
285
- retryStrategy = retryStrategy;
286
- let retryToken = await retryStrategy.acquireInitialRetryToken((context["partition_id"] ?? "") + (context.__retryLongPoll ? ":longpoll" : ""));
287
- let lastError = new Error();
288
- let attempts = 0;
289
- let totalRetryDelay = 0;
290
- const { request } = args;
291
- const isRequest = protocolHttp.HttpRequest.isInstance(request);
292
- if (isRequest) {
293
- request.headers[utilRetry.INVOCATION_ID_HEADER] = uuid.v4();
294
- }
295
- while (true) {
296
- try {
297
- if (isRequest) {
298
- request.headers[utilRetry.REQUEST_HEADER] = `attempt=${attempts + 1}; max=${maxAttempts}`;
299
- }
300
- const { response, output } = await next(args);
301
- retryStrategy.recordSuccess(retryToken);
302
- output.$metadata.attempts = attempts + 1;
303
- output.$metadata.totalRetryDelay = totalRetryDelay;
304
- return { response, output };
305
- }
306
- catch (e) {
307
- const retryErrorInfo = getRetryErrorInfo(e, options.logger);
308
- lastError = asSdkError(e);
309
- if (isRequest && isStreamingPayload.isStreamingPayload(request)) {
310
- (context.logger instanceof smithyClient.NoOpLogger ? console : context.logger)?.warn("An error was encountered in a non-retryable streaming request.");
311
- throw lastError;
312
- }
313
- try {
314
- retryToken = await retryStrategy.refreshRetryTokenForRetry(retryToken, retryErrorInfo);
315
- }
316
- catch (refreshError) {
317
- if (typeof refreshError.$backoff === "number") {
318
- await cooldown(refreshError.$backoff);
319
- }
320
- if (!lastError.$metadata) {
321
- lastError.$metadata = {};
322
- }
323
- lastError.$metadata.attempts = attempts + 1;
324
- lastError.$metadata.totalRetryDelay = totalRetryDelay;
325
- throw lastError;
326
- }
327
- attempts = retryToken.getRetryCount();
328
- const delay = retryToken.getRetryDelay();
329
- totalRetryDelay += delay;
330
- await cooldown(delay);
331
- }
332
- }
333
- }
334
- else {
335
- retryStrategy = retryStrategy;
336
- if (retryStrategy?.mode) {
337
- context.userAgent = [...(context.userAgent || []), ["cfg/retry-mode", retryStrategy.mode]];
338
- }
339
- return retryStrategy.retry(next, args);
340
- }
341
- };
342
- const cooldown = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
343
- const isRetryStrategyV2 = (retryStrategy) => typeof retryStrategy.acquireInitialRetryToken !== "undefined" &&
344
- typeof retryStrategy.refreshRetryTokenForRetry !== "undefined" &&
345
- typeof retryStrategy.recordSuccess !== "undefined";
346
- const getRetryErrorInfo = (error, logger) => {
347
- const errorInfo = {
348
- error,
349
- errorType: getRetryErrorType(error),
350
- };
351
- const retryAfterHint = parseRetryAfterHeader(error.$response, logger);
352
- if (retryAfterHint) {
353
- errorInfo.retryAfterHint = retryAfterHint;
354
- }
355
- return errorInfo;
356
- };
357
- const getRetryErrorType = (error) => {
358
- if (serviceErrorClassification.isThrottlingError(error))
359
- return "THROTTLING";
360
- if (serviceErrorClassification.isTransientError(error))
361
- return "TRANSIENT";
362
- if (serviceErrorClassification.isServerError(error))
363
- return "SERVER_ERROR";
364
- return "CLIENT_ERROR";
365
- };
366
- const retryMiddlewareOptions = {
367
- name: "retryMiddleware",
368
- tags: ["RETRY"],
369
- step: "finalizeRequest",
370
- priority: "high",
371
- override: true,
372
- };
373
- const getRetryPlugin = (options) => ({
374
- applyToStack: (clientStack) => {
375
- clientStack.add(retryMiddleware(options), retryMiddlewareOptions);
376
- },
377
- });
378
-
379
- exports.AdaptiveRetryStrategy = AdaptiveRetryStrategy;
380
- exports.CONFIG_MAX_ATTEMPTS = CONFIG_MAX_ATTEMPTS;
381
- exports.CONFIG_RETRY_MODE = CONFIG_RETRY_MODE;
382
- exports.ENV_MAX_ATTEMPTS = ENV_MAX_ATTEMPTS;
383
- exports.ENV_RETRY_MODE = ENV_RETRY_MODE;
384
- exports.NODE_MAX_ATTEMPT_CONFIG_OPTIONS = NODE_MAX_ATTEMPT_CONFIG_OPTIONS;
385
- exports.NODE_RETRY_MODE_CONFIG_OPTIONS = NODE_RETRY_MODE_CONFIG_OPTIONS;
386
- exports.StandardRetryStrategy = StandardRetryStrategy;
387
- exports.defaultDelayDecider = defaultDelayDecider;
388
- exports.defaultRetryDecider = defaultRetryDecider;
389
- exports.getOmitRetryHeadersPlugin = getOmitRetryHeadersPlugin;
390
- exports.getRetryAfterHint = getRetryAfterHint;
391
- exports.getRetryPlugin = getRetryPlugin;
392
- exports.omitRetryHeadersMiddleware = omitRetryHeadersMiddleware;
393
- exports.omitRetryHeadersMiddlewareOptions = omitRetryHeadersMiddlewareOptions;
394
- exports.resolveRetryConfig = resolveRetryConfig;
395
- exports.retryMiddleware = retryMiddleware;
396
- exports.retryMiddlewareOptions = retryMiddlewareOptions;
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.retryMiddlewareOptions = exports.retryMiddleware = exports.resolveRetryConfig = exports.omitRetryHeadersMiddlewareOptions = exports.omitRetryHeadersMiddleware = exports.getRetryPlugin = exports.getRetryAfterHint = exports.getOmitRetryHeadersPlugin = exports.defaultRetryDecider = exports.defaultDelayDecider = exports.NODE_RETRY_MODE_CONFIG_OPTIONS = exports.NODE_MAX_ATTEMPT_CONFIG_OPTIONS = exports.ENV_RETRY_MODE = exports.ENV_MAX_ATTEMPTS = exports.CONFIG_RETRY_MODE = exports.CONFIG_MAX_ATTEMPTS = exports.StandardRetryStrategy = exports.AdaptiveRetryStrategy = void 0;
4
+ var retry_1 = require("@smithy/core/retry");
5
+ Object.defineProperty(exports, "AdaptiveRetryStrategy", { enumerable: true, get: function () { return retry_1.DeprecatedAdaptiveRetryStrategy; } });
6
+ Object.defineProperty(exports, "StandardRetryStrategy", { enumerable: true, get: function () { return retry_1.DeprecatedStandardRetryStrategy; } });
7
+ Object.defineProperty(exports, "CONFIG_MAX_ATTEMPTS", { enumerable: true, get: function () { return retry_1.CONFIG_MAX_ATTEMPTS; } });
8
+ Object.defineProperty(exports, "CONFIG_RETRY_MODE", { enumerable: true, get: function () { return retry_1.CONFIG_RETRY_MODE; } });
9
+ Object.defineProperty(exports, "ENV_MAX_ATTEMPTS", { enumerable: true, get: function () { return retry_1.ENV_MAX_ATTEMPTS; } });
10
+ Object.defineProperty(exports, "ENV_RETRY_MODE", { enumerable: true, get: function () { return retry_1.ENV_RETRY_MODE; } });
11
+ Object.defineProperty(exports, "NODE_MAX_ATTEMPT_CONFIG_OPTIONS", { enumerable: true, get: function () { return retry_1.NODE_MAX_ATTEMPT_CONFIG_OPTIONS; } });
12
+ Object.defineProperty(exports, "NODE_RETRY_MODE_CONFIG_OPTIONS", { enumerable: true, get: function () { return retry_1.NODE_RETRY_MODE_CONFIG_OPTIONS; } });
13
+ Object.defineProperty(exports, "defaultDelayDecider", { enumerable: true, get: function () { return retry_1.defaultDelayDecider; } });
14
+ Object.defineProperty(exports, "defaultRetryDecider", { enumerable: true, get: function () { return retry_1.defaultRetryDecider; } });
15
+ Object.defineProperty(exports, "getOmitRetryHeadersPlugin", { enumerable: true, get: function () { return retry_1.getOmitRetryHeadersPlugin; } });
16
+ Object.defineProperty(exports, "getRetryAfterHint", { enumerable: true, get: function () { return retry_1.getRetryAfterHint; } });
17
+ Object.defineProperty(exports, "getRetryPlugin", { enumerable: true, get: function () { return retry_1.getRetryPlugin; } });
18
+ Object.defineProperty(exports, "omitRetryHeadersMiddleware", { enumerable: true, get: function () { return retry_1.omitRetryHeadersMiddleware; } });
19
+ Object.defineProperty(exports, "omitRetryHeadersMiddlewareOptions", { enumerable: true, get: function () { return retry_1.omitRetryHeadersMiddlewareOptions; } });
20
+ Object.defineProperty(exports, "resolveRetryConfig", { enumerable: true, get: function () { return retry_1.resolveRetryConfig; } });
21
+ Object.defineProperty(exports, "retryMiddleware", { enumerable: true, get: function () { return retry_1.retryMiddleware; } });
22
+ Object.defineProperty(exports, "retryMiddlewareOptions", { enumerable: true, get: function () { return retry_1.retryMiddlewareOptions; } });
package/dist-es/index.js CHANGED
@@ -1,8 +1 @@
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";
5
- export * from "./configurations";
6
- export * from "./omitRetryHeadersMiddleware";
7
- export * from "./retryMiddleware";
8
- export { getRetryAfterHint } from "./parseRetryAfterHeader";
1
+ export { DeprecatedAdaptiveRetryStrategy as AdaptiveRetryStrategy, DeprecatedStandardRetryStrategy as StandardRetryStrategy, CONFIG_MAX_ATTEMPTS, CONFIG_RETRY_MODE, ENV_MAX_ATTEMPTS, ENV_RETRY_MODE, NODE_MAX_ATTEMPT_CONFIG_OPTIONS, NODE_RETRY_MODE_CONFIG_OPTIONS, defaultDelayDecider, defaultRetryDecider, getOmitRetryHeadersPlugin, getRetryAfterHint, getRetryPlugin, omitRetryHeadersMiddleware, omitRetryHeadersMiddlewareOptions, resolveRetryConfig, retryMiddleware, retryMiddlewareOptions, } from "@smithy/core/retry";
@@ -1,8 +1,3 @@
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";
5
- export * from "./configurations";
6
- export * from "./omitRetryHeadersMiddleware";
7
- export * from "./retryMiddleware";
8
- export { getRetryAfterHint } from "./parseRetryAfterHeader";
1
+ /** @deprecated Use @smithy/core/retry instead. */
2
+ export { DeprecatedAdaptiveRetryStrategy as AdaptiveRetryStrategy, DeprecatedStandardRetryStrategy as StandardRetryStrategy, CONFIG_MAX_ATTEMPTS, CONFIG_RETRY_MODE, ENV_MAX_ATTEMPTS, ENV_RETRY_MODE, NODE_MAX_ATTEMPT_CONFIG_OPTIONS, NODE_RETRY_MODE_CONFIG_OPTIONS, defaultDelayDecider, defaultRetryDecider, getOmitRetryHeadersPlugin, getRetryAfterHint, getRetryPlugin, omitRetryHeadersMiddleware, omitRetryHeadersMiddlewareOptions, resolveRetryConfig, retryMiddleware, retryMiddlewareOptions, } from "@smithy/core/retry";
3
+ export type { DeprecatedAdaptiveRetryStrategyOptions as AdaptiveRetryStrategyOptions, DeprecatedStandardRetryStrategyOptions as StandardRetryStrategyOptions, RetryInputConfig, RetryResolvedConfig, PreviouslyResolved, } from "@smithy/core/retry";
package/package.json CHANGED
@@ -1,31 +1,14 @@
1
1
  {
2
2
  "name": "@smithy/middleware-retry",
3
- "version": "4.5.6",
3
+ "version": "4.6.0",
4
4
  "scripts": {
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",
7
- "build:types": "yarn g:tsc -p tsconfig.types.json",
8
- "build:types:downlevel": "premove dist-types/ts3.4 && downlevel-dts dist-types dist-types/ts3.4",
9
- "clean": "premove dist-cjs dist-es dist-types tsconfig.cjs.tsbuildinfo tsconfig.es.tsbuildinfo tsconfig.types.tsbuildinfo",
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",
14
- "test": "yarn g:vitest run",
15
- "test:integration": "yarn g:vitest run -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"
5
+ "build": "yarn g:tsc -p tsconfig.cjs.json && yarn g:tsc -p tsconfig.es.json && yarn g:tsc -p tsconfig.types.json",
6
+ "clean": "rm -rf dist-cjs dist-es dist-types",
7
+ "stage-release": "rm -rf .release && yarn pack && mkdir ./.release && tar zxvf ./package.tgz --directory ./.release && rm ./package.tgz"
18
8
  },
19
9
  "main": "./dist-cjs/index.js",
20
10
  "module": "./dist-es/index.js",
21
11
  "types": "./dist-types/index.d.ts",
22
- "browser": {
23
- "./dist-es/isStreamingPayload/isStreamingPayload": "./dist-es/isStreamingPayload/isStreamingPayload.browser"
24
- },
25
- "react-native": {
26
- "./dist-cjs/isStreamingPayload/isStreamingPayload": "./dist-cjs/isStreamingPayload/isStreamingPayload.browser",
27
- "./dist-es/isStreamingPayload/isStreamingPayload": "./dist-es/isStreamingPayload/isStreamingPayload.browser"
28
- },
29
12
  "author": {
30
13
  "name": "AWS SDK for JavaScript Team",
31
14
  "url": "https://aws.amazon.com/javascript/"
@@ -33,34 +16,12 @@
33
16
  "license": "Apache-2.0",
34
17
  "sideEffects": false,
35
18
  "dependencies": {
36
- "@smithy/core": "^3.23.17",
37
- "@smithy/node-config-provider": "^4.3.14",
38
- "@smithy/protocol-http": "^5.3.14",
39
- "@smithy/service-error-classification": "^4.3.1",
40
- "@smithy/smithy-client": "^4.12.13",
41
- "@smithy/types": "^4.14.1",
42
- "@smithy/util-middleware": "^4.2.14",
43
- "@smithy/util-retry": "^4.3.5",
44
- "@smithy/uuid": "^1.1.2",
19
+ "@smithy/core": "^3.24.0",
45
20
  "tslib": "^2.6.2"
46
21
  },
47
- "devDependencies": {
48
- "@smithy/util-test": "^0.2.8",
49
- "concurrently": "7.0.0",
50
- "downlevel-dts": "0.10.1",
51
- "premove": "4.0.0",
52
- "typedoc": "0.23.23"
53
- },
54
22
  "engines": {
55
23
  "node": ">=18.0.0"
56
24
  },
57
- "typesVersions": {
58
- "<4.5": {
59
- "dist-types/*": [
60
- "dist-types/ts3.4/*"
61
- ]
62
- }
63
- },
64
25
  "files": [
65
26
  "dist-*/**"
66
27
  ],
package/README.md DELETED
@@ -1,24 +0,0 @@
1
- # @smithy/middleware-retry
2
-
3
- [![NPM version](https://img.shields.io/npm/v/@smithy/middleware-retry/latest.svg)](https://www.npmjs.com/package/@smithy/middleware-retry)
4
- [![NPM downloads](https://img.shields.io/npm/dm/@smithy/middleware-retry.svg)](https://www.npmjs.com/package/@smithy/middleware-retry)
5
-
6
- ### :warning: Internal API :warning:
7
-
8
- > This is an internal package.
9
- > That means this is used as a dependency for other, public packages, but
10
- > should not be taken directly as a dependency in your application's `package.json`.
11
-
12
- > If you are updating the version of this package, for example to bring in a
13
- > bug-fix, you should do so by updating your application lockfile with
14
- > e.g. `npm up @scope/package` or equivalent command in another
15
- > package manager, rather than taking a direct dependency.
16
-
17
- ---
18
-
19
- ## Usage
20
-
21
- See [@smithy/util-retry](https://github.com/smithy-lang/smithy-typescript/tree/main/packages/util-retry)
22
- for retry behavior and configuration.
23
-
24
- See also: [AWS Documentation: Retry behavior](https://docs.aws.amazon.com/sdkref/latest/guide/feature-retry-behavior.html).
@@ -1,5 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.isStreamingPayload = void 0;
4
- const isStreamingPayload = (request) => request?.body instanceof ReadableStream;
5
- exports.isStreamingPayload = isStreamingPayload;
@@ -1,7 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.isStreamingPayload = void 0;
4
- const stream_1 = require("stream");
5
- const isStreamingPayload = (request) => request?.body instanceof stream_1.Readable ||
6
- (typeof ReadableStream !== "undefined" && request?.body instanceof ReadableStream);
7
- exports.isStreamingPayload = isStreamingPayload;
@@ -1,48 +0,0 @@
1
- import { normalizeProvider } from "@smithy/util-middleware";
2
- import { AdaptiveRetryStrategy, DEFAULT_MAX_ATTEMPTS, DEFAULT_RETRY_MODE, RETRY_MODES, StandardRetryStrategy, } from "@smithy/util-retry";
3
- export const ENV_MAX_ATTEMPTS = "AWS_MAX_ATTEMPTS";
4
- export const CONFIG_MAX_ATTEMPTS = "max_attempts";
5
- export const NODE_MAX_ATTEMPT_CONFIG_OPTIONS = {
6
- environmentVariableSelector: (env) => {
7
- const value = env[ENV_MAX_ATTEMPTS];
8
- if (!value)
9
- return undefined;
10
- const maxAttempt = parseInt(value);
11
- if (Number.isNaN(maxAttempt)) {
12
- throw new Error(`Environment variable ${ENV_MAX_ATTEMPTS} mast be a number, got "${value}"`);
13
- }
14
- return maxAttempt;
15
- },
16
- configFileSelector: (profile) => {
17
- const value = profile[CONFIG_MAX_ATTEMPTS];
18
- if (!value)
19
- return undefined;
20
- const maxAttempt = parseInt(value);
21
- if (Number.isNaN(maxAttempt)) {
22
- throw new Error(`Shared config file entry ${CONFIG_MAX_ATTEMPTS} mast be a number, got "${value}"`);
23
- }
24
- return maxAttempt;
25
- },
26
- default: DEFAULT_MAX_ATTEMPTS,
27
- };
28
- export const resolveRetryConfig = (input) => {
29
- const { retryStrategy, retryMode } = input;
30
- const maxAttempts = normalizeProvider(input.maxAttempts ?? DEFAULT_MAX_ATTEMPTS);
31
- let controller = retryStrategy
32
- ? Promise.resolve(retryStrategy)
33
- : undefined;
34
- const getDefault = async () => (await normalizeProvider(retryMode)()) === RETRY_MODES.ADAPTIVE
35
- ? new AdaptiveRetryStrategy(maxAttempts)
36
- : new StandardRetryStrategy(maxAttempts);
37
- return Object.assign(input, {
38
- maxAttempts,
39
- retryStrategy: () => (controller ??= getDefault()),
40
- });
41
- };
42
- export const ENV_RETRY_MODE = "AWS_RETRY_MODE";
43
- export const CONFIG_RETRY_MODE = "retry_mode";
44
- export const NODE_RETRY_MODE_CONFIG_OPTIONS = {
45
- environmentVariableSelector: (env) => env[ENV_RETRY_MODE],
46
- configFileSelector: (profile) => profile[CONFIG_RETRY_MODE],
47
- default: DEFAULT_RETRY_MODE,
48
- };
@@ -1 +0,0 @@
1
- export const isStreamingPayload = (request) => request?.body instanceof ReadableStream;
@@ -1,3 +0,0 @@
1
- import { Readable } from "stream";
2
- export const isStreamingPayload = (request) => request?.body instanceof Readable ||
3
- (typeof ReadableStream !== "undefined" && request?.body instanceof ReadableStream);
@@ -1,15 +0,0 @@
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
- });
@@ -1,22 +0,0 @@
1
- import { HttpRequest } from "@smithy/protocol-http";
2
- import { INVOCATION_ID_HEADER, REQUEST_HEADER } from "@smithy/util-retry";
3
- export const omitRetryHeadersMiddleware = () => (next) => async (args) => {
4
- const { request } = args;
5
- if (HttpRequest.isInstance(request)) {
6
- delete request.headers[INVOCATION_ID_HEADER];
7
- delete request.headers[REQUEST_HEADER];
8
- }
9
- return next(args);
10
- };
11
- export const omitRetryHeadersMiddlewareOptions = {
12
- name: "omitRetryHeadersMiddleware",
13
- tags: ["RETRY", "HEADERS", "OMIT_RETRY_HEADERS"],
14
- relation: "before",
15
- toMiddleware: "awsAuthMiddleware",
16
- override: true,
17
- };
18
- export const getOmitRetryHeadersPlugin = (options) => ({
19
- applyToStack: (clientStack) => {
20
- clientStack.addRelativeTo(omitRetryHeadersMiddleware(), omitRetryHeadersMiddlewareOptions);
21
- },
22
- });