svix 1.74.0 → 1.75.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/index.d.ts +7 -2
- package/dist/index.js +23 -1
- package/dist/index.js.map +1 -1
- package/dist/request.d.ts +8 -3
- package/dist/request.js +6 -4
- package/dist/request.js.map +1 -1
- package/dist/util.d.ts +5 -0
- package/package.json +1 -1
- package/src/index.ts +38 -3
- package/src/mockttp.test.ts +29 -2
- package/src/request.ts +45 -18
- package/src/util.ts +4 -0
package/dist/index.d.ts
CHANGED
|
@@ -16,6 +16,7 @@ export { PostOptions, ApiException } from "./util";
|
|
|
16
16
|
export { HTTPValidationError, HttpErrorOut, ValidationError } from "./HttpErrors";
|
|
17
17
|
export * from "./webhook";
|
|
18
18
|
export * from "./models/index";
|
|
19
|
+
import { XOR } from "./util";
|
|
19
20
|
export { ApplicationListOptions } from "./api/application";
|
|
20
21
|
export { BackgroundTaskListOptions } from "./api/backgroundTask";
|
|
21
22
|
export { EndpointListOptions, EndpointGetStatsOptions } from "./api/endpoint";
|
|
@@ -24,11 +25,15 @@ export { IntegrationListOptions } from "./api/integration";
|
|
|
24
25
|
export { MessageListOptions, messageInRaw } from "./api/message";
|
|
25
26
|
export { MessageAttemptListByEndpointOptions } from "./api/messageAttempt";
|
|
26
27
|
export { OperationalWebhookEndpointListOptions } from "./api/operationalWebhookEndpoint";
|
|
27
|
-
export
|
|
28
|
+
export type SvixOptions = {
|
|
28
29
|
debug?: boolean;
|
|
29
30
|
serverUrl?: string;
|
|
30
31
|
requestTimeout?: number;
|
|
31
|
-
}
|
|
32
|
+
} & XOR<{
|
|
33
|
+
retryScheduleInMs?: number[];
|
|
34
|
+
}, {
|
|
35
|
+
numRetries?: number;
|
|
36
|
+
}>;
|
|
32
37
|
export declare class Svix {
|
|
33
38
|
private readonly requestCtx;
|
|
34
39
|
constructor(token: string, options?: SvixOptions);
|
package/dist/index.js
CHANGED
|
@@ -51,7 +51,29 @@ class Svix {
|
|
|
51
51
|
var _a, _b, _c;
|
|
52
52
|
const regionalUrl = (_a = REGIONS.find((x) => x.region === token.split(".")[1])) === null || _a === void 0 ? void 0 : _a.url;
|
|
53
53
|
const baseUrl = (_c = (_b = options.serverUrl) !== null && _b !== void 0 ? _b : regionalUrl) !== null && _c !== void 0 ? _c : "https://api.svix.com";
|
|
54
|
-
|
|
54
|
+
if (options.retryScheduleInMs) {
|
|
55
|
+
this.requestCtx = {
|
|
56
|
+
baseUrl,
|
|
57
|
+
token,
|
|
58
|
+
timeout: options.requestTimeout,
|
|
59
|
+
retryScheduleInMs: options.retryScheduleInMs,
|
|
60
|
+
};
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
if (options.numRetries) {
|
|
64
|
+
this.requestCtx = {
|
|
65
|
+
baseUrl,
|
|
66
|
+
token,
|
|
67
|
+
timeout: options.requestTimeout,
|
|
68
|
+
numRetries: options.numRetries,
|
|
69
|
+
};
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
this.requestCtx = {
|
|
73
|
+
baseUrl,
|
|
74
|
+
token,
|
|
75
|
+
timeout: options.requestTimeout,
|
|
76
|
+
};
|
|
55
77
|
}
|
|
56
78
|
get application() {
|
|
57
79
|
return new application_1.Application(this.requestCtx);
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AACA,mDAAgD;AAChD,yDAAsD;AACtD,yDAAsD;AACtD,6CAA0C;AAC1C,mDAAgD;AAChD,+CAA4C;AAC5C,yCAAsC;AACtC,yCAAsC;AACtC,mDAAgD;AAChD,2CAAwC;AACxC,yDAAsD;AACtD,iEAA8D;AAC9D,iDAA8C;AAC9C,iFAA8E;AAG9E,+BAAmD;AAA7B,oGAAA,YAAY,OAAA;AAClC,2CAAkF;AAAzE,iHAAA,mBAAmB,OAAA;AAAE,0GAAA,YAAY,OAAA;AAAE,6GAAA,eAAe,OAAA;AAC3D,4CAA0B;AAC1B,iDAA+B;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/request.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
|
|
1
|
+
import { XOR } from "./util";
|
|
2
|
+
export declare const LIB_VERSION = "1.75.0";
|
|
2
3
|
export declare enum HttpMethod {
|
|
3
4
|
GET = "GET",
|
|
4
5
|
HEAD = "HEAD",
|
|
@@ -10,11 +11,15 @@ export declare enum HttpMethod {
|
|
|
10
11
|
TRACE = "TRACE",
|
|
11
12
|
PATCH = "PATCH"
|
|
12
13
|
}
|
|
13
|
-
export
|
|
14
|
+
export type SvixRequestContext = {
|
|
14
15
|
baseUrl: string;
|
|
15
16
|
token: string;
|
|
16
17
|
timeout?: number;
|
|
17
|
-
}
|
|
18
|
+
} & XOR<{
|
|
19
|
+
retryScheduleInMs?: number[];
|
|
20
|
+
}, {
|
|
21
|
+
numRetries?: number;
|
|
22
|
+
}>;
|
|
18
23
|
type QueryParameter = string | boolean | number | Date | string[] | null | undefined;
|
|
19
24
|
export declare class SvixRequest {
|
|
20
25
|
private readonly method;
|
package/dist/request.js
CHANGED
|
@@ -12,7 +12,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
12
12
|
exports.SvixRequest = exports.HttpMethod = exports.LIB_VERSION = void 0;
|
|
13
13
|
const util_1 = require("./util");
|
|
14
14
|
const uuid_1 = require("uuid");
|
|
15
|
-
exports.LIB_VERSION = "1.
|
|
15
|
+
exports.LIB_VERSION = "1.75.0";
|
|
16
16
|
const USER_AGENT = `svix-libs/${exports.LIB_VERSION}/javascript`;
|
|
17
17
|
var HttpMethod;
|
|
18
18
|
(function (HttpMethod) {
|
|
@@ -88,6 +88,7 @@ class SvixRequest {
|
|
|
88
88
|
});
|
|
89
89
|
}
|
|
90
90
|
sendInner(ctx) {
|
|
91
|
+
var _a, _b;
|
|
91
92
|
return __awaiter(this, void 0, void 0, function* () {
|
|
92
93
|
const url = new URL(ctx.baseUrl + this.path);
|
|
93
94
|
for (const [name, value] of Object.entries(this.queryParams)) {
|
|
@@ -108,7 +109,7 @@ class SvixRequest {
|
|
|
108
109
|
headers: Object.assign({ accept: "application/json, */*;q=0.8", authorization: `Bearer ${ctx.token}`, "user-agent": USER_AGENT, "svix-req-id": randomId.toString() }, this.headerParams),
|
|
109
110
|
credentials: isCredentialsSupported ? "same-origin" : undefined,
|
|
110
111
|
signal: ctx.timeout !== undefined ? AbortSignal.timeout(ctx.timeout) : undefined,
|
|
111
|
-
});
|
|
112
|
+
}, ctx.retryScheduleInMs, (_a = ctx.retryScheduleInMs) === null || _a === void 0 ? void 0 : _a[0], ((_b = ctx.retryScheduleInMs) === null || _b === void 0 ? void 0 : _b.length) || ctx.numRetries);
|
|
112
113
|
return filterResponseForErrors(response);
|
|
113
114
|
});
|
|
114
115
|
}
|
|
@@ -129,7 +130,7 @@ function filterResponseForErrors(response) {
|
|
|
129
130
|
throw new util_1.ApiException(response.status, responseBody, response.headers);
|
|
130
131
|
});
|
|
131
132
|
}
|
|
132
|
-
function sendWithRetry(url, init,
|
|
133
|
+
function sendWithRetry(url, init, retryScheduleInMs, nextInterval = 50, triesLeft = 2, retryCount = 1) {
|
|
133
134
|
return __awaiter(this, void 0, void 0, function* () {
|
|
134
135
|
const sleep = (interval) => new Promise((resolve) => setTimeout(resolve, interval));
|
|
135
136
|
try {
|
|
@@ -145,7 +146,8 @@ function sendWithRetry(url, init, triesLeft = 2, nextInterval = 50, retryCount =
|
|
|
145
146
|
}
|
|
146
147
|
yield sleep(nextInterval);
|
|
147
148
|
init.headers["svix-retry-count"] = retryCount.toString();
|
|
148
|
-
|
|
149
|
+
nextInterval = (retryScheduleInMs === null || retryScheduleInMs === void 0 ? void 0 : retryScheduleInMs[retryCount]) || nextInterval * 2;
|
|
150
|
+
return yield sendWithRetry(url, init, retryScheduleInMs, nextInterval, --triesLeft, ++retryCount);
|
|
149
151
|
});
|
|
150
152
|
}
|
|
151
153
|
//# sourceMappingURL=request.js.map
|
package/dist/request.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"request.js","sourceRoot":"","sources":["../src/request.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,
|
|
1
|
+
{"version":3,"file":"request.js","sourceRoot":"","sources":["../src/request.ts"],"names":[],"mappings":"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"}
|
package/dist/util.d.ts
CHANGED
package/package.json
CHANGED
package/src/index.ts
CHANGED
|
@@ -19,6 +19,7 @@ export { PostOptions, ApiException } from "./util";
|
|
|
19
19
|
export { HTTPValidationError, HttpErrorOut, ValidationError } from "./HttpErrors";
|
|
20
20
|
export * from "./webhook";
|
|
21
21
|
export * from "./models/index";
|
|
22
|
+
import { XOR } from "./util";
|
|
22
23
|
|
|
23
24
|
export { ApplicationListOptions } from "./api/application";
|
|
24
25
|
export { BackgroundTaskListOptions } from "./api/backgroundTask";
|
|
@@ -29,12 +30,24 @@ export { MessageListOptions, messageInRaw } from "./api/message";
|
|
|
29
30
|
export { MessageAttemptListByEndpointOptions } from "./api/messageAttempt";
|
|
30
31
|
export { OperationalWebhookEndpointListOptions } from "./api/operationalWebhookEndpoint";
|
|
31
32
|
|
|
32
|
-
export
|
|
33
|
+
export type SvixOptions = {
|
|
33
34
|
debug?: boolean;
|
|
34
35
|
serverUrl?: string;
|
|
35
36
|
/** Time in milliseconds to wait for requests to get a response. */
|
|
36
37
|
requestTimeout?: number;
|
|
37
|
-
}
|
|
38
|
+
} & XOR<
|
|
39
|
+
{
|
|
40
|
+
/** List of delays (in milliseconds) to wait before each retry attempt.*/
|
|
41
|
+
retryScheduleInMs?: number[];
|
|
42
|
+
},
|
|
43
|
+
{
|
|
44
|
+
/** The number of times the client will retry if a server-side error
|
|
45
|
+
* or timeout is received.
|
|
46
|
+
* Default: 2
|
|
47
|
+
*/
|
|
48
|
+
numRetries?: number;
|
|
49
|
+
}
|
|
50
|
+
>;
|
|
38
51
|
|
|
39
52
|
const REGIONS = [
|
|
40
53
|
{ region: "us", url: "https://api.us.svix.com" },
|
|
@@ -51,7 +64,29 @@ export class Svix {
|
|
|
51
64
|
const regionalUrl = REGIONS.find((x) => x.region === token.split(".")[1])?.url;
|
|
52
65
|
const baseUrl: string = options.serverUrl ?? regionalUrl ?? "https://api.svix.com";
|
|
53
66
|
|
|
54
|
-
|
|
67
|
+
if (options.retryScheduleInMs) {
|
|
68
|
+
this.requestCtx = {
|
|
69
|
+
baseUrl,
|
|
70
|
+
token,
|
|
71
|
+
timeout: options.requestTimeout,
|
|
72
|
+
retryScheduleInMs: options.retryScheduleInMs,
|
|
73
|
+
};
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
if (options.numRetries) {
|
|
77
|
+
this.requestCtx = {
|
|
78
|
+
baseUrl,
|
|
79
|
+
token,
|
|
80
|
+
timeout: options.requestTimeout,
|
|
81
|
+
numRetries: options.numRetries,
|
|
82
|
+
};
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
85
|
+
this.requestCtx = {
|
|
86
|
+
baseUrl,
|
|
87
|
+
token,
|
|
88
|
+
timeout: options.requestTimeout,
|
|
89
|
+
};
|
|
55
90
|
}
|
|
56
91
|
|
|
57
92
|
public get application() {
|
package/src/mockttp.test.ts
CHANGED
|
@@ -114,15 +114,19 @@ describe("mockttp tests", () => {
|
|
|
114
114
|
});
|
|
115
115
|
|
|
116
116
|
test("test retry for status => 500", async () => {
|
|
117
|
+
const numRetries = 5;
|
|
117
118
|
const endpointMock = await mockServer
|
|
118
119
|
.forGet("/api/v1/app")
|
|
119
120
|
.thenReply(500, `{"code":"500","detail":"asd"}`);
|
|
120
|
-
const svx = new Svix("token", {
|
|
121
|
+
const svx = new Svix("token", {
|
|
122
|
+
serverUrl: mockServer.url,
|
|
123
|
+
numRetries,
|
|
124
|
+
});
|
|
121
125
|
|
|
122
126
|
await expect(svx.application.list()).rejects.toThrow(ApiException);
|
|
123
127
|
|
|
124
128
|
const requests = await endpointMock.getSeenRequests();
|
|
125
|
-
expect(requests.length).toBe(
|
|
129
|
+
expect(requests.length).toBe(numRetries + 1);
|
|
126
130
|
|
|
127
131
|
// same svix-req-id for each retry
|
|
128
132
|
const req_id = requests[0].headers["svix-req-id"];
|
|
@@ -139,6 +143,29 @@ describe("mockttp tests", () => {
|
|
|
139
143
|
}
|
|
140
144
|
});
|
|
141
145
|
|
|
146
|
+
test("test retry schedule for status => 500", async () => {
|
|
147
|
+
const retryScheduleInMs = [60, 120, 240];
|
|
148
|
+
const endpointMock = await mockServer
|
|
149
|
+
.forGet("/api/v1/app")
|
|
150
|
+
.thenReply(500, `{"code":"500","detail":"asd"}`);
|
|
151
|
+
const before = new Date().getTime();
|
|
152
|
+
const svx = new Svix("token", {
|
|
153
|
+
serverUrl: mockServer.url,
|
|
154
|
+
retryScheduleInMs,
|
|
155
|
+
});
|
|
156
|
+
|
|
157
|
+
await expect(svx.application.list()).rejects.toThrow(ApiException);
|
|
158
|
+
|
|
159
|
+
const requests = await endpointMock.getSeenRequests();
|
|
160
|
+
expect(requests.length).toBe(retryScheduleInMs.length + 1);
|
|
161
|
+
|
|
162
|
+
const after = new Date().getTime();
|
|
163
|
+
|
|
164
|
+
expect(after - before).toBeGreaterThanOrEqual(
|
|
165
|
+
retryScheduleInMs.reduce((prev, curr) => prev + curr, 0)
|
|
166
|
+
);
|
|
167
|
+
});
|
|
168
|
+
|
|
142
169
|
test("no body in response does not return anything", async () => {
|
|
143
170
|
const endpointMock = await mockServer
|
|
144
171
|
.forDelete("/api/v1/app/app1")
|
package/src/request.ts
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { ApiException } from "./util";
|
|
1
|
+
import { ApiException, XOR } from "./util";
|
|
2
2
|
import { HttpErrorOut, HTTPValidationError } from "./HttpErrors";
|
|
3
3
|
import { v4 as uuidv4 } from "uuid";
|
|
4
4
|
|
|
5
|
-
export const LIB_VERSION = "1.
|
|
5
|
+
export const LIB_VERSION = "1.75.0";
|
|
6
6
|
const USER_AGENT = `svix-libs/${LIB_VERSION}/javascript`;
|
|
7
7
|
|
|
8
8
|
export enum HttpMethod {
|
|
@@ -17,14 +17,26 @@ export enum HttpMethod {
|
|
|
17
17
|
PATCH = "PATCH",
|
|
18
18
|
}
|
|
19
19
|
|
|
20
|
-
export
|
|
20
|
+
export type SvixRequestContext = {
|
|
21
21
|
/** The API base URL, like "https://api.svix.com" */
|
|
22
22
|
baseUrl: string;
|
|
23
23
|
/** The 'bearer' scheme access token */
|
|
24
24
|
token: string;
|
|
25
25
|
/** Time in milliseconds to wait for requests to get a response. */
|
|
26
26
|
timeout?: number;
|
|
27
|
-
}
|
|
27
|
+
} & XOR<
|
|
28
|
+
{
|
|
29
|
+
/** List of delays (in milliseconds) to wait before each retry attempt.*/
|
|
30
|
+
retryScheduleInMs?: number[];
|
|
31
|
+
},
|
|
32
|
+
{
|
|
33
|
+
/** The number of times the client will retry if a server-side error
|
|
34
|
+
* or timeout is received.
|
|
35
|
+
* Default: 2
|
|
36
|
+
*/
|
|
37
|
+
numRetries?: number;
|
|
38
|
+
}
|
|
39
|
+
>;
|
|
28
40
|
|
|
29
41
|
type QueryParameter = string | boolean | number | Date | string[] | null | undefined;
|
|
30
42
|
|
|
@@ -130,19 +142,25 @@ export class SvixRequest {
|
|
|
130
142
|
// https://github.com/cloudflare/workers-sdk/issues/2514#issuecomment-2178070014
|
|
131
143
|
const isCredentialsSupported = "credentials" in Request.prototype;
|
|
132
144
|
|
|
133
|
-
const response = await sendWithRetry(
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
145
|
+
const response = await sendWithRetry(
|
|
146
|
+
url,
|
|
147
|
+
{
|
|
148
|
+
method: this.method.toString(),
|
|
149
|
+
body: this.body,
|
|
150
|
+
headers: {
|
|
151
|
+
accept: "application/json, */*;q=0.8",
|
|
152
|
+
authorization: `Bearer ${ctx.token}`,
|
|
153
|
+
"user-agent": USER_AGENT,
|
|
154
|
+
"svix-req-id": randomId.toString(),
|
|
155
|
+
...this.headerParams,
|
|
156
|
+
},
|
|
157
|
+
credentials: isCredentialsSupported ? "same-origin" : undefined,
|
|
158
|
+
signal: ctx.timeout !== undefined ? AbortSignal.timeout(ctx.timeout) : undefined,
|
|
142
159
|
},
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
160
|
+
ctx.retryScheduleInMs,
|
|
161
|
+
ctx.retryScheduleInMs?.[0],
|
|
162
|
+
ctx.retryScheduleInMs?.length || ctx.numRetries
|
|
163
|
+
);
|
|
146
164
|
return filterResponseForErrors(response);
|
|
147
165
|
}
|
|
148
166
|
}
|
|
@@ -179,8 +197,9 @@ type SvixRequestInit = RequestInit & {
|
|
|
179
197
|
async function sendWithRetry(
|
|
180
198
|
url: URL,
|
|
181
199
|
init: SvixRequestInit,
|
|
182
|
-
|
|
200
|
+
retryScheduleInMs?: number[],
|
|
183
201
|
nextInterval = 50,
|
|
202
|
+
triesLeft = 2,
|
|
184
203
|
retryCount = 1
|
|
185
204
|
): Promise<Response> {
|
|
186
205
|
const sleep = (interval: number) =>
|
|
@@ -199,5 +218,13 @@ async function sendWithRetry(
|
|
|
199
218
|
|
|
200
219
|
await sleep(nextInterval);
|
|
201
220
|
init.headers["svix-retry-count"] = retryCount.toString();
|
|
202
|
-
|
|
221
|
+
nextInterval = retryScheduleInMs?.[retryCount] || nextInterval * 2;
|
|
222
|
+
return await sendWithRetry(
|
|
223
|
+
url,
|
|
224
|
+
init,
|
|
225
|
+
retryScheduleInMs,
|
|
226
|
+
nextInterval,
|
|
227
|
+
--triesLeft,
|
|
228
|
+
++retryCount
|
|
229
|
+
);
|
|
203
230
|
}
|