@haatlabs-core/provider-shopify 0.12.4 → 0.12.6
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/cjs/index.d.ts +2 -2
- package/dist/cjs/index.js +9 -1
- package/dist/cjs/shopify-source.d.ts +19 -0
- package/dist/cjs/shopify-source.js +61 -14
- package/dist/cjs/testing.d.ts +6 -0
- package/dist/cjs/testing.js +10 -0
- package/dist/index.d.ts +2 -2
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/shopify-source.d.ts +19 -0
- package/dist/shopify-source.js +58 -12
- package/dist/shopify-source.js.map +1 -1
- package/dist/testing.d.ts +6 -0
- package/dist/testing.js +10 -0
- package/dist/testing.js.map +1 -1
- package/package.json +6 -6
package/dist/cjs/index.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
export * from './errors.js';
|
|
2
2
|
export * from './refs.js';
|
|
3
|
-
export { createShopifySource, DEFAULT_SHOPIFY_MAX_RESPONSE_BYTES, SHOPIFY_CACHE_SECONDS, SHOPIFY_IMAGE_HOSTS, } from './shopify-source.js';
|
|
4
|
-
export type { ShopifySourceOptions } from './shopify-source.js';
|
|
3
|
+
export { createShopifySource, DEFAULT_SHOPIFY_MAX_RESPONSE_BYTES, SHOPIFY_CACHE_SECONDS, SHOPIFY_IMAGE_HOSTS, SHOPIFY_BACKGROUND_WAITS_MS, SHOPIFY_INTERACTIVE_WAIT_MS, SHOPIFY_MAX_RETRY_AFTER_MS, retryAfterMs, } from './shopify-source.js';
|
|
4
|
+
export type { ShopifySourceOptions, ShopifyStoreGate } from './shopify-source.js';
|
package/dist/cjs/index.js
CHANGED
|
@@ -19,9 +19,13 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
|
|
|
19
19
|
var index_exports = {};
|
|
20
20
|
__export(index_exports, {
|
|
21
21
|
DEFAULT_SHOPIFY_MAX_RESPONSE_BYTES: () => import_shopify_source.DEFAULT_SHOPIFY_MAX_RESPONSE_BYTES,
|
|
22
|
+
SHOPIFY_BACKGROUND_WAITS_MS: () => import_shopify_source.SHOPIFY_BACKGROUND_WAITS_MS,
|
|
22
23
|
SHOPIFY_CACHE_SECONDS: () => import_shopify_source.SHOPIFY_CACHE_SECONDS,
|
|
23
24
|
SHOPIFY_IMAGE_HOSTS: () => import_shopify_source.SHOPIFY_IMAGE_HOSTS,
|
|
24
|
-
|
|
25
|
+
SHOPIFY_INTERACTIVE_WAIT_MS: () => import_shopify_source.SHOPIFY_INTERACTIVE_WAIT_MS,
|
|
26
|
+
SHOPIFY_MAX_RETRY_AFTER_MS: () => import_shopify_source.SHOPIFY_MAX_RETRY_AFTER_MS,
|
|
27
|
+
createShopifySource: () => import_shopify_source.createShopifySource,
|
|
28
|
+
retryAfterMs: () => import_shopify_source.retryAfterMs
|
|
25
29
|
});
|
|
26
30
|
module.exports = __toCommonJS(index_exports);
|
|
27
31
|
__reExport(index_exports, require("./errors.js"), module.exports);
|
|
@@ -30,9 +34,13 @@ var import_shopify_source = require("./shopify-source.js");
|
|
|
30
34
|
// Annotate the CommonJS export names for ESM import in node:
|
|
31
35
|
0 && (module.exports = {
|
|
32
36
|
DEFAULT_SHOPIFY_MAX_RESPONSE_BYTES,
|
|
37
|
+
SHOPIFY_BACKGROUND_WAITS_MS,
|
|
33
38
|
SHOPIFY_CACHE_SECONDS,
|
|
34
39
|
SHOPIFY_IMAGE_HOSTS,
|
|
40
|
+
SHOPIFY_INTERACTIVE_WAIT_MS,
|
|
41
|
+
SHOPIFY_MAX_RETRY_AFTER_MS,
|
|
35
42
|
createShopifySource,
|
|
43
|
+
retryAfterMs,
|
|
36
44
|
...require("./errors.js"),
|
|
37
45
|
...require("./refs.js")
|
|
38
46
|
});
|
|
@@ -21,6 +21,25 @@ export interface ShopifySourceOptions {
|
|
|
21
21
|
network?: Pick<SafeFetchOptions, 'allowHttp' | 'allowedPorts' | 'lookup' | 'isBlocked'> & {
|
|
22
22
|
storeUrl?: (host: string) => string;
|
|
23
23
|
};
|
|
24
|
+
/**
|
|
25
|
+
* Each store's turn, shared by every process that reads it (one IP, one pace per store):
|
|
26
|
+
* `take` waits for it, false when none comes within `maxWaitMs`; `ease` slows the store
|
|
27
|
+
* down after it pushed back. Absent: no shared pace.
|
|
28
|
+
*/
|
|
29
|
+
gate?: ShopifyStoreGate;
|
|
30
|
+
/** How a wait is waited (tests). */
|
|
31
|
+
sleep?: (ms: number) => Promise<void>;
|
|
32
|
+
}
|
|
33
|
+
export interface ShopifyStoreGate {
|
|
34
|
+
take(host: string, maxWaitMs: number): Promise<boolean>;
|
|
35
|
+
ease(host: string): Promise<void>;
|
|
24
36
|
}
|
|
37
|
+
/** A person waiting: one more try, the whole wait at most this long. */
|
|
38
|
+
export declare const SHOPIFY_INTERACTIVE_WAIT_MS = 10000;
|
|
39
|
+
/** Background reads (tracking): these waits, or the store's Retry-After up to the cap. */
|
|
40
|
+
export declare const SHOPIFY_BACKGROUND_WAITS_MS: readonly [5000, 15000, 45000];
|
|
41
|
+
export declare const SHOPIFY_MAX_RETRY_AFTER_MS = 120000;
|
|
42
|
+
/** A Retry-After header as milliseconds: seconds, or a date; undefined when absent or unreadable. */
|
|
43
|
+
export declare function retryAfterMs(header: string | null, now?: number): number | undefined;
|
|
25
44
|
/** Shopify's public store feeds as a product source. Every request is checked before it is sent. */
|
|
26
45
|
export declare function createShopifySource(options: ShopifySourceOptions): ProductSource;
|
|
@@ -18,9 +18,13 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
|
|
|
18
18
|
var shopify_source_exports = {};
|
|
19
19
|
__export(shopify_source_exports, {
|
|
20
20
|
DEFAULT_SHOPIFY_MAX_RESPONSE_BYTES: () => DEFAULT_SHOPIFY_MAX_RESPONSE_BYTES,
|
|
21
|
+
SHOPIFY_BACKGROUND_WAITS_MS: () => SHOPIFY_BACKGROUND_WAITS_MS,
|
|
21
22
|
SHOPIFY_CACHE_SECONDS: () => SHOPIFY_CACHE_SECONDS,
|
|
22
23
|
SHOPIFY_IMAGE_HOSTS: () => SHOPIFY_IMAGE_HOSTS,
|
|
23
|
-
|
|
24
|
+
SHOPIFY_INTERACTIVE_WAIT_MS: () => SHOPIFY_INTERACTIVE_WAIT_MS,
|
|
25
|
+
SHOPIFY_MAX_RETRY_AFTER_MS: () => SHOPIFY_MAX_RETRY_AFTER_MS,
|
|
26
|
+
createShopifySource: () => createShopifySource,
|
|
27
|
+
retryAfterMs: () => retryAfterMs
|
|
24
28
|
});
|
|
25
29
|
module.exports = __toCommonJS(shopify_source_exports);
|
|
26
30
|
var import_provider_amazon = require("@haatlabs-core/provider-amazon");
|
|
@@ -34,6 +38,19 @@ const DEFAULT_SHOPIFY_MAX_RESPONSE_BYTES = 4 * 1024 * 1024;
|
|
|
34
38
|
const SEARCH_LIMIT = 10;
|
|
35
39
|
const MAX_IMAGES = 30;
|
|
36
40
|
const MAX_VARIANTS = 250;
|
|
41
|
+
const SHOPIFY_INTERACTIVE_WAIT_MS = 1e4;
|
|
42
|
+
const INTERACTIVE_RETRY_MS = 2e3;
|
|
43
|
+
const SHOPIFY_BACKGROUND_WAITS_MS = [5e3, 15e3, 45e3];
|
|
44
|
+
const SHOPIFY_MAX_RETRY_AFTER_MS = 12e4;
|
|
45
|
+
function retryAfterMs(header, now = Date.now()) {
|
|
46
|
+
if (!header)
|
|
47
|
+
return void 0;
|
|
48
|
+
const seconds = Number(header);
|
|
49
|
+
if (Number.isFinite(seconds))
|
|
50
|
+
return Math.max(0, seconds * 1e3);
|
|
51
|
+
const at = Date.parse(header);
|
|
52
|
+
return Number.isFinite(at) ? Math.max(0, at - now) : void 0;
|
|
53
|
+
}
|
|
37
54
|
const INFO = {
|
|
38
55
|
id: import_refs.SHOPIFY_SOURCE_ID,
|
|
39
56
|
name: "Shopify stores",
|
|
@@ -62,6 +79,7 @@ const https = (src) => {
|
|
|
62
79
|
};
|
|
63
80
|
function createShopifySource(options) {
|
|
64
81
|
const storeUrl = options.network?.storeUrl ?? ((host) => `https://${host}`);
|
|
82
|
+
const sleep = options.sleep ?? ((ms) => new Promise((resolve) => setTimeout(resolve, ms)));
|
|
65
83
|
const fetchOptions = {
|
|
66
84
|
timeoutMs: options.timeoutMs,
|
|
67
85
|
maxBytes: options.maxResponseBytes ?? DEFAULT_SHOPIFY_MAX_RESPONSE_BYTES,
|
|
@@ -71,14 +89,39 @@ function createShopifySource(options) {
|
|
|
71
89
|
...options.network,
|
|
72
90
|
reject: (code, message, { cause, transient }) => code === "SSRF_BLOCKED" ? (0, import_errors.createShopifySourceError)(import_errors.ShopifySourceErrorCode.SOURCE_BAD_REQUEST, "This store's address can't be reached.", { cause }) : (0, import_errors.createShopifySourceError)(transient ? import_errors.ShopifySourceErrorCode.SOURCE_UNAVAILABLE : import_errors.ShopifySourceErrorCode.SOURCE_ERROR, transient ? "The store is not responding. Try again shortly." : message, { cause })
|
|
73
91
|
};
|
|
74
|
-
async function feed(host, path, schema, missing) {
|
|
75
|
-
const
|
|
92
|
+
async function feed(host, path, schema, missing, call) {
|
|
93
|
+
const background = call?.priority === "background";
|
|
94
|
+
const busy = () => (0, import_errors.createShopifySourceError)(import_errors.ShopifySourceErrorCode.SOURCE_UNAVAILABLE, "The store is busy. Try again shortly.");
|
|
95
|
+
let waited = 0;
|
|
96
|
+
let answer;
|
|
97
|
+
for (let attempt = 0; ; attempt += 1) {
|
|
98
|
+
if (options.gate) {
|
|
99
|
+
const budget = background ? SHOPIFY_MAX_RETRY_AFTER_MS : Math.max(0, SHOPIFY_INTERACTIVE_WAIT_MS - waited);
|
|
100
|
+
if (!await options.gate.take(host, budget))
|
|
101
|
+
throw busy();
|
|
102
|
+
}
|
|
103
|
+
answer = await (0, import_safe_fetch.safeFetch)(`${storeUrl(host)}${path}`, { method: "GET" }, fetchOptions);
|
|
104
|
+
if (answer.status !== 429 && answer.status < 500)
|
|
105
|
+
break;
|
|
106
|
+
await options.gate?.ease(host);
|
|
107
|
+
const told = retryAfterMs(answer.headers.get("retry-after"));
|
|
108
|
+
let wait;
|
|
109
|
+
if (background) {
|
|
110
|
+
const ours = SHOPIFY_BACKGROUND_WAITS_MS[attempt];
|
|
111
|
+
if (ours === void 0)
|
|
112
|
+
throw busy();
|
|
113
|
+
wait = told === void 0 ? ours : Math.min(told, SHOPIFY_MAX_RETRY_AFTER_MS);
|
|
114
|
+
} else {
|
|
115
|
+
wait = told ?? INTERACTIVE_RETRY_MS;
|
|
116
|
+
if (attempt >= 1 || waited + wait > SHOPIFY_INTERACTIVE_WAIT_MS)
|
|
117
|
+
throw busy();
|
|
118
|
+
}
|
|
119
|
+
waited += wait;
|
|
120
|
+
await sleep(wait);
|
|
121
|
+
}
|
|
76
122
|
if (answer.status === 404) {
|
|
77
123
|
throw missing === "product" ? (0, import_errors.createShopifySourceError)(import_errors.ShopifySourceErrorCode.SOURCE_PRODUCT_NOT_FOUND, "This store has no such product.") : (0, import_errors.createShopifySourceError)(import_errors.ShopifySourceErrorCode.SOURCE_NOT_SHOPIFY, import_errors.NOT_SHOPIFY);
|
|
78
124
|
}
|
|
79
|
-
if (answer.status === 429 || answer.status >= 500) {
|
|
80
|
-
throw (0, import_errors.createShopifySourceError)(import_errors.ShopifySourceErrorCode.SOURCE_UNAVAILABLE, "The store is busy. Try again shortly.");
|
|
81
|
-
}
|
|
82
125
|
let json;
|
|
83
126
|
try {
|
|
84
127
|
json = answer.status === 200 ? JSON.parse(answer.body.toString("utf8")) : void 0;
|
|
@@ -90,31 +133,31 @@ function createShopifySource(options) {
|
|
|
90
133
|
throw (0, import_errors.createShopifySourceError)(import_errors.ShopifySourceErrorCode.SOURCE_NOT_SHOPIFY, import_errors.NOT_SHOPIFY);
|
|
91
134
|
return parsed.data;
|
|
92
135
|
}
|
|
93
|
-
const meta = (host) => feed(host, "/meta.json", import_raw.RawMetaSchema, "store");
|
|
136
|
+
const meta = (host, call) => feed(host, "/meta.json", import_raw.RawMetaSchema, "store", call);
|
|
94
137
|
return {
|
|
95
138
|
info: INFO,
|
|
96
139
|
cacheSeconds: SHOPIFY_CACHE_SECONDS,
|
|
97
|
-
async product(input) {
|
|
140
|
+
async product(input, call) {
|
|
98
141
|
const named = (0, import_refs.parseShopifyRefId)(input.id);
|
|
99
142
|
if (input.market !== import_refs.SHOPIFY_MARKET || !named) {
|
|
100
143
|
throw (0, import_errors.createShopifySourceError)(import_errors.ShopifySourceErrorCode.SOURCE_BAD_REQUEST, "This is not a Shopify product.");
|
|
101
144
|
}
|
|
102
|
-
const store = await meta(named.host);
|
|
103
|
-
const raw = await feed(named.host, `/products/${named.handle}.js`, import_raw.RawProductSchema, "product");
|
|
145
|
+
const store = await meta(named.host, call);
|
|
146
|
+
const raw = await feed(named.host, `/products/${named.handle}.js`, import_raw.RawProductSchema, "product", call);
|
|
104
147
|
return mapProduct(named.host, store, raw);
|
|
105
148
|
},
|
|
106
|
-
async search(query) {
|
|
149
|
+
async search(query, call) {
|
|
107
150
|
if (!query.store) {
|
|
108
151
|
throw (0, import_errors.createShopifySourceError)(import_errors.ShopifySourceErrorCode.SOURCE_BAD_REQUEST, "Name the store to search.");
|
|
109
152
|
}
|
|
110
153
|
const host = query.store;
|
|
111
|
-
const store = await meta(host);
|
|
154
|
+
const store = await meta(host, call);
|
|
112
155
|
const params = new URLSearchParams({
|
|
113
156
|
q: query.q,
|
|
114
157
|
"resources[type]": "product",
|
|
115
158
|
"resources[limit]": String(SEARCH_LIMIT)
|
|
116
159
|
});
|
|
117
|
-
const raw = await feed(host, `/search/suggest.json?${params.toString()}`, import_raw.RawSuggestSchema, "store");
|
|
160
|
+
const raw = await feed(host, `/search/suggest.json?${params.toString()}`, import_raw.RawSuggestSchema, "store", call);
|
|
118
161
|
const results = (raw.resources.results.products ?? []).flatMap((item) => {
|
|
119
162
|
const ref = (0, import_refs.shopifyRef)(host, item.handle);
|
|
120
163
|
if (!ref)
|
|
@@ -217,7 +260,11 @@ function mapProduct(host, store, raw) {
|
|
|
217
260
|
// Annotate the CommonJS export names for ESM import in node:
|
|
218
261
|
0 && (module.exports = {
|
|
219
262
|
DEFAULT_SHOPIFY_MAX_RESPONSE_BYTES,
|
|
263
|
+
SHOPIFY_BACKGROUND_WAITS_MS,
|
|
220
264
|
SHOPIFY_CACHE_SECONDS,
|
|
221
265
|
SHOPIFY_IMAGE_HOSTS,
|
|
222
|
-
|
|
266
|
+
SHOPIFY_INTERACTIVE_WAIT_MS,
|
|
267
|
+
SHOPIFY_MAX_RETRY_AFTER_MS,
|
|
268
|
+
createShopifySource,
|
|
269
|
+
retryAfterMs
|
|
223
270
|
});
|
package/dist/cjs/testing.d.ts
CHANGED
|
@@ -9,6 +9,12 @@ export interface FakeShopifyStoreOptions {
|
|
|
9
9
|
addresses?: Record<string, string>;
|
|
10
10
|
/** Every feed answers with the store's password page. */
|
|
11
11
|
passwordProtected?: boolean;
|
|
12
|
+
/** The first `times` requests answer `status` (429 or 5xx), with a Retry-After when given. */
|
|
13
|
+
busy?: {
|
|
14
|
+
status: number;
|
|
15
|
+
times: number;
|
|
16
|
+
retryAfter?: string;
|
|
17
|
+
};
|
|
12
18
|
}
|
|
13
19
|
export interface FakeShopifyStore {
|
|
14
20
|
/** Pass as `createShopifySource({ network })`: every store host reaches this server. */
|
package/dist/cjs/testing.js
CHANGED
|
@@ -25,6 +25,7 @@ var import_safe_fetch = require("@haatlabs-core/providers/safe-fetch");
|
|
|
25
25
|
var import_fixtures = require("./fixtures/index.js");
|
|
26
26
|
async function startFakeShopifyStore(options = {}) {
|
|
27
27
|
const seen = [];
|
|
28
|
+
let busyAnswered = 0;
|
|
28
29
|
const server = (0, import_node_http.createServer)((request, response) => {
|
|
29
30
|
const path = request.url ?? "/";
|
|
30
31
|
seen.push({ path, host: (request.headers.host ?? "").split(":")[0] ?? "" });
|
|
@@ -32,6 +33,15 @@ async function startFakeShopifyStore(options = {}) {
|
|
|
32
33
|
response.writeHead(200, { "content-type": "application/json" });
|
|
33
34
|
response.end(JSON.stringify(body));
|
|
34
35
|
};
|
|
36
|
+
if (options.busy && busyAnswered < options.busy.times) {
|
|
37
|
+
busyAnswered += 1;
|
|
38
|
+
response.writeHead(options.busy.status, {
|
|
39
|
+
"content-type": "text/plain",
|
|
40
|
+
...options.busy.retryAfter ? { "retry-after": options.busy.retryAfter } : {}
|
|
41
|
+
});
|
|
42
|
+
response.end("busy");
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
35
45
|
if (options.passwordProtected) {
|
|
36
46
|
response.writeHead(200, { "content-type": "text/html" });
|
|
37
47
|
response.end("<html><body>Enter store using password</body></html>");
|
package/dist/index.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
export * from './errors.js';
|
|
2
2
|
export * from './refs.js';
|
|
3
|
-
export { createShopifySource, DEFAULT_SHOPIFY_MAX_RESPONSE_BYTES, SHOPIFY_CACHE_SECONDS, SHOPIFY_IMAGE_HOSTS, } from './shopify-source.js';
|
|
4
|
-
export type { ShopifySourceOptions } from './shopify-source.js';
|
|
3
|
+
export { createShopifySource, DEFAULT_SHOPIFY_MAX_RESPONSE_BYTES, SHOPIFY_CACHE_SECONDS, SHOPIFY_IMAGE_HOSTS, SHOPIFY_BACKGROUND_WAITS_MS, SHOPIFY_INTERACTIVE_WAIT_MS, SHOPIFY_MAX_RETRY_AFTER_MS, retryAfterMs, } from './shopify-source.js';
|
|
4
|
+
export type { ShopifySourceOptions, ShopifyStoreGate } from './shopify-source.js';
|
package/dist/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
export * from './errors.js';
|
|
2
2
|
export * from './refs.js';
|
|
3
|
-
export { createShopifySource, DEFAULT_SHOPIFY_MAX_RESPONSE_BYTES, SHOPIFY_CACHE_SECONDS, SHOPIFY_IMAGE_HOSTS, } from './shopify-source.js';
|
|
3
|
+
export { createShopifySource, DEFAULT_SHOPIFY_MAX_RESPONSE_BYTES, SHOPIFY_CACHE_SECONDS, SHOPIFY_IMAGE_HOSTS, SHOPIFY_BACKGROUND_WAITS_MS, SHOPIFY_INTERACTIVE_WAIT_MS, SHOPIFY_MAX_RETRY_AFTER_MS, retryAfterMs, } from './shopify-source.js';
|
|
4
4
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,WAAW,CAAC;AAC1B,OAAO,EACL,mBAAmB,EACnB,kCAAkC,EAClC,qBAAqB,EACrB,mBAAmB,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,WAAW,CAAC;AAC1B,OAAO,EACL,mBAAmB,EACnB,kCAAkC,EAClC,qBAAqB,EACrB,mBAAmB,EACnB,2BAA2B,EAC3B,2BAA2B,EAC3B,0BAA0B,EAC1B,YAAY,GACb,MAAM,qBAAqB,CAAC"}
|
package/dist/shopify-source.d.ts
CHANGED
|
@@ -21,6 +21,25 @@ export interface ShopifySourceOptions {
|
|
|
21
21
|
network?: Pick<SafeFetchOptions, 'allowHttp' | 'allowedPorts' | 'lookup' | 'isBlocked'> & {
|
|
22
22
|
storeUrl?: (host: string) => string;
|
|
23
23
|
};
|
|
24
|
+
/**
|
|
25
|
+
* Each store's turn, shared by every process that reads it (one IP, one pace per store):
|
|
26
|
+
* `take` waits for it, false when none comes within `maxWaitMs`; `ease` slows the store
|
|
27
|
+
* down after it pushed back. Absent: no shared pace.
|
|
28
|
+
*/
|
|
29
|
+
gate?: ShopifyStoreGate;
|
|
30
|
+
/** How a wait is waited (tests). */
|
|
31
|
+
sleep?: (ms: number) => Promise<void>;
|
|
32
|
+
}
|
|
33
|
+
export interface ShopifyStoreGate {
|
|
34
|
+
take(host: string, maxWaitMs: number): Promise<boolean>;
|
|
35
|
+
ease(host: string): Promise<void>;
|
|
24
36
|
}
|
|
37
|
+
/** A person waiting: one more try, the whole wait at most this long. */
|
|
38
|
+
export declare const SHOPIFY_INTERACTIVE_WAIT_MS = 10000;
|
|
39
|
+
/** Background reads (tracking): these waits, or the store's Retry-After up to the cap. */
|
|
40
|
+
export declare const SHOPIFY_BACKGROUND_WAITS_MS: readonly [5000, 15000, 45000];
|
|
41
|
+
export declare const SHOPIFY_MAX_RETRY_AFTER_MS = 120000;
|
|
42
|
+
/** A Retry-After header as milliseconds: seconds, or a date; undefined when absent or unreadable. */
|
|
43
|
+
export declare function retryAfterMs(header: string | null, now?: number): number | undefined;
|
|
25
44
|
/** Shopify's public store feeds as a product source. Every request is checked before it is sent. */
|
|
26
45
|
export declare function createShopifySource(options: ShopifySourceOptions): ProductSource;
|
package/dist/shopify-source.js
CHANGED
|
@@ -12,6 +12,22 @@ export const DEFAULT_SHOPIFY_MAX_RESPONSE_BYTES = 4 * 1024 * 1024;
|
|
|
12
12
|
const SEARCH_LIMIT = 10;
|
|
13
13
|
const MAX_IMAGES = 30;
|
|
14
14
|
const MAX_VARIANTS = 250;
|
|
15
|
+
/** A person waiting: one more try, the whole wait at most this long. */
|
|
16
|
+
export const SHOPIFY_INTERACTIVE_WAIT_MS = 10_000;
|
|
17
|
+
const INTERACTIVE_RETRY_MS = 2_000;
|
|
18
|
+
/** Background reads (tracking): these waits, or the store's Retry-After up to the cap. */
|
|
19
|
+
export const SHOPIFY_BACKGROUND_WAITS_MS = [5_000, 15_000, 45_000];
|
|
20
|
+
export const SHOPIFY_MAX_RETRY_AFTER_MS = 120_000;
|
|
21
|
+
/** A Retry-After header as milliseconds: seconds, or a date; undefined when absent or unreadable. */
|
|
22
|
+
export function retryAfterMs(header, now = Date.now()) {
|
|
23
|
+
if (!header)
|
|
24
|
+
return undefined;
|
|
25
|
+
const seconds = Number(header);
|
|
26
|
+
if (Number.isFinite(seconds))
|
|
27
|
+
return Math.max(0, seconds * 1000);
|
|
28
|
+
const at = Date.parse(header);
|
|
29
|
+
return Number.isFinite(at) ? Math.max(0, at - now) : undefined;
|
|
30
|
+
}
|
|
15
31
|
const INFO = {
|
|
16
32
|
id: SHOPIFY_SOURCE_ID,
|
|
17
33
|
name: 'Shopify stores',
|
|
@@ -42,6 +58,7 @@ const https = (src) => {
|
|
|
42
58
|
/** Shopify's public store feeds as a product source. Every request is checked before it is sent. */
|
|
43
59
|
export function createShopifySource(options) {
|
|
44
60
|
const storeUrl = options.network?.storeUrl ?? ((host) => `https://${host}`);
|
|
61
|
+
const sleep = options.sleep ?? ((ms) => new Promise((resolve) => setTimeout(resolve, ms)));
|
|
45
62
|
const fetchOptions = {
|
|
46
63
|
timeoutMs: options.timeoutMs,
|
|
47
64
|
maxBytes: options.maxResponseBytes ?? DEFAULT_SHOPIFY_MAX_RESPONSE_BYTES,
|
|
@@ -56,16 +73,45 @@ export function createShopifySource(options) {
|
|
|
56
73
|
: ShopifySourceErrorCode.SOURCE_ERROR, transient ? 'The store is not responding. Try again shortly.' : message, { cause }),
|
|
57
74
|
};
|
|
58
75
|
/** One feed of a store, as JSON. `missing` is what a 404 means for this feed. */
|
|
59
|
-
async function feed(host, path, schema, missing) {
|
|
60
|
-
const
|
|
76
|
+
async function feed(host, path, schema, missing, call) {
|
|
77
|
+
const background = call?.priority === 'background';
|
|
78
|
+
const busy = () => createShopifySourceError(ShopifySourceErrorCode.SOURCE_UNAVAILABLE, 'The store is busy. Try again shortly.');
|
|
79
|
+
let waited = 0;
|
|
80
|
+
let answer;
|
|
81
|
+
for (let attempt = 0;; attempt += 1) {
|
|
82
|
+
if (options.gate) {
|
|
83
|
+
const budget = background
|
|
84
|
+
? SHOPIFY_MAX_RETRY_AFTER_MS
|
|
85
|
+
: Math.max(0, SHOPIFY_INTERACTIVE_WAIT_MS - waited);
|
|
86
|
+
if (!(await options.gate.take(host, budget)))
|
|
87
|
+
throw busy();
|
|
88
|
+
}
|
|
89
|
+
answer = await safeFetch(`${storeUrl(host)}${path}`, { method: 'GET' }, fetchOptions);
|
|
90
|
+
if (answer.status !== 429 && answer.status < 500)
|
|
91
|
+
break;
|
|
92
|
+
// The store pushed back: it is read more slowly for a while, and asked again after a wait.
|
|
93
|
+
await options.gate?.ease(host);
|
|
94
|
+
const told = retryAfterMs(answer.headers.get('retry-after'));
|
|
95
|
+
let wait;
|
|
96
|
+
if (background) {
|
|
97
|
+
const ours = SHOPIFY_BACKGROUND_WAITS_MS[attempt];
|
|
98
|
+
if (ours === undefined)
|
|
99
|
+
throw busy();
|
|
100
|
+
wait = told === undefined ? ours : Math.min(told, SHOPIFY_MAX_RETRY_AFTER_MS);
|
|
101
|
+
}
|
|
102
|
+
else {
|
|
103
|
+
wait = told ?? INTERACTIVE_RETRY_MS;
|
|
104
|
+
if (attempt >= 1 || waited + wait > SHOPIFY_INTERACTIVE_WAIT_MS)
|
|
105
|
+
throw busy();
|
|
106
|
+
}
|
|
107
|
+
waited += wait;
|
|
108
|
+
await sleep(wait);
|
|
109
|
+
}
|
|
61
110
|
if (answer.status === 404) {
|
|
62
111
|
throw missing === 'product'
|
|
63
112
|
? createShopifySourceError(ShopifySourceErrorCode.SOURCE_PRODUCT_NOT_FOUND, 'This store has no such product.')
|
|
64
113
|
: createShopifySourceError(ShopifySourceErrorCode.SOURCE_NOT_SHOPIFY, NOT_SHOPIFY);
|
|
65
114
|
}
|
|
66
|
-
if (answer.status === 429 || answer.status >= 500) {
|
|
67
|
-
throw createShopifySourceError(ShopifySourceErrorCode.SOURCE_UNAVAILABLE, 'The store is busy. Try again shortly.');
|
|
68
|
-
}
|
|
69
115
|
let json;
|
|
70
116
|
try {
|
|
71
117
|
json = answer.status === 200 ? JSON.parse(answer.body.toString('utf8')) : undefined;
|
|
@@ -78,31 +124,31 @@ export function createShopifySource(options) {
|
|
|
78
124
|
throw createShopifySourceError(ShopifySourceErrorCode.SOURCE_NOT_SHOPIFY, NOT_SHOPIFY);
|
|
79
125
|
return parsed.data;
|
|
80
126
|
}
|
|
81
|
-
const meta = (host) => feed(host, '/meta.json', RawMetaSchema, 'store');
|
|
127
|
+
const meta = (host, call) => feed(host, '/meta.json', RawMetaSchema, 'store', call);
|
|
82
128
|
return {
|
|
83
129
|
info: INFO,
|
|
84
130
|
cacheSeconds: SHOPIFY_CACHE_SECONDS,
|
|
85
|
-
async product(input) {
|
|
131
|
+
async product(input, call) {
|
|
86
132
|
const named = parseShopifyRefId(input.id);
|
|
87
133
|
if (input.market !== SHOPIFY_MARKET || !named) {
|
|
88
134
|
throw createShopifySourceError(ShopifySourceErrorCode.SOURCE_BAD_REQUEST, 'This is not a Shopify product.');
|
|
89
135
|
}
|
|
90
|
-
const store = await meta(named.host);
|
|
91
|
-
const raw = await feed(named.host, `/products/${named.handle}.js`, RawProductSchema, 'product');
|
|
136
|
+
const store = await meta(named.host, call);
|
|
137
|
+
const raw = await feed(named.host, `/products/${named.handle}.js`, RawProductSchema, 'product', call);
|
|
92
138
|
return mapProduct(named.host, store, raw);
|
|
93
139
|
},
|
|
94
|
-
async search(query) {
|
|
140
|
+
async search(query, call) {
|
|
95
141
|
if (!query.store) {
|
|
96
142
|
throw createShopifySourceError(ShopifySourceErrorCode.SOURCE_BAD_REQUEST, 'Name the store to search.');
|
|
97
143
|
}
|
|
98
144
|
const host = query.store;
|
|
99
|
-
const store = await meta(host);
|
|
145
|
+
const store = await meta(host, call);
|
|
100
146
|
const params = new URLSearchParams({
|
|
101
147
|
q: query.q,
|
|
102
148
|
'resources[type]': 'product',
|
|
103
149
|
'resources[limit]': String(SEARCH_LIMIT),
|
|
104
150
|
});
|
|
105
|
-
const raw = await feed(host, `/search/suggest.json?${params.toString()}`, RawSuggestSchema, 'store');
|
|
151
|
+
const raw = await feed(host, `/search/suggest.json?${params.toString()}`, RawSuggestSchema, 'store', call);
|
|
106
152
|
const results = (raw.resources.results.products ?? []).flatMap((item) => {
|
|
107
153
|
const ref = shopifyRef(host, item.handle);
|
|
108
154
|
if (!ref)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shopify-source.js","sourceRoot":"","sources":["../src/shopify-source.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"shopify-source.js","sourceRoot":"","sources":["../src/shopify-source.ts"],"names":[],"mappings":"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"}
|
package/dist/testing.d.ts
CHANGED
|
@@ -9,6 +9,12 @@ export interface FakeShopifyStoreOptions {
|
|
|
9
9
|
addresses?: Record<string, string>;
|
|
10
10
|
/** Every feed answers with the store's password page. */
|
|
11
11
|
passwordProtected?: boolean;
|
|
12
|
+
/** The first `times` requests answer `status` (429 or 5xx), with a Retry-After when given. */
|
|
13
|
+
busy?: {
|
|
14
|
+
status: number;
|
|
15
|
+
times: number;
|
|
16
|
+
retryAfter?: string;
|
|
17
|
+
};
|
|
12
18
|
}
|
|
13
19
|
export interface FakeShopifyStore {
|
|
14
20
|
/** Pass as `createShopifySource({ network })`: every store host reaches this server. */
|
package/dist/testing.js
CHANGED
|
@@ -7,6 +7,7 @@ import { shopifyFixtures } from './fixtures/index.js';
|
|
|
7
7
|
*/
|
|
8
8
|
export async function startFakeShopifyStore(options = {}) {
|
|
9
9
|
const seen = [];
|
|
10
|
+
let busyAnswered = 0;
|
|
10
11
|
const server = createServer((request, response) => {
|
|
11
12
|
const path = request.url ?? '/';
|
|
12
13
|
seen.push({ path, host: (request.headers.host ?? '').split(':')[0] ?? '' });
|
|
@@ -14,6 +15,15 @@ export async function startFakeShopifyStore(options = {}) {
|
|
|
14
15
|
response.writeHead(200, { 'content-type': 'application/json' });
|
|
15
16
|
response.end(JSON.stringify(body));
|
|
16
17
|
};
|
|
18
|
+
if (options.busy && busyAnswered < options.busy.times) {
|
|
19
|
+
busyAnswered += 1;
|
|
20
|
+
response.writeHead(options.busy.status, {
|
|
21
|
+
'content-type': 'text/plain',
|
|
22
|
+
...(options.busy.retryAfter ? { 'retry-after': options.busy.retryAfter } : {}),
|
|
23
|
+
});
|
|
24
|
+
response.end('busy');
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
17
27
|
if (options.passwordProtected) {
|
|
18
28
|
response.writeHead(200, { 'content-type': 'text/html' });
|
|
19
29
|
response.end('<html><body>Enter store using password</body></html>');
|
package/dist/testing.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"testing.js","sourceRoot":"","sources":["../src/testing.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAEzC,OAAO,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AAClE,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"testing.js","sourceRoot":"","sources":["../src/testing.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@haatlabs-core/provider-shopify",
|
|
3
|
-
"version": "0.12.
|
|
3
|
+
"version": "0.12.6",
|
|
4
4
|
"description": "Any Shopify store's public products as a ProductSource.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"haatlabs",
|
|
@@ -83,17 +83,17 @@
|
|
|
83
83
|
]
|
|
84
84
|
},
|
|
85
85
|
"dependencies": {
|
|
86
|
-
"@haatlabs-core/errors": "0.12.
|
|
87
|
-
"@haatlabs-core/
|
|
88
|
-
"@haatlabs-core/
|
|
86
|
+
"@haatlabs-core/errors": "0.12.6",
|
|
87
|
+
"@haatlabs-core/providers": "0.12.6",
|
|
88
|
+
"@haatlabs-core/provider-amazon": "0.12.6"
|
|
89
89
|
},
|
|
90
90
|
"peerDependencies": {
|
|
91
91
|
"zod": "^4.6.5"
|
|
92
92
|
},
|
|
93
93
|
"devDependencies": {
|
|
94
94
|
"zod": "^4.6.5",
|
|
95
|
-
"@haatlabs-core/
|
|
96
|
-
"@haatlabs-core/
|
|
95
|
+
"@haatlabs-core/tsconfig": "0.12.6",
|
|
96
|
+
"@haatlabs-core/vitest-config": "0.12.6"
|
|
97
97
|
},
|
|
98
98
|
"scripts": {
|
|
99
99
|
"build": "rm -rf dist && tsc -p tsconfig.build.json && node ../../scripts/build-cjs.mjs",
|