algoliasearch
Version:
A fully-featured and blazing-fast JavaScript API client to interact with Algolia API.
13 lines (9 loc) • 11.3 kB
JavaScript
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :
typeof define === 'function' && define.amd ? define(['exports'], factory) :
(global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global["algoliasearch/lite"] = {}));
})(this, (function (exports) { 'use strict';
function z(r){let e,o=`algolia-client-js-${r.key}`;function t(){return e===void 0&&(e=r.localStorage||window.localStorage),e}function a(){return JSON.parse(t().getItem(o)||"{}")}function c(n){t().setItem(o,JSON.stringify(n));}function i(){return new Promise(n=>setTimeout(n,0))}function s(){let n=r.timeToLive?r.timeToLive*1e3:null,l=a(),f=new Date().getTime(),h=false;return {namespace:Object.fromEntries(Object.entries(l).filter(([,x])=>!x||x.timestamp===void 0||n&&x.timestamp+n<f?(h=true,false):true)),changed:h}}return {get(n,l,f={miss:()=>Promise.resolve()}){return i().then(()=>{let{namespace:h,changed:y}=s(),x=h[JSON.stringify(n)];return y&&c(h),x?x.value:l().then(P=>f.miss(P).then(()=>P))})},set(n,l){return i().then(()=>{let f=a();return f[JSON.stringify(n)]={timestamp:new Date().getTime(),value:l},t().setItem(o,JSON.stringify(f)),l})},delete(n){return i().then(()=>{let l=a();delete l[JSON.stringify(n)],t().setItem(o,JSON.stringify(l));})},clear(){return Promise.resolve().then(()=>{t().removeItem(o);})}}}function te(){return {get(r,e,o={miss:()=>Promise.resolve()}){return e().then(a=>Promise.all([a,o.miss(a)])).then(([a])=>a)},set(r,e){return Promise.resolve(e)},delete(r){return Promise.resolve()},clear(){return Promise.resolve()}}}function R(r){let e=[...r.caches],o=e.shift();return o===void 0?te():{get(t,a,c={miss:()=>Promise.resolve()}){return o.get(t,a,c).catch(()=>R({caches:e}).get(t,a,c))},set(t,a){return o.set(t,a).catch(()=>R({caches:e}).set(t,a))},delete(t){return o.delete(t).catch(()=>R({caches:e}).delete(t))},clear(){return o.clear().catch(()=>R({caches:e}).clear())}}}function b(r={serializable:true}){let e={};return {get(o,t,a={miss:()=>Promise.resolve()}){let c=JSON.stringify(o);if(c in e)return Promise.resolve(r.serializable?JSON.parse(e[c]):e[c]);let i=t();return i.then(s=>a.miss(s)).then(()=>i)},set(o,t){return e[JSON.stringify(o)]=r.serializable?JSON.stringify(t):t,Promise.resolve(t)},delete(o){return delete e[JSON.stringify(o)],Promise.resolve()},clear(){return e={},Promise.resolve()}}}function oe(r){let e={value:`Algolia for JavaScript (${r})`,add(o){let t=`; ${o.segment}${o.version!==void 0?` (${o.version})`:""}`;return e.value.indexOf(t)===-1&&(e.value=`${e.value}${t}`),e}};return e}function J(r,e,o="WithinHeaders"){let t={"x-algolia-api-key":e,"x-algolia-application-id":r};return {headers(){return o==="WithinHeaders"?t:{}},queryParameters(){return o==="WithinQueryParameters"?t:{}}}}function j({algoliaAgents:r,client:e,version:o}){let t=oe(o).add({segment:e,version:o});return r.forEach(a=>t.add(a)),t}function G(){return {debug(r,e){return Promise.resolve()},info(r,e){return Promise.resolve()},error(r,e){return Promise.resolve()}}}var ae=750,M=120*1e3;function W(r,e="up"){let o=Date.now();function t(){return e==="up"||Date.now()-o>M}function a(){return e==="timed out"&&Date.now()-o<=M}return {...r,status:e,lastUpdate:o,isUp:t,isTimedOut:a}}var Q=class extends Error{name="AlgoliaError";constructor(r,e){super(r),e&&(this.name=e);}};var B=class extends Q{stackTrace;constructor(r,e,o){super(r,o),this.stackTrace=e;}},se=class extends B{constructor(r){super("Unreachable hosts - your application id may be incorrect. If the error persists, please visit our help center https://alg.li/support-unreachable-hosts or reach out to the Algolia Support team: https://alg.li/support",r,"RetryError");}},D=class extends B{status;constructor(r,e,o,t="ApiError"){super(r,o,t),this.status=e;}},ne=class extends Q{response;constructor(r,e){super(r,"DeserializationError"),this.response=e;}},ie=class extends D{error;constructor(r,e,o,t){super(r,e,t,"DetailedApiError"),this.error=o;}};function V(r){let e=r;for(let o=r.length-1;o>0;o--){let t=Math.floor(Math.random()*(o+1)),a=r[o];e[o]=r[t],e[t]=a;}return e}function ce(r,e,o){let t=me(o),a=`${r.protocol}://${r.url}${r.port?`:${r.port}`:""}/${e.charAt(0)==="/"?e.substring(1):e}`;return t.length&&(a+=`?${t}`),a}function me(r){return Object.keys(r).filter(e=>r[e]!==void 0).sort().map(e=>`${e}=${encodeURIComponent(Object.prototype.toString.call(r[e])==="[object Array]"?r[e].join(","):r[e]).replace(/\+/g,"%20")}`).join("&")}function ue(r,e){if(r.method==="GET"||r.data===void 0&&e.data===void 0)return;let o=Array.isArray(r.data)?r.data:{...r.data,...e.data};return JSON.stringify(o)}function le(r,e,o){let t={Accept:"application/json",...r,...e,...o},a={};return Object.keys(t).forEach(c=>{let i=t[c];a[c.toLowerCase()]=i;}),a}function pe(r){try{return JSON.parse(r.content)}catch(e){throw new ne(e.message,r)}}function fe({content:r,status:e},o){try{let t=JSON.parse(r);return "error"in t?new ie(t.message,e,t.error,o):new D(t.message,e,o)}catch{}return new D(r,e,o)}function de({isTimedOut:r,status:e}){return !r&&~~e===0}function he({isTimedOut:r,status:e}){return r||de({isTimedOut:r,status:e})||~~(e/100)!==2&&~~(e/100)!==4}function xe({status:r}){return ~~(r/100)===2}function ge(r){return r.map(e=>X(e))}function X(r){let e=r.request.headers["x-algolia-api-key"]?{"x-algolia-api-key":"*****"}:{};return {...r,request:{...r.request,headers:{...r.request.headers,...e}}}}function K({hosts:r,hostsCache:e,baseHeaders:o,logger:t,baseQueryParameters:a,algoliaAgent:c,timeouts:i,requester:s,requestsCache:n,responsesCache:l,compress:f,compression:h}){async function y(m){let p=await Promise.all(m.map(u=>e.get(u,()=>Promise.resolve(W(u))))),w=p.filter(u=>u.isUp()),T=p.filter(u=>u.isTimedOut()),v=[...w,...T];return {hosts:v.length>0?v:m,getTimeout(u,S){return (T.length===0&&u===0?1:T.length+3+u)*S}}}async function x(m,p,w){let T=[],v=ue(m,p),g=le(o,m.headers,p.headers),u=h==="gzip"&&v!==void 0&&v.length>ae&&(m.method==="POST"||m.method==="PUT");u&&f===void 0&&t.info("Compression is disabled because no compress method is available.");let S=u&&f!==void 0,$=S?await f(v):v;S&&(g["content-encoding"]="gzip");let ee=m.method==="GET"?{...m.data,...p.data}:{},O={...a,...m.queryParameters,...ee};if(c.value&&(O["x-algolia-agent"]=c.value),p&&p.queryParameters)for(let d of Object.keys(p.queryParameters))!p.queryParameters[d]||Object.prototype.toString.call(p.queryParameters[d])==="[object Object]"?O[d]=p.queryParameters[d]:O[d]=p.queryParameters[d].toString();let C=0,I=async(d,N)=>{let A=d.pop();if(A===void 0)throw new se(ge(T));let L={...i,...p.timeouts},H={data:$,headers:g,method:m.method,url:ce(A,m.path,O),connectTimeout:N(C,L.connect),responseTimeout:N(C,w?L.read:L.write)},k=_=>{let U={request:H,response:_,host:A,triesLeft:d.length};return T.push(U),U},E=await s.send(H);if(he(E)){let _=k(E);return E.isTimedOut&&C++,t.info("Retryable failure",X(_)),await e.set(A,W(A,E.isTimedOut?"timed out":"down")),I(d,N)}if(xe(E))return pe(E);throw k(E),fe(E,T)},re=r.filter(d=>d.accept==="readWrite"||(w?d.accept==="read":d.accept==="write")),F=await y(re);return I([...F.hosts].reverse(),F.getTimeout)}function P(m,p={}){let w=()=>x(m,p,T),T=m.useReadTransporter||m.method==="GET";if((p.cacheable||m.cacheable)!==true)return w();let g={request:m,requestOptions:p,transporter:{queryParameters:a,headers:o}};return l.get(g,()=>n.get(g,()=>n.set(g,w()).then(u=>Promise.all([n.delete(g),u]),u=>Promise.all([n.delete(g),Promise.reject(u)])).then(([u,S])=>S)),{miss:u=>l.set(g,u)})}return {hostsCache:e,requester:s,timeouts:i,logger:t,algoliaAgent:c,baseHeaders:o,baseQueryParameters:a,hosts:r,request:P,requestsCache:n,responsesCache:l}}function Y(){function r(e){return new Promise(o=>{let t=new XMLHttpRequest;t.open(e.method,e.url,true),Object.keys(e.headers).forEach(s=>t.setRequestHeader(s,e.headers[s]));let a=(s,n)=>setTimeout(()=>{t.abort(),o({status:0,content:n,isTimedOut:true});},s),c=a(e.connectTimeout,"Connection timeout"),i;t.onreadystatechange=()=>{t.readyState>t.OPENED&&i===void 0&&(clearTimeout(c),i=a(e.responseTimeout,"Socket timeout"));},t.onerror=()=>{t.status===0&&(clearTimeout(c),clearTimeout(i),o({content:t.responseText||"Network request failed",status:t.status,isTimedOut:false}));},t.onload=()=>{clearTimeout(c),clearTimeout(i),o({content:t.responseText,status:t.status,isTimedOut:false});},t.send(e.data);})}return {send:r}}var q="5.53.0";function ye(r){return [{url:`${r}-dsn.algolia.net`,accept:"read",protocol:"https"},{url:`${r}.algolia.net`,accept:"write",protocol:"https"}].concat(V([{url:`${r}-1.algolianet.com`,accept:"readWrite",protocol:"https"},{url:`${r}-2.algolianet.com`,accept:"readWrite",protocol:"https"},{url:`${r}-3.algolianet.com`,accept:"readWrite",protocol:"https"}]))}function Z({appId:r,apiKey:e,authMode:o,algoliaAgents:t,...a}){let c=J(r,e,o),i=K({hosts:ye(r),...a,algoliaAgent:j({algoliaAgents:t,client:"Lite",version:q}),baseHeaders:{"content-type":"text/plain",...c.headers(),...a.baseHeaders},baseQueryParameters:{...c.queryParameters(),...a.baseQueryParameters}});return {transporter:i,appId:r,apiKey:e,clearCache(){return Promise.all([i.requestsCache.clear(),i.responsesCache.clear()]).then(()=>{})},get _ua(){return i.algoliaAgent.value},addAlgoliaAgent(s,n){i.algoliaAgent.add({segment:s,version:n});},setClientApiKey({apiKey:s}){!o||o==="WithinHeaders"?i.baseHeaders["x-algolia-api-key"]=s:i.baseQueryParameters["x-algolia-api-key"]=s;},searchForHits(s,n){return this.search(s,n)},searchForFacets(s,n){return this.search(s,n)},customPost({path:s,parameters:n,body:l},f){if(!s)throw new Error("Parameter `path` is required when calling `customPost`.");let P={method:"POST",path:"/{path}".replace("{path}",s),queryParameters:n||{},headers:{},data:l||{}};return i.request(P,f)},getRecommendations(s,n){if(s&&Array.isArray(s)&&(s={requests:s}),!s)throw new Error("Parameter `getRecommendationsParams` is required when calling `getRecommendations`.");if(!s.requests)throw new Error("Parameter `getRecommendationsParams.requests` is required when calling `getRecommendations`.");let y={method:"POST",path:"/1/indexes/*/recommendations",queryParameters:{},headers:{},data:s,useReadTransporter:true,cacheable:true};return i.request(y,n)},search(s,n){if(s&&Array.isArray(s)&&(s={requests:s.map(({params:P,...m})=>m.type==="facet"?{...m,...P,type:"facet"}:{...m,...P,facet:void 0,maxFacetHits:void 0,facetQuery:void 0})}),!s)throw new Error("Parameter `searchMethodParams` is required when calling `search`.");if(!s.requests)throw new Error("Parameter `searchMethodParams.requests` is required when calling `search`.");let y={method:"POST",path:"/1/indexes/*/queries",queryParameters:{},headers:{},data:s,useReadTransporter:true,cacheable:true};return i.request(y,n)}}}function no(r,e,o){if(!r||typeof r!="string")throw new Error("`appId` is missing.");if(!e||typeof e!="string")throw new Error("`apiKey` is missing.");let{compression:t,...a}=o||{};return Z({appId:r,apiKey:e,timeouts:{connect:1e3,read:2e3,write:3e4},logger:G(),requester:Y(),algoliaAgents:[{segment:"Browser"}],authMode:"WithinQueryParameters",responsesCache:b(),requestsCache:b({serializable:false}),hostsCache:R({caches:[z({key:`${q}-${r}`}),b()]}),...a})}
exports.apiClientVersion = q;
exports.liteClient = no;
}));