@wildix/xbees-conversations-client 1.2.9 → 1.2.11
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.
|
@@ -9,6 +9,61 @@ const middleware_retry_1 = require("@smithy/middleware-retry");
|
|
|
9
9
|
const smithy_client_1 = require("@smithy/smithy-client");
|
|
10
10
|
Object.defineProperty(exports, "__Client", { enumerable: true, get: function () { return smithy_client_1.Client; } });
|
|
11
11
|
const smithy_utils_1 = require("@wildix/smithy-utils");
|
|
12
|
+
const DEFAULT_429_RETRY_DELAY_MS = 1000;
|
|
13
|
+
const parseRetryDelayMs = (rawValue) => {
|
|
14
|
+
if (typeof rawValue === "number" && Number.isFinite(rawValue)) {
|
|
15
|
+
if (rawValue >= 1000) {
|
|
16
|
+
return Math.max(0, Math.round(rawValue));
|
|
17
|
+
}
|
|
18
|
+
return Math.max(0, Math.round(rawValue * 1000));
|
|
19
|
+
}
|
|
20
|
+
if (typeof rawValue !== "string") {
|
|
21
|
+
return undefined;
|
|
22
|
+
}
|
|
23
|
+
const numeric = Number(rawValue);
|
|
24
|
+
if (!Number.isNaN(numeric)) {
|
|
25
|
+
if (numeric >= 1000) {
|
|
26
|
+
return Math.max(0, Math.round(numeric));
|
|
27
|
+
}
|
|
28
|
+
return Math.max(0, Math.round(numeric * 1000));
|
|
29
|
+
}
|
|
30
|
+
const parsedDateMs = Date.parse(rawValue);
|
|
31
|
+
if (!Number.isNaN(parsedDateMs)) {
|
|
32
|
+
return Math.max(0, parsedDateMs - Date.now());
|
|
33
|
+
}
|
|
34
|
+
return undefined;
|
|
35
|
+
};
|
|
36
|
+
const getHeaderCaseInsensitive = (headers, ...names) => {
|
|
37
|
+
if (!headers) {
|
|
38
|
+
return undefined;
|
|
39
|
+
}
|
|
40
|
+
const normalizedNames = names.map((name) => name.toLowerCase());
|
|
41
|
+
for (const [key, value] of Object.entries(headers)) {
|
|
42
|
+
if (normalizedNames.includes(key.toLowerCase())) {
|
|
43
|
+
return value;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
return undefined;
|
|
47
|
+
};
|
|
48
|
+
const get429RetryDelayMs = (error) => {
|
|
49
|
+
const headers = error?.$response?.headers;
|
|
50
|
+
const retryAfter = getHeaderCaseInsensitive(headers, "retry-after");
|
|
51
|
+
const rateLimitReset = getHeaderCaseInsensitive(headers, "x-ratelimit-reset", "ratelimit-reset", "rateLimitReset");
|
|
52
|
+
const retryAfterFromError = error?.retryAfter;
|
|
53
|
+
const delayFromRetryAfter = parseRetryDelayMs(retryAfter);
|
|
54
|
+
if (typeof delayFromRetryAfter === "number") {
|
|
55
|
+
return delayFromRetryAfter;
|
|
56
|
+
}
|
|
57
|
+
const delayFromReset = parseRetryDelayMs(rateLimitReset);
|
|
58
|
+
if (typeof delayFromReset === "number") {
|
|
59
|
+
return delayFromReset;
|
|
60
|
+
}
|
|
61
|
+
const delayFromError = parseRetryDelayMs(retryAfterFromError);
|
|
62
|
+
if (typeof delayFromError === "number") {
|
|
63
|
+
return delayFromError;
|
|
64
|
+
}
|
|
65
|
+
return DEFAULT_429_RETRY_DELAY_MS;
|
|
66
|
+
};
|
|
12
67
|
class ConversationsClient extends smithy_client_1.Client {
|
|
13
68
|
config;
|
|
14
69
|
constructor(...[configuration]) {
|
|
@@ -32,47 +87,43 @@ class ConversationsClient extends smithy_client_1.Client {
|
|
|
32
87
|
this.middlewareStack.add(smithy_utils_1.authorizationMiddleware.bind(this, configuration.token), { step: "build" });
|
|
33
88
|
this.middlewareStack.use((0, middleware_user_agent_1.getUserAgentPlugin)(this.config));
|
|
34
89
|
this.middlewareStack.use((0, middleware_retry_1.getRetryPlugin)(this.config));
|
|
35
|
-
this.middlewareStack.add((next) => async (args) => {
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
if (retryAfterHeader) {
|
|
55
|
-
const [retryAfterKey, retryAfterValue] = retryAfterHeader;
|
|
56
|
-
const retryAfterNumeric = Number(retryAfterValue);
|
|
57
|
-
if (!Number.isNaN(retryAfterNumeric) && retryAfterNumeric >= 1000) {
|
|
58
|
-
headers[retryAfterKey] = new Date(Date.now() + retryAfterNumeric).toUTCString();
|
|
59
|
-
}
|
|
90
|
+
this.middlewareStack.add((next, context) => async (args) => {
|
|
91
|
+
const retryOn429 = configuration?.retryOn429 ?? true;
|
|
92
|
+
const maxAttempts = await this.config.maxAttempts();
|
|
93
|
+
let customAttempt = 0;
|
|
94
|
+
for (;;) {
|
|
95
|
+
customAttempt += 1;
|
|
96
|
+
context.__xbsCustom429Attempt = customAttempt;
|
|
97
|
+
context.__xbsCustom429MaxAttempts = maxAttempts;
|
|
98
|
+
try {
|
|
99
|
+
return await next(args);
|
|
100
|
+
}
|
|
101
|
+
catch (error) {
|
|
102
|
+
const statusCode = error?.$metadata?.httpStatusCode ?? error?.$response?.statusCode;
|
|
103
|
+
if (!retryOn429 || statusCode !== 429 || customAttempt >= maxAttempts) {
|
|
104
|
+
throw error;
|
|
105
|
+
}
|
|
106
|
+
const retryDelayMs = get429RetryDelayMs(error);
|
|
107
|
+
if (configuration?.retryLogging) {
|
|
108
|
+
console.warn(`[ConversationsClient] Custom 429 retry scheduling: attempt ${customAttempt}/${maxAttempts}, delayMs=${retryDelayMs}, nextAt=${new Date(Date.now() + retryDelayMs).toISOString()}`);
|
|
60
109
|
}
|
|
110
|
+
await new Promise((resolve) => setTimeout(resolve, retryDelayMs));
|
|
61
111
|
}
|
|
62
|
-
throw error;
|
|
63
112
|
}
|
|
64
113
|
}, {
|
|
65
|
-
name: "
|
|
66
|
-
step: "
|
|
67
|
-
priority: "
|
|
114
|
+
name: "custom429RetryMiddleware",
|
|
115
|
+
step: "deserialize",
|
|
116
|
+
priority: "high",
|
|
68
117
|
});
|
|
69
118
|
if (configuration?.retryLogging) {
|
|
70
|
-
this.middlewareStack.add((next) => async (args) => {
|
|
119
|
+
this.middlewareStack.add((next, context) => async (args) => {
|
|
71
120
|
const request = args.request;
|
|
72
121
|
const attemptHeader = request?.headers?.["amz-sdk-request"] ?? request?.headers?.["x-amz-sdk-request"];
|
|
73
122
|
const attemptMatch = typeof attemptHeader === "string" ? attemptHeader.match(/attempt=(\d+)/) : null;
|
|
74
|
-
const
|
|
75
|
-
const
|
|
123
|
+
const customAttempt = Number(context.__xbsCustom429Attempt) || undefined;
|
|
124
|
+
const customMaxAttempts = Number(context.__xbsCustom429MaxAttempts) || undefined;
|
|
125
|
+
const attempt = customAttempt ?? (attemptMatch ? Number(attemptMatch[1]) : 1);
|
|
126
|
+
const maxAttempts = customMaxAttempts ?? await this.config.maxAttempts();
|
|
76
127
|
const startedAt = new Date().toISOString();
|
|
77
128
|
if (attempt > 1) {
|
|
78
129
|
console.warn(`[ConversationsClient] Retry attempt ${attempt}/${maxAttempts} started at ${startedAt}`);
|
|
@@ -85,47 +136,21 @@ class ConversationsClient extends smithy_client_1.Client {
|
|
|
85
136
|
}
|
|
86
137
|
catch (error) {
|
|
87
138
|
const statusCode = error?.$metadata?.httpStatusCode ?? error?.$response?.statusCode;
|
|
88
|
-
const
|
|
139
|
+
const retryOn429 = configuration?.retryOn429 ?? true;
|
|
140
|
+
const willRetry = statusCode === 429
|
|
141
|
+
? retryOn429 && attempt < maxAttempts
|
|
142
|
+
: attempt < maxAttempts && this.config.retryDecider(error);
|
|
89
143
|
const responseHeaders = (error?.$response?.headers ?? {});
|
|
90
|
-
const
|
|
91
|
-
const getHeader = (...names) => {
|
|
92
|
-
const normalizedNames = names.map((name) => name.toLowerCase());
|
|
93
|
-
for (const [key, value] of headerEntries) {
|
|
94
|
-
if (normalizedNames.includes(key.toLowerCase())) {
|
|
95
|
-
return value;
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
return undefined;
|
|
99
|
-
};
|
|
144
|
+
const getHeader = (...names) => getHeaderCaseInsensitive(responseHeaders, ...names);
|
|
100
145
|
const retryAfterRaw = getHeader("retry-after");
|
|
101
146
|
const rateLimitResetRaw = getHeader("x-ratelimit-reset", "ratelimit-reset", "rateLimitReset");
|
|
102
147
|
const rateLimitRaw = getHeader("x-ratelimit-limit", "ratelimit-limit", "rateLimit");
|
|
103
148
|
const rateLimitRemainingRaw = getHeader("x-ratelimit-remaining", "ratelimit-remaining", "rateLimitRemaining");
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
const retryAfterNumeric = Number(retryAfterRaw);
|
|
107
|
-
if (!Number.isNaN(retryAfterNumeric)) {
|
|
108
|
-
retryAfterDelayMs = retryAfterNumeric >= 1000 ? retryAfterNumeric : retryAfterNumeric * 1000;
|
|
109
|
-
}
|
|
110
|
-
else {
|
|
111
|
-
retryAfterDelayMs = new Date(retryAfterRaw).getTime() - Date.now();
|
|
112
|
-
}
|
|
113
|
-
}
|
|
114
|
-
let rateLimitResetDelayMs;
|
|
115
|
-
if (rateLimitResetRaw !== undefined) {
|
|
116
|
-
const resetValue = Number(rateLimitResetRaw);
|
|
117
|
-
if (!Number.isNaN(resetValue)) {
|
|
118
|
-
if (resetValue > 1000000000) {
|
|
119
|
-
rateLimitResetDelayMs = (resetValue * 1000) - Date.now();
|
|
120
|
-
}
|
|
121
|
-
else {
|
|
122
|
-
rateLimitResetDelayMs = resetValue >= 1000 ? resetValue : resetValue * 1000;
|
|
123
|
-
}
|
|
124
|
-
}
|
|
125
|
-
}
|
|
149
|
+
const retryAfterDelayMs = parseRetryDelayMs(retryAfterRaw);
|
|
150
|
+
const rateLimitResetDelayMs = parseRetryDelayMs(rateLimitResetRaw);
|
|
126
151
|
if (willRetry) {
|
|
127
152
|
console.warn(`[ConversationsClient] Retry decision: will retry after attempt ${attempt}/${maxAttempts} (status=${statusCode ?? "unknown"}, time=${new Date().toISOString()})`);
|
|
128
|
-
console.warn(`[ConversationsClient] Retry headers: retry-after=${retryAfterRaw ?? "n/a"}, x-ratelimit-reset=${rateLimitResetRaw ?? "n/a"}, x-ratelimit-limit=${rateLimitRaw ?? "n/a"}, x-ratelimit-remaining=${rateLimitRemainingRaw ?? "n/a"}`);
|
|
153
|
+
console.warn(`[ConversationsClient] Retry headers: retry-after=${String(retryAfterRaw ?? "n/a")}, x-ratelimit-reset=${String(rateLimitResetRaw ?? "n/a")}, x-ratelimit-limit=${String(rateLimitRaw ?? "n/a")}, x-ratelimit-remaining=${String(rateLimitRemainingRaw ?? "n/a")}`);
|
|
129
154
|
console.warn(`[ConversationsClient] Parsed retry timing: retryAfterDelayMs=${retryAfterDelayMs ?? "n/a"}, rateLimitResetDelayMs=${rateLimitResetDelayMs ?? "n/a"}`);
|
|
130
155
|
}
|
|
131
156
|
else {
|
|
@@ -27,7 +27,7 @@ const getRuntimeConfig = (config) => {
|
|
|
27
27
|
retryDecider: config?.retryDecider ?? ((error) => {
|
|
28
28
|
const statusCode = error?.$metadata?.httpStatusCode ?? error?.$response?.statusCode;
|
|
29
29
|
if (statusCode === 429) {
|
|
30
|
-
return
|
|
30
|
+
return false;
|
|
31
31
|
}
|
|
32
32
|
return Boolean(error?.$retryable?.throttling
|
|
33
33
|
|| error?.$retryable?.retryable
|
|
@@ -31,7 +31,7 @@ const getRuntimeConfig = (config) => {
|
|
|
31
31
|
retryDecider: config?.retryDecider ?? ((error) => {
|
|
32
32
|
const statusCode = error?.$metadata?.httpStatusCode ?? error?.$response?.statusCode;
|
|
33
33
|
if (statusCode === 429) {
|
|
34
|
-
return
|
|
34
|
+
return false;
|
|
35
35
|
}
|
|
36
36
|
return Boolean(error?.$retryable?.throttling
|
|
37
37
|
|| error?.$retryable?.retryable
|
|
@@ -6,6 +6,61 @@ import { getRetryPlugin, resolveRetryConfig, } from "@smithy/middleware-retry";
|
|
|
6
6
|
import { Client as __Client, } from "@smithy/smithy-client";
|
|
7
7
|
import { authorizationMiddleware } from '@wildix/smithy-utils';
|
|
8
8
|
export { __Client };
|
|
9
|
+
const DEFAULT_429_RETRY_DELAY_MS = 1000;
|
|
10
|
+
const parseRetryDelayMs = (rawValue) => {
|
|
11
|
+
if (typeof rawValue === "number" && Number.isFinite(rawValue)) {
|
|
12
|
+
if (rawValue >= 1000) {
|
|
13
|
+
return Math.max(0, Math.round(rawValue));
|
|
14
|
+
}
|
|
15
|
+
return Math.max(0, Math.round(rawValue * 1000));
|
|
16
|
+
}
|
|
17
|
+
if (typeof rawValue !== "string") {
|
|
18
|
+
return undefined;
|
|
19
|
+
}
|
|
20
|
+
const numeric = Number(rawValue);
|
|
21
|
+
if (!Number.isNaN(numeric)) {
|
|
22
|
+
if (numeric >= 1000) {
|
|
23
|
+
return Math.max(0, Math.round(numeric));
|
|
24
|
+
}
|
|
25
|
+
return Math.max(0, Math.round(numeric * 1000));
|
|
26
|
+
}
|
|
27
|
+
const parsedDateMs = Date.parse(rawValue);
|
|
28
|
+
if (!Number.isNaN(parsedDateMs)) {
|
|
29
|
+
return Math.max(0, parsedDateMs - Date.now());
|
|
30
|
+
}
|
|
31
|
+
return undefined;
|
|
32
|
+
};
|
|
33
|
+
const getHeaderCaseInsensitive = (headers, ...names) => {
|
|
34
|
+
if (!headers) {
|
|
35
|
+
return undefined;
|
|
36
|
+
}
|
|
37
|
+
const normalizedNames = names.map((name) => name.toLowerCase());
|
|
38
|
+
for (const [key, value] of Object.entries(headers)) {
|
|
39
|
+
if (normalizedNames.includes(key.toLowerCase())) {
|
|
40
|
+
return value;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
return undefined;
|
|
44
|
+
};
|
|
45
|
+
const get429RetryDelayMs = (error) => {
|
|
46
|
+
const headers = error?.$response?.headers;
|
|
47
|
+
const retryAfter = getHeaderCaseInsensitive(headers, "retry-after");
|
|
48
|
+
const rateLimitReset = getHeaderCaseInsensitive(headers, "x-ratelimit-reset", "ratelimit-reset", "rateLimitReset");
|
|
49
|
+
const retryAfterFromError = error?.retryAfter;
|
|
50
|
+
const delayFromRetryAfter = parseRetryDelayMs(retryAfter);
|
|
51
|
+
if (typeof delayFromRetryAfter === "number") {
|
|
52
|
+
return delayFromRetryAfter;
|
|
53
|
+
}
|
|
54
|
+
const delayFromReset = parseRetryDelayMs(rateLimitReset);
|
|
55
|
+
if (typeof delayFromReset === "number") {
|
|
56
|
+
return delayFromReset;
|
|
57
|
+
}
|
|
58
|
+
const delayFromError = parseRetryDelayMs(retryAfterFromError);
|
|
59
|
+
if (typeof delayFromError === "number") {
|
|
60
|
+
return delayFromError;
|
|
61
|
+
}
|
|
62
|
+
return DEFAULT_429_RETRY_DELAY_MS;
|
|
63
|
+
};
|
|
9
64
|
export class ConversationsClient extends __Client {
|
|
10
65
|
config;
|
|
11
66
|
constructor(...[configuration]) {
|
|
@@ -29,47 +84,43 @@ export class ConversationsClient extends __Client {
|
|
|
29
84
|
this.middlewareStack.add(authorizationMiddleware.bind(this, configuration.token), { step: "build" });
|
|
30
85
|
this.middlewareStack.use(getUserAgentPlugin(this.config));
|
|
31
86
|
this.middlewareStack.use(getRetryPlugin(this.config));
|
|
32
|
-
this.middlewareStack.add((next) => async (args) => {
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
if (retryAfterHeader) {
|
|
52
|
-
const [retryAfterKey, retryAfterValue] = retryAfterHeader;
|
|
53
|
-
const retryAfterNumeric = Number(retryAfterValue);
|
|
54
|
-
if (!Number.isNaN(retryAfterNumeric) && retryAfterNumeric >= 1000) {
|
|
55
|
-
headers[retryAfterKey] = new Date(Date.now() + retryAfterNumeric).toUTCString();
|
|
56
|
-
}
|
|
87
|
+
this.middlewareStack.add((next, context) => async (args) => {
|
|
88
|
+
const retryOn429 = configuration?.retryOn429 ?? true;
|
|
89
|
+
const maxAttempts = await this.config.maxAttempts();
|
|
90
|
+
let customAttempt = 0;
|
|
91
|
+
for (;;) {
|
|
92
|
+
customAttempt += 1;
|
|
93
|
+
context.__xbsCustom429Attempt = customAttempt;
|
|
94
|
+
context.__xbsCustom429MaxAttempts = maxAttempts;
|
|
95
|
+
try {
|
|
96
|
+
return await next(args);
|
|
97
|
+
}
|
|
98
|
+
catch (error) {
|
|
99
|
+
const statusCode = error?.$metadata?.httpStatusCode ?? error?.$response?.statusCode;
|
|
100
|
+
if (!retryOn429 || statusCode !== 429 || customAttempt >= maxAttempts) {
|
|
101
|
+
throw error;
|
|
102
|
+
}
|
|
103
|
+
const retryDelayMs = get429RetryDelayMs(error);
|
|
104
|
+
if (configuration?.retryLogging) {
|
|
105
|
+
console.warn(`[ConversationsClient] Custom 429 retry scheduling: attempt ${customAttempt}/${maxAttempts}, delayMs=${retryDelayMs}, nextAt=${new Date(Date.now() + retryDelayMs).toISOString()}`);
|
|
57
106
|
}
|
|
107
|
+
await new Promise((resolve) => setTimeout(resolve, retryDelayMs));
|
|
58
108
|
}
|
|
59
|
-
throw error;
|
|
60
109
|
}
|
|
61
110
|
}, {
|
|
62
|
-
name: "
|
|
63
|
-
step: "
|
|
64
|
-
priority: "
|
|
111
|
+
name: "custom429RetryMiddleware",
|
|
112
|
+
step: "deserialize",
|
|
113
|
+
priority: "high",
|
|
65
114
|
});
|
|
66
115
|
if (configuration?.retryLogging) {
|
|
67
|
-
this.middlewareStack.add((next) => async (args) => {
|
|
116
|
+
this.middlewareStack.add((next, context) => async (args) => {
|
|
68
117
|
const request = args.request;
|
|
69
118
|
const attemptHeader = request?.headers?.["amz-sdk-request"] ?? request?.headers?.["x-amz-sdk-request"];
|
|
70
119
|
const attemptMatch = typeof attemptHeader === "string" ? attemptHeader.match(/attempt=(\d+)/) : null;
|
|
71
|
-
const
|
|
72
|
-
const
|
|
120
|
+
const customAttempt = Number(context.__xbsCustom429Attempt) || undefined;
|
|
121
|
+
const customMaxAttempts = Number(context.__xbsCustom429MaxAttempts) || undefined;
|
|
122
|
+
const attempt = customAttempt ?? (attemptMatch ? Number(attemptMatch[1]) : 1);
|
|
123
|
+
const maxAttempts = customMaxAttempts ?? await this.config.maxAttempts();
|
|
73
124
|
const startedAt = new Date().toISOString();
|
|
74
125
|
if (attempt > 1) {
|
|
75
126
|
console.warn(`[ConversationsClient] Retry attempt ${attempt}/${maxAttempts} started at ${startedAt}`);
|
|
@@ -82,47 +133,21 @@ export class ConversationsClient extends __Client {
|
|
|
82
133
|
}
|
|
83
134
|
catch (error) {
|
|
84
135
|
const statusCode = error?.$metadata?.httpStatusCode ?? error?.$response?.statusCode;
|
|
85
|
-
const
|
|
136
|
+
const retryOn429 = configuration?.retryOn429 ?? true;
|
|
137
|
+
const willRetry = statusCode === 429
|
|
138
|
+
? retryOn429 && attempt < maxAttempts
|
|
139
|
+
: attempt < maxAttempts && this.config.retryDecider(error);
|
|
86
140
|
const responseHeaders = (error?.$response?.headers ?? {});
|
|
87
|
-
const
|
|
88
|
-
const getHeader = (...names) => {
|
|
89
|
-
const normalizedNames = names.map((name) => name.toLowerCase());
|
|
90
|
-
for (const [key, value] of headerEntries) {
|
|
91
|
-
if (normalizedNames.includes(key.toLowerCase())) {
|
|
92
|
-
return value;
|
|
93
|
-
}
|
|
94
|
-
}
|
|
95
|
-
return undefined;
|
|
96
|
-
};
|
|
141
|
+
const getHeader = (...names) => getHeaderCaseInsensitive(responseHeaders, ...names);
|
|
97
142
|
const retryAfterRaw = getHeader("retry-after");
|
|
98
143
|
const rateLimitResetRaw = getHeader("x-ratelimit-reset", "ratelimit-reset", "rateLimitReset");
|
|
99
144
|
const rateLimitRaw = getHeader("x-ratelimit-limit", "ratelimit-limit", "rateLimit");
|
|
100
145
|
const rateLimitRemainingRaw = getHeader("x-ratelimit-remaining", "ratelimit-remaining", "rateLimitRemaining");
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
const retryAfterNumeric = Number(retryAfterRaw);
|
|
104
|
-
if (!Number.isNaN(retryAfterNumeric)) {
|
|
105
|
-
retryAfterDelayMs = retryAfterNumeric >= 1000 ? retryAfterNumeric : retryAfterNumeric * 1000;
|
|
106
|
-
}
|
|
107
|
-
else {
|
|
108
|
-
retryAfterDelayMs = new Date(retryAfterRaw).getTime() - Date.now();
|
|
109
|
-
}
|
|
110
|
-
}
|
|
111
|
-
let rateLimitResetDelayMs;
|
|
112
|
-
if (rateLimitResetRaw !== undefined) {
|
|
113
|
-
const resetValue = Number(rateLimitResetRaw);
|
|
114
|
-
if (!Number.isNaN(resetValue)) {
|
|
115
|
-
if (resetValue > 1000000000) {
|
|
116
|
-
rateLimitResetDelayMs = (resetValue * 1000) - Date.now();
|
|
117
|
-
}
|
|
118
|
-
else {
|
|
119
|
-
rateLimitResetDelayMs = resetValue >= 1000 ? resetValue : resetValue * 1000;
|
|
120
|
-
}
|
|
121
|
-
}
|
|
122
|
-
}
|
|
146
|
+
const retryAfterDelayMs = parseRetryDelayMs(retryAfterRaw);
|
|
147
|
+
const rateLimitResetDelayMs = parseRetryDelayMs(rateLimitResetRaw);
|
|
123
148
|
if (willRetry) {
|
|
124
149
|
console.warn(`[ConversationsClient] Retry decision: will retry after attempt ${attempt}/${maxAttempts} (status=${statusCode ?? "unknown"}, time=${new Date().toISOString()})`);
|
|
125
|
-
console.warn(`[ConversationsClient] Retry headers: retry-after=${retryAfterRaw ?? "n/a"}, x-ratelimit-reset=${rateLimitResetRaw ?? "n/a"}, x-ratelimit-limit=${rateLimitRaw ?? "n/a"}, x-ratelimit-remaining=${rateLimitRemainingRaw ?? "n/a"}`);
|
|
150
|
+
console.warn(`[ConversationsClient] Retry headers: retry-after=${String(retryAfterRaw ?? "n/a")}, x-ratelimit-reset=${String(rateLimitResetRaw ?? "n/a")}, x-ratelimit-limit=${String(rateLimitRaw ?? "n/a")}, x-ratelimit-remaining=${String(rateLimitRemainingRaw ?? "n/a")}`);
|
|
126
151
|
console.warn(`[ConversationsClient] Parsed retry timing: retryAfterDelayMs=${retryAfterDelayMs ?? "n/a"}, rateLimitResetDelayMs=${rateLimitResetDelayMs ?? "n/a"}`);
|
|
127
152
|
}
|
|
128
153
|
else {
|
|
@@ -23,7 +23,7 @@ export const getRuntimeConfig = (config) => {
|
|
|
23
23
|
retryDecider: config?.retryDecider ?? ((error) => {
|
|
24
24
|
const statusCode = error?.$metadata?.httpStatusCode ?? error?.$response?.statusCode;
|
|
25
25
|
if (statusCode === 429) {
|
|
26
|
-
return
|
|
26
|
+
return false;
|
|
27
27
|
}
|
|
28
28
|
return Boolean(error?.$retryable?.throttling
|
|
29
29
|
|| error?.$retryable?.retryable
|
package/dist-es/runtimeConfig.js
CHANGED
|
@@ -27,7 +27,7 @@ export const getRuntimeConfig = (config) => {
|
|
|
27
27
|
retryDecider: config?.retryDecider ?? ((error) => {
|
|
28
28
|
const statusCode = error?.$metadata?.httpStatusCode ?? error?.$response?.statusCode;
|
|
29
29
|
if (statusCode === 429) {
|
|
30
|
-
return
|
|
30
|
+
return false;
|
|
31
31
|
}
|
|
32
32
|
return Boolean(error?.$retryable?.throttling
|
|
33
33
|
|| error?.$retryable?.retryable
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@wildix/xbees-conversations-client",
|
|
3
3
|
"description": "@wildix/xbees-conversations-client client",
|
|
4
|
-
"version": "1.2.
|
|
4
|
+
"version": "1.2.11",
|
|
5
5
|
"scripts": {
|
|
6
6
|
"build": "concurrently 'yarn:build:cjs' 'yarn:build:es' 'yarn:build:types'",
|
|
7
7
|
"build:cjs": "tsc -p tsconfig.cjs.json",
|