PageRenderTime 48ms CodeModel.GetById 16ms RepoModel.GetById 0ms app.codeStats 0ms

/ajax/libs/algoliasearch/2.3.7/algoliasearch.js

https://gitlab.com/Mirros/cdnjs
JavaScript | 617 lines | 608 code | 4 blank | 5 comment | 105 complexity | d41f6fdcb439ddddd159efcaeaf6a3c9 MD5 | raw file
  1. /*!
  2. * algoliasearch 2.3.6
  3. * https://github.com/algolia/algoliasearch-client-js
  4. * Copyright 2013 Algolia SAS; Licensed MIT
  5. */
  6. var VERSION = "2.3.6";
  7. var AlgoliaSearch = function(applicationID, apiKey, method, resolveDNS, hostsArray) {
  8. this.applicationID = applicationID;
  9. this.apiKey = apiKey;
  10. if (this._isUndefined(hostsArray)) {
  11. hostsArray = [ applicationID + "-1.algolia.io", applicationID + "-2.algolia.io", applicationID + "-3.algolia.io" ];
  12. }
  13. this.hosts = [];
  14. for (var i = 0; i < hostsArray.length; ++i) {
  15. if (Math.random() > .5) {
  16. this.hosts.reverse();
  17. }
  18. if (this._isUndefined(method) || method == null) {
  19. this.hosts.push(("https:" == document.location.protocol ? "https" : "http") + "://" + hostsArray[i]);
  20. } else if (method === "https" || method === "HTTPS") {
  21. this.hosts.push("https://" + hostsArray[i]);
  22. } else {
  23. this.hosts.push("http://" + hostsArray[i]);
  24. }
  25. }
  26. if (Math.random() > .5) {
  27. this.hosts.reverse();
  28. }
  29. if (this._isUndefined(resolveDNS) || resolveDNS) {
  30. this._jsonRequest({
  31. method: "GET",
  32. url: "/1/isalive"
  33. });
  34. }
  35. this.extraHeaders = [];
  36. };
  37. AlgoliaSearch.prototype = {
  38. deleteIndex: function(indexName, callback) {
  39. this._jsonRequest({
  40. method: "DELETE",
  41. url: "/1/indexes/" + encodeURIComponent(indexName),
  42. callback: callback
  43. });
  44. },
  45. moveIndex: function(srcIndexName, dstIndexName, callback) {
  46. var postObj = {
  47. operation: "move",
  48. destination: dstIndexName
  49. };
  50. this._jsonRequest({
  51. method: "POST",
  52. url: "/1/indexes/" + encodeURIComponent(srcIndexName) + "/operation",
  53. body: postObj,
  54. callback: callback
  55. });
  56. },
  57. copyIndex: function(srcIndexName, dstIndexName, callback) {
  58. var postObj = {
  59. operation: "copy",
  60. destination: dstIndexName
  61. };
  62. this._jsonRequest({
  63. method: "POST",
  64. url: "/1/indexes/" + encodeURIComponent(srcIndexName) + "/operation",
  65. body: postObj,
  66. callback: callback
  67. });
  68. },
  69. getLogs: function(callback, offset, length) {
  70. if (this._isUndefined(offset)) {
  71. offset = 0;
  72. }
  73. if (this._isUndefined(length)) {
  74. length = 10;
  75. }
  76. this._jsonRequest({
  77. method: "GET",
  78. url: "/1/logs?offset=" + offset + "&length=" + length,
  79. callback: callback
  80. });
  81. },
  82. listIndexes: function(callback) {
  83. this._jsonRequest({
  84. method: "GET",
  85. url: "/1/indexes/",
  86. callback: callback
  87. });
  88. },
  89. initIndex: function(indexName) {
  90. return new this.Index(this, indexName);
  91. },
  92. listUserKeys: function(callback) {
  93. this._jsonRequest({
  94. method: "GET",
  95. url: "/1/keys",
  96. callback: callback
  97. });
  98. },
  99. getUserKeyACL: function(key, callback) {
  100. this._jsonRequest({
  101. method: "GET",
  102. url: "/1/keys/" + key,
  103. callback: callback
  104. });
  105. },
  106. deleteUserKey: function(key, callback) {
  107. this._jsonRequest({
  108. method: "DELETE",
  109. url: "/1/keys/" + key,
  110. callback: callback
  111. });
  112. },
  113. addUserKey: function(acls, callback) {
  114. var aclsObject = {};
  115. aclsObject.acl = acls;
  116. this._jsonRequest({
  117. method: "POST",
  118. url: "/1/keys",
  119. body: aclsObject,
  120. callback: callback
  121. });
  122. },
  123. addUserKeyWithValidity: function(acls, validity, maxQueriesPerIPPerHour, maxHitsPerQuery, callback) {
  124. var indexObj = this;
  125. var aclsObject = {};
  126. aclsObject.acl = acls;
  127. aclsObject.validity = validity;
  128. aclsObject.maxQueriesPerIPPerHour = maxQueriesPerIPPerHour;
  129. aclsObject.maxHitsPerQuery = maxHitsPerQuery;
  130. this._jsonRequest({
  131. method: "POST",
  132. url: "/1/indexes/" + indexObj.indexName + "/keys",
  133. body: aclsObject,
  134. callback: callback
  135. });
  136. },
  137. startQueriesBatch: function() {
  138. this.batch = [];
  139. },
  140. addQueryInBatch: function(indexName, query, args) {
  141. var params = "query=" + encodeURIComponent(query);
  142. if (!this._isUndefined(args) && args != null) {
  143. params = this._getSearchParams(args, params);
  144. }
  145. this.batch.push({
  146. indexName: indexName,
  147. params: params
  148. });
  149. },
  150. clearCache: function() {
  151. this.cache = {};
  152. },
  153. sendQueriesBatch: function(callback, delay) {
  154. var as = this;
  155. var params = {
  156. requests: [],
  157. apiKey: this.apiKey,
  158. appID: this.applicationID
  159. };
  160. for (var i = 0; i < as.batch.length; ++i) {
  161. params.requests.push(as.batch[i]);
  162. }
  163. window.clearTimeout(as.onDelayTrigger);
  164. if (!this._isUndefined(delay) && delay != null && delay > 0) {
  165. var onDelayTrigger = window.setTimeout(function() {
  166. as._sendQueriesBatch(params, callback);
  167. }, delay);
  168. as.onDelayTrigger = onDelayTrigger;
  169. } else {
  170. this._sendQueriesBatch(params, callback);
  171. }
  172. },
  173. Index: function(algoliasearch, indexName) {
  174. this.indexName = indexName;
  175. this.as = algoliasearch;
  176. this.typeAheadArgs = null;
  177. this.typeAheadValueOption = null;
  178. },
  179. setExtraHeader: function(key, value) {
  180. this.extraHeaders.push({
  181. key: key,
  182. value: value
  183. });
  184. },
  185. _sendQueriesBatch: function(params, callback) {
  186. this._jsonRequest({
  187. cache: this.cache,
  188. method: "POST",
  189. url: "/1/indexes/*/queries",
  190. body: params,
  191. callback: callback
  192. });
  193. },
  194. _jsonRequest: function(opts) {
  195. var self = this;
  196. var callback = opts.callback;
  197. var cache = null;
  198. var cacheID = opts.url;
  199. if (!this._isUndefined(opts.body)) {
  200. cacheID = opts.url + "_body_" + JSON.stringify(opts.body);
  201. }
  202. if (!this._isUndefined(opts.cache)) {
  203. cache = opts.cache;
  204. if (!this._isUndefined(cache[cacheID])) {
  205. if (!this._isUndefined(callback)) {
  206. callback(true, cache[cacheID]);
  207. }
  208. return;
  209. }
  210. }
  211. var impl = function(position) {
  212. var idx = 0;
  213. if (!self._isUndefined(position)) {
  214. idx = position;
  215. }
  216. if (self.hosts.length <= idx) {
  217. if (!self._isUndefined(callback)) {
  218. callback(false, {
  219. message: "Cannot contact server"
  220. });
  221. }
  222. return;
  223. }
  224. opts.callback = function(retry, success, res, body) {
  225. if (!success && !self._isUndefined(body)) {
  226. console.log("Error: " + body.message);
  227. }
  228. if (success && !self._isUndefined(opts.cache)) {
  229. cache[cacheID] = body;
  230. }
  231. if (!success && retry && idx + 1 < self.hosts.length) {
  232. impl(idx + 1);
  233. } else {
  234. if (!self._isUndefined(callback)) {
  235. callback(success, body);
  236. }
  237. }
  238. };
  239. opts.hostname = self.hosts[idx];
  240. self._jsonRequestByHost(opts);
  241. };
  242. impl();
  243. },
  244. _jsonRequestByHost: function(opts) {
  245. var body = null;
  246. var self = this;
  247. if (!this._isUndefined(opts.body)) {
  248. body = JSON.stringify(opts.body);
  249. }
  250. var url = opts.hostname + opts.url;
  251. var xmlHttp = null;
  252. xmlHttp = new XMLHttpRequest();
  253. if ("withCredentials" in xmlHttp) {
  254. xmlHttp.open(opts.method, url, true);
  255. xmlHttp.setRequestHeader("X-Algolia-API-Key", this.apiKey);
  256. xmlHttp.setRequestHeader("X-Algolia-Application-Id", this.applicationID);
  257. for (var i = 0; i < this.extraHeaders.length; ++i) {
  258. xmlHttp.setRequestHeader(this.extraHeaders[i].key, this.extraHeaders[i].value);
  259. }
  260. if (body != null) {
  261. xmlHttp.setRequestHeader("Content-type", "application/json");
  262. }
  263. } else if (typeof XDomainRequest != "undefined") {
  264. xmlHttp = new XDomainRequest();
  265. xmlHttp.open(opts.method, url);
  266. } else {
  267. console.log("your browser is too old to support CORS requests");
  268. }
  269. xmlHttp.send(body);
  270. xmlHttp.onload = function(event) {
  271. if (!self._isUndefined(event) && event.target != null) {
  272. var retry = event.target.status === 0 || event.target.status === 503;
  273. var success = event.target.status === 200 || event.target.status === 201;
  274. opts.callback(retry, success, event.target, event.target.response != null ? JSON.parse(event.target.response) : null);
  275. } else {
  276. opts.callback(false, true, event, JSON.parse(xmlHttp.responseText));
  277. }
  278. };
  279. xmlHttp.onerror = function() {
  280. opts.callback(true, false, null, {
  281. message: "Could not connect to Host"
  282. });
  283. };
  284. },
  285. _getSearchParams: function(args, params) {
  286. if (this._isUndefined(args) || args == null) {
  287. return params;
  288. }
  289. for (var key in args) {
  290. if (key != null && args.hasOwnProperty(key)) {
  291. params += params.length === 0 ? "?" : "&";
  292. params += key + "=" + encodeURIComponent(Object.prototype.toString.call(args[key]) === "[object Array]" ? JSON.stringify(args[key]) : args[key]);
  293. }
  294. }
  295. return params;
  296. },
  297. _isUndefined: function(obj) {
  298. return obj === void 0;
  299. },
  300. applicationID: null,
  301. apiKey: null,
  302. hosts: [],
  303. cache: {},
  304. extraHeaders: []
  305. };
  306. AlgoliaSearch.prototype.Index.prototype = {
  307. clearCache: function() {
  308. this.cache = {};
  309. },
  310. addObject: function(content, callback, objectID) {
  311. var indexObj = this;
  312. if (this.as._isUndefined(objectID)) {
  313. this.as._jsonRequest({
  314. method: "POST",
  315. url: "/1/indexes/" + encodeURIComponent(indexObj.indexName),
  316. body: content,
  317. callback: callback
  318. });
  319. } else {
  320. this.as._jsonRequest({
  321. method: "PUT",
  322. url: "/1/indexes/" + encodeURIComponent(indexObj.indexName) + "/" + encodeURIComponent(objectID),
  323. body: content,
  324. callback: callback
  325. });
  326. }
  327. },
  328. addObjects: function(objects, callback) {
  329. var indexObj = this;
  330. var postObj = {
  331. requests: []
  332. };
  333. for (var i = 0; i < objects.length; ++i) {
  334. var request = {
  335. action: "addObject",
  336. body: objects[i]
  337. };
  338. postObj.requests.push(request);
  339. }
  340. this.as._jsonRequest({
  341. method: "POST",
  342. url: "/1/indexes/" + encodeURIComponent(indexObj.indexName) + "/batch",
  343. body: postObj,
  344. callback: callback
  345. });
  346. },
  347. getObject: function(objectID, callback, attributes) {
  348. var indexObj = this;
  349. var params = "";
  350. if (!this.as._isUndefined(attributes)) {
  351. params = "?attributes=";
  352. for (var i = 0; i < attributes.length; ++i) {
  353. if (i !== 0) {
  354. params += ",";
  355. }
  356. params += attributes[i];
  357. }
  358. }
  359. this.as._jsonRequest({
  360. method: "GET",
  361. url: "/1/indexes/" + encodeURIComponent(indexObj.indexName) + "/" + encodeURIComponent(objectID) + params,
  362. callback: callback
  363. });
  364. },
  365. partialUpdateObject: function(partialObject, callback) {
  366. var indexObj = this;
  367. this.as._jsonRequest({
  368. method: "POST",
  369. url: "/1/indexes/" + encodeURIComponent(indexObj.indexName) + "/" + encodeURIComponent(partialObject.objectID) + "/partial",
  370. body: partialObject,
  371. callback: callback
  372. });
  373. },
  374. partialUpdateObjects: function(objects, callback) {
  375. var indexObj = this;
  376. var postObj = {
  377. requests: []
  378. };
  379. for (var i = 0; i < objects.length; ++i) {
  380. var request = {
  381. action: "partialUpdateObject",
  382. objectID: encodeURIComponent(objects[i].objectID),
  383. body: objects[i]
  384. };
  385. postObj.requests.push(request);
  386. }
  387. this.as._jsonRequest({
  388. method: "POST",
  389. url: "/1/indexes/" + encodeURIComponent(indexObj.indexName) + "/batch",
  390. body: postObj,
  391. callback: callback
  392. });
  393. },
  394. saveObject: function(object, callback) {
  395. var indexObj = this;
  396. this.as._jsonRequest({
  397. method: "PUT",
  398. url: "/1/indexes/" + encodeURIComponent(indexObj.indexName) + "/" + encodeURIComponent(object.objectID),
  399. body: object,
  400. callback: callback
  401. });
  402. },
  403. saveObjects: function(objects, callback) {
  404. var indexObj = this;
  405. var postObj = {
  406. requests: []
  407. };
  408. for (var i = 0; i < objects.length; ++i) {
  409. var request = {
  410. action: "updateObject",
  411. objectID: encodeURIComponent(objects[i].objectID),
  412. body: objects[i]
  413. };
  414. postObj.requests.push(request);
  415. }
  416. this.as._jsonRequest({
  417. method: "POST",
  418. url: "/1/indexes/" + encodeURIComponent(indexObj.indexName) + "/batch",
  419. body: postObj,
  420. callback: callback
  421. });
  422. },
  423. deleteObject: function(objectID, callback) {
  424. if (objectID == null || objectID.length === 0) {
  425. callback(false, {
  426. message: "empty objectID"
  427. });
  428. return;
  429. }
  430. var indexObj = this;
  431. this.as._jsonRequest({
  432. method: "DELETE",
  433. url: "/1/indexes/" + encodeURIComponent(indexObj.indexName) + "/" + encodeURIComponent(objectID),
  434. callback: callback
  435. });
  436. },
  437. search: function(query, callback, args, delay) {
  438. var indexObj = this;
  439. var params = "query=" + encodeURIComponent(query);
  440. if (!this.as._isUndefined(args) && args != null) {
  441. params = this.as._getSearchParams(args, params);
  442. }
  443. window.clearTimeout(indexObj.onDelayTrigger);
  444. if (!this.as._isUndefined(delay) && delay != null && delay > 0) {
  445. var onDelayTrigger = window.setTimeout(function() {
  446. indexObj._search(params, callback);
  447. }, delay);
  448. indexObj.onDelayTrigger = onDelayTrigger;
  449. } else {
  450. this._search(params, callback);
  451. }
  452. },
  453. browse: function(page, callback, hitsPerPage) {
  454. var indexObj = this;
  455. var params = "?page=" + page;
  456. if (!_.isUndefined(hitsPerPage)) {
  457. params += "&hitsPerPage=" + hitsPerPage;
  458. }
  459. this.as._jsonRequest({
  460. method: "GET",
  461. url: "/1/indexes/" + encodeURIComponent(indexObj.indexName) + "/browse" + params,
  462. callback: callback
  463. });
  464. },
  465. getTypeaheadTransport: function(args, valueOption) {
  466. this.typeAheadArgs = args;
  467. if (typeof valueOption !== "undefined") {
  468. this.typeAheadValueOption = valueOption;
  469. }
  470. return this;
  471. },
  472. get: function(query, processRemoteData, that, cb, suggestions) {
  473. self = this;
  474. this.search(query, function(success, content) {
  475. if (success) {
  476. for (var i = 0; i < content.hits.length; ++i) {
  477. var obj = content.hits[i], found = false;
  478. if (typeof obj.value === "undefined") {
  479. if (self.typeAheadValueOption != null) {
  480. if (typeof self.typeAheadValueOption === "function") {
  481. obj.value = self.typeAheadValueOption(obj);
  482. found = true;
  483. } else if (typeof obj[self.typeAheadValueOption] !== "undefined") {
  484. obj.value = obj[self.typeAheadValueOption];
  485. found = true;
  486. }
  487. }
  488. if (!found) {
  489. for (var propertyName in obj) {
  490. if (!found && obj.hasOwnProperty(propertyName) && typeof obj[propertyName] === "string") {
  491. obj.value = obj[propertyName];
  492. found = true;
  493. }
  494. }
  495. }
  496. }
  497. suggestions.push(that._transformDatum(obj));
  498. }
  499. cb && cb(suggestions);
  500. }
  501. }, self.typeAheadArgs);
  502. return true;
  503. },
  504. waitTask: function(taskID, callback) {
  505. var indexObj = this;
  506. this.as._jsonRequest({
  507. method: "GET",
  508. url: "/1/indexes/" + encodeURIComponent(indexObj.indexName) + "/task/" + taskID,
  509. callback: function(success, body) {
  510. if (success && body.status === "published") {
  511. callback(true, body);
  512. } else if (success && body.pendingTask) {
  513. return indexObj.waitTask(taskID, callback);
  514. } else {
  515. callback(false, body);
  516. }
  517. }
  518. });
  519. },
  520. clearIndex: function(callback) {
  521. var indexObj = this;
  522. this.as._jsonRequest({
  523. method: "POST",
  524. url: "/1/indexes/" + encodeURIComponent(indexObj.indexName) + "/clear",
  525. callback: callback
  526. });
  527. },
  528. getSettings: function(callback) {
  529. var indexObj = this;
  530. this.as._jsonRequest({
  531. method: "GET",
  532. url: "/1/indexes/" + encodeURIComponent(indexObj.indexName) + "/settings",
  533. callback: callback
  534. });
  535. },
  536. setSettings: function(settings, callback) {
  537. var indexObj = this;
  538. this.as._jsonRequest({
  539. method: "PUT",
  540. url: "/1/indexes/" + encodeURIComponent(indexObj.indexName) + "/settings",
  541. body: settings,
  542. callback: callback
  543. });
  544. },
  545. listUserKeys: function(callback) {
  546. var indexObj = this;
  547. this.as._jsonRequest({
  548. method: "GET",
  549. url: "/1/indexes/" + encodeURIComponent(indexObj.indexName) + "/keys",
  550. callback: callback
  551. });
  552. },
  553. getUserKeyACL: function(key, callback) {
  554. var indexObj = this;
  555. this.as._jsonRequest({
  556. method: "GET",
  557. url: "/1/indexes/" + encodeURIComponent(indexObj.indexName) + "/keys/" + key,
  558. callback: callback
  559. });
  560. },
  561. deleteUserKey: function(key, callback) {
  562. var indexObj = this;
  563. this.as._jsonRequest({
  564. method: "DELETE",
  565. url: "/1/indexes/" + encodeURIComponent(indexObj.indexName) + "/keys/" + key,
  566. callback: callback
  567. });
  568. },
  569. addUserKey: function(acls, callback) {
  570. var indexObj = this;
  571. var aclsObject = {};
  572. aclsObject.acl = acls;
  573. this.as._jsonRequest({
  574. method: "POST",
  575. url: "/1/indexes/" + encodeURIComponent(indexObj.indexName) + "/keys",
  576. body: aclsObject,
  577. callback: callback
  578. });
  579. },
  580. addUserKeyWithValidity: function(acls, validity, maxQueriesPerIPPerHour, maxHitsPerQuery, callback) {
  581. var indexObj = this;
  582. var aclsObject = {};
  583. aclsObject.acl = acls;
  584. aclsObject.validity = validity;
  585. aclsObject.maxQueriesPerIPPerHour = maxQueriesPerIPPerHour;
  586. aclsObject.maxHitsPerQuery = maxHitsPerQuery;
  587. this.as._jsonRequest({
  588. method: "POST",
  589. url: "/1/indexes/" + encodeURIComponent(indexObj.indexName) + "/keys",
  590. body: aclsObject,
  591. callback: callback
  592. });
  593. },
  594. _search: function(params, callback) {
  595. this.as._jsonRequest({
  596. cache: this.cache,
  597. method: "POST",
  598. url: "/1/indexes/" + encodeURIComponent(this.indexName) + "/query",
  599. body: {
  600. params: params,
  601. apiKey: this.as.apiKey,
  602. appID: this.as.applicationID
  603. },
  604. callback: callback
  605. });
  606. },
  607. as: null,
  608. indexName: null,
  609. cache: {},
  610. typeAheadArgs: null,
  611. typeAheadValueOption: null,
  612. emptyConstructor: function() {}
  613. };