@algolia/client-common 5.2.4 → 5.3.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.
Files changed (61) hide show
  1. package/dist/common.cjs +714 -0
  2. package/dist/common.cjs.map +1 -0
  3. package/dist/common.d.cts +438 -0
  4. package/dist/common.d.ts +438 -0
  5. package/dist/common.esm.js +653 -0
  6. package/dist/common.esm.js.map +1 -0
  7. package/package.json +20 -6
  8. package/dist/client-common.cjs +0 -783
  9. package/dist/client-common.esm.node.js +0 -747
  10. package/dist/index.d.ts +0 -10
  11. package/dist/index.d.ts.map +0 -1
  12. package/dist/src/cache/createBrowserLocalStorageCache.d.ts +0 -3
  13. package/dist/src/cache/createBrowserLocalStorageCache.d.ts.map +0 -1
  14. package/dist/src/cache/createFallbackableCache.d.ts +0 -3
  15. package/dist/src/cache/createFallbackableCache.d.ts.map +0 -1
  16. package/dist/src/cache/createMemoryCache.d.ts +0 -3
  17. package/dist/src/cache/createMemoryCache.d.ts.map +0 -1
  18. package/dist/src/cache/createNullCache.d.ts +0 -3
  19. package/dist/src/cache/createNullCache.d.ts.map +0 -1
  20. package/dist/src/cache/index.d.ts +0 -5
  21. package/dist/src/cache/index.d.ts.map +0 -1
  22. package/dist/src/constants.d.ts +0 -7
  23. package/dist/src/constants.d.ts.map +0 -1
  24. package/dist/src/createAlgoliaAgent.d.ts +0 -3
  25. package/dist/src/createAlgoliaAgent.d.ts.map +0 -1
  26. package/dist/src/createAuth.d.ts +0 -6
  27. package/dist/src/createAuth.d.ts.map +0 -1
  28. package/dist/src/createEchoRequester.d.ts +0 -7
  29. package/dist/src/createEchoRequester.d.ts.map +0 -1
  30. package/dist/src/createIterablePromise.d.ts +0 -13
  31. package/dist/src/createIterablePromise.d.ts.map +0 -1
  32. package/dist/src/getAlgoliaAgent.d.ts +0 -8
  33. package/dist/src/getAlgoliaAgent.d.ts.map +0 -1
  34. package/dist/src/transporter/createStatefulHost.d.ts +0 -3
  35. package/dist/src/transporter/createStatefulHost.d.ts.map +0 -1
  36. package/dist/src/transporter/createTransporter.d.ts +0 -3
  37. package/dist/src/transporter/createTransporter.d.ts.map +0 -1
  38. package/dist/src/transporter/errors.d.ts +0 -38
  39. package/dist/src/transporter/errors.d.ts.map +0 -1
  40. package/dist/src/transporter/helpers.d.ts +0 -9
  41. package/dist/src/transporter/helpers.d.ts.map +0 -1
  42. package/dist/src/transporter/index.d.ts +0 -7
  43. package/dist/src/transporter/index.d.ts.map +0 -1
  44. package/dist/src/transporter/responses.d.ts +0 -5
  45. package/dist/src/transporter/responses.d.ts.map +0 -1
  46. package/dist/src/transporter/stackTrace.d.ts +0 -4
  47. package/dist/src/transporter/stackTrace.d.ts.map +0 -1
  48. package/dist/src/types/cache.d.ts +0 -61
  49. package/dist/src/types/cache.d.ts.map +0 -1
  50. package/dist/src/types/createClient.d.ts +0 -12
  51. package/dist/src/types/createClient.d.ts.map +0 -1
  52. package/dist/src/types/createIterablePromise.d.ts +0 -36
  53. package/dist/src/types/createIterablePromise.d.ts.map +0 -1
  54. package/dist/src/types/host.d.ts +0 -37
  55. package/dist/src/types/host.d.ts.map +0 -1
  56. package/dist/src/types/index.d.ts +0 -7
  57. package/dist/src/types/index.d.ts.map +0 -1
  58. package/dist/src/types/requester.d.ts +0 -66
  59. package/dist/src/types/requester.d.ts.map +0 -1
  60. package/dist/src/types/transporter.d.ts +0 -128
  61. package/dist/src/types/transporter.d.ts.map +0 -1
@@ -0,0 +1,714 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // index.ts
21
+ var client_common_exports = {};
22
+ __export(client_common_exports, {
23
+ AlgoliaError: () => AlgoliaError,
24
+ ApiError: () => ApiError,
25
+ DEFAULT_CONNECT_TIMEOUT_BROWSER: () => DEFAULT_CONNECT_TIMEOUT_BROWSER,
26
+ DEFAULT_CONNECT_TIMEOUT_NODE: () => DEFAULT_CONNECT_TIMEOUT_NODE,
27
+ DEFAULT_READ_TIMEOUT_BROWSER: () => DEFAULT_READ_TIMEOUT_BROWSER,
28
+ DEFAULT_READ_TIMEOUT_NODE: () => DEFAULT_READ_TIMEOUT_NODE,
29
+ DEFAULT_WRITE_TIMEOUT_BROWSER: () => DEFAULT_WRITE_TIMEOUT_BROWSER,
30
+ DEFAULT_WRITE_TIMEOUT_NODE: () => DEFAULT_WRITE_TIMEOUT_NODE,
31
+ DeserializationError: () => DeserializationError,
32
+ DetailedApiError: () => DetailedApiError,
33
+ ErrorWithStackTrace: () => ErrorWithStackTrace,
34
+ RetryError: () => RetryError,
35
+ createAlgoliaAgent: () => createAlgoliaAgent,
36
+ createAuth: () => createAuth,
37
+ createBrowserLocalStorageCache: () => createBrowserLocalStorageCache,
38
+ createEchoRequester: () => createEchoRequester,
39
+ createFallbackableCache: () => createFallbackableCache,
40
+ createIterablePromise: () => createIterablePromise,
41
+ createMemoryCache: () => createMemoryCache,
42
+ createNullCache: () => createNullCache,
43
+ createStatefulHost: () => createStatefulHost,
44
+ createTransporter: () => createTransporter,
45
+ deserializeFailure: () => deserializeFailure,
46
+ deserializeSuccess: () => deserializeSuccess,
47
+ getAlgoliaAgent: () => getAlgoliaAgent,
48
+ isNetworkError: () => isNetworkError,
49
+ isRetryable: () => isRetryable,
50
+ isSuccess: () => isSuccess,
51
+ serializeData: () => serializeData,
52
+ serializeHeaders: () => serializeHeaders,
53
+ serializeQueryParameters: () => serializeQueryParameters,
54
+ serializeUrl: () => serializeUrl,
55
+ shuffle: () => shuffle,
56
+ stackFrameWithoutCredentials: () => stackFrameWithoutCredentials,
57
+ stackTraceWithoutCredentials: () => stackTraceWithoutCredentials
58
+ });
59
+ module.exports = __toCommonJS(client_common_exports);
60
+
61
+ // src/createAuth.ts
62
+ function createAuth(appId, apiKey, authMode = "WithinHeaders") {
63
+ const credentials = {
64
+ "x-algolia-api-key": apiKey,
65
+ "x-algolia-application-id": appId
66
+ };
67
+ return {
68
+ headers() {
69
+ return authMode === "WithinHeaders" ? credentials : {};
70
+ },
71
+ queryParameters() {
72
+ return authMode === "WithinQueryParameters" ? credentials : {};
73
+ }
74
+ };
75
+ }
76
+
77
+ // src/createEchoRequester.ts
78
+ function getUrlParams({
79
+ host,
80
+ search,
81
+ pathname
82
+ }) {
83
+ const urlSearchParams = search.split("?");
84
+ if (urlSearchParams.length === 1) {
85
+ return {
86
+ host,
87
+ algoliaAgent: "",
88
+ searchParams: void 0,
89
+ path: pathname
90
+ };
91
+ }
92
+ const splitSearchParams = urlSearchParams[1].split("&");
93
+ let algoliaAgent = "";
94
+ const searchParams = {};
95
+ if (splitSearchParams.length > 0) {
96
+ splitSearchParams.forEach((param) => {
97
+ const [key, value] = param.split("=");
98
+ if (key === "x-algolia-agent") {
99
+ algoliaAgent = value;
100
+ return;
101
+ }
102
+ searchParams[key] = value;
103
+ });
104
+ }
105
+ return {
106
+ host,
107
+ algoliaAgent,
108
+ searchParams: Object.keys(searchParams).length === 0 ? void 0 : searchParams,
109
+ path: pathname
110
+ };
111
+ }
112
+ function createEchoRequester({ getURL, status = 200 }) {
113
+ function send(request) {
114
+ const { host, searchParams, algoliaAgent, path } = getUrlParams(getURL(request.url));
115
+ const content = {
116
+ ...request,
117
+ data: request.data ? JSON.parse(request.data) : void 0,
118
+ path,
119
+ host,
120
+ algoliaAgent,
121
+ searchParams
122
+ };
123
+ return Promise.resolve({
124
+ content: JSON.stringify(content),
125
+ isTimedOut: false,
126
+ status
127
+ });
128
+ }
129
+ return { send };
130
+ }
131
+
132
+ // src/createIterablePromise.ts
133
+ function createIterablePromise({
134
+ func,
135
+ validate,
136
+ aggregator,
137
+ error,
138
+ timeout = () => 0
139
+ }) {
140
+ const retry = (previousResponse) => {
141
+ return new Promise((resolve, reject) => {
142
+ func(previousResponse).then((response) => {
143
+ if (aggregator) {
144
+ aggregator(response);
145
+ }
146
+ if (validate(response)) {
147
+ return resolve(response);
148
+ }
149
+ if (error && error.validate(response)) {
150
+ return reject(new Error(error.message(response)));
151
+ }
152
+ return setTimeout(() => {
153
+ retry(response).then(resolve).catch(reject);
154
+ }, timeout());
155
+ }).catch((err) => {
156
+ reject(err);
157
+ });
158
+ });
159
+ };
160
+ return retry();
161
+ }
162
+
163
+ // src/cache/createBrowserLocalStorageCache.ts
164
+ function createBrowserLocalStorageCache(options) {
165
+ let storage;
166
+ const namespaceKey = `algolia-client-js-${options.key}`;
167
+ function getStorage() {
168
+ if (storage === void 0) {
169
+ storage = options.localStorage || window.localStorage;
170
+ }
171
+ return storage;
172
+ }
173
+ function getNamespace() {
174
+ return JSON.parse(getStorage().getItem(namespaceKey) || "{}");
175
+ }
176
+ function setNamespace(namespace) {
177
+ getStorage().setItem(namespaceKey, JSON.stringify(namespace));
178
+ }
179
+ function removeOutdatedCacheItems() {
180
+ const timeToLive = options.timeToLive ? options.timeToLive * 1e3 : null;
181
+ const namespace = getNamespace();
182
+ const filteredNamespaceWithoutOldFormattedCacheItems = Object.fromEntries(
183
+ Object.entries(namespace).filter(([, cacheItem]) => {
184
+ return cacheItem.timestamp !== void 0;
185
+ })
186
+ );
187
+ setNamespace(filteredNamespaceWithoutOldFormattedCacheItems);
188
+ if (!timeToLive) {
189
+ return;
190
+ }
191
+ const filteredNamespaceWithoutExpiredItems = Object.fromEntries(
192
+ Object.entries(filteredNamespaceWithoutOldFormattedCacheItems).filter(([, cacheItem]) => {
193
+ const currentTimestamp = (/* @__PURE__ */ new Date()).getTime();
194
+ const isExpired = cacheItem.timestamp + timeToLive < currentTimestamp;
195
+ return !isExpired;
196
+ })
197
+ );
198
+ setNamespace(filteredNamespaceWithoutExpiredItems);
199
+ }
200
+ return {
201
+ get(key, defaultValue, events = {
202
+ miss: () => Promise.resolve()
203
+ }) {
204
+ return Promise.resolve().then(() => {
205
+ removeOutdatedCacheItems();
206
+ return getNamespace()[JSON.stringify(key)];
207
+ }).then((value) => {
208
+ return Promise.all([value ? value.value : defaultValue(), value !== void 0]);
209
+ }).then(([value, exists]) => {
210
+ return Promise.all([value, exists || events.miss(value)]);
211
+ }).then(([value]) => value);
212
+ },
213
+ set(key, value) {
214
+ return Promise.resolve().then(() => {
215
+ const namespace = getNamespace();
216
+ namespace[JSON.stringify(key)] = {
217
+ timestamp: (/* @__PURE__ */ new Date()).getTime(),
218
+ value
219
+ };
220
+ getStorage().setItem(namespaceKey, JSON.stringify(namespace));
221
+ return value;
222
+ });
223
+ },
224
+ delete(key) {
225
+ return Promise.resolve().then(() => {
226
+ const namespace = getNamespace();
227
+ delete namespace[JSON.stringify(key)];
228
+ getStorage().setItem(namespaceKey, JSON.stringify(namespace));
229
+ });
230
+ },
231
+ clear() {
232
+ return Promise.resolve().then(() => {
233
+ getStorage().removeItem(namespaceKey);
234
+ });
235
+ }
236
+ };
237
+ }
238
+
239
+ // src/cache/createNullCache.ts
240
+ function createNullCache() {
241
+ return {
242
+ get(_key, defaultValue, events = {
243
+ miss: () => Promise.resolve()
244
+ }) {
245
+ const value = defaultValue();
246
+ return value.then((result) => Promise.all([result, events.miss(result)])).then(([result]) => result);
247
+ },
248
+ set(_key, value) {
249
+ return Promise.resolve(value);
250
+ },
251
+ delete(_key) {
252
+ return Promise.resolve();
253
+ },
254
+ clear() {
255
+ return Promise.resolve();
256
+ }
257
+ };
258
+ }
259
+
260
+ // src/cache/createFallbackableCache.ts
261
+ function createFallbackableCache(options) {
262
+ const caches = [...options.caches];
263
+ const current = caches.shift();
264
+ if (current === void 0) {
265
+ return createNullCache();
266
+ }
267
+ return {
268
+ get(key, defaultValue, events = {
269
+ miss: () => Promise.resolve()
270
+ }) {
271
+ return current.get(key, defaultValue, events).catch(() => {
272
+ return createFallbackableCache({ caches }).get(key, defaultValue, events);
273
+ });
274
+ },
275
+ set(key, value) {
276
+ return current.set(key, value).catch(() => {
277
+ return createFallbackableCache({ caches }).set(key, value);
278
+ });
279
+ },
280
+ delete(key) {
281
+ return current.delete(key).catch(() => {
282
+ return createFallbackableCache({ caches }).delete(key);
283
+ });
284
+ },
285
+ clear() {
286
+ return current.clear().catch(() => {
287
+ return createFallbackableCache({ caches }).clear();
288
+ });
289
+ }
290
+ };
291
+ }
292
+
293
+ // src/cache/createMemoryCache.ts
294
+ function createMemoryCache(options = { serializable: true }) {
295
+ let cache = {};
296
+ return {
297
+ get(key, defaultValue, events = {
298
+ miss: () => Promise.resolve()
299
+ }) {
300
+ const keyAsString = JSON.stringify(key);
301
+ if (keyAsString in cache) {
302
+ return Promise.resolve(options.serializable ? JSON.parse(cache[keyAsString]) : cache[keyAsString]);
303
+ }
304
+ const promise = defaultValue();
305
+ return promise.then((value) => events.miss(value)).then(() => promise);
306
+ },
307
+ set(key, value) {
308
+ cache[JSON.stringify(key)] = options.serializable ? JSON.stringify(value) : value;
309
+ return Promise.resolve(value);
310
+ },
311
+ delete(key) {
312
+ delete cache[JSON.stringify(key)];
313
+ return Promise.resolve();
314
+ },
315
+ clear() {
316
+ cache = {};
317
+ return Promise.resolve();
318
+ }
319
+ };
320
+ }
321
+
322
+ // src/transporter/createStatefulHost.ts
323
+ var EXPIRATION_DELAY = 2 * 60 * 1e3;
324
+ function createStatefulHost(host, status = "up") {
325
+ const lastUpdate = Date.now();
326
+ function isUp() {
327
+ return status === "up" || Date.now() - lastUpdate > EXPIRATION_DELAY;
328
+ }
329
+ function isTimedOut() {
330
+ return status === "timed out" && Date.now() - lastUpdate <= EXPIRATION_DELAY;
331
+ }
332
+ return { ...host, status, lastUpdate, isUp, isTimedOut };
333
+ }
334
+
335
+ // src/transporter/errors.ts
336
+ var AlgoliaError = class extends Error {
337
+ name = "AlgoliaError";
338
+ constructor(message, name) {
339
+ super(message);
340
+ if (name) {
341
+ this.name = name;
342
+ }
343
+ }
344
+ };
345
+ var ErrorWithStackTrace = class extends AlgoliaError {
346
+ stackTrace;
347
+ constructor(message, stackTrace, name) {
348
+ super(message, name);
349
+ this.stackTrace = stackTrace;
350
+ }
351
+ };
352
+ var RetryError = class extends ErrorWithStackTrace {
353
+ constructor(stackTrace) {
354
+ super(
355
+ "Unreachable hosts - your application id may be incorrect. If the error persists, please reach out to the Algolia Support team: https://alg.li/support.",
356
+ stackTrace,
357
+ "RetryError"
358
+ );
359
+ }
360
+ };
361
+ var ApiError = class extends ErrorWithStackTrace {
362
+ status;
363
+ constructor(message, status, stackTrace, name = "ApiError") {
364
+ super(message, stackTrace, name);
365
+ this.status = status;
366
+ }
367
+ };
368
+ var DeserializationError = class extends AlgoliaError {
369
+ response;
370
+ constructor(message, response) {
371
+ super(message, "DeserializationError");
372
+ this.response = response;
373
+ }
374
+ };
375
+ var DetailedApiError = class extends ApiError {
376
+ error;
377
+ constructor(message, status, error, stackTrace) {
378
+ super(message, status, stackTrace, "DetailedApiError");
379
+ this.error = error;
380
+ }
381
+ };
382
+
383
+ // src/transporter/helpers.ts
384
+ function shuffle(array) {
385
+ const shuffledArray = array;
386
+ for (let c = array.length - 1; c > 0; c--) {
387
+ const b = Math.floor(Math.random() * (c + 1));
388
+ const a = array[c];
389
+ shuffledArray[c] = array[b];
390
+ shuffledArray[b] = a;
391
+ }
392
+ return shuffledArray;
393
+ }
394
+ function serializeUrl(host, path, queryParameters) {
395
+ const queryParametersAsString = serializeQueryParameters(queryParameters);
396
+ let url = `${host.protocol}://${host.url}${host.port ? `:${host.port}` : ""}/${path.charAt(0) === "/" ? path.substring(1) : path}`;
397
+ if (queryParametersAsString.length) {
398
+ url += `?${queryParametersAsString}`;
399
+ }
400
+ return url;
401
+ }
402
+ function serializeQueryParameters(parameters) {
403
+ return Object.keys(parameters).filter((key) => parameters[key] !== void 0).sort().map(
404
+ (key) => `${key}=${encodeURIComponent(
405
+ Object.prototype.toString.call(parameters[key]) === "[object Array]" ? parameters[key].join(",") : parameters[key]
406
+ ).replaceAll("+", "%20")}`
407
+ ).join("&");
408
+ }
409
+ function serializeData(request, requestOptions) {
410
+ if (request.method === "GET" || request.data === void 0 && requestOptions.data === void 0) {
411
+ return void 0;
412
+ }
413
+ const data = Array.isArray(request.data) ? request.data : { ...request.data, ...requestOptions.data };
414
+ return JSON.stringify(data);
415
+ }
416
+ function serializeHeaders(baseHeaders, requestHeaders, requestOptionsHeaders) {
417
+ const headers = {
418
+ Accept: "application/json",
419
+ ...baseHeaders,
420
+ ...requestHeaders,
421
+ ...requestOptionsHeaders
422
+ };
423
+ const serializedHeaders = {};
424
+ Object.keys(headers).forEach((header) => {
425
+ const value = headers[header];
426
+ serializedHeaders[header.toLowerCase()] = value;
427
+ });
428
+ return serializedHeaders;
429
+ }
430
+ function deserializeSuccess(response) {
431
+ try {
432
+ return JSON.parse(response.content);
433
+ } catch (e) {
434
+ throw new DeserializationError(e.message, response);
435
+ }
436
+ }
437
+ function deserializeFailure({ content, status }, stackFrame) {
438
+ try {
439
+ const parsed = JSON.parse(content);
440
+ if ("error" in parsed) {
441
+ return new DetailedApiError(parsed.message, status, parsed.error, stackFrame);
442
+ }
443
+ return new ApiError(parsed.message, status, stackFrame);
444
+ } catch {
445
+ }
446
+ return new ApiError(content, status, stackFrame);
447
+ }
448
+
449
+ // src/transporter/responses.ts
450
+ function isNetworkError({ isTimedOut, status }) {
451
+ return !isTimedOut && ~~status === 0;
452
+ }
453
+ function isRetryable({ isTimedOut, status }) {
454
+ return isTimedOut || isNetworkError({ isTimedOut, status }) || ~~(status / 100) !== 2 && ~~(status / 100) !== 4;
455
+ }
456
+ function isSuccess({ status }) {
457
+ return ~~(status / 100) === 2;
458
+ }
459
+
460
+ // src/transporter/stackTrace.ts
461
+ function stackTraceWithoutCredentials(stackTrace) {
462
+ return stackTrace.map((stackFrame) => stackFrameWithoutCredentials(stackFrame));
463
+ }
464
+ function stackFrameWithoutCredentials(stackFrame) {
465
+ const modifiedHeaders = stackFrame.request.headers["x-algolia-api-key"] ? { "x-algolia-api-key": "*****" } : {};
466
+ return {
467
+ ...stackFrame,
468
+ request: {
469
+ ...stackFrame.request,
470
+ headers: {
471
+ ...stackFrame.request.headers,
472
+ ...modifiedHeaders
473
+ }
474
+ }
475
+ };
476
+ }
477
+
478
+ // src/transporter/createTransporter.ts
479
+ function createTransporter({
480
+ hosts,
481
+ hostsCache,
482
+ baseHeaders,
483
+ baseQueryParameters,
484
+ algoliaAgent,
485
+ timeouts,
486
+ requester,
487
+ requestsCache,
488
+ responsesCache
489
+ }) {
490
+ async function createRetryableOptions(compatibleHosts) {
491
+ const statefulHosts = await Promise.all(
492
+ compatibleHosts.map((compatibleHost) => {
493
+ return hostsCache.get(compatibleHost, () => {
494
+ return Promise.resolve(createStatefulHost(compatibleHost));
495
+ });
496
+ })
497
+ );
498
+ const hostsUp = statefulHosts.filter((host) => host.isUp());
499
+ const hostsTimedOut = statefulHosts.filter((host) => host.isTimedOut());
500
+ const hostsAvailable = [...hostsUp, ...hostsTimedOut];
501
+ const compatibleHostsAvailable = hostsAvailable.length > 0 ? hostsAvailable : compatibleHosts;
502
+ return {
503
+ hosts: compatibleHostsAvailable,
504
+ getTimeout(timeoutsCount, baseTimeout) {
505
+ const timeoutMultiplier = hostsTimedOut.length === 0 && timeoutsCount === 0 ? 1 : hostsTimedOut.length + 3 + timeoutsCount;
506
+ return timeoutMultiplier * baseTimeout;
507
+ }
508
+ };
509
+ }
510
+ async function retryableRequest(request, requestOptions, isRead = true) {
511
+ const stackTrace = [];
512
+ const data = serializeData(request, requestOptions);
513
+ const headers = serializeHeaders(baseHeaders, request.headers, requestOptions.headers);
514
+ const dataQueryParameters = request.method === "GET" ? {
515
+ ...request.data,
516
+ ...requestOptions.data
517
+ } : {};
518
+ const queryParameters = {
519
+ ...baseQueryParameters,
520
+ ...request.queryParameters,
521
+ ...dataQueryParameters
522
+ };
523
+ if (algoliaAgent.value) {
524
+ queryParameters["x-algolia-agent"] = algoliaAgent.value;
525
+ }
526
+ if (requestOptions && requestOptions.queryParameters) {
527
+ for (const key of Object.keys(requestOptions.queryParameters)) {
528
+ if (!requestOptions.queryParameters[key] || Object.prototype.toString.call(requestOptions.queryParameters[key]) === "[object Object]") {
529
+ queryParameters[key] = requestOptions.queryParameters[key];
530
+ } else {
531
+ queryParameters[key] = requestOptions.queryParameters[key].toString();
532
+ }
533
+ }
534
+ }
535
+ let timeoutsCount = 0;
536
+ const retry = async (retryableHosts, getTimeout) => {
537
+ const host = retryableHosts.pop();
538
+ if (host === void 0) {
539
+ throw new RetryError(stackTraceWithoutCredentials(stackTrace));
540
+ }
541
+ const timeout = { ...timeouts, ...requestOptions.timeouts };
542
+ const payload = {
543
+ data,
544
+ headers,
545
+ method: request.method,
546
+ url: serializeUrl(host, request.path, queryParameters),
547
+ connectTimeout: getTimeout(timeoutsCount, timeout.connect),
548
+ responseTimeout: getTimeout(timeoutsCount, isRead ? timeout.read : timeout.write)
549
+ };
550
+ const pushToStackTrace = (response2) => {
551
+ const stackFrame = {
552
+ request: payload,
553
+ response: response2,
554
+ host,
555
+ triesLeft: retryableHosts.length
556
+ };
557
+ stackTrace.push(stackFrame);
558
+ return stackFrame;
559
+ };
560
+ const response = await requester.send(payload);
561
+ if (isRetryable(response)) {
562
+ const stackFrame = pushToStackTrace(response);
563
+ if (response.isTimedOut) {
564
+ timeoutsCount++;
565
+ }
566
+ console.log("Retryable failure", stackFrameWithoutCredentials(stackFrame));
567
+ await hostsCache.set(host, createStatefulHost(host, response.isTimedOut ? "timed out" : "down"));
568
+ return retry(retryableHosts, getTimeout);
569
+ }
570
+ if (isSuccess(response)) {
571
+ return deserializeSuccess(response);
572
+ }
573
+ pushToStackTrace(response);
574
+ throw deserializeFailure(response, stackTrace);
575
+ };
576
+ const compatibleHosts = hosts.filter(
577
+ (host) => host.accept === "readWrite" || (isRead ? host.accept === "read" : host.accept === "write")
578
+ );
579
+ const options = await createRetryableOptions(compatibleHosts);
580
+ return retry([...options.hosts].reverse(), options.getTimeout);
581
+ }
582
+ function createRequest(request, requestOptions = {}) {
583
+ const isRead = request.useReadTransporter || request.method === "GET";
584
+ if (!isRead) {
585
+ return retryableRequest(request, requestOptions, isRead);
586
+ }
587
+ const createRetryableRequest = () => {
588
+ return retryableRequest(request, requestOptions);
589
+ };
590
+ const cacheable = requestOptions.cacheable || request.cacheable;
591
+ if (cacheable !== true) {
592
+ return createRetryableRequest();
593
+ }
594
+ const key = {
595
+ request,
596
+ requestOptions,
597
+ transporter: {
598
+ queryParameters: baseQueryParameters,
599
+ headers: baseHeaders
600
+ }
601
+ };
602
+ return responsesCache.get(
603
+ key,
604
+ () => {
605
+ return requestsCache.get(
606
+ key,
607
+ () => (
608
+ /**
609
+ * Finally, if there is no request in progress with the same key,
610
+ * this `createRetryableRequest()` will actually trigger the
611
+ * retryable request.
612
+ */
613
+ requestsCache.set(key, createRetryableRequest()).then(
614
+ (response) => Promise.all([requestsCache.delete(key), response]),
615
+ (err) => Promise.all([requestsCache.delete(key), Promise.reject(err)])
616
+ ).then(([_, response]) => response)
617
+ )
618
+ );
619
+ },
620
+ {
621
+ /**
622
+ * Of course, once we get this response back from the server, we
623
+ * tell response cache to actually store the received response
624
+ * to be used later.
625
+ */
626
+ miss: (response) => responsesCache.set(key, response)
627
+ }
628
+ );
629
+ }
630
+ return {
631
+ hostsCache,
632
+ requester,
633
+ timeouts,
634
+ algoliaAgent,
635
+ baseHeaders,
636
+ baseQueryParameters,
637
+ hosts,
638
+ request: createRequest,
639
+ requestsCache,
640
+ responsesCache
641
+ };
642
+ }
643
+
644
+ // src/createAlgoliaAgent.ts
645
+ function createAlgoliaAgent(version) {
646
+ const algoliaAgent = {
647
+ value: `Algolia for JavaScript (${version})`,
648
+ add(options) {
649
+ const addedAlgoliaAgent = `; ${options.segment}${options.version !== void 0 ? ` (${options.version})` : ""}`;
650
+ if (algoliaAgent.value.indexOf(addedAlgoliaAgent) === -1) {
651
+ algoliaAgent.value = `${algoliaAgent.value}${addedAlgoliaAgent}`;
652
+ }
653
+ return algoliaAgent;
654
+ }
655
+ };
656
+ return algoliaAgent;
657
+ }
658
+
659
+ // src/getAlgoliaAgent.ts
660
+ function getAlgoliaAgent({ algoliaAgents, client, version }) {
661
+ const defaultAlgoliaAgent = createAlgoliaAgent(version).add({
662
+ segment: client,
663
+ version
664
+ });
665
+ algoliaAgents.forEach((algoliaAgent) => defaultAlgoliaAgent.add(algoliaAgent));
666
+ return defaultAlgoliaAgent;
667
+ }
668
+
669
+ // src/constants.ts
670
+ var DEFAULT_CONNECT_TIMEOUT_BROWSER = 1e3;
671
+ var DEFAULT_READ_TIMEOUT_BROWSER = 2e3;
672
+ var DEFAULT_WRITE_TIMEOUT_BROWSER = 3e4;
673
+ var DEFAULT_CONNECT_TIMEOUT_NODE = 2e3;
674
+ var DEFAULT_READ_TIMEOUT_NODE = 5e3;
675
+ var DEFAULT_WRITE_TIMEOUT_NODE = 3e4;
676
+ // Annotate the CommonJS export names for ESM import in node:
677
+ 0 && (module.exports = {
678
+ AlgoliaError,
679
+ ApiError,
680
+ DEFAULT_CONNECT_TIMEOUT_BROWSER,
681
+ DEFAULT_CONNECT_TIMEOUT_NODE,
682
+ DEFAULT_READ_TIMEOUT_BROWSER,
683
+ DEFAULT_READ_TIMEOUT_NODE,
684
+ DEFAULT_WRITE_TIMEOUT_BROWSER,
685
+ DEFAULT_WRITE_TIMEOUT_NODE,
686
+ DeserializationError,
687
+ DetailedApiError,
688
+ ErrorWithStackTrace,
689
+ RetryError,
690
+ createAlgoliaAgent,
691
+ createAuth,
692
+ createBrowserLocalStorageCache,
693
+ createEchoRequester,
694
+ createFallbackableCache,
695
+ createIterablePromise,
696
+ createMemoryCache,
697
+ createNullCache,
698
+ createStatefulHost,
699
+ createTransporter,
700
+ deserializeFailure,
701
+ deserializeSuccess,
702
+ getAlgoliaAgent,
703
+ isNetworkError,
704
+ isRetryable,
705
+ isSuccess,
706
+ serializeData,
707
+ serializeHeaders,
708
+ serializeQueryParameters,
709
+ serializeUrl,
710
+ shuffle,
711
+ stackFrameWithoutCredentials,
712
+ stackTraceWithoutCredentials
713
+ });
714
+ //# sourceMappingURL=common.cjs.map