@algolia/client-common 5.2.4 → 5.2.5
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/common.cjs +714 -0
- package/dist/common.cjs.map +1 -0
- package/dist/common.d.cts +438 -0
- package/dist/common.d.ts +438 -0
- package/dist/common.esm.js +653 -0
- package/dist/common.esm.js.map +1 -0
- package/package.json +20 -6
- package/dist/client-common.cjs +0 -783
- package/dist/client-common.esm.node.js +0 -747
- package/dist/index.d.ts +0 -10
- package/dist/index.d.ts.map +0 -1
- package/dist/src/cache/createBrowserLocalStorageCache.d.ts +0 -3
- package/dist/src/cache/createBrowserLocalStorageCache.d.ts.map +0 -1
- package/dist/src/cache/createFallbackableCache.d.ts +0 -3
- package/dist/src/cache/createFallbackableCache.d.ts.map +0 -1
- package/dist/src/cache/createMemoryCache.d.ts +0 -3
- package/dist/src/cache/createMemoryCache.d.ts.map +0 -1
- package/dist/src/cache/createNullCache.d.ts +0 -3
- package/dist/src/cache/createNullCache.d.ts.map +0 -1
- package/dist/src/cache/index.d.ts +0 -5
- package/dist/src/cache/index.d.ts.map +0 -1
- package/dist/src/constants.d.ts +0 -7
- package/dist/src/constants.d.ts.map +0 -1
- package/dist/src/createAlgoliaAgent.d.ts +0 -3
- package/dist/src/createAlgoliaAgent.d.ts.map +0 -1
- package/dist/src/createAuth.d.ts +0 -6
- package/dist/src/createAuth.d.ts.map +0 -1
- package/dist/src/createEchoRequester.d.ts +0 -7
- package/dist/src/createEchoRequester.d.ts.map +0 -1
- package/dist/src/createIterablePromise.d.ts +0 -13
- package/dist/src/createIterablePromise.d.ts.map +0 -1
- package/dist/src/getAlgoliaAgent.d.ts +0 -8
- package/dist/src/getAlgoliaAgent.d.ts.map +0 -1
- package/dist/src/transporter/createStatefulHost.d.ts +0 -3
- package/dist/src/transporter/createStatefulHost.d.ts.map +0 -1
- package/dist/src/transporter/createTransporter.d.ts +0 -3
- package/dist/src/transporter/createTransporter.d.ts.map +0 -1
- package/dist/src/transporter/errors.d.ts +0 -38
- package/dist/src/transporter/errors.d.ts.map +0 -1
- package/dist/src/transporter/helpers.d.ts +0 -9
- package/dist/src/transporter/helpers.d.ts.map +0 -1
- package/dist/src/transporter/index.d.ts +0 -7
- package/dist/src/transporter/index.d.ts.map +0 -1
- package/dist/src/transporter/responses.d.ts +0 -5
- package/dist/src/transporter/responses.d.ts.map +0 -1
- package/dist/src/transporter/stackTrace.d.ts +0 -4
- package/dist/src/transporter/stackTrace.d.ts.map +0 -1
- package/dist/src/types/cache.d.ts +0 -61
- package/dist/src/types/cache.d.ts.map +0 -1
- package/dist/src/types/createClient.d.ts +0 -12
- package/dist/src/types/createClient.d.ts.map +0 -1
- package/dist/src/types/createIterablePromise.d.ts +0 -36
- package/dist/src/types/createIterablePromise.d.ts.map +0 -1
- package/dist/src/types/host.d.ts +0 -37
- package/dist/src/types/host.d.ts.map +0 -1
- package/dist/src/types/index.d.ts +0 -7
- package/dist/src/types/index.d.ts.map +0 -1
- package/dist/src/types/requester.d.ts +0 -66
- package/dist/src/types/requester.d.ts.map +0 -1
- package/dist/src/types/transporter.d.ts +0 -128
- package/dist/src/types/transporter.d.ts.map +0 -1
package/dist/common.cjs
ADDED
|
@@ -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
|