@vqnguyen1/piece-sellercloud 0.1.0 → 0.1.1
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/package.json +1 -1
- package/src/lib/common/client.js +98 -19
- package/src/lib/common/client.js.map +1 -1
package/package.json
CHANGED
package/src/lib/common/client.js
CHANGED
|
@@ -4,17 +4,70 @@ exports.sellercloudClient = void 0;
|
|
|
4
4
|
const tslib_1 = require("tslib");
|
|
5
5
|
const pieces_common_1 = require("@activepieces/pieces-common");
|
|
6
6
|
const shared_1 = require("@activepieces/shared");
|
|
7
|
+
// Tokens last an hour and /token is itself rate limited, so a flow that runs many
|
|
8
|
+
// actions must not log in once per request.
|
|
9
|
+
const tokenCache = new Map();
|
|
7
10
|
function getToken(_a) {
|
|
8
11
|
return tslib_1.__awaiter(this, arguments, void 0, function* ({ auth }) {
|
|
9
|
-
const
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
12
|
+
const cacheKey = `${apiBase({ auth })}|${auth.username}`;
|
|
13
|
+
const cached = tokenCache.get(cacheKey);
|
|
14
|
+
if (cached && cached.expiresAt > Date.now()) {
|
|
15
|
+
return cached.token;
|
|
16
|
+
}
|
|
17
|
+
const response = yield sendWithRetry({
|
|
18
|
+
request: {
|
|
19
|
+
method: pieces_common_1.HttpMethod.POST,
|
|
20
|
+
url: `${apiBase({ auth })}/token`,
|
|
21
|
+
headers: { 'Content-Type': 'application/json' },
|
|
22
|
+
body: { Username: auth.username, Password: auth.password },
|
|
23
|
+
},
|
|
14
24
|
});
|
|
15
|
-
|
|
25
|
+
const token = response.access_token;
|
|
26
|
+
tokenCache.set(cacheKey, { token, expiresAt: Date.now() + TOKEN_TTL_MS });
|
|
27
|
+
return token;
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
// SellerCloud answers 409 {"Error":"Too many requests.","RateLimitResetTime":"..."} when
|
|
31
|
+
// throttling, so the reset time in the body is what to wait for, not a fixed backoff.
|
|
32
|
+
function sendWithRetry(_a) {
|
|
33
|
+
return tslib_1.__awaiter(this, arguments, void 0, function* ({ request, attempt = 1 }) {
|
|
34
|
+
const { data, error } = yield (0, shared_1.tryCatch)(() => pieces_common_1.httpClient.sendRequest(request));
|
|
35
|
+
if (!error) {
|
|
36
|
+
return data.body;
|
|
37
|
+
}
|
|
38
|
+
const delay = retryDelayMs({ error, attempt });
|
|
39
|
+
if (delay === null) {
|
|
40
|
+
throw error;
|
|
41
|
+
}
|
|
42
|
+
yield new Promise((resolve) => setTimeout(resolve, delay));
|
|
43
|
+
return sendWithRetry({ request, attempt: attempt + 1 });
|
|
16
44
|
});
|
|
17
45
|
}
|
|
46
|
+
function retryDelayMs({ error, attempt }) {
|
|
47
|
+
if (attempt >= MAX_ATTEMPTS || !(error instanceof pieces_common_1.HttpError)) {
|
|
48
|
+
return null;
|
|
49
|
+
}
|
|
50
|
+
const status = error.response.status;
|
|
51
|
+
if (status === RATE_LIMITED_STATUS || status === 429) {
|
|
52
|
+
const wait = rateLimitWaitMs({ body: error.response.body });
|
|
53
|
+
return wait !== null && wait <= MAX_RATE_LIMIT_WAIT_MS ? wait : null;
|
|
54
|
+
}
|
|
55
|
+
if (TRANSIENT_STATUSES.includes(status)) {
|
|
56
|
+
return BASE_BACKOFF_MS * Math.pow(2, (attempt - 1));
|
|
57
|
+
}
|
|
58
|
+
return null;
|
|
59
|
+
}
|
|
60
|
+
function rateLimitWaitMs({ body }) {
|
|
61
|
+
const resetTime = body === null || body === void 0 ? void 0 : body.RateLimitResetTime;
|
|
62
|
+
if (!resetTime) {
|
|
63
|
+
return BASE_BACKOFF_MS;
|
|
64
|
+
}
|
|
65
|
+
const resetAt = Date.parse(resetTime);
|
|
66
|
+
if (Number.isNaN(resetAt)) {
|
|
67
|
+
return BASE_BACKOFF_MS;
|
|
68
|
+
}
|
|
69
|
+
return Math.max(BASE_BACKOFF_MS, resetAt - Date.now() + RATE_LIMIT_PADDING_MS);
|
|
70
|
+
}
|
|
18
71
|
function tryGetToken(_a) {
|
|
19
72
|
return tslib_1.__awaiter(this, arguments, void 0, function* ({ auth }) {
|
|
20
73
|
const { error } = yield (0, shared_1.tryCatch)(() => getToken({ auth }));
|
|
@@ -25,20 +78,22 @@ function tryGetToken(_a) {
|
|
|
25
78
|
function request(_a) {
|
|
26
79
|
return tslib_1.__awaiter(this, arguments, void 0, function* ({ auth, token, method, path, queryParams, body }) {
|
|
27
80
|
const accessToken = token !== null && token !== void 0 ? token : yield getToken({ auth });
|
|
28
|
-
const { data, error } = yield (0, shared_1.tryCatch)(() =>
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
81
|
+
const { data, error } = yield (0, shared_1.tryCatch)(() => sendWithRetry({
|
|
82
|
+
request: {
|
|
83
|
+
method,
|
|
84
|
+
url: `${apiBase({ auth })}${path}`,
|
|
85
|
+
headers: {
|
|
86
|
+
Authorization: `Bearer ${accessToken}`,
|
|
87
|
+
'Content-Type': 'application/json',
|
|
88
|
+
},
|
|
89
|
+
queryParams: compactQuery({ queryParams }),
|
|
90
|
+
body,
|
|
34
91
|
},
|
|
35
|
-
queryParams: compactQuery({ queryParams }),
|
|
36
|
-
body,
|
|
37
92
|
}));
|
|
38
93
|
if (error) {
|
|
39
94
|
throw new Error(`SellerCloud ${method} ${path} failed: ${describeError({ error })}`);
|
|
40
95
|
}
|
|
41
|
-
return data
|
|
96
|
+
return data;
|
|
42
97
|
});
|
|
43
98
|
}
|
|
44
99
|
function listWarehouses(_a) {
|
|
@@ -46,10 +101,20 @@ function listWarehouses(_a) {
|
|
|
46
101
|
return fetchAllPages({ auth, token, path: '/Warehouses' });
|
|
47
102
|
});
|
|
48
103
|
}
|
|
104
|
+
// /Catalog pages 50 at a time, so one match pass is ~50 requests against a rate-limited
|
|
105
|
+
// API. Six PDC flows rebuilding the same list would spend most of the budget on it.
|
|
106
|
+
const catalogCache = new Map();
|
|
49
107
|
function listCatalogProductIds(_a) {
|
|
50
108
|
return tslib_1.__awaiter(this, arguments, void 0, function* ({ auth, token }) {
|
|
109
|
+
const cacheKey = apiBase({ auth });
|
|
110
|
+
const cached = catalogCache.get(cacheKey);
|
|
111
|
+
if (cached && cached.expiresAt > Date.now()) {
|
|
112
|
+
return cached.ids;
|
|
113
|
+
}
|
|
51
114
|
const products = yield fetchAllPages({ auth, token, path: '/Catalog' });
|
|
52
|
-
|
|
115
|
+
const ids = products.map((product) => product.ID);
|
|
116
|
+
catalogCache.set(cacheKey, { ids, expiresAt: Date.now() + CATALOG_TTL_MS });
|
|
117
|
+
return ids;
|
|
53
118
|
});
|
|
54
119
|
}
|
|
55
120
|
// SellerCloud silently caps pageSize (50 on /Catalog), so stop on the running total, not on pageNumber * pageSize.
|
|
@@ -79,12 +144,26 @@ function compactQuery({ queryParams }) {
|
|
|
79
144
|
.map(([key, value]) => [key, String(value)]));
|
|
80
145
|
}
|
|
81
146
|
function describeError({ error }) {
|
|
82
|
-
if (error instanceof pieces_common_1.HttpError) {
|
|
83
|
-
return
|
|
147
|
+
if (!(error instanceof pieces_common_1.HttpError)) {
|
|
148
|
+
return error.message;
|
|
149
|
+
}
|
|
150
|
+
const { status, body } = error.response;
|
|
151
|
+
if (status === RATE_LIMITED_STATUS) {
|
|
152
|
+
const resetTime = body === null || body === void 0 ? void 0 : body.RateLimitResetTime;
|
|
153
|
+
return `rate limited by SellerCloud${resetTime ? `, resets at ${resetTime}` : ''}`;
|
|
84
154
|
}
|
|
85
|
-
return
|
|
155
|
+
return `${status} ${JSON.stringify(body)}`;
|
|
86
156
|
}
|
|
87
157
|
const MAX_PAGE_SIZE = 500;
|
|
158
|
+
const TOKEN_TTL_MS = 50 * 60 * 1000;
|
|
159
|
+
const CATALOG_TTL_MS = 15 * 60 * 1000;
|
|
160
|
+
const RATE_LIMITED_STATUS = 409;
|
|
161
|
+
const TRANSIENT_STATUSES = [502, 503, 504];
|
|
162
|
+
const MAX_ATTEMPTS = 4;
|
|
163
|
+
const BASE_BACKOFF_MS = 2000;
|
|
164
|
+
const RATE_LIMIT_PADDING_MS = 1000;
|
|
165
|
+
// A flow step has a budget, so a long lockout should fail with the reset time rather than hang.
|
|
166
|
+
const MAX_RATE_LIMIT_WAIT_MS = 120 * 1000;
|
|
88
167
|
exports.sellercloudClient = {
|
|
89
168
|
getToken,
|
|
90
169
|
tryGetToken,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../../../src/lib/common/client.ts"],"names":[],"mappings":";;;;AAAA,+DAA6F;AAC7F,iDAAgD;AAEhD,SAAe,QAAQ;iEAAC,EAAE,IAAI,EAAkC;QAC5D,MAAM,QAAQ,GAAG,MAAM,
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../../../src/lib/common/client.ts"],"names":[],"mappings":"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"}
|