UNPKG

algoliasearch

Version:

A fully-featured and blazing-fast JavaScript API client to interact with Algolia API.

13 lines (9 loc) 11.4 kB
(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 j(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(s){t().setItem(o,JSON.stringify(s));}function i(){let s=r.timeToLive?r.timeToLive*1e3:null,n=a(),f=Object.fromEntries(Object.entries(n).filter(([,h])=>h.timestamp!==void 0));if(c(f),!s)return;let l=Object.fromEntries(Object.entries(f).filter(([,h])=>{let y=new Date().getTime();return !(h.timestamp+s<y)}));c(l);}return {get(s,n,f={miss:()=>Promise.resolve()}){return Promise.resolve().then(()=>(i(),a()[JSON.stringify(s)])).then(l=>Promise.all([l?l.value:n(),l!==void 0])).then(([l,h])=>Promise.all([l,h||f.miss(l)])).then(([l])=>l)},set(s,n){return Promise.resolve().then(()=>{let f=a();return f[JSON.stringify(s)]={timestamp:new Date().getTime(),value:n},t().setItem(o,JSON.stringify(f)),n})},delete(s){return Promise.resolve().then(()=>{let n=a();delete n[JSON.stringify(s)],t().setItem(o,JSON.stringify(n));})},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 w(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(()=>w({caches:e}).get(t,a,c))},set(t,a){return o.set(t,a).catch(()=>w({caches:e}).set(t,a))},delete(t){return o.delete(t).catch(()=>w({caches:e}).delete(t))},clear(){return o.clear().catch(()=>w({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 z(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 se=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;}},ae=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:f,compress:l,compression:h}){async function y(m){let p=await Promise.all(m.map(u=>e.get(u,()=>Promise.resolve(W(u))))),v=p.filter(u=>u.isUp()),g=p.filter(u=>u.isTimedOut()),P=[...v,...g];return {hosts:P.length>0?P:m,getTimeout(u,S){return (g.length===0&&u===0?1:g.length+3+u)*S}}}async function R(m,p,v){let g=[],P=ue(m,p),x=le(o,m.headers,p.headers),u=h==="gzip"&&P!==void 0&&P.length>se&&(m.method==="POST"||m.method==="PUT");u&&l===void 0&&t.info("Compression is disabled because no compress method is available.");let S=u&&l!==void 0,I=S?await l(P):P;S&&(x["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 q=0,$=async(d,N)=>{let A=d.pop();if(A===void 0)throw new ae(ge(g));let L={...i,...p.timeouts},H={data:I,headers:x,method:m.method,url:ce(A,m.path,O),connectTimeout:N(q,L.connect),responseTimeout:N(q,v?L.read:L.write)},k=_=>{let U={request:H,response:_,host:A,triesLeft:d.length};return g.push(U),U},T=await s.send(H);if(he(T)){let _=k(T);return T.isTimedOut&&q++,t.info("Retryable failure",X(_)),await e.set(A,W(A,T.isTimedOut?"timed out":"down")),$(d,N)}if(xe(T))return pe(T);throw k(T),fe(T,g)},re=r.filter(d=>d.accept==="readWrite"||(v?d.accept==="read":d.accept==="write")),F=await y(re);return $([...F.hosts].reverse(),F.getTimeout)}function E(m,p={}){let v=()=>R(m,p,g),g=m.useReadTransporter||m.method==="GET";if((p.cacheable||m.cacheable)!==true)return v();let x={request:m,requestOptions:p,transporter:{queryParameters:a,headers:o}};return f.get(x,()=>n.get(x,()=>n.set(x,v()).then(u=>Promise.all([n.delete(x),u]),u=>Promise.all([n.delete(x),Promise.reject(u)])).then(([u,S])=>S)),{miss:u=>f.set(x,u)})}return {hostsCache:e,requester:s,timeouts:i,logger:t,algoliaAgent:c,baseHeaders:o,baseQueryParameters:a,hosts:r,request:E,requestsCache:n,responsesCache:f}}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 C="5.51.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=z(r,e,o),i=K({hosts:ye(r),...a,algoliaAgent:J({algoliaAgents:t,client:"Lite",version:C}),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:f},l){if(!s)throw new Error("Parameter `path` is required when calling `customPost`.");let E={method:"POST",path:"/{path}".replace("{path}",s),queryParameters:n||{},headers:{},data:f||{}};return i.request(E,l)},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:E,...m})=>m.type==="facet"?{...m,...E,type:"facet"}:{...m,...E,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 ao(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:w({caches:[j({key:`${C}-${r}`}),b()]}),...a})} exports.apiClientVersion = C; exports.liteClient = ao; }));