@smithy/util-waiter 3.1.10 → 4.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist-cjs/index.js CHANGED
@@ -79,30 +79,55 @@ var exponentialBackoffWithJitter = /* @__PURE__ */ __name((minDelay, maxDelay, a
79
79
  }, "exponentialBackoffWithJitter");
80
80
  var randomInRange = /* @__PURE__ */ __name((min, max) => min + Math.random() * (max - min), "randomInRange");
81
81
  var runPolling = /* @__PURE__ */ __name(async ({ minDelay, maxDelay, maxWaitTime, abortController, client, abortSignal }, input, acceptorChecks) => {
82
- var _a;
82
+ const observedResponses = {};
83
83
  const { state, reason } = await acceptorChecks(client, input);
84
+ if (reason) {
85
+ const message = createMessageFromResponse(reason);
86
+ observedResponses[message] |= 0;
87
+ observedResponses[message] += 1;
88
+ }
84
89
  if (state !== "RETRY" /* RETRY */) {
85
- return { state, reason };
90
+ return { state, reason, observedResponses };
86
91
  }
87
92
  let currentAttempt = 1;
88
93
  const waitUntil = Date.now() + maxWaitTime * 1e3;
89
94
  const attemptCeiling = Math.log(maxDelay / minDelay) / Math.log(2) + 1;
90
95
  while (true) {
91
- if (((_a = abortController == null ? void 0 : abortController.signal) == null ? void 0 : _a.aborted) || (abortSignal == null ? void 0 : abortSignal.aborted)) {
92
- return { state: "ABORTED" /* ABORTED */ };
96
+ if (abortController?.signal?.aborted || abortSignal?.aborted) {
97
+ const message = "AbortController signal aborted.";
98
+ observedResponses[message] |= 0;
99
+ observedResponses[message] += 1;
100
+ return { state: "ABORTED" /* ABORTED */, observedResponses };
93
101
  }
94
102
  const delay = exponentialBackoffWithJitter(minDelay, maxDelay, attemptCeiling, currentAttempt);
95
103
  if (Date.now() + delay * 1e3 > waitUntil) {
96
- return { state: "TIMEOUT" /* TIMEOUT */ };
104
+ return { state: "TIMEOUT" /* TIMEOUT */, observedResponses };
97
105
  }
98
106
  await sleep(delay);
99
107
  const { state: state2, reason: reason2 } = await acceptorChecks(client, input);
108
+ if (reason2) {
109
+ const message = createMessageFromResponse(reason2);
110
+ observedResponses[message] |= 0;
111
+ observedResponses[message] += 1;
112
+ }
100
113
  if (state2 !== "RETRY" /* RETRY */) {
101
- return { state: state2, reason: reason2 };
114
+ return { state: state2, reason: reason2, observedResponses };
102
115
  }
103
116
  currentAttempt += 1;
104
117
  }
105
118
  }, "runPolling");
119
+ var createMessageFromResponse = /* @__PURE__ */ __name((reason) => {
120
+ if (reason?.$responseBodyText) {
121
+ return `Deserialization error for body: ${reason.$responseBodyText}`;
122
+ }
123
+ if (reason?.$metadata?.httpStatusCode) {
124
+ if (reason.$response || reason.message) {
125
+ return `${reason.$response.statusCode ?? reason.$metadata.httpStatusCode ?? "Unknown"}: ${reason.message}`;
126
+ }
127
+ return `${reason.$metadata.httpStatusCode}: OK`;
128
+ }
129
+ return String(reason?.message ?? JSON.stringify(reason) ?? "Unknown");
130
+ }, "createMessageFromResponse");
106
131
 
107
132
  // src/utils/validate.ts
108
133
  var validateWaiterOptions = /* @__PURE__ */ __name((options) => {
package/dist-es/poller.js CHANGED
@@ -8,26 +8,52 @@ const exponentialBackoffWithJitter = (minDelay, maxDelay, attemptCeiling, attemp
8
8
  };
9
9
  const randomInRange = (min, max) => min + Math.random() * (max - min);
10
10
  export const runPolling = async ({ minDelay, maxDelay, maxWaitTime, abortController, client, abortSignal }, input, acceptorChecks) => {
11
+ const observedResponses = {};
11
12
  const { state, reason } = await acceptorChecks(client, input);
13
+ if (reason) {
14
+ const message = createMessageFromResponse(reason);
15
+ observedResponses[message] |= 0;
16
+ observedResponses[message] += 1;
17
+ }
12
18
  if (state !== WaiterState.RETRY) {
13
- return { state, reason };
19
+ return { state, reason, observedResponses };
14
20
  }
15
21
  let currentAttempt = 1;
16
22
  const waitUntil = Date.now() + maxWaitTime * 1000;
17
23
  const attemptCeiling = Math.log(maxDelay / minDelay) / Math.log(2) + 1;
18
24
  while (true) {
19
25
  if (abortController?.signal?.aborted || abortSignal?.aborted) {
20
- return { state: WaiterState.ABORTED };
26
+ const message = "AbortController signal aborted.";
27
+ observedResponses[message] |= 0;
28
+ observedResponses[message] += 1;
29
+ return { state: WaiterState.ABORTED, observedResponses };
21
30
  }
22
31
  const delay = exponentialBackoffWithJitter(minDelay, maxDelay, attemptCeiling, currentAttempt);
23
32
  if (Date.now() + delay * 1000 > waitUntil) {
24
- return { state: WaiterState.TIMEOUT };
33
+ return { state: WaiterState.TIMEOUT, observedResponses };
25
34
  }
26
35
  await sleep(delay);
27
36
  const { state, reason } = await acceptorChecks(client, input);
37
+ if (reason) {
38
+ const message = createMessageFromResponse(reason);
39
+ observedResponses[message] |= 0;
40
+ observedResponses[message] += 1;
41
+ }
28
42
  if (state !== WaiterState.RETRY) {
29
- return { state, reason };
43
+ return { state, reason, observedResponses };
30
44
  }
31
45
  currentAttempt += 1;
32
46
  }
33
47
  };
48
+ const createMessageFromResponse = (reason) => {
49
+ if (reason?.$responseBodyText) {
50
+ return `Deserialization error for body: ${reason.$responseBodyText}`;
51
+ }
52
+ if (reason?.$metadata?.httpStatusCode) {
53
+ if (reason.$response || reason.message) {
54
+ return `${reason.$response.statusCode ?? reason.$metadata.httpStatusCode ?? "Unknown"}: ${reason.message}`;
55
+ }
56
+ return `${reason.$metadata.httpStatusCode}: OK`;
57
+ }
58
+ return String(reason?.message ?? JSON.stringify(reason) ?? "Unknown");
59
+ };
@@ -34,6 +34,11 @@ export type WaiterResult = {
34
34
  * (optional) Indicates a reason for why a waiter has reached its state.
35
35
  */
36
36
  reason?: any;
37
+ /**
38
+ * Responses observed by the waiter during its polling, where the value
39
+ * is the count.
40
+ */
41
+ observedResponses?: Record<string, number>;
37
42
  };
38
43
  /**
39
44
  * @internal
@@ -34,6 +34,11 @@ export type WaiterResult = {
34
34
  * (optional) Indicates a reason for why a waiter has reached its state.
35
35
  */
36
36
  reason?: any;
37
+ /**
38
+ * Responses observed by the waiter during its polling, where the value
39
+ * is the count.
40
+ */
41
+ observedResponses?: Record<string, number>;
37
42
  };
38
43
  /**
39
44
  * @internal
package/package.json CHANGED
@@ -1,10 +1,10 @@
1
1
  {
2
2
  "name": "@smithy/util-waiter",
3
- "version": "3.1.10",
3
+ "version": "4.0.0",
4
4
  "description": "Shared utilities for client waiters for the AWS SDK",
5
5
  "dependencies": {
6
- "@smithy/abort-controller": "^3.1.9",
7
- "@smithy/types": "^3.7.2",
6
+ "@smithy/abort-controller": "^4.0.0",
7
+ "@smithy/types": "^4.0.0",
8
8
  "tslib": "^2.6.2"
9
9
  },
10
10
  "scripts": {
@@ -29,7 +29,7 @@
29
29
  "module": "./dist-es/index.js",
30
30
  "types": "./dist-types/index.d.ts",
31
31
  "engines": {
32
- "node": ">=16.0.0"
32
+ "node": ">=18.0.0"
33
33
  },
34
34
  "typesVersions": {
35
35
  "<4.0": {