client-search.cjs.js 49 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369
  1. 'use strict';
  2. Object.defineProperty(exports, '__esModule', { value: true });
  3. var clientCommon = require('@algolia/client-common');
  4. var transporter = require('@algolia/transporter');
  5. var requesterCommon = require('@algolia/requester-common');
  6. var crypto = require('crypto');
  7. function createBrowsablePromise(options) {
  8. const browse = (data) => {
  9. return options.request(data).then(response => {
  10. /**
  11. * First we send to the developer the
  12. * batch retrieved from the API.
  13. */
  14. if (options.batch !== undefined) {
  15. options.batch(response.hits);
  16. }
  17. /**
  18. * Then, we ask to the browse concrete implementation
  19. * if we should stop browsing. As example, the `browseObjects`
  20. * method will stop if the cursor is not present on the response.
  21. */
  22. if (options.shouldStop(response)) {
  23. return undefined;
  24. }
  25. /**
  26. * Finally, if the response contains a cursor, we browse to the next
  27. * batch using that same cursor. Otherwise, we just use the traditional
  28. * browsing using the page element.
  29. */
  30. if (response.cursor) {
  31. return browse({
  32. cursor: response.cursor,
  33. });
  34. }
  35. return browse({
  36. page: (data.page || 0) + 1,
  37. });
  38. });
  39. };
  40. return browse({});
  41. }
  42. const createSearchClient = options => {
  43. const appId = options.appId;
  44. const auth = clientCommon.createAuth(options.authMode !== undefined ? options.authMode : clientCommon.AuthMode.WithinHeaders, appId, options.apiKey);
  45. const transporter$1 = transporter.createTransporter({
  46. hosts: [
  47. { url: `${appId}-dsn.algolia.net`, accept: transporter.CallEnum.Read },
  48. { url: `${appId}.algolia.net`, accept: transporter.CallEnum.Write },
  49. ].concat(clientCommon.shuffle([
  50. { url: `${appId}-1.algolianet.com` },
  51. { url: `${appId}-2.algolianet.com` },
  52. { url: `${appId}-3.algolianet.com` },
  53. ])),
  54. ...options,
  55. headers: {
  56. ...auth.headers(),
  57. ...{ 'content-type': 'application/x-www-form-urlencoded' },
  58. ...options.headers,
  59. },
  60. queryParameters: {
  61. ...auth.queryParameters(),
  62. ...options.queryParameters,
  63. },
  64. });
  65. const base = {
  66. transporter: transporter$1,
  67. appId,
  68. addAlgoliaAgent(segment, version) {
  69. transporter$1.userAgent.add({ segment, version });
  70. },
  71. clearCache() {
  72. return Promise.all([
  73. transporter$1.requestsCache.clear(),
  74. transporter$1.responsesCache.clear(),
  75. ]).then(() => undefined);
  76. },
  77. };
  78. return clientCommon.addMethods(base, options.methods);
  79. };
  80. function createMissingObjectIDError() {
  81. return {
  82. name: 'MissingObjectIDError',
  83. message: 'All objects must have an unique objectID ' +
  84. '(like a primary key) to be valid. ' +
  85. 'Algolia is also able to generate objectIDs ' +
  86. "automatically but *it's not recommended*. " +
  87. "To do it, use the `{'autoGenerateObjectIDIfNotExist': true}` option.",
  88. };
  89. }
  90. function createObjectNotFoundError() {
  91. return {
  92. name: 'ObjectNotFoundError',
  93. message: 'Object not found.',
  94. };
  95. }
  96. function createValidUntilNotFoundError() {
  97. return {
  98. name: 'ValidUntilNotFoundError',
  99. message: 'ValidUntil not found in given secured api key.',
  100. };
  101. }
  102. const addApiKey = (base) => {
  103. return (acl, requestOptions) => {
  104. const { queryParameters, ...options } = requestOptions || {};
  105. const data = {
  106. acl,
  107. ...(queryParameters !== undefined ? { queryParameters } : {}),
  108. };
  109. const wait = (response, waitRequestOptions) => {
  110. return clientCommon.createRetryablePromise(retry => {
  111. return getApiKey(base)(response.key, waitRequestOptions).catch((apiError) => {
  112. if (apiError.status !== 404) {
  113. throw apiError;
  114. }
  115. return retry();
  116. });
  117. });
  118. };
  119. return clientCommon.createWaitablePromise(base.transporter.write({
  120. method: requesterCommon.MethodEnum.Post,
  121. path: '1/keys',
  122. data,
  123. }, options), wait);
  124. };
  125. };
  126. const assignUserID = (base) => {
  127. return (userID, clusterName, requestOptions) => {
  128. const mappedRequestOptions = transporter.createMappedRequestOptions(requestOptions);
  129. // eslint-disable-next-line functional/immutable-data
  130. mappedRequestOptions.queryParameters['X-Algolia-User-ID'] = userID;
  131. return base.transporter.write({
  132. method: requesterCommon.MethodEnum.Post,
  133. path: '1/clusters/mapping',
  134. data: { cluster: clusterName },
  135. }, mappedRequestOptions);
  136. };
  137. };
  138. const assignUserIDs = (base) => {
  139. return (userIDs, clusterName, requestOptions) => {
  140. return base.transporter.write({
  141. method: requesterCommon.MethodEnum.Post,
  142. path: '1/clusters/mapping/batch',
  143. data: {
  144. users: userIDs,
  145. cluster: clusterName,
  146. },
  147. }, requestOptions);
  148. };
  149. };
  150. const clearDictionaryEntries = (base) => {
  151. return (dictionary, requestOptions) => {
  152. return clientCommon.createWaitablePromise(base.transporter.write({
  153. method: requesterCommon.MethodEnum.Post,
  154. path: clientCommon.encode('/1/dictionaries/%s/batch', dictionary),
  155. data: {
  156. clearExistingDictionaryEntries: true,
  157. requests: { action: 'addEntry', body: [] },
  158. },
  159. }, requestOptions), (response, waitRequestOptions) => waitAppTask(base)(response.taskID, waitRequestOptions));
  160. };
  161. };
  162. const copyIndex = (base) => {
  163. return (from, to, requestOptions) => {
  164. const wait = (response, waitRequestOptions) => {
  165. return initIndex(base)(from, {
  166. methods: { waitTask },
  167. }).waitTask(response.taskID, waitRequestOptions);
  168. };
  169. return clientCommon.createWaitablePromise(base.transporter.write({
  170. method: requesterCommon.MethodEnum.Post,
  171. path: clientCommon.encode('1/indexes/%s/operation', from),
  172. data: {
  173. operation: 'copy',
  174. destination: to,
  175. },
  176. }, requestOptions), wait);
  177. };
  178. };
  179. const copyRules = (base) => {
  180. return (from, to, requestOptions) => {
  181. return copyIndex(base)(from, to, {
  182. ...requestOptions,
  183. scope: [ScopeEnum.Rules],
  184. });
  185. };
  186. };
  187. const copySettings = (base) => {
  188. return (from, to, requestOptions) => {
  189. return copyIndex(base)(from, to, {
  190. ...requestOptions,
  191. scope: [ScopeEnum.Settings],
  192. });
  193. };
  194. };
  195. const copySynonyms = (base) => {
  196. return (from, to, requestOptions) => {
  197. return copyIndex(base)(from, to, {
  198. ...requestOptions,
  199. scope: [ScopeEnum.Synonyms],
  200. });
  201. };
  202. };
  203. const customRequest = (base) => {
  204. return (request, requestOptions) => {
  205. if (request.method === requesterCommon.MethodEnum.Get) {
  206. return base.transporter.read(request, requestOptions);
  207. }
  208. return base.transporter.write(request, requestOptions);
  209. };
  210. };
  211. const deleteApiKey = (base) => {
  212. return (apiKey, requestOptions) => {
  213. const wait = (_, waitRequestOptions) => {
  214. return clientCommon.createRetryablePromise(retry => {
  215. return getApiKey(base)(apiKey, waitRequestOptions)
  216. .then(retry)
  217. .catch((apiError) => {
  218. if (apiError.status !== 404) {
  219. throw apiError;
  220. }
  221. });
  222. });
  223. };
  224. return clientCommon.createWaitablePromise(base.transporter.write({
  225. method: requesterCommon.MethodEnum.Delete,
  226. path: clientCommon.encode('1/keys/%s', apiKey),
  227. }, requestOptions), wait);
  228. };
  229. };
  230. const deleteDictionaryEntries = (base) => {
  231. return (dictionary, objectIDs, requestOptions) => {
  232. const requests = objectIDs.map(objectID => ({
  233. action: 'deleteEntry',
  234. body: { objectID },
  235. }));
  236. return clientCommon.createWaitablePromise(base.transporter.write({
  237. method: requesterCommon.MethodEnum.Post,
  238. path: clientCommon.encode('/1/dictionaries/%s/batch', dictionary),
  239. data: { clearExistingDictionaryEntries: false, requests },
  240. }, requestOptions), (response, waitRequestOptions) => waitAppTask(base)(response.taskID, waitRequestOptions));
  241. };
  242. };
  243. const generateSecuredApiKey = () => {
  244. return (parentApiKey, restrictions) => {
  245. const queryParameters = transporter.serializeQueryParameters(restrictions);
  246. const securedKey = crypto.createHmac('sha256', parentApiKey)
  247. .update(queryParameters)
  248. .digest('hex');
  249. return Buffer.from(securedKey + queryParameters).toString('base64');
  250. };
  251. };
  252. const getApiKey = (base) => {
  253. return (apiKey, requestOptions) => {
  254. return base.transporter.read({
  255. method: requesterCommon.MethodEnum.Get,
  256. path: clientCommon.encode('1/keys/%s', apiKey),
  257. }, requestOptions);
  258. };
  259. };
  260. const getAppTask = (base) => {
  261. return (taskID, requestOptions) => {
  262. return base.transporter.read({
  263. method: requesterCommon.MethodEnum.Get,
  264. path: clientCommon.encode('1/task/%s', taskID.toString()),
  265. }, requestOptions);
  266. };
  267. };
  268. const getDictionarySettings = (base) => {
  269. return (requestOptions) => {
  270. return base.transporter.read({
  271. method: requesterCommon.MethodEnum.Get,
  272. path: '/1/dictionaries/*/settings',
  273. }, requestOptions);
  274. };
  275. };
  276. const getLogs = (base) => {
  277. return (requestOptions) => {
  278. return base.transporter.read({
  279. method: requesterCommon.MethodEnum.Get,
  280. path: '1/logs',
  281. }, requestOptions);
  282. };
  283. };
  284. const getSecuredApiKeyRemainingValidity = () => {
  285. return (securedApiKey) => {
  286. const decodedString = Buffer.from(securedApiKey, 'base64').toString('ascii');
  287. const regex = /validUntil=(\d+)/;
  288. const match = decodedString.match(regex);
  289. if (match === null) {
  290. throw createValidUntilNotFoundError();
  291. }
  292. return parseInt(match[1], 10) - Math.round(new Date().getTime() / 1000);
  293. };
  294. };
  295. const getTopUserIDs = (base) => {
  296. return (requestOptions) => {
  297. return base.transporter.read({
  298. method: requesterCommon.MethodEnum.Get,
  299. path: '1/clusters/mapping/top',
  300. }, requestOptions);
  301. };
  302. };
  303. const getUserID = (base) => {
  304. return (userID, requestOptions) => {
  305. return base.transporter.read({
  306. method: requesterCommon.MethodEnum.Get,
  307. path: clientCommon.encode('1/clusters/mapping/%s', userID),
  308. }, requestOptions);
  309. };
  310. };
  311. const hasPendingMappings = (base) => {
  312. return (requestOptions) => {
  313. const { retrieveMappings, ...options } = requestOptions || {};
  314. if (retrieveMappings === true) {
  315. // eslint-disable-next-line functional/immutable-data
  316. options.getClusters = true;
  317. }
  318. return base.transporter.read({
  319. method: requesterCommon.MethodEnum.Get,
  320. path: '1/clusters/mapping/pending',
  321. }, options);
  322. };
  323. };
  324. const initIndex = (base) => {
  325. return (indexName, options = {}) => {
  326. const searchIndex = {
  327. transporter: base.transporter,
  328. appId: base.appId,
  329. indexName,
  330. };
  331. return clientCommon.addMethods(searchIndex, options.methods);
  332. };
  333. };
  334. const listApiKeys = (base) => {
  335. return (requestOptions) => {
  336. return base.transporter.read({
  337. method: requesterCommon.MethodEnum.Get,
  338. path: '1/keys',
  339. }, requestOptions);
  340. };
  341. };
  342. const listClusters = (base) => {
  343. return (requestOptions) => {
  344. return base.transporter.read({
  345. method: requesterCommon.MethodEnum.Get,
  346. path: '1/clusters',
  347. }, requestOptions);
  348. };
  349. };
  350. const listIndices = (base) => {
  351. return (requestOptions) => {
  352. return base.transporter.read({
  353. method: requesterCommon.MethodEnum.Get,
  354. path: '1/indexes',
  355. }, requestOptions);
  356. };
  357. };
  358. const listUserIDs = (base) => {
  359. return (requestOptions) => {
  360. return base.transporter.read({
  361. method: requesterCommon.MethodEnum.Get,
  362. path: '1/clusters/mapping',
  363. }, requestOptions);
  364. };
  365. };
  366. const moveIndex = (base) => {
  367. return (from, to, requestOptions) => {
  368. const wait = (response, waitRequestOptions) => {
  369. return initIndex(base)(from, {
  370. methods: { waitTask },
  371. }).waitTask(response.taskID, waitRequestOptions);
  372. };
  373. return clientCommon.createWaitablePromise(base.transporter.write({
  374. method: requesterCommon.MethodEnum.Post,
  375. path: clientCommon.encode('1/indexes/%s/operation', from),
  376. data: {
  377. operation: 'move',
  378. destination: to,
  379. },
  380. }, requestOptions), wait);
  381. };
  382. };
  383. const multipleBatch = (base) => {
  384. return (requests, requestOptions) => {
  385. const wait = (response, waitRequestOptions) => {
  386. return Promise.all(Object.keys(response.taskID).map(indexName => {
  387. return initIndex(base)(indexName, {
  388. methods: { waitTask },
  389. }).waitTask(response.taskID[indexName], waitRequestOptions);
  390. }));
  391. };
  392. return clientCommon.createWaitablePromise(base.transporter.write({
  393. method: requesterCommon.MethodEnum.Post,
  394. path: '1/indexes/*/batch',
  395. data: {
  396. requests,
  397. },
  398. }, requestOptions), wait);
  399. };
  400. };
  401. const multipleGetObjects = (base) => {
  402. return (requests, requestOptions) => {
  403. return base.transporter.read({
  404. method: requesterCommon.MethodEnum.Post,
  405. path: '1/indexes/*/objects',
  406. data: {
  407. requests,
  408. },
  409. }, requestOptions);
  410. };
  411. };
  412. const multipleQueries = (base) => {
  413. return (queries, requestOptions) => {
  414. const requests = queries.map(query => {
  415. return {
  416. ...query,
  417. params: transporter.serializeQueryParameters(query.params || {}),
  418. };
  419. });
  420. return base.transporter.read({
  421. method: requesterCommon.MethodEnum.Post,
  422. path: '1/indexes/*/queries',
  423. data: {
  424. requests,
  425. },
  426. cacheable: true,
  427. }, requestOptions);
  428. };
  429. };
  430. const multipleSearchForFacetValues = (base) => {
  431. return (queries, requestOptions) => {
  432. return Promise.all(queries.map(query => {
  433. const { facetName, facetQuery, ...params } = query.params;
  434. return initIndex(base)(query.indexName, {
  435. methods: { searchForFacetValues },
  436. }).searchForFacetValues(facetName, facetQuery, {
  437. ...requestOptions,
  438. ...params,
  439. });
  440. }));
  441. };
  442. };
  443. const removeUserID = (base) => {
  444. return (userID, requestOptions) => {
  445. const mappedRequestOptions = transporter.createMappedRequestOptions(requestOptions);
  446. // eslint-disable-next-line functional/immutable-data
  447. mappedRequestOptions.queryParameters['X-Algolia-User-ID'] = userID;
  448. return base.transporter.write({
  449. method: requesterCommon.MethodEnum.Delete,
  450. path: '1/clusters/mapping',
  451. }, mappedRequestOptions);
  452. };
  453. };
  454. const replaceDictionaryEntries = (base) => {
  455. return (dictionary, entries, requestOptions) => {
  456. const requests = entries.map(entry => ({
  457. action: 'addEntry',
  458. body: entry,
  459. }));
  460. return clientCommon.createWaitablePromise(base.transporter.write({
  461. method: requesterCommon.MethodEnum.Post,
  462. path: clientCommon.encode('/1/dictionaries/%s/batch', dictionary),
  463. data: { clearExistingDictionaryEntries: true, requests },
  464. }, requestOptions), (response, waitRequestOptions) => waitAppTask(base)(response.taskID, waitRequestOptions));
  465. };
  466. };
  467. const restoreApiKey = (base) => {
  468. return (apiKey, requestOptions) => {
  469. const wait = (_, waitRequestOptions) => {
  470. return clientCommon.createRetryablePromise(retry => {
  471. return getApiKey(base)(apiKey, waitRequestOptions).catch((apiError) => {
  472. if (apiError.status !== 404) {
  473. throw apiError;
  474. }
  475. return retry();
  476. });
  477. });
  478. };
  479. return clientCommon.createWaitablePromise(base.transporter.write({
  480. method: requesterCommon.MethodEnum.Post,
  481. path: clientCommon.encode('1/keys/%s/restore', apiKey),
  482. }, requestOptions), wait);
  483. };
  484. };
  485. const saveDictionaryEntries = (base) => {
  486. return (dictionary, entries, requestOptions) => {
  487. const requests = entries.map(entry => ({
  488. action: 'addEntry',
  489. body: entry,
  490. }));
  491. return clientCommon.createWaitablePromise(base.transporter.write({
  492. method: requesterCommon.MethodEnum.Post,
  493. path: clientCommon.encode('/1/dictionaries/%s/batch', dictionary),
  494. data: { clearExistingDictionaryEntries: false, requests },
  495. }, requestOptions), (response, waitRequestOptions) => waitAppTask(base)(response.taskID, waitRequestOptions));
  496. };
  497. };
  498. const searchDictionaryEntries = (base) => {
  499. return (dictionary, query, requestOptions) => {
  500. return base.transporter.read({
  501. method: requesterCommon.MethodEnum.Post,
  502. path: clientCommon.encode('/1/dictionaries/%s/search', dictionary),
  503. data: {
  504. query,
  505. },
  506. cacheable: true,
  507. }, requestOptions);
  508. };
  509. };
  510. const searchUserIDs = (base) => {
  511. return (query, requestOptions) => {
  512. return base.transporter.read({
  513. method: requesterCommon.MethodEnum.Post,
  514. path: '1/clusters/mapping/search',
  515. data: {
  516. query,
  517. },
  518. }, requestOptions);
  519. };
  520. };
  521. const setDictionarySettings = (base) => {
  522. return (settings, requestOptions) => {
  523. return clientCommon.createWaitablePromise(base.transporter.write({
  524. method: requesterCommon.MethodEnum.Put,
  525. path: '/1/dictionaries/*/settings',
  526. data: settings,
  527. }, requestOptions), (response, waitRequestOptions) => waitAppTask(base)(response.taskID, waitRequestOptions));
  528. };
  529. };
  530. const updateApiKey = (base) => {
  531. return (apiKey, requestOptions) => {
  532. const updatedFields = Object.assign({}, requestOptions);
  533. const { queryParameters, ...options } = requestOptions || {};
  534. const data = queryParameters ? { queryParameters } : {};
  535. const apiKeyFields = [
  536. 'acl',
  537. 'indexes',
  538. 'referers',
  539. 'restrictSources',
  540. 'queryParameters',
  541. 'description',
  542. 'maxQueriesPerIPPerHour',
  543. 'maxHitsPerQuery',
  544. ];
  545. const hasChanged = (getApiKeyResponse) => {
  546. return Object.keys(updatedFields)
  547. .filter((updatedField) => apiKeyFields.indexOf(updatedField) !== -1)
  548. .every(updatedField => {
  549. return getApiKeyResponse[updatedField] === updatedFields[updatedField];
  550. });
  551. };
  552. const wait = (_, waitRequestOptions) => clientCommon.createRetryablePromise(retry => {
  553. return getApiKey(base)(apiKey, waitRequestOptions).then(getApiKeyResponse => {
  554. return hasChanged(getApiKeyResponse) ? Promise.resolve() : retry();
  555. });
  556. });
  557. return clientCommon.createWaitablePromise(base.transporter.write({
  558. method: requesterCommon.MethodEnum.Put,
  559. path: clientCommon.encode('1/keys/%s', apiKey),
  560. data,
  561. }, options), wait);
  562. };
  563. };
  564. const waitAppTask = (base) => {
  565. return (taskID, requestOptions) => {
  566. return clientCommon.createRetryablePromise(retry => {
  567. return getAppTask(base)(taskID, requestOptions).then(response => {
  568. return response.status !== 'published' ? retry() : undefined;
  569. });
  570. });
  571. };
  572. };
  573. const batch = (base) => {
  574. return (requests, requestOptions) => {
  575. const wait = (response, waitRequestOptions) => {
  576. return waitTask(base)(response.taskID, waitRequestOptions);
  577. };
  578. return clientCommon.createWaitablePromise(base.transporter.write({
  579. method: requesterCommon.MethodEnum.Post,
  580. path: clientCommon.encode('1/indexes/%s/batch', base.indexName),
  581. data: {
  582. requests,
  583. },
  584. }, requestOptions), wait);
  585. };
  586. };
  587. const browseObjects = (base) => {
  588. return (requestOptions) => {
  589. return createBrowsablePromise({
  590. shouldStop: response => response.cursor === undefined,
  591. ...requestOptions,
  592. request: (data) => base.transporter.read({
  593. method: requesterCommon.MethodEnum.Post,
  594. path: clientCommon.encode('1/indexes/%s/browse', base.indexName),
  595. data,
  596. }, requestOptions),
  597. });
  598. };
  599. };
  600. const browseRules = (base) => {
  601. return (requestOptions) => {
  602. const options = {
  603. hitsPerPage: 1000,
  604. ...requestOptions,
  605. };
  606. return createBrowsablePromise({
  607. shouldStop: response => response.hits.length < options.hitsPerPage,
  608. ...options,
  609. request(data) {
  610. return searchRules(base)('', { ...options, ...data }).then((response) => {
  611. return {
  612. ...response,
  613. hits: response.hits.map(rule => {
  614. // eslint-disable-next-line functional/immutable-data,no-param-reassign
  615. delete rule._highlightResult;
  616. return rule;
  617. }),
  618. };
  619. });
  620. },
  621. });
  622. };
  623. };
  624. const browseSynonyms = (base) => {
  625. return (requestOptions) => {
  626. const options = {
  627. hitsPerPage: 1000,
  628. ...requestOptions,
  629. };
  630. return createBrowsablePromise({
  631. shouldStop: response => response.hits.length < options.hitsPerPage,
  632. ...options,
  633. request(data) {
  634. return searchSynonyms(base)('', { ...options, ...data }).then((response) => {
  635. return {
  636. ...response,
  637. hits: response.hits.map(synonym => {
  638. // eslint-disable-next-line functional/immutable-data,no-param-reassign
  639. delete synonym._highlightResult;
  640. return synonym;
  641. }),
  642. };
  643. });
  644. },
  645. });
  646. };
  647. };
  648. const chunkedBatch = (base) => {
  649. return (bodies, action, requestOptions) => {
  650. const { batchSize, ...options } = requestOptions || {};
  651. const response = {
  652. taskIDs: [],
  653. objectIDs: [],
  654. };
  655. const forEachBatch = (lastIndex = 0) => {
  656. // eslint-disable-next-line functional/prefer-readonly-type
  657. const bodiesChunk = [];
  658. // eslint-disable-next-line functional/no-let
  659. let index;
  660. /* eslint-disable-next-line functional/no-loop-statement */
  661. for (index = lastIndex; index < bodies.length; index++) {
  662. // eslint-disable-next-line functional/immutable-data
  663. bodiesChunk.push(bodies[index]);
  664. if (bodiesChunk.length === (batchSize || 1000)) {
  665. break;
  666. }
  667. }
  668. if (bodiesChunk.length === 0) {
  669. return Promise.resolve(response);
  670. }
  671. return batch(base)(bodiesChunk.map(body => {
  672. return {
  673. action,
  674. body,
  675. };
  676. }), options).then(res => {
  677. response.objectIDs = response.objectIDs.concat(res.objectIDs); // eslint-disable-line functional/immutable-data
  678. response.taskIDs.push(res.taskID); // eslint-disable-line functional/immutable-data
  679. index++;
  680. return forEachBatch(index);
  681. });
  682. };
  683. return clientCommon.createWaitablePromise(forEachBatch(), (chunkedBatchResponse, waitRequestOptions) => {
  684. return Promise.all(chunkedBatchResponse.taskIDs.map(taskID => {
  685. return waitTask(base)(taskID, waitRequestOptions);
  686. }));
  687. });
  688. };
  689. };
  690. const clearObjects = (base) => {
  691. return (requestOptions) => {
  692. return clientCommon.createWaitablePromise(base.transporter.write({
  693. method: requesterCommon.MethodEnum.Post,
  694. path: clientCommon.encode('1/indexes/%s/clear', base.indexName),
  695. }, requestOptions), (response, waitRequestOptions) => waitTask(base)(response.taskID, waitRequestOptions));
  696. };
  697. };
  698. const clearRules = (base) => {
  699. return (requestOptions) => {
  700. const { forwardToReplicas, ...options } = requestOptions || {};
  701. const mappedRequestOptions = transporter.createMappedRequestOptions(options);
  702. if (forwardToReplicas) {
  703. mappedRequestOptions.queryParameters.forwardToReplicas = 1; // eslint-disable-line functional/immutable-data
  704. }
  705. return clientCommon.createWaitablePromise(base.transporter.write({
  706. method: requesterCommon.MethodEnum.Post,
  707. path: clientCommon.encode('1/indexes/%s/rules/clear', base.indexName),
  708. }, mappedRequestOptions), (response, waitRequestOptions) => waitTask(base)(response.taskID, waitRequestOptions));
  709. };
  710. };
  711. const clearSynonyms = (base) => {
  712. return (requestOptions) => {
  713. const { forwardToReplicas, ...options } = requestOptions || {};
  714. const mappedRequestOptions = transporter.createMappedRequestOptions(options);
  715. if (forwardToReplicas) {
  716. mappedRequestOptions.queryParameters.forwardToReplicas = 1; // eslint-disable-line functional/immutable-data
  717. }
  718. return clientCommon.createWaitablePromise(base.transporter.write({
  719. method: requesterCommon.MethodEnum.Post,
  720. path: clientCommon.encode('1/indexes/%s/synonyms/clear', base.indexName),
  721. }, mappedRequestOptions), (response, waitRequestOptions) => waitTask(base)(response.taskID, waitRequestOptions));
  722. };
  723. };
  724. const deleteBy = (base) => {
  725. return (filters, requestOptions) => {
  726. return clientCommon.createWaitablePromise(base.transporter.write({
  727. method: requesterCommon.MethodEnum.Post,
  728. path: clientCommon.encode('1/indexes/%s/deleteByQuery', base.indexName),
  729. data: filters,
  730. }, requestOptions), (response, waitRequestOptions) => waitTask(base)(response.taskID, waitRequestOptions));
  731. };
  732. };
  733. const deleteIndex = (base) => {
  734. return (requestOptions) => {
  735. return clientCommon.createWaitablePromise(base.transporter.write({
  736. method: requesterCommon.MethodEnum.Delete,
  737. path: clientCommon.encode('1/indexes/%s', base.indexName),
  738. }, requestOptions), (response, waitRequestOptions) => waitTask(base)(response.taskID, waitRequestOptions));
  739. };
  740. };
  741. const deleteObject = (base) => {
  742. return (objectID, requestOptions) => {
  743. return clientCommon.createWaitablePromise(deleteObjects(base)([objectID], requestOptions).then(response => {
  744. return { taskID: response.taskIDs[0] };
  745. }), (response, waitRequestOptions) => waitTask(base)(response.taskID, waitRequestOptions));
  746. };
  747. };
  748. const deleteObjects = (base) => {
  749. return (objectIDs, requestOptions) => {
  750. const objects = objectIDs.map(objectID => {
  751. return { objectID };
  752. });
  753. return chunkedBatch(base)(objects, BatchActionEnum.DeleteObject, requestOptions);
  754. };
  755. };
  756. const deleteRule = (base) => {
  757. return (objectID, requestOptions) => {
  758. const { forwardToReplicas, ...options } = requestOptions || {};
  759. const mappedRequestOptions = transporter.createMappedRequestOptions(options);
  760. if (forwardToReplicas) {
  761. mappedRequestOptions.queryParameters.forwardToReplicas = 1; // eslint-disable-line functional/immutable-data
  762. }
  763. return clientCommon.createWaitablePromise(base.transporter.write({
  764. method: requesterCommon.MethodEnum.Delete,
  765. path: clientCommon.encode('1/indexes/%s/rules/%s', base.indexName, objectID),
  766. }, mappedRequestOptions), (response, waitRequestOptions) => waitTask(base)(response.taskID, waitRequestOptions));
  767. };
  768. };
  769. const deleteSynonym = (base) => {
  770. return (objectID, requestOptions) => {
  771. const { forwardToReplicas, ...options } = requestOptions || {};
  772. const mappedRequestOptions = transporter.createMappedRequestOptions(options);
  773. if (forwardToReplicas) {
  774. mappedRequestOptions.queryParameters.forwardToReplicas = 1; // eslint-disable-line functional/immutable-data
  775. }
  776. return clientCommon.createWaitablePromise(base.transporter.write({
  777. method: requesterCommon.MethodEnum.Delete,
  778. path: clientCommon.encode('1/indexes/%s/synonyms/%s', base.indexName, objectID),
  779. }, mappedRequestOptions), (response, waitRequestOptions) => waitTask(base)(response.taskID, waitRequestOptions));
  780. };
  781. };
  782. const exists = (base) => {
  783. return (requestOptions) => {
  784. return getSettings(base)(requestOptions)
  785. .then(() => true)
  786. .catch(error => {
  787. if (error.status !== 404) {
  788. throw error;
  789. }
  790. return false;
  791. });
  792. };
  793. };
  794. const findAnswers = (base) => {
  795. return (query, queryLanguages, requestOptions) => {
  796. return base.transporter.read({
  797. method: requesterCommon.MethodEnum.Post,
  798. path: clientCommon.encode('1/answers/%s/prediction', base.indexName),
  799. data: {
  800. query,
  801. queryLanguages,
  802. },
  803. cacheable: true,
  804. }, requestOptions);
  805. };
  806. };
  807. const findObject = (base) => {
  808. return (callback, requestOptions) => {
  809. const { query, paginate, ...options } = requestOptions || {};
  810. // eslint-disable-next-line functional/no-let
  811. let page = 0;
  812. const forEachPage = () => {
  813. return search(base)(query || '', { ...options, page }).then(result => {
  814. // eslint-disable-next-line functional/no-loop-statement
  815. for (const [position, hit] of Object.entries(result.hits)) {
  816. // eslint-disable-next-line promise/no-callback-in-promise
  817. if (callback(hit)) {
  818. return {
  819. object: hit,
  820. position: parseInt(position, 10),
  821. page,
  822. };
  823. }
  824. }
  825. page++;
  826. // paginate if option was set and has next page
  827. if (paginate === false || page >= result.nbPages) {
  828. throw createObjectNotFoundError();
  829. }
  830. return forEachPage();
  831. });
  832. };
  833. return forEachPage();
  834. };
  835. };
  836. const getObject = (base) => {
  837. return (objectID, requestOptions) => {
  838. return base.transporter.read({
  839. method: requesterCommon.MethodEnum.Get,
  840. path: clientCommon.encode('1/indexes/%s/%s', base.indexName, objectID),
  841. }, requestOptions);
  842. };
  843. };
  844. const getObjectPosition = () => {
  845. return (searchResponse, objectID) => {
  846. // eslint-disable-next-line functional/no-loop-statement
  847. for (const [position, hit] of Object.entries(searchResponse.hits)) {
  848. if (hit.objectID === objectID) {
  849. return parseInt(position, 10);
  850. }
  851. }
  852. return -1;
  853. };
  854. };
  855. const getObjects = (base) => {
  856. return (objectIDs, requestOptions) => {
  857. const { attributesToRetrieve, ...options } = requestOptions || {};
  858. const requests = objectIDs.map(objectID => {
  859. return {
  860. indexName: base.indexName,
  861. objectID,
  862. ...(attributesToRetrieve ? { attributesToRetrieve } : {}),
  863. };
  864. });
  865. return base.transporter.read({
  866. method: requesterCommon.MethodEnum.Post,
  867. path: '1/indexes/*/objects',
  868. data: {
  869. requests,
  870. },
  871. }, options);
  872. };
  873. };
  874. const getRule = (base) => {
  875. return (objectID, requestOptions) => {
  876. return base.transporter.read({
  877. method: requesterCommon.MethodEnum.Get,
  878. path: clientCommon.encode('1/indexes/%s/rules/%s', base.indexName, objectID),
  879. }, requestOptions);
  880. };
  881. };
  882. const getSettings = (base) => {
  883. return (requestOptions) => {
  884. return base.transporter.read({
  885. method: requesterCommon.MethodEnum.Get,
  886. path: clientCommon.encode('1/indexes/%s/settings', base.indexName),
  887. data: {
  888. getVersion: 2,
  889. },
  890. }, requestOptions);
  891. };
  892. };
  893. const getSynonym = (base) => {
  894. return (objectID, requestOptions) => {
  895. return base.transporter.read({
  896. method: requesterCommon.MethodEnum.Get,
  897. path: clientCommon.encode(`1/indexes/%s/synonyms/%s`, base.indexName, objectID),
  898. }, requestOptions);
  899. };
  900. };
  901. const getTask = (base) => {
  902. return (taskID, requestOptions) => {
  903. return base.transporter.read({
  904. method: requesterCommon.MethodEnum.Get,
  905. path: clientCommon.encode('1/indexes/%s/task/%s', base.indexName, taskID.toString()),
  906. }, requestOptions);
  907. };
  908. };
  909. const partialUpdateObject = (base) => {
  910. return (object, requestOptions) => {
  911. return clientCommon.createWaitablePromise(partialUpdateObjects(base)([object], requestOptions).then(response => {
  912. return {
  913. objectID: response.objectIDs[0],
  914. taskID: response.taskIDs[0],
  915. };
  916. }), (response, waitRequestOptions) => waitTask(base)(response.taskID, waitRequestOptions));
  917. };
  918. };
  919. const partialUpdateObjects = (base) => {
  920. return (objects, requestOptions) => {
  921. const { createIfNotExists, ...options } = requestOptions || {};
  922. const action = createIfNotExists
  923. ? BatchActionEnum.PartialUpdateObject
  924. : BatchActionEnum.PartialUpdateObjectNoCreate;
  925. return chunkedBatch(base)(objects, action, options);
  926. };
  927. };
  928. const replaceAllObjects = (base) => {
  929. return (objects, requestOptions) => {
  930. const { safe, autoGenerateObjectIDIfNotExist, batchSize, ...options } = requestOptions || {};
  931. const operation = (from, to, type, operationRequestOptions) => {
  932. return clientCommon.createWaitablePromise(base.transporter.write({
  933. method: requesterCommon.MethodEnum.Post,
  934. path: clientCommon.encode('1/indexes/%s/operation', from),
  935. data: {
  936. operation: type,
  937. destination: to,
  938. },
  939. }, operationRequestOptions), (response, waitRequestOptions) => waitTask(base)(response.taskID, waitRequestOptions));
  940. };
  941. const randomSuffix = Math.random()
  942. .toString(36)
  943. .substring(7);
  944. const temporaryIndexName = `${base.indexName}_tmp_${randomSuffix}`;
  945. const saveObjectsInTemporary = saveObjects({
  946. appId: base.appId,
  947. transporter: base.transporter,
  948. indexName: temporaryIndexName,
  949. });
  950. // @ts-ignore
  951. // eslint-disable-next-line prefer-const, functional/no-let, functional/prefer-readonly-type
  952. let responses = [];
  953. const copyWaitablePromise = operation(base.indexName, temporaryIndexName, 'copy', {
  954. ...options,
  955. scope: ['settings', 'synonyms', 'rules'],
  956. });
  957. // eslint-disable-next-line functional/immutable-data
  958. responses.push(copyWaitablePromise);
  959. const result = (safe
  960. ? copyWaitablePromise.wait(options)
  961. : copyWaitablePromise)
  962. .then(() => {
  963. const saveObjectsWaitablePromise = saveObjectsInTemporary(objects, {
  964. ...options,
  965. autoGenerateObjectIDIfNotExist,
  966. batchSize,
  967. });
  968. // eslint-disable-next-line functional/immutable-data
  969. responses.push(saveObjectsWaitablePromise);
  970. return safe ? saveObjectsWaitablePromise.wait(options) : saveObjectsWaitablePromise;
  971. })
  972. .then(() => {
  973. const moveWaitablePromise = operation(temporaryIndexName, base.indexName, 'move', options);
  974. // eslint-disable-next-line functional/immutable-data
  975. responses.push(moveWaitablePromise);
  976. return safe ? moveWaitablePromise.wait(options) : moveWaitablePromise;
  977. })
  978. .then(() => Promise.all(responses))
  979. .then(([copyResponse, saveObjectsResponse, moveResponse]) => {
  980. return {
  981. objectIDs: saveObjectsResponse.objectIDs,
  982. taskIDs: [copyResponse.taskID, ...saveObjectsResponse.taskIDs, moveResponse.taskID],
  983. };
  984. });
  985. return clientCommon.createWaitablePromise(result, (_, waitRequestOptions) => {
  986. return Promise.all(responses.map(response => response.wait(waitRequestOptions)));
  987. });
  988. };
  989. };
  990. const replaceAllRules = (base) => {
  991. return (rules, requestOptions) => {
  992. return saveRules(base)(rules, {
  993. ...requestOptions,
  994. clearExistingRules: true,
  995. });
  996. };
  997. };
  998. const replaceAllSynonyms = (base) => {
  999. return (synonyms, requestOptions) => {
  1000. return saveSynonyms(base)(synonyms, {
  1001. ...requestOptions,
  1002. clearExistingSynonyms: true,
  1003. });
  1004. };
  1005. };
  1006. const saveObject = (base) => {
  1007. return (object, requestOptions) => {
  1008. return clientCommon.createWaitablePromise(saveObjects(base)([object], requestOptions).then(response => {
  1009. return {
  1010. objectID: response.objectIDs[0],
  1011. taskID: response.taskIDs[0],
  1012. };
  1013. }), (response, waitRequestOptions) => waitTask(base)(response.taskID, waitRequestOptions));
  1014. };
  1015. };
  1016. const saveObjects = (base) => {
  1017. return (objects, requestOptions) => {
  1018. const { autoGenerateObjectIDIfNotExist, ...options } = requestOptions || {};
  1019. const action = autoGenerateObjectIDIfNotExist
  1020. ? BatchActionEnum.AddObject
  1021. : BatchActionEnum.UpdateObject;
  1022. if (action === BatchActionEnum.UpdateObject) {
  1023. // eslint-disable-next-line functional/no-loop-statement
  1024. for (const object of objects) {
  1025. if (object.objectID === undefined) {
  1026. return clientCommon.createWaitablePromise(Promise.reject(createMissingObjectIDError()));
  1027. }
  1028. }
  1029. }
  1030. return chunkedBatch(base)(objects, action, options);
  1031. };
  1032. };
  1033. const saveRule = (base) => {
  1034. return (rule, requestOptions) => {
  1035. return saveRules(base)([rule], requestOptions);
  1036. };
  1037. };
  1038. const saveRules = (base) => {
  1039. return (rules, requestOptions) => {
  1040. const { forwardToReplicas, clearExistingRules, ...options } = requestOptions || {};
  1041. const mappedRequestOptions = transporter.createMappedRequestOptions(options);
  1042. if (forwardToReplicas) {
  1043. mappedRequestOptions.queryParameters.forwardToReplicas = 1; // eslint-disable-line functional/immutable-data
  1044. }
  1045. if (clearExistingRules) {
  1046. mappedRequestOptions.queryParameters.clearExistingRules = 1; // eslint-disable-line functional/immutable-data
  1047. }
  1048. return clientCommon.createWaitablePromise(base.transporter.write({
  1049. method: requesterCommon.MethodEnum.Post,
  1050. path: clientCommon.encode('1/indexes/%s/rules/batch', base.indexName),
  1051. data: rules,
  1052. }, mappedRequestOptions), (response, waitRequestOptions) => waitTask(base)(response.taskID, waitRequestOptions));
  1053. };
  1054. };
  1055. const saveSynonym = (base) => {
  1056. return (synonym, requestOptions) => {
  1057. return saveSynonyms(base)([synonym], requestOptions);
  1058. };
  1059. };
  1060. const saveSynonyms = (base) => {
  1061. return (synonyms, requestOptions) => {
  1062. const { forwardToReplicas, clearExistingSynonyms, replaceExistingSynonyms, ...options } = requestOptions || {};
  1063. const mappedRequestOptions = transporter.createMappedRequestOptions(options);
  1064. if (forwardToReplicas) {
  1065. mappedRequestOptions.queryParameters.forwardToReplicas = 1; // eslint-disable-line functional/immutable-data
  1066. }
  1067. if (replaceExistingSynonyms || clearExistingSynonyms) {
  1068. mappedRequestOptions.queryParameters.replaceExistingSynonyms = 1; // eslint-disable-line functional/immutable-data
  1069. }
  1070. return clientCommon.createWaitablePromise(base.transporter.write({
  1071. method: requesterCommon.MethodEnum.Post,
  1072. path: clientCommon.encode('1/indexes/%s/synonyms/batch', base.indexName),
  1073. data: synonyms,
  1074. }, mappedRequestOptions), (response, waitRequestOptions) => waitTask(base)(response.taskID, waitRequestOptions));
  1075. };
  1076. };
  1077. const search = (base) => {
  1078. return (query, requestOptions) => {
  1079. return base.transporter.read({
  1080. method: requesterCommon.MethodEnum.Post,
  1081. path: clientCommon.encode('1/indexes/%s/query', base.indexName),
  1082. data: {
  1083. query,
  1084. },
  1085. cacheable: true,
  1086. }, requestOptions);
  1087. };
  1088. };
  1089. const searchForFacetValues = (base) => {
  1090. return (facetName, facetQuery, requestOptions) => {
  1091. return base.transporter.read({
  1092. method: requesterCommon.MethodEnum.Post,
  1093. path: clientCommon.encode('1/indexes/%s/facets/%s/query', base.indexName, facetName),
  1094. data: {
  1095. facetQuery,
  1096. },
  1097. cacheable: true,
  1098. }, requestOptions);
  1099. };
  1100. };
  1101. const searchRules = (base) => {
  1102. return (query, requestOptions) => {
  1103. return base.transporter.read({
  1104. method: requesterCommon.MethodEnum.Post,
  1105. path: clientCommon.encode('1/indexes/%s/rules/search', base.indexName),
  1106. data: {
  1107. query,
  1108. },
  1109. }, requestOptions);
  1110. };
  1111. };
  1112. const searchSynonyms = (base) => {
  1113. return (query, requestOptions) => {
  1114. return base.transporter.read({
  1115. method: requesterCommon.MethodEnum.Post,
  1116. path: clientCommon.encode('1/indexes/%s/synonyms/search', base.indexName),
  1117. data: {
  1118. query,
  1119. },
  1120. }, requestOptions);
  1121. };
  1122. };
  1123. const setSettings = (base) => {
  1124. return (settings, requestOptions) => {
  1125. const { forwardToReplicas, ...options } = requestOptions || {};
  1126. const mappedRequestOptions = transporter.createMappedRequestOptions(options);
  1127. if (forwardToReplicas) {
  1128. mappedRequestOptions.queryParameters.forwardToReplicas = 1; // eslint-disable-line functional/immutable-data
  1129. }
  1130. return clientCommon.createWaitablePromise(base.transporter.write({
  1131. method: requesterCommon.MethodEnum.Put,
  1132. path: clientCommon.encode('1/indexes/%s/settings', base.indexName),
  1133. data: settings,
  1134. }, mappedRequestOptions), (response, waitRequestOptions) => waitTask(base)(response.taskID, waitRequestOptions));
  1135. };
  1136. };
  1137. const waitTask = (base) => {
  1138. return (taskID, requestOptions) => {
  1139. return clientCommon.createRetryablePromise(retry => {
  1140. return getTask(base)(taskID, requestOptions).then(response => {
  1141. return response.status !== 'published' ? retry() : undefined;
  1142. });
  1143. });
  1144. };
  1145. };
  1146. const ApiKeyACLEnum = {
  1147. AddObject: 'addObject',
  1148. Analytics: 'analytics',
  1149. Browser: 'browse',
  1150. DeleteIndex: 'deleteIndex',
  1151. DeleteObject: 'deleteObject',
  1152. EditSettings: 'editSettings',
  1153. ListIndexes: 'listIndexes',
  1154. Logs: 'logs',
  1155. Personalization: 'personalization',
  1156. Recommendation: 'recommendation',
  1157. Search: 'search',
  1158. SeeUnretrievableAttributes: 'seeUnretrievableAttributes',
  1159. Settings: 'settings',
  1160. Usage: 'usage',
  1161. };
  1162. const BatchActionEnum = {
  1163. AddObject: 'addObject',
  1164. UpdateObject: 'updateObject',
  1165. PartialUpdateObject: 'partialUpdateObject',
  1166. PartialUpdateObjectNoCreate: 'partialUpdateObjectNoCreate',
  1167. DeleteObject: 'deleteObject',
  1168. DeleteIndex: 'delete',
  1169. ClearIndex: 'clear',
  1170. };
  1171. const ScopeEnum = {
  1172. Settings: 'settings',
  1173. Synonyms: 'synonyms',
  1174. Rules: 'rules',
  1175. };
  1176. const StrategyEnum = {
  1177. None: 'none',
  1178. StopIfEnoughMatches: 'stopIfEnoughMatches',
  1179. };
  1180. const SynonymEnum = {
  1181. Synonym: 'synonym',
  1182. OneWaySynonym: 'oneWaySynonym',
  1183. AltCorrection1: 'altCorrection1',
  1184. AltCorrection2: 'altCorrection2',
  1185. Placeholder: 'placeholder',
  1186. };
  1187. exports.ApiKeyACLEnum = ApiKeyACLEnum;
  1188. exports.BatchActionEnum = BatchActionEnum;
  1189. exports.ScopeEnum = ScopeEnum;
  1190. exports.StrategyEnum = StrategyEnum;
  1191. exports.SynonymEnum = SynonymEnum;
  1192. exports.addApiKey = addApiKey;
  1193. exports.assignUserID = assignUserID;
  1194. exports.assignUserIDs = assignUserIDs;
  1195. exports.batch = batch;
  1196. exports.browseObjects = browseObjects;
  1197. exports.browseRules = browseRules;
  1198. exports.browseSynonyms = browseSynonyms;
  1199. exports.chunkedBatch = chunkedBatch;
  1200. exports.clearDictionaryEntries = clearDictionaryEntries;
  1201. exports.clearObjects = clearObjects;
  1202. exports.clearRules = clearRules;
  1203. exports.clearSynonyms = clearSynonyms;
  1204. exports.copyIndex = copyIndex;
  1205. exports.copyRules = copyRules;
  1206. exports.copySettings = copySettings;
  1207. exports.copySynonyms = copySynonyms;
  1208. exports.createBrowsablePromise = createBrowsablePromise;
  1209. exports.createMissingObjectIDError = createMissingObjectIDError;
  1210. exports.createObjectNotFoundError = createObjectNotFoundError;
  1211. exports.createSearchClient = createSearchClient;
  1212. exports.createValidUntilNotFoundError = createValidUntilNotFoundError;
  1213. exports.customRequest = customRequest;
  1214. exports.deleteApiKey = deleteApiKey;
  1215. exports.deleteBy = deleteBy;
  1216. exports.deleteDictionaryEntries = deleteDictionaryEntries;
  1217. exports.deleteIndex = deleteIndex;
  1218. exports.deleteObject = deleteObject;
  1219. exports.deleteObjects = deleteObjects;
  1220. exports.deleteRule = deleteRule;
  1221. exports.deleteSynonym = deleteSynonym;
  1222. exports.exists = exists;
  1223. exports.findAnswers = findAnswers;
  1224. exports.findObject = findObject;
  1225. exports.generateSecuredApiKey = generateSecuredApiKey;
  1226. exports.getApiKey = getApiKey;
  1227. exports.getAppTask = getAppTask;
  1228. exports.getDictionarySettings = getDictionarySettings;
  1229. exports.getLogs = getLogs;
  1230. exports.getObject = getObject;
  1231. exports.getObjectPosition = getObjectPosition;
  1232. exports.getObjects = getObjects;
  1233. exports.getRule = getRule;
  1234. exports.getSecuredApiKeyRemainingValidity = getSecuredApiKeyRemainingValidity;
  1235. exports.getSettings = getSettings;
  1236. exports.getSynonym = getSynonym;
  1237. exports.getTask = getTask;
  1238. exports.getTopUserIDs = getTopUserIDs;
  1239. exports.getUserID = getUserID;
  1240. exports.hasPendingMappings = hasPendingMappings;
  1241. exports.initIndex = initIndex;
  1242. exports.listApiKeys = listApiKeys;
  1243. exports.listClusters = listClusters;
  1244. exports.listIndices = listIndices;
  1245. exports.listUserIDs = listUserIDs;
  1246. exports.moveIndex = moveIndex;
  1247. exports.multipleBatch = multipleBatch;
  1248. exports.multipleGetObjects = multipleGetObjects;
  1249. exports.multipleQueries = multipleQueries;
  1250. exports.multipleSearchForFacetValues = multipleSearchForFacetValues;
  1251. exports.partialUpdateObject = partialUpdateObject;
  1252. exports.partialUpdateObjects = partialUpdateObjects;
  1253. exports.removeUserID = removeUserID;
  1254. exports.replaceAllObjects = replaceAllObjects;
  1255. exports.replaceAllRules = replaceAllRules;
  1256. exports.replaceAllSynonyms = replaceAllSynonyms;
  1257. exports.replaceDictionaryEntries = replaceDictionaryEntries;
  1258. exports.restoreApiKey = restoreApiKey;
  1259. exports.saveDictionaryEntries = saveDictionaryEntries;
  1260. exports.saveObject = saveObject;
  1261. exports.saveObjects = saveObjects;
  1262. exports.saveRule = saveRule;
  1263. exports.saveRules = saveRules;
  1264. exports.saveSynonym = saveSynonym;
  1265. exports.saveSynonyms = saveSynonyms;
  1266. exports.search = search;
  1267. exports.searchDictionaryEntries = searchDictionaryEntries;
  1268. exports.searchForFacetValues = searchForFacetValues;
  1269. exports.searchRules = searchRules;
  1270. exports.searchSynonyms = searchSynonyms;
  1271. exports.searchUserIDs = searchUserIDs;
  1272. exports.setDictionarySettings = setDictionarySettings;
  1273. exports.setSettings = setSettings;
  1274. exports.updateApiKey = updateApiKey;
  1275. exports.waitAppTask = waitAppTask;
  1276. exports.waitTask = waitTask;