@wildix/xbees-conversations-client 1.2.8 → 1.2.10

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.
@@ -32,6 +32,44 @@ class ConversationsClient extends smithy_client_1.Client {
32
32
  this.middlewareStack.add(smithy_utils_1.authorizationMiddleware.bind(this, configuration.token), { step: "build" });
33
33
  this.middlewareStack.use((0, middleware_user_agent_1.getUserAgentPlugin)(this.config));
34
34
  this.middlewareStack.use((0, middleware_retry_1.getRetryPlugin)(this.config));
35
+ this.middlewareStack.add((next) => async (args) => {
36
+ try {
37
+ return await next(args);
38
+ }
39
+ catch (error) {
40
+ const statusCode = error?.$metadata?.httpStatusCode ?? error?.$response?.statusCode;
41
+ const headers = error?.$response?.headers;
42
+ if (statusCode === 429 && headers) {
43
+ const headerEntries = Object.entries(headers);
44
+ const getHeaderWithKey = (name) => {
45
+ const normalizedName = name.toLowerCase();
46
+ for (const [key, value] of headerEntries) {
47
+ if (key.toLowerCase() === normalizedName && (typeof value === "string" || typeof value === "number")) {
48
+ return [key, value];
49
+ }
50
+ }
51
+ return undefined;
52
+ };
53
+ const retryAfterHeader = getHeaderWithKey("retry-after");
54
+ if (retryAfterHeader) {
55
+ const [retryAfterKey, retryAfterValueRaw] = retryAfterHeader;
56
+ const retryAfterNumeric = Number(retryAfterValueRaw);
57
+ if (!Number.isNaN(retryAfterNumeric) && retryAfterNumeric >= 1000) {
58
+ const normalizedRetryAfterValue = new Date(Date.now() + retryAfterNumeric).toUTCString();
59
+ headers[retryAfterKey] = normalizedRetryAfterValue;
60
+ if (configuration?.retryLogging) {
61
+ console.warn(`[ConversationsClient] Normalized retry-after header from ${String(retryAfterValueRaw)} to ${normalizedRetryAfterValue}`);
62
+ }
63
+ }
64
+ }
65
+ }
66
+ throw error;
67
+ }
68
+ }, {
69
+ name: "retryAfterHeaderNormalizationMiddleware",
70
+ step: "finalizeRequest",
71
+ priority: "low",
72
+ });
35
73
  if (configuration?.retryLogging) {
36
74
  this.middlewareStack.add((next) => async (args) => {
37
75
  const request = args.request;
@@ -69,9 +107,9 @@ class ConversationsClient extends smithy_client_1.Client {
69
107
  const rateLimitRemainingRaw = getHeader("x-ratelimit-remaining", "ratelimit-remaining", "rateLimitRemaining");
70
108
  let retryAfterDelayMs;
71
109
  if (retryAfterRaw !== undefined) {
72
- const retryAfterSeconds = Number(retryAfterRaw);
73
- if (!Number.isNaN(retryAfterSeconds)) {
74
- retryAfterDelayMs = retryAfterSeconds * 1000;
110
+ const retryAfterNumeric = Number(retryAfterRaw);
111
+ if (!Number.isNaN(retryAfterNumeric)) {
112
+ retryAfterDelayMs = retryAfterNumeric >= 1000 ? retryAfterNumeric : retryAfterNumeric * 1000;
75
113
  }
76
114
  else {
77
115
  retryAfterDelayMs = new Date(retryAfterRaw).getTime() - Date.now();
@@ -81,7 +119,12 @@ class ConversationsClient extends smithy_client_1.Client {
81
119
  if (rateLimitResetRaw !== undefined) {
82
120
  const resetValue = Number(rateLimitResetRaw);
83
121
  if (!Number.isNaN(resetValue)) {
84
- rateLimitResetDelayMs = resetValue > 1000000000 ? (resetValue * 1000) - Date.now() : resetValue * 1000;
122
+ if (resetValue > 1000000000) {
123
+ rateLimitResetDelayMs = (resetValue * 1000) - Date.now();
124
+ }
125
+ else {
126
+ rateLimitResetDelayMs = resetValue >= 1000 ? resetValue : resetValue * 1000;
127
+ }
85
128
  }
86
129
  }
87
130
  if (willRetry) {
@@ -29,6 +29,44 @@ export class ConversationsClient extends __Client {
29
29
  this.middlewareStack.add(authorizationMiddleware.bind(this, configuration.token), { step: "build" });
30
30
  this.middlewareStack.use(getUserAgentPlugin(this.config));
31
31
  this.middlewareStack.use(getRetryPlugin(this.config));
32
+ this.middlewareStack.add((next) => async (args) => {
33
+ try {
34
+ return await next(args);
35
+ }
36
+ catch (error) {
37
+ const statusCode = error?.$metadata?.httpStatusCode ?? error?.$response?.statusCode;
38
+ const headers = error?.$response?.headers;
39
+ if (statusCode === 429 && headers) {
40
+ const headerEntries = Object.entries(headers);
41
+ const getHeaderWithKey = (name) => {
42
+ const normalizedName = name.toLowerCase();
43
+ for (const [key, value] of headerEntries) {
44
+ if (key.toLowerCase() === normalizedName && (typeof value === "string" || typeof value === "number")) {
45
+ return [key, value];
46
+ }
47
+ }
48
+ return undefined;
49
+ };
50
+ const retryAfterHeader = getHeaderWithKey("retry-after");
51
+ if (retryAfterHeader) {
52
+ const [retryAfterKey, retryAfterValueRaw] = retryAfterHeader;
53
+ const retryAfterNumeric = Number(retryAfterValueRaw);
54
+ if (!Number.isNaN(retryAfterNumeric) && retryAfterNumeric >= 1000) {
55
+ const normalizedRetryAfterValue = new Date(Date.now() + retryAfterNumeric).toUTCString();
56
+ headers[retryAfterKey] = normalizedRetryAfterValue;
57
+ if (configuration?.retryLogging) {
58
+ console.warn(`[ConversationsClient] Normalized retry-after header from ${String(retryAfterValueRaw)} to ${normalizedRetryAfterValue}`);
59
+ }
60
+ }
61
+ }
62
+ }
63
+ throw error;
64
+ }
65
+ }, {
66
+ name: "retryAfterHeaderNormalizationMiddleware",
67
+ step: "finalizeRequest",
68
+ priority: "low",
69
+ });
32
70
  if (configuration?.retryLogging) {
33
71
  this.middlewareStack.add((next) => async (args) => {
34
72
  const request = args.request;
@@ -66,9 +104,9 @@ export class ConversationsClient extends __Client {
66
104
  const rateLimitRemainingRaw = getHeader("x-ratelimit-remaining", "ratelimit-remaining", "rateLimitRemaining");
67
105
  let retryAfterDelayMs;
68
106
  if (retryAfterRaw !== undefined) {
69
- const retryAfterSeconds = Number(retryAfterRaw);
70
- if (!Number.isNaN(retryAfterSeconds)) {
71
- retryAfterDelayMs = retryAfterSeconds * 1000;
107
+ const retryAfterNumeric = Number(retryAfterRaw);
108
+ if (!Number.isNaN(retryAfterNumeric)) {
109
+ retryAfterDelayMs = retryAfterNumeric >= 1000 ? retryAfterNumeric : retryAfterNumeric * 1000;
72
110
  }
73
111
  else {
74
112
  retryAfterDelayMs = new Date(retryAfterRaw).getTime() - Date.now();
@@ -78,7 +116,12 @@ export class ConversationsClient extends __Client {
78
116
  if (rateLimitResetRaw !== undefined) {
79
117
  const resetValue = Number(rateLimitResetRaw);
80
118
  if (!Number.isNaN(resetValue)) {
81
- rateLimitResetDelayMs = resetValue > 1000000000 ? (resetValue * 1000) - Date.now() : resetValue * 1000;
119
+ if (resetValue > 1000000000) {
120
+ rateLimitResetDelayMs = (resetValue * 1000) - Date.now();
121
+ }
122
+ else {
123
+ rateLimitResetDelayMs = resetValue >= 1000 ? resetValue : resetValue * 1000;
124
+ }
82
125
  }
83
126
  }
84
127
  if (willRetry) {
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.8",
4
+ "version": "1.2.10",
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",