@sinch/sdk-client 1.4.1 → 1.4.2
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-errors.d.ts +9 -1
- package/dist/api/api-errors.js +2 -1
- package/dist/api/api-errors.js.map +1 -1
- package/dist/plugins/exception/exception.response.js +5 -1
- package/dist/plugins/exception/exception.response.js.map +1 -1
- package/dist/plugins/oauth2/oauth2-token.request.d.ts +5 -0
- package/dist/plugins/oauth2/oauth2-token.request.js +68 -9
- package/dist/plugins/oauth2/oauth2-token.request.js.map +1 -1
- package/package.json +1 -1
package/dist/api/api-errors.d.ts
CHANGED
|
@@ -28,7 +28,15 @@ export declare class RequestFailedError<T> extends GenericError {
|
|
|
28
28
|
* Data decoded from the response body
|
|
29
29
|
*/
|
|
30
30
|
data?: string;
|
|
31
|
-
|
|
31
|
+
/**
|
|
32
|
+
* Response headers (lower-cased keys), captured at the moment of failure.
|
|
33
|
+
*/
|
|
34
|
+
responseHeaders?: {
|
|
35
|
+
[key: string]: string;
|
|
36
|
+
};
|
|
37
|
+
constructor(message: string, statusCode: number, errorContext: ErrorContext, data?: T, responseHeaders?: {
|
|
38
|
+
[key: string]: string;
|
|
39
|
+
});
|
|
32
40
|
}
|
|
33
41
|
/**
|
|
34
42
|
* Empty response error class
|
package/dist/api/api-errors.js
CHANGED
|
@@ -21,10 +21,11 @@ exports.GenericError = GenericError;
|
|
|
21
21
|
* Request failed error class
|
|
22
22
|
*/
|
|
23
23
|
class RequestFailedError extends GenericError {
|
|
24
|
-
constructor(message, statusCode, errorContext, data) {
|
|
24
|
+
constructor(message, statusCode, errorContext, data, responseHeaders) {
|
|
25
25
|
super(`[status: ${statusCode}] ${message}`, errorContext);
|
|
26
26
|
this.statusCode = statusCode;
|
|
27
27
|
this.data = JSON.stringify(data, null, 2);
|
|
28
|
+
this.responseHeaders = responseHeaders;
|
|
28
29
|
}
|
|
29
30
|
}
|
|
30
31
|
exports.RequestFailedError = RequestFailedError;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api-errors.js","sourceRoot":"","sources":["../../src/api/api-errors.ts"],"names":[],"mappings":";;;AAYA;;GAEG;AACH,MAAa,YAAa,SAAQ,KAAK;IACrC,YAAY,OAAe,EAAE,YAA0B;QACrD,MAAM,OAAO,GAAG,YAAY,CAAC,SAAS,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;QACzD,KAAK,CACH,mBAAmB,YAAY,CAAC,OAAO,IAAI,SAAS;wBAClC,YAAY,CAAC,WAAW,IAAI,SAAS;oBACzC,OAAO,sBAAsB,OAAO,EAAE,CACrD,CAAC;IACJ,CAAC;IAEO,MAAM,CAAC,SAAS,CAAC,GAA8B;QACrD,MAAM,UAAU,GAAG,cAAc,CAAC;QAClC,OAAO,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IACvD,CAAC;CAEF;AAfD,oCAeC;AAED;;GAEG;AACH,MAAa,kBAAsB,SAAQ,YAAY;
|
|
1
|
+
{"version":3,"file":"api-errors.js","sourceRoot":"","sources":["../../src/api/api-errors.ts"],"names":[],"mappings":";;;AAYA;;GAEG;AACH,MAAa,YAAa,SAAQ,KAAK;IACrC,YAAY,OAAe,EAAE,YAA0B;QACrD,MAAM,OAAO,GAAG,YAAY,CAAC,SAAS,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;QACzD,KAAK,CACH,mBAAmB,YAAY,CAAC,OAAO,IAAI,SAAS;wBAClC,YAAY,CAAC,WAAW,IAAI,SAAS;oBACzC,OAAO,sBAAsB,OAAO,EAAE,CACrD,CAAC;IACJ,CAAC;IAEO,MAAM,CAAC,SAAS,CAAC,GAA8B;QACrD,MAAM,UAAU,GAAG,cAAc,CAAC;QAClC,OAAO,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IACvD,CAAC;CAEF;AAfD,oCAeC;AAED;;GAEG;AACH,MAAa,kBAAsB,SAAQ,YAAY;IAgBrD,YACE,OAAe,EACf,UAAkB,EAClB,YAA0B,EAC1B,IAAQ,EACR,eAA2C;QAE3C,KAAK,CAAC,YAAY,UAAU,KAAK,OAAO,EAAE,EAAE,YAAY,CAAC,CAAC;QAC1D,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;QAC7B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;QAC1C,IAAI,CAAC,eAAe,GAAG,eAAe,CAAC;IACzC,CAAC;CACF;AA5BD,gDA4BC;AAED;;GAEG;AACH,MAAa,kBAAmB,SAAQ,YAAY;IAElD,YAAY,OAAe,EAAE,YAA0B;QACrD,KAAK,CAAC,oBAAoB,OAAO,EAAE,EAAE,YAAY,CAAC,CAAC;IACrD,CAAC;CACF;AALD,gDAKC;AAED;;GAEG;AACH,MAAa,sBAAuB,SAAQ,kBAA0B;IACpE,YACE,OAAe,EACf,UAAkB,EAClB,YAA0B,EAC1B,WAAoB;QAEpB,KAAK,CACH,+BAA+B,OAAO,EAAE,EACxC,UAAU,EACV,YAAY,EACZ,WAAW,CACZ,CAAC;IACJ,CAAC;CACF;AAdD,wDAcC"}
|
|
@@ -30,7 +30,11 @@ class ExceptionResponse {
|
|
|
30
30
|
error = new api_errors_1.EmptyResponseError('Fail to Fetch', errorContext);
|
|
31
31
|
}
|
|
32
32
|
else if (!context.response.ok) {
|
|
33
|
-
|
|
33
|
+
const headers = {};
|
|
34
|
+
context.response.headers.forEach((value, key) => {
|
|
35
|
+
headers[key.toLowerCase()] = value;
|
|
36
|
+
});
|
|
37
|
+
error = new api_errors_1.RequestFailedError(context.response.statusText, context.response.status, errorContext, res, headers);
|
|
34
38
|
}
|
|
35
39
|
else if (!res) {
|
|
36
40
|
if (context.response.status !== 204
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"exception.response.js","sourceRoot":"","sources":["../../../src/plugins/exception/exception.response.ts"],"names":[],"mappings":";;;AAAA,qDAA8E;AAI9E;;GAEG;AACH,MAAa,iBAAiB;IAI9B;;;;OAIG;IACD,YAAoB,QAAkD;QAAlD,aAAQ,GAAR,QAAQ,CAA0C;IAAG,CAAC;IAEnE,IAAI,CACT,OAA8B;QAE9B,OAAO;YACL,SAAS,EAAE,CAAC,GAAM,EAAE,EAAE;gBACpB,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;oBACtB,OAAO,GAAG,CAAC;gBACb,CAAC;gBAED,MAAM,YAAY,GAAG;oBACnB,OAAO,EAAE,OAAO,CAAC,OAAO;oBACxB,WAAW,EAAE,OAAO,CAAC,WAAW;oBAChC,GAAG,EAAE,OAAO,CAAC,GAAG;iBACjB,CAAC;gBACF,IAAI,KAAwB,CAAC;gBAE7B,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC;oBACtB,KAAK,GAAG,IAAI,+BAAkB,CAC5B,eAAe,EACf,YAAY,CACb,CAAC;gBACJ,CAAC;qBAAM,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;oBAChC,KAAK,GAAG,IAAI,+BAAkB,CAC5B,OAAO,CAAC,QAAQ,CAAC,UAAU,EAC3B,OAAO,CAAC,QAAQ,CAAC,MAAM,EACvB,YAAY,EACZ,GAAG,
|
|
1
|
+
{"version":3,"file":"exception.response.js","sourceRoot":"","sources":["../../../src/plugins/exception/exception.response.ts"],"names":[],"mappings":";;;AAAA,qDAA8E;AAI9E;;GAEG;AACH,MAAa,iBAAiB;IAI9B;;;;OAIG;IACD,YAAoB,QAAkD;QAAlD,aAAQ,GAAR,QAAQ,CAA0C;IAAG,CAAC;IAEnE,IAAI,CACT,OAA8B;QAE9B,OAAO;YACL,SAAS,EAAE,CAAC,GAAM,EAAE,EAAE;gBACpB,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;oBACtB,OAAO,GAAG,CAAC;gBACb,CAAC;gBAED,MAAM,YAAY,GAAG;oBACnB,OAAO,EAAE,OAAO,CAAC,OAAO;oBACxB,WAAW,EAAE,OAAO,CAAC,WAAW;oBAChC,GAAG,EAAE,OAAO,CAAC,GAAG;iBACjB,CAAC;gBACF,IAAI,KAAwB,CAAC;gBAE7B,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC;oBACtB,KAAK,GAAG,IAAI,+BAAkB,CAC5B,eAAe,EACf,YAAY,CACb,CAAC;gBACJ,CAAC;qBAAM,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;oBAChC,MAAM,OAAO,GAA8B,EAAE,CAAC;oBAC9C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;wBAC9C,OAAO,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,GAAG,KAAK,CAAC;oBACrC,CAAC,CAAC,CAAC;oBACH,KAAK,GAAG,IAAI,+BAAkB,CAC5B,OAAO,CAAC,QAAQ,CAAC,UAAU,EAC3B,OAAO,CAAC,QAAQ,CAAC,MAAM,EACvB,YAAY,EACZ,GAAG,EACH,OAAO,CACR,CAAC;gBACJ,CAAC;qBAAM,IAAI,CAAC,GAAG,EAAE,CAAC;oBAChB,IAAI,OAAO,CAAC,QAAQ,CAAC,MAAM,KAAK,GAAG;2BAC9B,OAAO,CAAC,QAAQ,CAAC,MAAM,KAAK,GAAG;2BAC/B,OAAO,CAAC,QAAQ,CAAC,MAAM,KAAK,GAAG,EAClC,CAAC;wBACD,KAAK,GAAG,IAAI,+BAAkB,CAC5B,OAAO,CAAC,QAAQ,CAAC,UAAU,EAC3B,YAAY,CACb,CAAC;oBACJ,CAAC;gBACH,CAAC;gBAED,IAAI,KAAK,EAAE,CAAC;oBACV,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;wBAClB,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;oBACnC,CAAC;yBAAM,CAAC;wBACN,MAAM,KAAK,CAAC;oBACd,CAAC;gBACH,CAAC;gBACD,OAAO,GAAG,CAAC;YACb,CAAC;SACF,CAAC;IACJ,CAAC;CACF;AAnED,8CAmEC"}
|
|
@@ -9,6 +9,11 @@ export declare class Oauth2TokenRequest implements RequestPlugin {
|
|
|
9
9
|
constructor(clientId: string, clientSecret: string, authenticationUrl?: string);
|
|
10
10
|
private getOAuth2Token;
|
|
11
11
|
private fetchNewToken;
|
|
12
|
+
/**
|
|
13
|
+
* Call the auth endpoint, retrying only on 429 with full-jitter backoff.
|
|
14
|
+
* Other failures (network, 5xx, malformed response) propagate immediately
|
|
15
|
+
*/
|
|
16
|
+
private callAuthWithRateLimitRetry;
|
|
12
17
|
private buildAuthorizationHeader;
|
|
13
18
|
private isTokenValid;
|
|
14
19
|
load(): PluginRunner<RequestOptions, RequestOptions>;
|
|
@@ -7,7 +7,22 @@ const oauth2_api_1 = require("./oauth2-api");
|
|
|
7
7
|
const basicAuthentication_1 = require("../basicAuthentication");
|
|
8
8
|
const api_fetch_client_1 = require("../../client/api-fetch-client");
|
|
9
9
|
const domain_1 = require("../../domain");
|
|
10
|
+
const api_errors_1 = require("../../api/api-errors");
|
|
10
11
|
const EXPIRY_SAFETY_MARGIN_SEC = 60;
|
|
12
|
+
/**
|
|
13
|
+
* Token-fetch 429 backoff. ZAP is a token bucket: capacity 30, refill 10/s,
|
|
14
|
+
* no `Retry-After` header. With N SinchClient instances cold-starting
|
|
15
|
+
* concurrently, the first 30 succeed and the rest get 429s; this backoff
|
|
16
|
+
* absorbs that overflow silently.
|
|
17
|
+
*
|
|
18
|
+
* Full-jitter exponential backoff: each retry waits a uniform sample from
|
|
19
|
+
* [0, ceiling], where ceiling grows by RATE_LIMIT_RETRY_GROWTH each attempt.
|
|
20
|
+
* Jitter is necessary and essential: without it, multiple workers' retries
|
|
21
|
+
* collide at the same wall-clock instant and re-trigger the rate limit.
|
|
22
|
+
*/
|
|
23
|
+
const MAX_RATE_LIMIT_RETRIES = 3;
|
|
24
|
+
const RATE_LIMIT_RETRY_BASE_MS = 1_000;
|
|
25
|
+
const RATE_LIMIT_RETRY_GROWTH = 4;
|
|
11
26
|
class Oauth2TokenRequest {
|
|
12
27
|
getName() {
|
|
13
28
|
return request_plugin_1.RequestPluginEnum.OAUTH2_TOKEN_REQUEST;
|
|
@@ -43,15 +58,7 @@ class Oauth2TokenRequest {
|
|
|
43
58
|
}
|
|
44
59
|
async fetchNewToken() {
|
|
45
60
|
const oauth2Api = new oauth2_api_1.OAuth2Api(this.apiClient);
|
|
46
|
-
|
|
47
|
-
try {
|
|
48
|
-
response = await oauth2Api.postAccessToken();
|
|
49
|
-
}
|
|
50
|
-
catch (e) {
|
|
51
|
-
// Propagate the auth failure to the caller.
|
|
52
|
-
this.token = undefined;
|
|
53
|
-
throw e;
|
|
54
|
-
}
|
|
61
|
+
const response = await this.callAuthWithRateLimitRetry(oauth2Api);
|
|
55
62
|
if (!response.access_token) {
|
|
56
63
|
this.token = undefined;
|
|
57
64
|
throw new Error('The authentication server did not return an access_token. Response keys: ['
|
|
@@ -64,6 +71,25 @@ class Oauth2TokenRequest {
|
|
|
64
71
|
};
|
|
65
72
|
return this.buildAuthorizationHeader();
|
|
66
73
|
}
|
|
74
|
+
/**
|
|
75
|
+
* Call the auth endpoint, retrying only on 429 with full-jitter backoff.
|
|
76
|
+
* Other failures (network, 5xx, malformed response) propagate immediately
|
|
77
|
+
*/
|
|
78
|
+
async callAuthWithRateLimitRetry(oauth2Api) {
|
|
79
|
+
for (let attempt = 0;; attempt++) {
|
|
80
|
+
try {
|
|
81
|
+
return await oauth2Api.postAccessToken();
|
|
82
|
+
}
|
|
83
|
+
catch (e) {
|
|
84
|
+
if (attempt < MAX_RATE_LIMIT_RETRIES && isRateLimit(e)) {
|
|
85
|
+
await sleep(computeRateLimitBackoffMs(e, attempt));
|
|
86
|
+
continue;
|
|
87
|
+
}
|
|
88
|
+
this.token = undefined;
|
|
89
|
+
throw e;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
}
|
|
67
93
|
buildAuthorizationHeader() {
|
|
68
94
|
return { Authorization: `Bearer ${this.token.value}` };
|
|
69
95
|
}
|
|
@@ -106,6 +132,39 @@ var TokenStatus;
|
|
|
106
132
|
TokenStatus[TokenStatus["INVALID"] = 0] = "INVALID";
|
|
107
133
|
TokenStatus[TokenStatus["VALID"] = 1] = "VALID";
|
|
108
134
|
})(TokenStatus || (TokenStatus = {}));
|
|
135
|
+
const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
|
|
136
|
+
const isRateLimit = (error) => error instanceof api_errors_1.RequestFailedError && error.statusCode === 429;
|
|
137
|
+
/**
|
|
138
|
+
* Backoff for a rate-limit retry. Honors `Retry-After` if the server sent one
|
|
139
|
+
* (RFC 7231: delta-seconds or HTTP-date); otherwise full-jitter exponential.
|
|
140
|
+
* Sinch prod doesn't send Retry-After today, so the exponential path is what
|
|
141
|
+
* actually runs there — but the Retry-After path works for any third-party OAuth2
|
|
142
|
+
* endpoint the SDK is pointed at.
|
|
143
|
+
*/
|
|
144
|
+
const computeRateLimitBackoffMs = (error, attempt) => {
|
|
145
|
+
const fromHeader = parseRetryAfterMs(error.responseHeaders?.['retry-after']);
|
|
146
|
+
if (fromHeader !== undefined) {
|
|
147
|
+
// Add a sliver of jitter on top so concurrent SinchClient instances don't all
|
|
148
|
+
// wake at the same millisecond and re-collide at the auth gateway.
|
|
149
|
+
return fromHeader + Math.floor(Math.random() * 250);
|
|
150
|
+
}
|
|
151
|
+
const ceilingMs = RATE_LIMIT_RETRY_BASE_MS * Math.pow(RATE_LIMIT_RETRY_GROWTH, attempt);
|
|
152
|
+
return Math.floor(Math.random() * ceilingMs);
|
|
153
|
+
};
|
|
154
|
+
const parseRetryAfterMs = (value) => {
|
|
155
|
+
if (!value) {
|
|
156
|
+
return undefined;
|
|
157
|
+
}
|
|
158
|
+
const asNumber = Number(value);
|
|
159
|
+
if (!Number.isNaN(asNumber) && asNumber >= 0) {
|
|
160
|
+
return Math.floor(asNumber * 1000);
|
|
161
|
+
}
|
|
162
|
+
const asDate = Date.parse(value);
|
|
163
|
+
if (!Number.isNaN(asDate)) {
|
|
164
|
+
return Math.max(0, asDate - Date.now());
|
|
165
|
+
}
|
|
166
|
+
return undefined;
|
|
167
|
+
};
|
|
109
168
|
/**
|
|
110
169
|
* Decode the `exp` claim from a JWT without verifying the signature.
|
|
111
170
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"oauth2-token.request.js","sourceRoot":"","sources":["../../../src/plugins/oauth2/oauth2-token.request.ts"],"names":[],"mappings":";;;AACA,2DAA0F;AAC1F,8DAAiE;AAEjE,6CAAyC;AACzC,gEAAoE;AACpE,oEAA+D;AAC/D,yCAA6C;
|
|
1
|
+
{"version":3,"file":"oauth2-token.request.js","sourceRoot":"","sources":["../../../src/plugins/oauth2/oauth2-token.request.ts"],"names":[],"mappings":"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"}
|