@sinch/sdk-client 1.4.2 → 1.6.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/api/api-client-options-helper.d.ts +6 -2
- package/dist/api/api-client-options-helper.js +56 -7
- package/dist/api/api-client-options-helper.js.map +1 -1
- package/dist/api/api-client-options.d.ts +8 -1
- package/dist/api/api-client.d.ts +12 -3
- package/dist/api/api-client.js +8 -1
- package/dist/api/api-client.js.map +1 -1
- package/dist/api/api-errors.d.ts +2 -0
- package/dist/api/api-errors.js +3 -1
- package/dist/api/api-errors.js.map +1 -1
- package/dist/api/api-interface.d.ts +1 -1
- package/dist/api/callback-webhooks-interface.d.ts +1 -0
- package/dist/api/index.d.ts +1 -1
- package/dist/api/index.js.map +1 -1
- package/dist/client/api-client-helpers.js.map +1 -1
- package/dist/client/api-client-pagination-helper.js +24 -0
- package/dist/client/api-client-pagination-helper.js.map +1 -1
- package/dist/client/api-fetch-client.d.ts +7 -3
- package/dist/client/api-fetch-client.js +77 -31
- package/dist/client/api-fetch-client.js.map +1 -1
- package/dist/client/index.d.ts +1 -0
- package/dist/client/index.js +1 -0
- package/dist/client/index.js.map +1 -1
- package/dist/client/lazy-api-client.d.ts +9 -0
- package/dist/client/lazy-api-client.js +14 -0
- package/dist/client/lazy-api-client.js.map +1 -0
- package/dist/client/retry-policy.d.ts +33 -0
- package/dist/client/retry-policy.js +112 -0
- package/dist/client/retry-policy.js.map +1 -0
- package/dist/domain/domain-helper.d.ts +15 -0
- package/dist/domain/domain-helper.js +16 -1
- package/dist/domain/domain-helper.js.map +1 -1
- package/dist/domain/domain-interface.d.ts +99 -3
- package/dist/domain/domain-interface.js +35 -1
- package/dist/domain/domain-interface.js.map +1 -1
- package/dist/http/fetch/fetch-http-content-parser.d.ts +13 -0
- package/dist/http/fetch/fetch-http-content-parser.js +65 -0
- package/dist/http/fetch/fetch-http-content-parser.js.map +1 -0
- package/dist/http/fetch/fetch-http-headers.d.ts +4 -0
- package/dist/http/fetch/fetch-http-headers.js +37 -0
- package/dist/http/fetch/fetch-http-headers.js.map +1 -0
- package/dist/http/fetch/fetch-http-request-mapper.d.ts +8 -0
- package/dist/http/fetch/fetch-http-request-mapper.js +31 -0
- package/dist/http/fetch/fetch-http-request-mapper.js.map +1 -0
- package/dist/http/fetch/fetch-http-response.d.ts +3 -0
- package/dist/http/fetch/fetch-http-response.js +10 -0
- package/dist/http/fetch/fetch-http-response.js.map +1 -0
- package/dist/http/fetch/fetch-http-transport.d.ts +11 -0
- package/dist/http/fetch/fetch-http-transport.js +44 -0
- package/dist/http/fetch/fetch-http-transport.js.map +1 -0
- package/dist/http/fetch/index.d.ts +5 -0
- package/dist/http/fetch/index.js +15 -0
- package/dist/http/fetch/index.js.map +1 -0
- package/dist/http/http-content-parser.d.ts +13 -0
- package/dist/http/http-content-parser.js +3 -0
- package/dist/http/http-content-parser.js.map +1 -0
- package/dist/http/http-headers.d.ts +16 -0
- package/dist/http/http-headers.js +63 -0
- package/dist/http/http-headers.js.map +1 -0
- package/dist/http/http-method.d.ts +10 -0
- package/dist/http/http-method.js +26 -0
- package/dist/http/http-method.js.map +1 -0
- package/dist/http/http-request.d.ts +27 -0
- package/dist/http/http-request.js +19 -0
- package/dist/http/http-request.js.map +1 -0
- package/dist/http/http-response.d.ts +12 -0
- package/dist/http/http-response.js +16 -0
- package/dist/http/http-response.js.map +1 -0
- package/dist/http/http-transport.d.ts +15 -0
- package/dist/http/http-transport.js +3 -0
- package/dist/http/http-transport.js.map +1 -0
- package/dist/http/index.d.ts +6 -0
- package/dist/http/index.js +13 -0
- package/dist/http/index.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/logger/index.d.ts +2 -0
- package/dist/logger/index.js +9 -0
- package/dist/logger/index.js.map +1 -0
- package/dist/logger/logger-types.d.ts +30 -0
- package/dist/logger/logger-types.js +3 -0
- package/dist/logger/logger-types.js.map +1 -0
- package/dist/logger/logger.d.ts +11 -0
- package/dist/logger/logger.js +56 -0
- package/dist/logger/logger.js.map +1 -0
- package/dist/logger/sinch-logger.d.ts +14 -0
- package/dist/logger/sinch-logger.js +39 -0
- package/dist/logger/sinch-logger.js.map +1 -0
- package/dist/plugins/additional-headers/additional-headers.request.js.map +1 -1
- package/dist/plugins/api-token/api-token.request.d.ts +1 -0
- package/dist/plugins/api-token/api-token.request.js +1 -0
- package/dist/plugins/api-token/api-token.request.js.map +1 -1
- package/dist/plugins/basicAuthentication/basic-authentication.request.d.ts +1 -0
- package/dist/plugins/basicAuthentication/basic-authentication.request.js +1 -0
- package/dist/plugins/basicAuthentication/basic-authentication.request.js.map +1 -1
- package/dist/plugins/core/index.d.ts +1 -1
- package/dist/plugins/core/index.js +1 -0
- package/dist/plugins/core/index.js.map +1 -1
- package/dist/plugins/core/request-plugin.d.ts +2 -1
- package/dist/plugins/core/request-plugin.js.map +1 -1
- package/dist/plugins/exception/exception.response.d.ts +5 -4
- package/dist/plugins/exception/exception.response.js +5 -4
- package/dist/plugins/exception/exception.response.js.map +1 -1
- package/dist/plugins/oauth2/oauth2-api.js.map +1 -1
- package/dist/plugins/oauth2/oauth2-token.request.d.ts +4 -6
- package/dist/plugins/oauth2/oauth2-token.request.js +26 -77
- package/dist/plugins/oauth2/oauth2-token.request.js.map +1 -1
- package/dist/plugins/signing/signing.request.d.ts +1 -0
- package/dist/plugins/signing/signing.request.js +1 -0
- package/dist/plugins/signing/signing.request.js.map +1 -1
- package/dist/plugins/version/version.request.d.ts +1 -0
- package/dist/plugins/version/version.request.js +1 -0
- package/dist/plugins/version/version.request.js.map +1 -1
- package/dist/plugins/x-timestamp/x-timestamp.request.d.ts +1 -0
- package/dist/plugins/x-timestamp/x-timestamp.request.js +1 -0
- package/dist/plugins/x-timestamp/x-timestamp.request.js.map +1 -1
- package/dist/utils/authorization.helper.d.ts +2 -2
- package/dist/utils/authorization.helper.js +7 -16
- package/dist/utils/authorization.helper.js.map +1 -1
- package/dist/utils/date.js.map +1 -1
- package/dist/utils/text-to-hex.js.map +1 -1
- package/package.json +7 -4
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
-
};
|
|
5
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
3
|
exports.ApiFetchClient = void 0;
|
|
7
4
|
const version_1 = require("../plugins/version");
|
|
8
5
|
const exception_1 = require("../plugins/exception");
|
|
9
6
|
const api_client_1 = require("../api/api-client");
|
|
10
7
|
const api_errors_1 = require("../api/api-errors");
|
|
11
|
-
const node_fetch_1 = __importDefault(require("node-fetch"));
|
|
12
8
|
const api_client_helpers_1 = require("./api-client-helpers");
|
|
9
|
+
const logger_1 = require("../logger");
|
|
10
|
+
const domain_1 = require("../domain");
|
|
11
|
+
const fetch_1 = require("../http/fetch");
|
|
13
12
|
const api_client_pagination_helper_1 = require("./api-client-pagination-helper");
|
|
13
|
+
const retry_policy_1 = require("./retry-policy");
|
|
14
14
|
/** Client to process the call to the API using Fetch API */
|
|
15
15
|
class ApiFetchClient extends api_client_1.ApiClient {
|
|
16
16
|
/**
|
|
@@ -21,14 +21,25 @@ class ApiFetchClient extends api_client_1.ApiClient {
|
|
|
21
21
|
* @param {ApiClientOptions} options - Configuration options for the API Client.
|
|
22
22
|
*/
|
|
23
23
|
constructor(options) {
|
|
24
|
-
|
|
24
|
+
const logger = (0, logger_1.resolveLogger)(options.logger);
|
|
25
|
+
const retry = (0, retry_policy_1.resolveRetryConfig)(options);
|
|
26
|
+
const resolvedOptions = {
|
|
25
27
|
...options,
|
|
26
|
-
|
|
28
|
+
logger,
|
|
29
|
+
timeoutSeconds: (0, domain_1.resolveTimeoutSeconds)(options.timeoutSeconds),
|
|
30
|
+
retryPolicy: retry.retryPolicy,
|
|
31
|
+
maxRetryCount: retry.maxRetryCount,
|
|
32
|
+
exponentialBackoff: retry.exponentialBackoff,
|
|
33
|
+
};
|
|
34
|
+
super({
|
|
35
|
+
...resolvedOptions,
|
|
36
|
+
requestPlugins: [new version_1.VersionRequest(), ...(resolvedOptions.requestPlugins || [])],
|
|
27
37
|
responsePlugins: [
|
|
28
|
-
new exception_1.ExceptionResponse(),
|
|
29
|
-
...(
|
|
38
|
+
new exception_1.ExceptionResponse(undefined),
|
|
39
|
+
...(resolvedOptions.responsePlugins || []),
|
|
30
40
|
],
|
|
31
41
|
});
|
|
42
|
+
this.httpTransport = new fetch_1.FetchHttpTransport();
|
|
32
43
|
}
|
|
33
44
|
/** @inheritdoc */
|
|
34
45
|
async processCall(apiCallParameters) {
|
|
@@ -54,10 +65,11 @@ class ApiFetchClient extends api_client_1.ApiClient {
|
|
|
54
65
|
async executeRequest(apiCallParameters, isFileDownload = false) {
|
|
55
66
|
const errorContext = (0, api_client_helpers_1.buildErrorContext)(apiCallParameters);
|
|
56
67
|
try {
|
|
57
|
-
const
|
|
58
|
-
const body = isFileDownload ? undefined : await
|
|
68
|
+
const httpResponse = await this.sinchFetch(apiCallParameters, errorContext);
|
|
69
|
+
const body = isFileDownload ? undefined : await httpResponse.content.asString();
|
|
59
70
|
return {
|
|
60
|
-
|
|
71
|
+
httpResponse,
|
|
72
|
+
response: this.httpTransport.getNativeResponse(httpResponse),
|
|
61
73
|
body,
|
|
62
74
|
apiCallParameters,
|
|
63
75
|
errorContext,
|
|
@@ -68,6 +80,7 @@ class ApiFetchClient extends api_client_1.ApiClient {
|
|
|
68
80
|
}
|
|
69
81
|
}
|
|
70
82
|
async processResponse(context) {
|
|
83
|
+
this.logFailedResponse(context);
|
|
71
84
|
const pluginContext = await this.parseAndValidateResponse(context);
|
|
72
85
|
const transformedResponse = await this.applyResponsePlugins(pluginContext);
|
|
73
86
|
if (pluginContext.exception) {
|
|
@@ -87,47 +100,66 @@ class ApiFetchClient extends api_client_1.ApiClient {
|
|
|
87
100
|
return { result, exception, responseContext: context };
|
|
88
101
|
}
|
|
89
102
|
async processFileResponse(context) {
|
|
90
|
-
if (!context.response
|
|
91
|
-
throw this.buildFetchError(new Error(
|
|
103
|
+
if (!context.response.ok) {
|
|
104
|
+
throw this.buildFetchError(new Error(`HTTP ${context.httpResponse.status}`), context.errorContext);
|
|
92
105
|
}
|
|
93
|
-
const buffer = await context.
|
|
94
|
-
const fileName = this.extractFileName(context.
|
|
106
|
+
const buffer = await context.httpResponse.content.asBytes();
|
|
107
|
+
const fileName = this.extractFileName(context.httpResponse.headers, 'pdf');
|
|
95
108
|
if (!buffer || !fileName) {
|
|
96
109
|
throw new Error('An error occurred while downloading the file');
|
|
97
110
|
}
|
|
98
111
|
return { fileName, buffer };
|
|
99
112
|
}
|
|
100
113
|
async processCSVResponse(context) {
|
|
101
|
-
if (!context.response
|
|
102
|
-
throw this.buildFetchError(new Error(
|
|
114
|
+
if (!context.response.ok) {
|
|
115
|
+
throw this.buildFetchError(new Error(`HTTP ${context.httpResponse.status}`), context.errorContext);
|
|
103
116
|
}
|
|
104
|
-
const responseText = await context.
|
|
105
|
-
const fileName = this.extractFileName(context.
|
|
117
|
+
const responseText = await context.httpResponse.content.asString();
|
|
118
|
+
const fileName = this.extractFileName(context.httpResponse.headers, 'csv');
|
|
106
119
|
if (!responseText || !fileName) {
|
|
107
120
|
throw new Error('An error occurred while downloading the file');
|
|
108
121
|
}
|
|
109
122
|
return { fileName, data: responseText };
|
|
110
123
|
}
|
|
111
124
|
/**
|
|
112
|
-
* Handle fetch request with token refresh
|
|
125
|
+
* Handle fetch request with token refresh and retry.
|
|
113
126
|
* @param {ApiCallParameters} apiCallParameters
|
|
114
127
|
* @param {ErrorContext} errorContext
|
|
115
128
|
*/
|
|
116
129
|
async sinchFetch(apiCallParameters, errorContext) {
|
|
117
|
-
|
|
118
|
-
|
|
130
|
+
const retryConfig = (0, retry_policy_1.resolveRetryConfig)(this.apiClientOptions);
|
|
131
|
+
let requestOptions = apiCallParameters.requestOptions;
|
|
132
|
+
let httpRequest = (0, fetch_1.toHttpRequest)(apiCallParameters, requestOptions);
|
|
133
|
+
let httpResponse = await this.send(httpRequest, requestOptions.timeout);
|
|
134
|
+
if (this.isTokenExpired(httpResponse)) {
|
|
119
135
|
// Capture the JWT used by the failing request so the OAuth2 plugin can
|
|
120
136
|
// refuse to clear a cached token that has since been refreshed by another caller.
|
|
121
|
-
const failingAuth =
|
|
122
|
-
const failingJwt = failingAuth.startsWith('Bearer ')
|
|
123
|
-
|
|
124
|
-
|
|
137
|
+
const failingAuth = httpRequest.headers.getAll('Authorization')[0] || '';
|
|
138
|
+
const failingJwt = failingAuth.startsWith('Bearer ')
|
|
139
|
+
? failingAuth.slice('Bearer '.length)
|
|
140
|
+
: undefined;
|
|
141
|
+
this.httpTransport.release(httpResponse);
|
|
142
|
+
requestOptions = await (0, api_client_helpers_1.manageExpiredToken)(apiCallParameters, errorContext, this.apiClientOptions.requestPlugins, failingJwt);
|
|
143
|
+
httpRequest = (0, fetch_1.toHttpRequest)(apiCallParameters, requestOptions);
|
|
144
|
+
httpResponse = await this.send(httpRequest, requestOptions.timeout);
|
|
145
|
+
}
|
|
146
|
+
for (let attempt = 0;; attempt++) {
|
|
147
|
+
const retryAfterMs = (0, retry_policy_1.parseRetryAfterMs)(httpResponse.headers.getAll('retry-after')[0]);
|
|
148
|
+
if (!(0, retry_policy_1.shouldRetryRateLimit)(httpResponse.status, attempt, retryConfig, retryAfterMs)) {
|
|
149
|
+
break;
|
|
150
|
+
}
|
|
151
|
+
await (0, retry_policy_1.sleep)((0, retry_policy_1.computeRateLimitBackoffMs)(attempt, retryConfig, retryAfterMs));
|
|
152
|
+
this.httpTransport.release(httpResponse);
|
|
153
|
+
httpResponse = await this.send(httpRequest, requestOptions.timeout);
|
|
125
154
|
}
|
|
126
|
-
return
|
|
155
|
+
return httpResponse;
|
|
127
156
|
}
|
|
128
|
-
|
|
129
|
-
return
|
|
130
|
-
|
|
157
|
+
send(request, timeout) {
|
|
158
|
+
return this.httpTransport.send(request, { timeout });
|
|
159
|
+
}
|
|
160
|
+
isTokenExpired(httpResponse) {
|
|
161
|
+
return httpResponse.status === 401
|
|
162
|
+
&& httpResponse.headers.getAll('www-authenticate')[0]?.includes('expired') === true;
|
|
131
163
|
}
|
|
132
164
|
async applyResponsePlugins(context) {
|
|
133
165
|
const plugins = this.loadResponsePlugins(this.apiClientOptions.responsePlugins, context.responseContext);
|
|
@@ -157,6 +189,20 @@ class ApiFetchClient extends api_client_1.ApiClient {
|
|
|
157
189
|
nextPage: () => (0, api_client_pagination_helper_1.createNextPageMethod)(this, paginationContext, apiCallParameters.requestOptions, nextPage),
|
|
158
190
|
};
|
|
159
191
|
}
|
|
192
|
+
logFailedResponse(context) {
|
|
193
|
+
if (!context.response.ok) {
|
|
194
|
+
const { apiCallParameters } = context;
|
|
195
|
+
this.apiClientOptions.logger.debug(() => `[${apiCallParameters.apiName}][${apiCallParameters.operationId}][${context.httpResponse.status}]\n`
|
|
196
|
+
+ `HTTP method: ${apiCallParameters.requestOptions.method}\n`
|
|
197
|
+
+ `URL: ${apiCallParameters.url}\n`
|
|
198
|
+
+ `Response Headers: ${this.formatResponseHeaders(context.httpResponse.headers)}`);
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
formatResponseHeaders(headers) {
|
|
202
|
+
return [...headers.entries()]
|
|
203
|
+
.map(([key, value]) => `${key}=${String(value)}`)
|
|
204
|
+
.join(', ');
|
|
205
|
+
}
|
|
160
206
|
buildFetchError(error, errorContext) {
|
|
161
207
|
if (error instanceof api_errors_1.GenericError) {
|
|
162
208
|
return new api_errors_1.GenericError(error.message, errorContext);
|
|
@@ -166,7 +212,7 @@ class ApiFetchClient extends api_client_1.ApiClient {
|
|
|
166
212
|
}
|
|
167
213
|
}
|
|
168
214
|
extractFileName(headers, extension) {
|
|
169
|
-
const contentDisposition = headers.
|
|
215
|
+
const contentDisposition = headers.getAll('content-disposition')[0];
|
|
170
216
|
let fileName = 'default-name.' + extension;
|
|
171
217
|
if (contentDisposition) {
|
|
172
218
|
// Support both quoted and unquoted filenames
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api-fetch-client.js","sourceRoot":"","sources":["../../src/client/api-fetch-client.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"api-fetch-client.js","sourceRoot":"","sources":["../../src/client/api-fetch-client.ts"],"names":[],"mappings":"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"}
|
package/dist/client/index.d.ts
CHANGED
package/dist/client/index.js
CHANGED
|
@@ -16,4 +16,5 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
|
16
16
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
17
|
__exportStar(require("./api-fetch-client"), exports);
|
|
18
18
|
__exportStar(require("./api-client-pagination-helper"), exports);
|
|
19
|
+
__exportStar(require("./lazy-api-client"), exports);
|
|
19
20
|
//# sourceMappingURL=index.js.map
|
package/dist/client/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/client/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,qDAAmC;AACnC,iEAA+C"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/client/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,qDAAmC;AACnC,iEAA+C;AAC/C,oDAAkC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { ResolvedSinchClientParameters } from '../domain';
|
|
2
|
+
import { ApiFetchClient } from './api-fetch-client';
|
|
3
|
+
/** @internal Base class for domain lazy clients that share resolved SDK configuration. */
|
|
4
|
+
export declare abstract class LazyApiClient {
|
|
5
|
+
apiFetchClient?: ApiFetchClient;
|
|
6
|
+
sharedConfig: ResolvedSinchClientParameters;
|
|
7
|
+
constructor(sharedConfig: ResolvedSinchClientParameters);
|
|
8
|
+
resetApiClient(): void;
|
|
9
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.LazyApiClient = void 0;
|
|
4
|
+
/** @internal Base class for domain lazy clients that share resolved SDK configuration. */
|
|
5
|
+
class LazyApiClient {
|
|
6
|
+
constructor(sharedConfig) {
|
|
7
|
+
this.sharedConfig = sharedConfig;
|
|
8
|
+
}
|
|
9
|
+
resetApiClient() {
|
|
10
|
+
this.apiFetchClient = undefined;
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
exports.LazyApiClient = LazyApiClient;
|
|
14
|
+
//# sourceMappingURL=lazy-api-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lazy-api-client.js","sourceRoot":"","sources":["../../src/client/lazy-api-client.ts"],"names":[],"mappings":";;;AAGA,0FAA0F;AAC1F;IAIE,YAAY,YAA2C;QACrD,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC;IACnC,CAAC;IAEM,cAAc;QACnB,IAAI,CAAC,cAAc,GAAG,SAAS,CAAC;IAClC,CAAC;CACF"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { SupportedRetryPolicy, WithRetryPolicy } from '../domain';
|
|
2
|
+
/** Base delay for full-jitter exponential backoff (1 second). */
|
|
3
|
+
export declare const RATE_LIMIT_RETRY_BASE_MS = 1000;
|
|
4
|
+
/** @internal */
|
|
5
|
+
export interface ResolvedRetryConfig {
|
|
6
|
+
retryPolicy: SupportedRetryPolicy;
|
|
7
|
+
maxRetryCount: number;
|
|
8
|
+
exponentialBackoff: number;
|
|
9
|
+
}
|
|
10
|
+
/** @internal */
|
|
11
|
+
export declare const resolveRetryConfig: (partial?: WithRetryPolicy) => ResolvedRetryConfig;
|
|
12
|
+
/**
|
|
13
|
+
* Parse an RFC 7231 `Retry-After` value (delta-seconds or HTTP-date) to milliseconds.
|
|
14
|
+
* Negative delta-seconds are ignored. Returns undefined when the value is absent or invalid.
|
|
15
|
+
*/
|
|
16
|
+
/** @internal */
|
|
17
|
+
export declare const parseRetryAfterMs: (value: string | null | undefined) => number | undefined;
|
|
18
|
+
/**
|
|
19
|
+
* Whether the SDK should retry this response for the given attempt index (0 = first retry).
|
|
20
|
+
* `retryAfterMs` is the already-parsed `Retry-After` delay (undefined if absent/invalid).
|
|
21
|
+
*/
|
|
22
|
+
/** @internal */
|
|
23
|
+
export declare const shouldRetryRateLimit: (status: number, attempt: number, config: ResolvedRetryConfig, retryAfterMs?: number) => boolean;
|
|
24
|
+
/**
|
|
25
|
+
* Backoff delay for a rate-limit retry, respecting the configured policy.
|
|
26
|
+
* - DEFAULT: Retry-After (+ 0–250ms jitter) when parseable, else full-jitter exponential
|
|
27
|
+
* - RETRY_AFTER: Retry-After (+ jitter) only (caller must have validated the header)
|
|
28
|
+
* - BACKOFF: full-jitter exponential only
|
|
29
|
+
*/
|
|
30
|
+
/** @internal */
|
|
31
|
+
export declare const computeRateLimitBackoffMs: (attempt: number, config: ResolvedRetryConfig, retryAfterMs?: number) => number;
|
|
32
|
+
/** @internal */
|
|
33
|
+
export declare const sleep: (ms: number) => Promise<void>;
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.sleep = exports.computeRateLimitBackoffMs = exports.shouldRetryRateLimit = exports.parseRetryAfterMs = exports.resolveRetryConfig = exports.RATE_LIMIT_RETRY_BASE_MS = void 0;
|
|
4
|
+
const domain_1 = require("../domain");
|
|
5
|
+
/** Base delay for full-jitter exponential backoff (1 second). */
|
|
6
|
+
exports.RATE_LIMIT_RETRY_BASE_MS = 1_000;
|
|
7
|
+
const DEFAULT_MAX_RETRY_COUNT = 3;
|
|
8
|
+
const DEFAULT_EXPONENTIAL_BACKOFF = 4;
|
|
9
|
+
const isSupportedRetryPolicy = (value) => value === domain_1.SupportedRetryPolicy.DEFAULT
|
|
10
|
+
|| value === domain_1.SupportedRetryPolicy.RETRY_AFTER
|
|
11
|
+
|| value === domain_1.SupportedRetryPolicy.BACKOFF
|
|
12
|
+
|| value === domain_1.SupportedRetryPolicy.NONE;
|
|
13
|
+
/** @internal */
|
|
14
|
+
const resolveRetryConfig = (partial) => {
|
|
15
|
+
const retryPolicy = partial?.retryPolicy ?? domain_1.SupportedRetryPolicy.DEFAULT;
|
|
16
|
+
if (!isSupportedRetryPolicy(retryPolicy)) {
|
|
17
|
+
throw new Error('Invalid configuration: "retryPolicy" must be DEFAULT, RETRY_AFTER, BACKOFF, or NONE');
|
|
18
|
+
}
|
|
19
|
+
const maxRetryCount = partial?.maxRetryCount ?? DEFAULT_MAX_RETRY_COUNT;
|
|
20
|
+
if (!Number.isInteger(maxRetryCount) || maxRetryCount < 0) {
|
|
21
|
+
throw new Error('Invalid configuration: "maxRetryCount" must be a non-negative integer');
|
|
22
|
+
}
|
|
23
|
+
const exponentialBackoff = partial?.exponentialBackoff ?? DEFAULT_EXPONENTIAL_BACKOFF;
|
|
24
|
+
if (!Number.isFinite(exponentialBackoff) || exponentialBackoff <= 0) {
|
|
25
|
+
throw new Error('Invalid configuration: "exponentialBackoff" must be a positive number');
|
|
26
|
+
}
|
|
27
|
+
return { retryPolicy, maxRetryCount, exponentialBackoff };
|
|
28
|
+
};
|
|
29
|
+
exports.resolveRetryConfig = resolveRetryConfig;
|
|
30
|
+
/**
|
|
31
|
+
* ANSI C asctime() form from RFC 7231 §7.1.1.1 (`Sun Nov 6 08:49:37 1994`).
|
|
32
|
+
* It has no timezone; the spec treats it as GMT. `Date.parse` otherwise uses local time.
|
|
33
|
+
*/
|
|
34
|
+
const ASCTIME_HTTP_DATE = /^[A-Za-z]{3} [A-Za-z]{3} [\d ]\d \d{2}:\d{2}:\d{2} \d{4}$/;
|
|
35
|
+
const toParseableHttpDate = (value) => ASCTIME_HTTP_DATE.test(value) ? `${value} GMT` : value;
|
|
36
|
+
/**
|
|
37
|
+
* Parse an RFC 7231 `Retry-After` value (delta-seconds or HTTP-date) to milliseconds.
|
|
38
|
+
* Negative delta-seconds are ignored. Returns undefined when the value is absent or invalid.
|
|
39
|
+
*/
|
|
40
|
+
/** @internal */
|
|
41
|
+
const parseRetryAfterMs = (value) => {
|
|
42
|
+
if (value === null || value === undefined) {
|
|
43
|
+
return undefined;
|
|
44
|
+
}
|
|
45
|
+
const trimmed = value.trim();
|
|
46
|
+
if (trimmed === '') {
|
|
47
|
+
return undefined;
|
|
48
|
+
}
|
|
49
|
+
const asNumber = Number(trimmed);
|
|
50
|
+
if (Number.isFinite(asNumber)) {
|
|
51
|
+
// Negative delta-seconds are ignored per the retry policy spec.
|
|
52
|
+
if (asNumber < 0) {
|
|
53
|
+
return undefined;
|
|
54
|
+
}
|
|
55
|
+
return Math.floor(asNumber * 1000);
|
|
56
|
+
}
|
|
57
|
+
const asDate = Date.parse(toParseableHttpDate(trimmed));
|
|
58
|
+
if (!Number.isNaN(asDate)) {
|
|
59
|
+
return Math.max(0, asDate - Date.now());
|
|
60
|
+
}
|
|
61
|
+
return undefined;
|
|
62
|
+
};
|
|
63
|
+
exports.parseRetryAfterMs = parseRetryAfterMs;
|
|
64
|
+
/**
|
|
65
|
+
* Whether the SDK should retry this response for the given attempt index (0 = first retry).
|
|
66
|
+
* `retryAfterMs` is the already-parsed `Retry-After` delay (undefined if absent/invalid).
|
|
67
|
+
*/
|
|
68
|
+
/** @internal */
|
|
69
|
+
const shouldRetryRateLimit = (status, attempt, config, retryAfterMs) => {
|
|
70
|
+
if (status !== 429) {
|
|
71
|
+
return false;
|
|
72
|
+
}
|
|
73
|
+
if (config.retryPolicy === domain_1.SupportedRetryPolicy.NONE) {
|
|
74
|
+
return false;
|
|
75
|
+
}
|
|
76
|
+
if (attempt >= config.maxRetryCount) {
|
|
77
|
+
return false;
|
|
78
|
+
}
|
|
79
|
+
if (config.retryPolicy === domain_1.SupportedRetryPolicy.RETRY_AFTER) {
|
|
80
|
+
return retryAfterMs !== undefined;
|
|
81
|
+
}
|
|
82
|
+
return config.retryPolicy === domain_1.SupportedRetryPolicy.DEFAULT
|
|
83
|
+
|| config.retryPolicy === domain_1.SupportedRetryPolicy.BACKOFF;
|
|
84
|
+
};
|
|
85
|
+
exports.shouldRetryRateLimit = shouldRetryRateLimit;
|
|
86
|
+
/**
|
|
87
|
+
* Backoff delay for a rate-limit retry, respecting the configured policy.
|
|
88
|
+
* - DEFAULT: Retry-After (+ 0–250ms jitter) when parseable, else full-jitter exponential
|
|
89
|
+
* - RETRY_AFTER: Retry-After (+ jitter) only (caller must have validated the header)
|
|
90
|
+
* - BACKOFF: full-jitter exponential only
|
|
91
|
+
*/
|
|
92
|
+
/** @internal */
|
|
93
|
+
const computeRateLimitBackoffMs = (attempt, config, retryAfterMs) => {
|
|
94
|
+
const useRetryAfter = config.retryPolicy === domain_1.SupportedRetryPolicy.DEFAULT
|
|
95
|
+
|| config.retryPolicy === domain_1.SupportedRetryPolicy.RETRY_AFTER;
|
|
96
|
+
const useBackoff = config.retryPolicy === domain_1.SupportedRetryPolicy.DEFAULT
|
|
97
|
+
|| config.retryPolicy === domain_1.SupportedRetryPolicy.BACKOFF;
|
|
98
|
+
if (useRetryAfter && retryAfterMs !== undefined) {
|
|
99
|
+
// Small jitter so concurrent SinchClient instances don't all wake together.
|
|
100
|
+
return retryAfterMs + Math.floor(Math.random() * 250);
|
|
101
|
+
}
|
|
102
|
+
if (useBackoff) {
|
|
103
|
+
const ceilingMs = exports.RATE_LIMIT_RETRY_BASE_MS * Math.pow(config.exponentialBackoff, attempt);
|
|
104
|
+
return Math.floor(Math.random() * ceilingMs);
|
|
105
|
+
}
|
|
106
|
+
return 0;
|
|
107
|
+
};
|
|
108
|
+
exports.computeRateLimitBackoffMs = computeRateLimitBackoffMs;
|
|
109
|
+
/** @internal */
|
|
110
|
+
const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
|
|
111
|
+
exports.sleep = sleep;
|
|
112
|
+
//# sourceMappingURL=retry-policy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"retry-policy.js","sourceRoot":"","sources":["../../src/client/retry-policy.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,14 +1,29 @@
|
|
|
1
|
+
/** @internal */
|
|
1
2
|
export declare const REGION_PATTERN = "{region}";
|
|
3
|
+
/** @internal */
|
|
2
4
|
export declare const AUTH_HOSTNAME = "https://auth.sinch.com";
|
|
5
|
+
/** @internal */
|
|
3
6
|
export declare const CONVERSATION_HOSTNAME = "https://{region}conversation.api.sinch.com";
|
|
7
|
+
/** @internal */
|
|
4
8
|
export declare const CONVERSATION_TEMPLATES_HOSTNAME = "https://{region}template.api.sinch.com";
|
|
9
|
+
/** @internal @deprecated Elastic SIP Trunking support will be removed in version 2 of the SDK. */
|
|
5
10
|
export declare const ELASTIC_SIP_TRUNKING_HOSTNAME = "https://elastic-trunking.api.sinch.com";
|
|
11
|
+
/** @internal */
|
|
6
12
|
export declare const FAX_HOSTNAME = "https://fax.api.sinch.com";
|
|
13
|
+
/** @internal @deprecated*/
|
|
7
14
|
export declare const MAILGUN_HOSTNAME = "https://api.{region}mailgun.net";
|
|
15
|
+
/** @internal */
|
|
8
16
|
export declare const NUMBERS_HOSTNAME = "https://numbers.api.sinch.com";
|
|
17
|
+
/** @internal */
|
|
9
18
|
export declare const SMS_HOSTNAME = "https://{region}sms.api.sinch.com";
|
|
19
|
+
/** @internal */
|
|
10
20
|
export declare const VERIFICATION_HOSTNAME = "https://verification.api.sinch.com";
|
|
21
|
+
/** @internal */
|
|
11
22
|
export declare const VOICE_HOSTNAME = "https://calling{region}.api.sinch.com";
|
|
23
|
+
/** @internal */
|
|
12
24
|
export declare const VOICE_APPLICATION_MANAGEMENT_HOSTNAME = "https://callingapi.sinch.com";
|
|
25
|
+
/** @internal */
|
|
13
26
|
export declare const NUMBER_LOOKUP_HOSTNAME = "https://lookup.api.sinch.com";
|
|
27
|
+
export declare const PROVISIONING_HOSTNAME = "https://provisioning.api.sinch.com";
|
|
28
|
+
/** @internal */
|
|
14
29
|
export declare const formatRegionalizedHostname: (hostnamePattern: string, region: string) => string;
|
|
@@ -1,19 +1,34 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.formatRegionalizedHostname = exports.NUMBER_LOOKUP_HOSTNAME = exports.VOICE_APPLICATION_MANAGEMENT_HOSTNAME = exports.VOICE_HOSTNAME = exports.VERIFICATION_HOSTNAME = exports.SMS_HOSTNAME = exports.NUMBERS_HOSTNAME = exports.MAILGUN_HOSTNAME = exports.FAX_HOSTNAME = exports.ELASTIC_SIP_TRUNKING_HOSTNAME = exports.CONVERSATION_TEMPLATES_HOSTNAME = exports.CONVERSATION_HOSTNAME = exports.AUTH_HOSTNAME = exports.REGION_PATTERN = void 0;
|
|
3
|
+
exports.formatRegionalizedHostname = exports.PROVISIONING_HOSTNAME = exports.NUMBER_LOOKUP_HOSTNAME = exports.VOICE_APPLICATION_MANAGEMENT_HOSTNAME = exports.VOICE_HOSTNAME = exports.VERIFICATION_HOSTNAME = exports.SMS_HOSTNAME = exports.NUMBERS_HOSTNAME = exports.MAILGUN_HOSTNAME = exports.FAX_HOSTNAME = exports.ELASTIC_SIP_TRUNKING_HOSTNAME = exports.CONVERSATION_TEMPLATES_HOSTNAME = exports.CONVERSATION_HOSTNAME = exports.AUTH_HOSTNAME = exports.REGION_PATTERN = void 0;
|
|
4
|
+
/** @internal */
|
|
4
5
|
exports.REGION_PATTERN = '{region}';
|
|
6
|
+
/** @internal */
|
|
5
7
|
exports.AUTH_HOSTNAME = 'https://auth.sinch.com';
|
|
8
|
+
/** @internal */
|
|
6
9
|
exports.CONVERSATION_HOSTNAME = `https://${exports.REGION_PATTERN}conversation.api.sinch.com`;
|
|
10
|
+
/** @internal */
|
|
7
11
|
exports.CONVERSATION_TEMPLATES_HOSTNAME = `https://${exports.REGION_PATTERN}template.api.sinch.com`;
|
|
12
|
+
/** @internal @deprecated Elastic SIP Trunking support will be removed in version 2 of the SDK. */
|
|
8
13
|
exports.ELASTIC_SIP_TRUNKING_HOSTNAME = 'https://elastic-trunking.api.sinch.com';
|
|
14
|
+
/** @internal */
|
|
9
15
|
exports.FAX_HOSTNAME = 'https://fax.api.sinch.com';
|
|
16
|
+
/** @internal @deprecated*/
|
|
10
17
|
exports.MAILGUN_HOSTNAME = `https://api.${exports.REGION_PATTERN}mailgun.net`;
|
|
18
|
+
/** @internal */
|
|
11
19
|
exports.NUMBERS_HOSTNAME = 'https://numbers.api.sinch.com';
|
|
20
|
+
/** @internal */
|
|
12
21
|
exports.SMS_HOSTNAME = `https://${exports.REGION_PATTERN}sms.api.sinch.com`;
|
|
22
|
+
/** @internal */
|
|
13
23
|
exports.VERIFICATION_HOSTNAME = 'https://verification.api.sinch.com';
|
|
24
|
+
/** @internal */
|
|
14
25
|
exports.VOICE_HOSTNAME = `https://calling${exports.REGION_PATTERN}.api.sinch.com`;
|
|
26
|
+
/** @internal */
|
|
15
27
|
exports.VOICE_APPLICATION_MANAGEMENT_HOSTNAME = 'https://callingapi.sinch.com';
|
|
28
|
+
/** @internal */
|
|
16
29
|
exports.NUMBER_LOOKUP_HOSTNAME = 'https://lookup.api.sinch.com';
|
|
30
|
+
exports.PROVISIONING_HOSTNAME = 'https://provisioning.api.sinch.com';
|
|
31
|
+
/** @internal */
|
|
17
32
|
const formatRegionalizedHostname = (hostnamePattern, region) => {
|
|
18
33
|
return hostnamePattern.replace(exports.REGION_PATTERN, region);
|
|
19
34
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"domain-helper.js","sourceRoot":"","sources":["../../src/domain/domain-helper.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"domain-helper.js","sourceRoot":"","sources":["../../src/domain/domain-helper.ts"],"names":[],"mappings":";;;AAAA,gBAAgB;AACH,QAAA,cAAc,GAAG,UAAU,CAAC;AAEzC,gBAAgB;AACH,QAAA,aAAa,GAAG,wBAAwB,CAAC;AACtD,gBAAgB;AACH,QAAA,qBAAqB,GAAG,WAAW,QAAA,cAAc,4BAA4B,CAAC;AAC3F,gBAAgB;AACH,QAAA,+BAA+B,GAAG,WAAW,QAAA,cAAc,wBAAwB,CAAC;AACjG,kGAAkG;AACrF,QAAA,6BAA6B,GAAG,wCAAwC,CAAC;AACtF,gBAAgB;AACH,QAAA,YAAY,GAAG,2BAA2B,CAAC;AACxD,2BAA2B;AACd,QAAA,gBAAgB,GAAG,eAAe,QAAA,cAAc,aAAa,CAAC;AAC3E,gBAAgB;AACH,QAAA,gBAAgB,GAAG,+BAA+B,CAAC;AAChE,gBAAgB;AACH,QAAA,YAAY,GAAG,WAAW,QAAA,cAAc,mBAAmB,CAAC;AACzE,gBAAgB;AACH,QAAA,qBAAqB,GAAG,oCAAoC,CAAC;AAC1E,gBAAgB;AACH,QAAA,cAAc,GAAG,kBAAkB,QAAA,cAAc,gBAAgB,CAAC;AAC/E,gBAAgB;AACH,QAAA,qCAAqC,GAAG,8BAA8B,CAAC;AACpF,gBAAgB;AACH,QAAA,sBAAsB,GAAG,8BAA8B,CAAC;AACxD,QAAA,qBAAqB,GAAG,oCAAoC,CAAC;AAE1E,gBAAgB;AACT,MAAM,0BAA0B,GAAG,CAAC,eAAuB,EAAE,MAAc,EAAE,EAAE;IACpF,OAAO,eAAe,CAAC,OAAO,CAAC,QAAA,cAAc,EAAE,MAAM,CAAC,CAAC;AACzD,CAAC,CAAC;AAFW,QAAA,0BAA0B,GAA1B,0BAA0B,CAErC"}
|