@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.
- package/dist-cjs/index.js +70 -29
- package/dist-es/index.js +5 -4
- package/dist-es/longPollMiddleware.js +15 -0
- package/dist-es/parseRetryAfterHeader.js +49 -0
- package/dist-es/{StandardRetryStrategy.js → retry-pre-sra-deprecated/StandardRetryStrategy.js} +1 -1
- package/dist-es/retryMiddleware.js +13 -20
- package/dist-types/configurations.d.ts +3 -1
- package/dist-types/index.d.ts +5 -4
- package/dist-types/longPollMiddleware.d.ts +15 -0
- package/dist-types/omitRetryHeadersMiddleware.d.ts +2 -0
- package/dist-types/parseRetryAfterHeader.d.ts +10 -0
- package/dist-types/{AdaptiveRetryStrategy.d.ts → retry-pre-sra-deprecated/AdaptiveRetryStrategy.d.ts} +2 -1
- package/dist-types/{defaultRetryQuota.d.ts → retry-pre-sra-deprecated/defaultRetryQuota.d.ts} +2 -0
- package/dist-types/{delayDecider.d.ts → retry-pre-sra-deprecated/delayDecider.d.ts} +2 -1
- package/dist-types/retryMiddleware.d.ts +0 -4
- package/package.json +16 -16
- package/dist-types/ts3.4/AdaptiveRetryStrategy.d.ts +0 -23
- package/dist-types/ts3.4/StandardRetryStrategy.d.ts +0 -33
- package/dist-types/ts3.4/configurations.d.ts +0 -66
- package/dist-types/ts3.4/defaultRetryQuota.d.ts +0 -24
- package/dist-types/ts3.4/delayDecider.d.ts +0 -5
- package/dist-types/ts3.4/index.d.ts +0 -7
- package/dist-types/ts3.4/isStreamingPayload/isStreamingPayload.browser.d.ts +0 -5
- package/dist-types/ts3.4/isStreamingPayload/isStreamingPayload.d.ts +0 -5
- package/dist-types/ts3.4/omitRetryHeadersMiddleware.d.ts +0 -13
- package/dist-types/ts3.4/retryDecider.d.ts +0 -6
- package/dist-types/ts3.4/retryMiddleware.d.ts +0 -18
- package/dist-types/ts3.4/types.d.ts +0 -65
- package/dist-types/ts3.4/util.d.ts +0 -2
- /package/dist-es/{AdaptiveRetryStrategy.js → retry-pre-sra-deprecated/AdaptiveRetryStrategy.js} +0 -0
- /package/dist-es/{defaultRetryQuota.js → retry-pre-sra-deprecated/defaultRetryQuota.js} +0 -0
- /package/dist-es/{delayDecider.js → retry-pre-sra-deprecated/delayDecider.js} +0 -0
- /package/dist-es/{retryDecider.js → retry-pre-sra-deprecated/retryDecider.js} +0 -0
- /package/dist-es/{types.js → retry-pre-sra-deprecated/types.js} +0 -0
- /package/dist-types/{StandardRetryStrategy.d.ts → retry-pre-sra-deprecated/StandardRetryStrategy.d.ts} +0 -0
- /package/dist-types/{retryDecider.d.ts → retry-pre-sra-deprecated/retryDecider.d.ts} +0 -0
- /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
|
|
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 =
|
|
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
|
+
}
|
package/dist-es/{StandardRetryStrategy.js → retry-pre-sra-deprecated/StandardRetryStrategy.js}
RENAMED
|
@@ -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
|
|
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
|
|
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 =
|
|
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
|
package/dist-types/index.d.ts
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
|
+
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;
|
package/dist-types/{defaultRetryQuota.d.ts → retry-pre-sra-deprecated/defaultRetryQuota.d.ts}
RENAMED
|
@@ -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;
|
|
@@ -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.
|
|
3
|
+
"version": "4.5.1",
|
|
4
4
|
"scripts": {
|
|
5
|
-
"build": "concurrently 'yarn:build:
|
|
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:
|
|
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/
|
|
38
|
-
"@smithy/
|
|
39
|
-
"@smithy/
|
|
40
|
-
"@smithy/
|
|
41
|
-
"@smithy/
|
|
42
|
-
"@smithy/
|
|
43
|
-
"@smithy/util-
|
|
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,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,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,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
|
-
}
|
/package/dist-es/{AdaptiveRetryStrategy.js → retry-pre-sra-deprecated/AdaptiveRetryStrategy.js}
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|