@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 +31 -6
- package/dist-es/poller.js +30 -4
- package/dist-types/ts3.4/waiter.d.ts +5 -0
- package/dist-types/waiter.d.ts +5 -0
- package/package.json +4 -4
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
|
-
|
|
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 (
|
|
92
|
-
|
|
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
|
-
|
|
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
|
package/dist-types/waiter.d.ts
CHANGED
|
@@ -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
|
+
"version": "4.0.0",
|
|
4
4
|
"description": "Shared utilities for client waiters for the AWS SDK",
|
|
5
5
|
"dependencies": {
|
|
6
|
-
"@smithy/abort-controller": "^
|
|
7
|
-
"@smithy/types": "^
|
|
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": ">=
|
|
32
|
+
"node": ">=18.0.0"
|
|
33
33
|
},
|
|
34
34
|
"typesVersions": {
|
|
35
35
|
"<4.0": {
|