@haatlabs-core/provider-shopify 0.12.5 → 0.12.7

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.
@@ -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
- createShopifySource: () => import_shopify_source.createShopifySource
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
- createShopifySource: () => createShopifySource
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 answer = await (0, import_safe_fetch.safeFetch)(`${storeUrl(host)}${path}`, { method: "GET" }, fetchOptions);
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
- createShopifySource
266
+ SHOPIFY_INTERACTIVE_WAIT_MS,
267
+ SHOPIFY_MAX_RETRY_AFTER_MS,
268
+ createShopifySource,
269
+ retryAfterMs
223
270
  });
@@ -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. */
@@ -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,GACpB,MAAM,qBAAqB,CAAC"}
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"}
@@ -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;
@@ -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 answer = await safeFetch(`${storeUrl(host)}${path}`, { method: 'GET' }, fetchOptions);
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>');
@@ -1 +1 @@
1
- {"version":3,"file":"testing.js","sourceRoot":"","sources":["../src/testing.ts"],"names":[],"mappings":"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"}
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.5",
3
+ "version": "0.12.7",
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.5",
87
- "@haatlabs-core/provider-amazon": "0.12.5",
88
- "@haatlabs-core/providers": "0.12.5"
86
+ "@haatlabs-core/errors": "0.12.7",
87
+ "@haatlabs-core/provider-amazon": "0.12.7",
88
+ "@haatlabs-core/providers": "0.12.7"
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/tsconfig": "0.12.5",
96
- "@haatlabs-core/vitest-config": "0.12.5"
95
+ "@haatlabs-core/vitest-config": "0.12.7",
96
+ "@haatlabs-core/tsconfig": "0.12.7"
97
97
  },
98
98
  "scripts": {
99
99
  "build": "rm -rf dist && tsc -p tsconfig.build.json && node ../../scripts/build-cjs.mjs",