@cdk8s/awscdk-resolver 0.0.546 → 0.0.548

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 (86) hide show
  1. package/.jsii +3 -3
  2. package/lib/resolve.js +1 -1
  3. package/node_modules/@aws-sdk/client-cloudformation/dist-cjs/index.js +9 -9
  4. package/node_modules/@aws-sdk/client-cloudformation/dist-es/waiters/waitForChangeSetCreateComplete.js +2 -2
  5. package/node_modules/@aws-sdk/client-cloudformation/dist-es/waiters/waitForStackCreateComplete.js +2 -2
  6. package/node_modules/@aws-sdk/client-cloudformation/dist-es/waiters/waitForStackDeleteComplete.js +2 -2
  7. package/node_modules/@aws-sdk/client-cloudformation/dist-es/waiters/waitForStackExists.js +2 -2
  8. package/node_modules/@aws-sdk/client-cloudformation/dist-es/waiters/waitForStackImportComplete.js +2 -2
  9. package/node_modules/@aws-sdk/client-cloudformation/dist-es/waiters/waitForStackRefactorCreateComplete.js +1 -1
  10. package/node_modules/@aws-sdk/client-cloudformation/dist-es/waiters/waitForStackRefactorExecuteComplete.js +1 -1
  11. package/node_modules/@aws-sdk/client-cloudformation/dist-es/waiters/waitForStackRollbackComplete.js +2 -2
  12. package/node_modules/@aws-sdk/client-cloudformation/dist-es/waiters/waitForStackUpdateComplete.js +2 -2
  13. package/node_modules/@aws-sdk/client-cloudformation/dist-types/CloudFormation.d.ts +11 -10
  14. package/node_modules/@aws-sdk/client-cloudformation/dist-types/ts3.4/CloudFormation.d.ts +13 -10
  15. package/node_modules/@aws-sdk/client-cloudformation/dist-types/ts3.4/waiters/waitForChangeSetCreateComplete.d.ts +9 -3
  16. package/node_modules/@aws-sdk/client-cloudformation/dist-types/ts3.4/waiters/waitForStackCreateComplete.d.ts +9 -3
  17. package/node_modules/@aws-sdk/client-cloudformation/dist-types/ts3.4/waiters/waitForStackDeleteComplete.d.ts +11 -3
  18. package/node_modules/@aws-sdk/client-cloudformation/dist-types/ts3.4/waiters/waitForStackExists.d.ts +9 -3
  19. package/node_modules/@aws-sdk/client-cloudformation/dist-types/ts3.4/waiters/waitForStackImportComplete.d.ts +9 -3
  20. package/node_modules/@aws-sdk/client-cloudformation/dist-types/ts3.4/waiters/waitForStackRefactorCreateComplete.d.ts +11 -3
  21. package/node_modules/@aws-sdk/client-cloudformation/dist-types/ts3.4/waiters/waitForStackRefactorExecuteComplete.d.ts +11 -3
  22. package/node_modules/@aws-sdk/client-cloudformation/dist-types/ts3.4/waiters/waitForStackRollbackComplete.d.ts +9 -3
  23. package/node_modules/@aws-sdk/client-cloudformation/dist-types/ts3.4/waiters/waitForStackUpdateComplete.d.ts +9 -3
  24. package/node_modules/@aws-sdk/client-cloudformation/dist-types/ts3.4/waiters/waitForTypeRegistrationComplete.d.ts +11 -3
  25. package/node_modules/@aws-sdk/client-cloudformation/dist-types/waiters/waitForChangeSetCreateComplete.d.ts +4 -3
  26. package/node_modules/@aws-sdk/client-cloudformation/dist-types/waiters/waitForStackCreateComplete.d.ts +4 -3
  27. package/node_modules/@aws-sdk/client-cloudformation/dist-types/waiters/waitForStackDeleteComplete.d.ts +4 -3
  28. package/node_modules/@aws-sdk/client-cloudformation/dist-types/waiters/waitForStackExists.d.ts +4 -3
  29. package/node_modules/@aws-sdk/client-cloudformation/dist-types/waiters/waitForStackImportComplete.d.ts +4 -3
  30. package/node_modules/@aws-sdk/client-cloudformation/dist-types/waiters/waitForStackRefactorCreateComplete.d.ts +4 -3
  31. package/node_modules/@aws-sdk/client-cloudformation/dist-types/waiters/waitForStackRefactorExecuteComplete.d.ts +4 -3
  32. package/node_modules/@aws-sdk/client-cloudformation/dist-types/waiters/waitForStackRollbackComplete.d.ts +4 -3
  33. package/node_modules/@aws-sdk/client-cloudformation/dist-types/waiters/waitForStackUpdateComplete.d.ts +4 -3
  34. package/node_modules/@aws-sdk/client-cloudformation/dist-types/waiters/waitForTypeRegistrationComplete.d.ts +4 -3
  35. package/node_modules/@aws-sdk/client-cloudformation/package.json +8 -8
  36. package/node_modules/@aws-sdk/core/package.json +3 -3
  37. package/node_modules/@aws-sdk/credential-provider-env/package.json +2 -2
  38. package/node_modules/@aws-sdk/credential-provider-http/package.json +2 -2
  39. package/node_modules/@aws-sdk/credential-provider-ini/package.json +9 -9
  40. package/node_modules/@aws-sdk/credential-provider-login/package.json +3 -3
  41. package/node_modules/@aws-sdk/credential-provider-node/package.json +7 -7
  42. package/node_modules/@aws-sdk/credential-provider-process/package.json +2 -2
  43. package/node_modules/@aws-sdk/credential-provider-sso/package.json +4 -4
  44. package/node_modules/@aws-sdk/credential-provider-web-identity/package.json +3 -3
  45. package/node_modules/@aws-sdk/middleware-sdk-s3/package.json +2 -2
  46. package/node_modules/@aws-sdk/middleware-user-agent/package.json +3 -3
  47. package/node_modules/@aws-sdk/nested-clients/package.json +7 -7
  48. package/node_modules/@aws-sdk/signature-v4-multi-region/package.json +2 -2
  49. package/node_modules/@aws-sdk/token-providers/package.json +3 -3
  50. package/node_modules/@aws-sdk/util-user-agent-node/package.json +2 -2
  51. package/node_modules/@aws-sdk/xml-builder/dist-cjs/xml-external/nodable_entities.js +336 -0
  52. package/node_modules/@aws-sdk/xml-builder/dist-cjs/xml-parser.js +26 -0
  53. package/node_modules/@aws-sdk/xml-builder/dist-es/xml-external/nodable_entities.js +332 -0
  54. package/node_modules/@aws-sdk/xml-builder/dist-es/xml-parser.js +26 -0
  55. package/node_modules/@aws-sdk/xml-builder/dist-types/ts3.4/XmlNode.d.ts +49 -29
  56. package/node_modules/@aws-sdk/xml-builder/dist-types/ts3.4/XmlText.d.ts +11 -6
  57. package/node_modules/@aws-sdk/xml-builder/dist-types/ts3.4/escape-attribute.d.ts +6 -1
  58. package/node_modules/@aws-sdk/xml-builder/dist-types/ts3.4/escape-element.d.ts +6 -1
  59. package/node_modules/@aws-sdk/xml-builder/dist-types/ts3.4/index.d.ts +12 -3
  60. package/node_modules/@aws-sdk/xml-builder/dist-types/ts3.4/stringable.d.ts +6 -3
  61. package/node_modules/@aws-sdk/xml-builder/dist-types/ts3.4/xml-external/nodable_entities.d.ts +65 -0
  62. package/node_modules/@aws-sdk/xml-builder/dist-types/ts3.4/xml-parser.browser.d.ts +9 -1
  63. package/node_modules/@aws-sdk/xml-builder/dist-types/ts3.4/xml-parser.d.ts +4 -1
  64. package/node_modules/@aws-sdk/xml-builder/dist-types/xml-external/nodable_entities.d.ts +65 -0
  65. package/node_modules/@aws-sdk/xml-builder/package.json +3 -2
  66. package/node_modules/@smithy/middleware-retry/package.json +3 -3
  67. package/node_modules/@smithy/service-error-classification/dist-cjs/index.js +1 -0
  68. package/node_modules/@smithy/service-error-classification/dist-es/index.js +1 -0
  69. package/node_modules/@smithy/service-error-classification/package.json +1 -1
  70. package/node_modules/@smithy/util-retry/package.json +2 -2
  71. package/node_modules/@smithy/util-waiter/dist-cjs/index.js +59 -34
  72. package/node_modules/@smithy/util-waiter/dist-es/poller.js +61 -34
  73. package/node_modules/@smithy/util-waiter/dist-types/createWaiter.d.ts +1 -1
  74. package/node_modules/@smithy/util-waiter/dist-types/poller.d.ts +2 -1
  75. package/node_modules/@smithy/util-waiter/dist-types/waiter.d.ts +13 -13
  76. package/node_modules/@smithy/util-waiter/package.json +1 -1
  77. package/node_modules/fast-xml-parser/CHANGELOG.md +8 -0
  78. package/node_modules/fast-xml-parser/lib/fxp.cjs +1 -1
  79. package/node_modules/fast-xml-parser/lib/fxp.min.js +1 -1
  80. package/node_modules/fast-xml-parser/lib/fxp.min.js.map +1 -1
  81. package/node_modules/fast-xml-parser/lib/fxparser.min.js +1 -1
  82. package/node_modules/fast-xml-parser/lib/fxparser.min.js.map +1 -1
  83. package/node_modules/fast-xml-parser/package.json +1 -1
  84. package/node_modules/fast-xml-parser/src/xmlparser/OrderedObjParser.js +16 -11
  85. package/node_modules/fast-xml-parser/src/xmlparser/XMLParser.js +2 -2
  86. package/package.json +3 -3
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@smithy/middleware-retry",
3
- "version": "4.5.5",
3
+ "version": "4.5.6",
4
4
  "scripts": {
5
5
  "build": "concurrently 'yarn:build:types' 'yarn:build:es:cjs'",
6
6
  "build:es:cjs": "yarn g:tsc -p tsconfig.es.json && node ../../scripts/inline middleware-retry",
@@ -36,11 +36,11 @@
36
36
  "@smithy/core": "^3.23.17",
37
37
  "@smithy/node-config-provider": "^4.3.14",
38
38
  "@smithy/protocol-http": "^5.3.14",
39
- "@smithy/service-error-classification": "^4.3.0",
39
+ "@smithy/service-error-classification": "^4.3.1",
40
40
  "@smithy/smithy-client": "^4.12.13",
41
41
  "@smithy/types": "^4.14.1",
42
42
  "@smithy/util-middleware": "^4.2.14",
43
- "@smithy/util-retry": "^4.3.4",
43
+ "@smithy/util-retry": "^4.3.5",
44
44
  "@smithy/uuid": "^1.1.2",
45
45
  "tslib": "^2.6.2"
46
46
  },
@@ -51,6 +51,7 @@ const isThrottlingError = (error) => error.$metadata?.httpStatusCode === 429 ||
51
51
  error.$retryable?.throttling == true;
52
52
  const isTransientError = (error, depth = 0) => isRetryableByTrait(error) ||
53
53
  isClockSkewCorrectedError(error) ||
54
+ (error.name === "InvalidSignatureException" && error.message?.includes("Signature expired")) ||
54
55
  TRANSIENT_ERROR_CODES.includes(error.name) ||
55
56
  NODEJS_TIMEOUT_ERROR_CODES.includes(error?.code || "") ||
56
57
  NODEJS_NETWORK_ERROR_CODES.includes(error?.code || "") ||
@@ -21,6 +21,7 @@ export const isThrottlingError = (error) => error.$metadata?.httpStatusCode ===
21
21
  error.$retryable?.throttling == true;
22
22
  export const isTransientError = (error, depth = 0) => isRetryableByTrait(error) ||
23
23
  isClockSkewCorrectedError(error) ||
24
+ (error.name === "InvalidSignatureException" && error.message?.includes("Signature expired")) ||
24
25
  TRANSIENT_ERROR_CODES.includes(error.name) ||
25
26
  NODEJS_TIMEOUT_ERROR_CODES.includes(error?.code || "") ||
26
27
  NODEJS_NETWORK_ERROR_CODES.includes(error?.code || "") ||
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@smithy/service-error-classification",
3
- "version": "4.3.0",
3
+ "version": "4.3.1",
4
4
  "scripts": {
5
5
  "build": "concurrently 'yarn:build:types' 'yarn:build:es:cjs'",
6
6
  "build:es:cjs": "yarn g:tsc -p tsconfig.es.json && node ../../scripts/inline service-error-classification",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@smithy/util-retry",
3
- "version": "4.3.4",
3
+ "version": "4.3.5",
4
4
  "description": "Shared retry utilities to be used in middleware packages.",
5
5
  "main": "./dist-cjs/index.js",
6
6
  "module": "./dist-es/index.js",
@@ -30,7 +30,7 @@
30
30
  "license": "Apache-2.0",
31
31
  "sideEffects": false,
32
32
  "dependencies": {
33
- "@smithy/service-error-classification": "^4.3.0",
33
+ "@smithy/service-error-classification": "^4.3.1",
34
34
  "@smithy/types": "^4.14.1",
35
35
  "tslib": "^2.6.2"
36
36
  },
@@ -52,39 +52,27 @@ const checkExceptions = (result) => {
52
52
  return result;
53
53
  };
54
54
 
55
- const exponentialBackoffWithJitter = (minDelay, maxDelay, attemptCeiling, attempt) => {
56
- if (attempt > attemptCeiling)
57
- return maxDelay;
58
- const delay = minDelay * 2 ** (attempt - 1);
59
- return randomInRange(minDelay, delay);
60
- };
61
- const randomInRange = (min, max) => min + Math.random() * (max - min);
62
55
  const runPolling = async ({ minDelay, maxDelay, maxWaitTime, abortController, client, abortSignal }, input, acceptorChecks) => {
63
56
  const observedResponses = {};
64
- const { state, reason } = await acceptorChecks(client, input);
65
- if (reason) {
66
- const message = createMessageFromResponse(reason);
67
- observedResponses[message] |= 0;
68
- observedResponses[message] += 1;
69
- }
70
- if (state !== exports.WaiterState.RETRY) {
71
- return { state, reason, observedResponses };
72
- }
73
- let currentAttempt = 1;
57
+ const [minDelayMs, maxDelayMs] = [minDelay * 1000, maxDelay * 1000];
58
+ let currentAttempt = 0;
74
59
  const waitUntil = Date.now() + maxWaitTime * 1000;
75
- const attemptCeiling = Math.log(maxDelay / minDelay) / Math.log(2) + 1;
60
+ const warn403Time = Date.now() + 60_000;
61
+ let didWarn403 = false;
76
62
  while (true) {
77
- if (abortController?.signal?.aborted || abortSignal?.aborted) {
78
- const message = "AbortController signal aborted.";
79
- observedResponses[message] |= 0;
80
- observedResponses[message] += 1;
81
- return { state: exports.WaiterState.ABORTED, observedResponses };
82
- }
83
- const delay = exponentialBackoffWithJitter(minDelay, maxDelay, attemptCeiling, currentAttempt);
84
- if (Date.now() + delay * 1000 > waitUntil) {
85
- return { state: exports.WaiterState.TIMEOUT, observedResponses };
63
+ if (currentAttempt > 0) {
64
+ const delayMs = exponentialBackoffWithJitter(minDelayMs, maxDelayMs, currentAttempt, waitUntil);
65
+ if (abortController?.signal?.aborted || abortSignal?.aborted) {
66
+ const message = "AbortController signal aborted.";
67
+ observedResponses[message] |= 0;
68
+ observedResponses[message] += 1;
69
+ return { state: exports.WaiterState.ABORTED, observedResponses };
70
+ }
71
+ if (Date.now() + delayMs > waitUntil) {
72
+ return { state: exports.WaiterState.TIMEOUT, observedResponses };
73
+ }
74
+ await sleep(delayMs / 1_000);
86
75
  }
87
- await sleep(delay);
88
76
  const { state, reason } = await acceptorChecks(client, input);
89
77
  if (reason) {
90
78
  const message = createMessageFromResponse(reason);
@@ -92,23 +80,60 @@ const runPolling = async ({ minDelay, maxDelay, maxWaitTime, abortController, cl
92
80
  observedResponses[message] += 1;
93
81
  }
94
82
  if (state !== exports.WaiterState.RETRY) {
95
- return { state, reason, observedResponses };
83
+ return { state, reason, final: reason, observedResponses };
96
84
  }
97
85
  currentAttempt += 1;
86
+ if (!didWarn403 && Date.now() >= warn403Time) {
87
+ checkWarn403(observedResponses, client);
88
+ didWarn403 = true;
89
+ }
90
+ }
91
+ };
92
+ const checkWarn403 = (observedResponses = {}, client) => {
93
+ const orderedErrors = Object.keys(observedResponses);
94
+ let count403 = 0;
95
+ for (const response of orderedErrors) {
96
+ const n = observedResponses[response] | 0;
97
+ if (response.startsWith("403:")) {
98
+ count403 += n;
99
+ }
100
+ }
101
+ const clientLogger = client?.config?.logger;
102
+ const warningLogger = typeof clientLogger?.warn === "function" && !clientLogger.constructor?.name?.includes?.("NoOpLogger")
103
+ ? clientLogger
104
+ : console;
105
+ if (count403 >= 3 || orderedErrors[orderedErrors.length - 1].startsWith("403:")) {
106
+ warningLogger.warn(`@smithy/util-waiter WARN - 403 status code encountered during waiter polling.`);
98
107
  }
99
108
  };
100
109
  const createMessageFromResponse = (reason) => {
110
+ const status = reason?.$response?.statusCode ?? reason?.$metadata?.httpStatusCode;
101
111
  if (reason?.$responseBodyText) {
102
- return `Deserialization error for body: ${reason.$responseBodyText}`;
112
+ return `${status ? status + ": " : ""}Deserialization error for body: ${reason.$responseBodyText}`;
103
113
  }
104
- if (reason?.$metadata?.httpStatusCode) {
105
- if (reason.$response || reason.message) {
106
- return `${reason.$response?.statusCode ?? reason.$metadata.httpStatusCode ?? "Unknown"}: ${reason.message}`;
114
+ if (status) {
115
+ if (reason?.$response || reason?.message) {
116
+ return `${status ?? "Unknown"}: ${reason?.message}`;
107
117
  }
108
- return `${reason.$metadata.httpStatusCode}: OK`;
118
+ return `${status}: OK`;
109
119
  }
110
120
  return String(reason?.message ?? JSON.stringify(reason, getCircularReplacer()) ?? "Unknown");
111
121
  };
122
+ const exponentialBackoffWithJitter = (minDelayMs, maxDelayMs, attempt, waitUntil) => {
123
+ const attemptCountCeiling = Math.log(maxDelayMs / minDelayMs) / Math.log(2) + 1;
124
+ if (attempt > attemptCountCeiling) {
125
+ return maxDelayMs;
126
+ }
127
+ const delay = minDelayMs * 2 ** (attempt - 1);
128
+ const capped = Math.min(delay, maxDelayMs);
129
+ const waitFor = randomInRange(minDelayMs, capped);
130
+ if (Date.now() + waitFor > waitUntil) {
131
+ const timeRemaining = waitUntil - Date.now();
132
+ return Math.max(0, timeRemaining - 500);
133
+ }
134
+ return waitFor;
135
+ };
136
+ const randomInRange = (min, max) => min + Math.random() * (max - min);
112
137
 
113
138
  const validateWaiterOptions = (options) => {
114
139
  if (options.maxWaitTime <= 0) {
@@ -1,39 +1,27 @@
1
1
  import { getCircularReplacer } from "./circularReplacer";
2
2
  import { sleep } from "./utils/sleep";
3
3
  import { WaiterState } from "./waiter";
4
- const exponentialBackoffWithJitter = (minDelay, maxDelay, attemptCeiling, attempt) => {
5
- if (attempt > attemptCeiling)
6
- return maxDelay;
7
- const delay = minDelay * 2 ** (attempt - 1);
8
- return randomInRange(minDelay, delay);
9
- };
10
- const randomInRange = (min, max) => min + Math.random() * (max - min);
11
4
  export const runPolling = async ({ minDelay, maxDelay, maxWaitTime, abortController, client, abortSignal }, input, acceptorChecks) => {
12
5
  const observedResponses = {};
13
- const { state, reason } = await acceptorChecks(client, input);
14
- if (reason) {
15
- const message = createMessageFromResponse(reason);
16
- observedResponses[message] |= 0;
17
- observedResponses[message] += 1;
18
- }
19
- if (state !== WaiterState.RETRY) {
20
- return { state, reason, observedResponses };
21
- }
22
- let currentAttempt = 1;
6
+ const [minDelayMs, maxDelayMs] = [minDelay * 1000, maxDelay * 1000];
7
+ let currentAttempt = 0;
23
8
  const waitUntil = Date.now() + maxWaitTime * 1000;
24
- const attemptCeiling = Math.log(maxDelay / minDelay) / Math.log(2) + 1;
9
+ const warn403Time = Date.now() + 60_000;
10
+ let didWarn403 = false;
25
11
  while (true) {
26
- if (abortController?.signal?.aborted || abortSignal?.aborted) {
27
- const message = "AbortController signal aborted.";
28
- observedResponses[message] |= 0;
29
- observedResponses[message] += 1;
30
- return { state: WaiterState.ABORTED, observedResponses };
12
+ if (currentAttempt > 0) {
13
+ const delayMs = exponentialBackoffWithJitter(minDelayMs, maxDelayMs, currentAttempt, waitUntil);
14
+ if (abortController?.signal?.aborted || abortSignal?.aborted) {
15
+ const message = "AbortController signal aborted.";
16
+ observedResponses[message] |= 0;
17
+ observedResponses[message] += 1;
18
+ return { state: WaiterState.ABORTED, observedResponses };
19
+ }
20
+ if (Date.now() + delayMs > waitUntil) {
21
+ return { state: WaiterState.TIMEOUT, observedResponses };
22
+ }
23
+ await sleep(delayMs / 1_000);
31
24
  }
32
- const delay = exponentialBackoffWithJitter(minDelay, maxDelay, attemptCeiling, currentAttempt);
33
- if (Date.now() + delay * 1000 > waitUntil) {
34
- return { state: WaiterState.TIMEOUT, observedResponses };
35
- }
36
- await sleep(delay);
37
25
  const { state, reason } = await acceptorChecks(client, input);
38
26
  if (reason) {
39
27
  const message = createMessageFromResponse(reason);
@@ -41,20 +29,59 @@ export const runPolling = async ({ minDelay, maxDelay, maxWaitTime, abortControl
41
29
  observedResponses[message] += 1;
42
30
  }
43
31
  if (state !== WaiterState.RETRY) {
44
- return { state, reason, observedResponses };
32
+ return { state, reason, final: reason, observedResponses };
45
33
  }
46
34
  currentAttempt += 1;
35
+ if (!didWarn403 && Date.now() >= warn403Time) {
36
+ checkWarn403(observedResponses, client);
37
+ didWarn403 = true;
38
+ }
39
+ }
40
+ };
41
+ const checkWarn403 = (observedResponses = {}, client) => {
42
+ const orderedErrors = Object.keys(observedResponses);
43
+ let maxCount = 0;
44
+ let count403 = 0;
45
+ for (const response of orderedErrors) {
46
+ const n = observedResponses[response] | 0;
47
+ maxCount = Math.max(n, maxCount);
48
+ if (response.startsWith("403:")) {
49
+ count403 += n;
50
+ }
51
+ }
52
+ const clientLogger = client?.config?.logger;
53
+ const warningLogger = typeof clientLogger?.warn === "function" && !clientLogger.constructor?.name?.includes?.("NoOpLogger")
54
+ ? clientLogger
55
+ : console;
56
+ if (count403 >= 3 || orderedErrors[orderedErrors.length - 1].startsWith("403:")) {
57
+ warningLogger.warn(`@smithy/util-waiter WARN - 403 status code encountered during waiter polling.`);
47
58
  }
48
59
  };
49
60
  const createMessageFromResponse = (reason) => {
61
+ const status = reason?.$response?.statusCode ?? reason?.$metadata?.httpStatusCode;
50
62
  if (reason?.$responseBodyText) {
51
- return `Deserialization error for body: ${reason.$responseBodyText}`;
63
+ return `${status ? status + ": " : ""}Deserialization error for body: ${reason.$responseBodyText}`;
52
64
  }
53
- if (reason?.$metadata?.httpStatusCode) {
54
- if (reason.$response || reason.message) {
55
- return `${reason.$response?.statusCode ?? reason.$metadata.httpStatusCode ?? "Unknown"}: ${reason.message}`;
65
+ if (status) {
66
+ if (reason?.$response || reason?.message) {
67
+ return `${status ?? "Unknown"}: ${reason?.message}`;
56
68
  }
57
- return `${reason.$metadata.httpStatusCode}: OK`;
69
+ return `${status}: OK`;
58
70
  }
59
71
  return String(reason?.message ?? JSON.stringify(reason, getCircularReplacer()) ?? "Unknown");
60
72
  };
73
+ const exponentialBackoffWithJitter = (minDelayMs, maxDelayMs, attempt, waitUntil) => {
74
+ const attemptCountCeiling = Math.log(maxDelayMs / minDelayMs) / Math.log(2) + 1;
75
+ if (attempt > attemptCountCeiling) {
76
+ return maxDelayMs;
77
+ }
78
+ const delay = minDelayMs * 2 ** (attempt - 1);
79
+ const capped = Math.min(delay, maxDelayMs);
80
+ const waitFor = randomInRange(minDelayMs, capped);
81
+ if (Date.now() + waitFor > waitUntil) {
82
+ const timeRemaining = waitUntil - Date.now();
83
+ return Math.max(0, timeRemaining - 500);
84
+ }
85
+ return waitFor;
86
+ };
87
+ const randomInRange = (min, max) => min + Math.random() * (max - min);
@@ -8,4 +8,4 @@ import type { WaiterOptions, WaiterResult } from "./waiter";
8
8
  *
9
9
  * @internal
10
10
  */
11
- export declare const createWaiter: <Client, Input>(options: WaiterOptions<Client>, input: Input, acceptorChecks: (client: Client, input: Input) => Promise<WaiterResult>) => Promise<WaiterResult>;
11
+ export declare const createWaiter: <Client, Input, Reason = any>(options: WaiterOptions<Client>, input: Input, acceptorChecks: (client: Client, input: Input) => Promise<WaiterResult<Reason>>) => Promise<WaiterResult<Reason>>;
@@ -2,9 +2,10 @@ import type { WaiterOptions, WaiterResult } from "./waiter";
2
2
  /**
3
3
  * Function that runs polling as part of waiters. This will make one inital attempt and then
4
4
  * subsequent attempts with an increasing delay.
5
+ *
5
6
  * @param params - options passed to the waiter.
6
7
  * @param client - AWS SDK Client
7
8
  * @param input - client input
8
9
  * @param acceptorChecks - function that checks the acceptor states on each poll.
9
10
  */
10
- export declare const runPolling: <Client, Input>({ minDelay, maxDelay, maxWaitTime, abortController, client, abortSignal }: WaiterOptions<Client>, input: Input, acceptorChecks: (client: Client, input: Input) => Promise<WaiterResult>) => Promise<WaiterResult>;
11
+ export declare const runPolling: <Client, Input, Reason = any>({ minDelay, maxDelay, maxWaitTime, abortController, client, abortSignal }: WaiterOptions<Client>, input: Input, acceptorChecks: (client: Client, input: Input) => Promise<WaiterResult<Reason>>) => Promise<WaiterResult<Reason>>;
@@ -1,9 +1,5 @@
1
- import type { WaiterConfiguration as WaiterConfiguration__ } from "@smithy/types";
2
- /**
3
- * @internal
4
- */
5
- export interface WaiterConfiguration<T> extends WaiterConfiguration__<T> {
6
- }
1
+ import type { WaiterConfiguration } from "@smithy/types";
2
+ export { WaiterConfiguration };
7
3
  /**
8
4
  * @internal
9
5
  */
@@ -16,7 +12,7 @@ export declare const waiterServiceDefaults: {
16
12
  */
17
13
  export type WaiterOptions<Client> = WaiterConfiguration<Client> & Required<Pick<WaiterConfiguration<Client>, "minDelay" | "maxDelay">>;
18
14
  /**
19
- * @internal
15
+ * @public
20
16
  */
21
17
  export declare enum WaiterState {
22
18
  ABORTED = "ABORTED",
@@ -26,14 +22,19 @@ export declare enum WaiterState {
26
22
  TIMEOUT = "TIMEOUT"
27
23
  }
28
24
  /**
29
- * @internal
25
+ * @public
30
26
  */
31
- export type WaiterResult = {
27
+ export type WaiterResult<R = any> = {
32
28
  state: WaiterState;
33
29
  /**
34
- * (optional) Indicates a reason for why a waiter has reached its state.
30
+ * @deprecated because this was untyped as `any`, new code should use the field 'final',
31
+ * which is the same value, but typed.
35
32
  */
36
33
  reason?: any;
34
+ /**
35
+ * (optional) Indicates a reason for why a waiter has reached its state.
36
+ */
37
+ final?: R;
37
38
  /**
38
39
  * Responses observed by the waiter during its polling, where the value
39
40
  * is the count.
@@ -41,9 +42,8 @@ export type WaiterResult = {
41
42
  observedResponses?: Record<string, number>;
42
43
  };
43
44
  /**
44
- * @internal
45
- *
46
45
  * Handles and throws exceptions resulting from the waiterResult
46
+ * @internal
47
47
  * @param result - WaiterResult
48
48
  */
49
- export declare const checkExceptions: (result: WaiterResult) => WaiterResult;
49
+ export declare const checkExceptions: <R>(result: WaiterResult<R>) => WaiterResult<R>;
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@smithy/util-waiter",
3
- "version": "4.2.16",
3
+ "version": "4.3.0",
4
4
  "description": "Shared utilities for client waiters for the AWS SDK",
5
5
  "dependencies": {
6
6
  "@smithy/types": "^4.14.1",
@@ -2,6 +2,14 @@
2
2
 
3
3
  Note: Due to some last quick changes on v4, detail of v4.5.3 & v4.5.4 are not updated here. v4.5.4x is the last tag of v4 in github repository. I'm extremely sorry for the confusion
4
4
 
5
+ **5.7.2 / 2026-04-25**
6
+ - allow numerical external entity for backward compatibility
7
+ - fix #705: attributesGroupName working with preserveOrder
8
+ - fix #817: stackoverflow when tag expression is very long
9
+
10
+ **5.7.1 / 2026-04-20**
11
+ - fix typo in CJS typing file
12
+
5
13
  **5.7.0 / 2026-04-17**
6
14
  - Use `@nodable/entities` v2.1.0
7
15
  - breaking changes