@algolia/client-common 5.2.3 → 5.2.4-beta.2

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