function J(e){const t=`algoliasearch-client-js-${e.key}`;let r;const n=()=>(r===void 0&&(r=e.localStorage||window.localStorage),r),s=()=>JSON.parse(n().getItem(t)||"{}"),o=a=>{n().setItem(t,JSON.stringify(a))},l=()=>{const a=e.timeToLive?e.timeToLive*1e3:null,d=s(),h=Object.fromEntries(Object.entries(d).filter(([,c])=>c.timestamp!==void 0));if(o(h),!a)return;const u=Object.fromEntries(Object.entries(h).filter(([,c])=>{const m=new Date().getTime();return!(c.timestamp+a<m)}));o(u)};return{get(a,d,h={miss:()=>Promise.resolve()}){return Promise.resolve().then(()=>{l();const u=JSON.stringify(a);return s()[u]}).then(u=>Promise.all([u?u.value:d(),u!==void 0])).then(([u,c])=>Promise.all([u,c||h.miss(u)])).then(([u])=>u)},set(a,d){return Promise.resolve().then(()=>{const h=s();return h[JSON.stringify(a)]={timestamp:new Date().getTime(),value:d},n().setItem(t,JSON.stringify(h)),d})},delete(a){return Promise.resolve().then(()=>{const d=s();delete d[JSON.stringify(a)],n().setItem(t,JSON.stringify(d))})},clear(){return Promise.resolve().then(()=>{n().removeItem(t)})}}}function O(e){const t=[...e.caches],r=t.shift();return r===void 0?k():{get(n,s,o={miss:()=>Promise.resolve()}){return r.get(n,s,o).catch(()=>O({caches:t}).get(n,s,o))},set(n,s){return r.set(n,s).catch(()=>O({caches:t}).set(n,s))},delete(n){return r.delete(n).catch(()=>O({caches:t}).delete(n))},clear(){return r.clear().catch(()=>O({caches:t}).clear())}}}function k(){return{get(e,t,r={miss:()=>Promise.resolve()}){return t().then(s=>Promise.all([s,r.miss(s)])).then(([s])=>s)},set(e,t){return Promise.resolve(t)},delete(e){return Promise.resolve()},clear(){return Promise.resolve()}}}function w(e={serializable:!0}){let t={};return{get(r,n,s={miss:()=>Promise.resolve()}){const o=JSON.stringify(r);if(o in t)return Promise.resolve(e.serializable?JSON.parse(t[o]):t[o]);const l=n(),a=s&&s.miss||(()=>Promise.resolve());return l.then(d=>a(d)).then(()=>l)},set(r,n){return t[JSON.stringify(r)]=e.serializable?JSON.stringify(n):n,Promise.resolve(n)},delete(r){return delete t[JSON.stringify(r)],Promise.resolve()},clear(){return t={},Promise.resolve()}}}function U(e,t,r){const n={"x-algolia-api-key":r,"x-algolia-application-id":t};return{headers(){return e===v.WithinHeaders?n:{}},queryParameters(){return e===v.WithinQueryParameters?n:{}}}}function z(e){let t=e.length-1;for(t;t>0;t--){const r=Math.floor(Math.random()*(t+1)),n=e[t];e[t]=e[r],e[r]=n}return e}function H(e,t){return t&&Object.keys(t).forEach(r=>{e[r]=t[r](e)}),e}function W(e,...t){let r=0;return e.replace(/%s/g,()=>encodeURIComponent(t[r++]))}const C="4.22.1",v={WithinQueryParameters:0,WithinHeaders:1},R={Debug:1,Info:2,Error:3};function L(e){return{debug(t,r){return R.Debug>=e&&console.debug(t,r),Promise.resolve()},info(t,r){return R.Info>=e&&console.info(t,r),Promise.resolve()},error(t,r){return console.error(t,r),Promise.resolve()}}}function M(){return{send(e){return new Promise(t=>{const r=new XMLHttpRequest;r.open(e.method,e.url,!0),Object.keys(e.headers).forEach(l=>r.setRequestHeader(l,e.headers[l]));const n=(l,a)=>setTimeout(()=>{r.abort(),t({status:0,content:a,isTimedOut:!0})},l*1e3),s=n(e.connectTimeout,"Connection timeout");let o;r.onreadystatechange=()=>{r.readyState>r.OPENED&&o===void 0&&(clearTimeout(s),o=n(e.responseTimeout,"Socket timeout"))},r.onerror=()=>{r.status===0&&(clearTimeout(s),clearTimeout(o),t({content:r.responseText||"Network request failed",status:r.status,isTimedOut:!1}))},r.onload=()=>{clearTimeout(s),clearTimeout(o),t({content:r.responseText,status:r.status,isTimedOut:!1})},r.send(e.data)})}}}function N(e,t){const r=e||{},n=r.data||{};return Object.keys(r).forEach(s=>{["timeout","headers","queryParameters","data","cacheable"].indexOf(s)===-1&&(n[s]=r[s])}),{data:Object.entries(n).length>0?n:void 0,timeout:r.timeout||t,headers:r.headers||{},queryParameters:r.queryParameters||{},cacheable:r.cacheable}}const P={Read:1,Write:2,Any:3},S={Up:1,Down:2,Timeouted:3},x=2*60*1e3;function $(e,t=S.Up){return{...e,status:t,lastUpdate:Date.now()}}function F(e){return e.status===S.Up||Date.now()-e.lastUpdate>x}function Q(e){return e.status===S.Timeouted&&Date.now()-e.lastUpdate<=x}function D(e){return typeof e=="string"?{protocol:"https",url:e,accept:P.Any}:{protocol:e.protocol||"https",url:e.url,accept:e.accept||P.Any}}const b={Delete:"DELETE",Get:"GET",Post:"POST",Put:"PUT"};function _(e,t){return Promise.all(t.map(r=>e.get(r,()=>Promise.resolve($(r))))).then(r=>{const n=r.filter(a=>F(a)),s=r.filter(a=>Q(a)),o=[...n,...s],l=o.length>0?o.map(a=>D(a)):t;return{getTimeout(a,d){return(s.length===0&&a===0?1:s.length+3+a)*d},statelessHosts:l}})}const B=({isTimedOut:e,status:t})=>!e&&~~t===0,G=e=>{const t=e.status;return e.isTimedOut||B(e)||~~(t/100)!==2&&~~(t/100)!==4},X=({status:e})=>~~(e/100)===2,K=(e,t)=>G(e)?t.onRetry(e):X(e)?t.onSuccess(e):t.onFail(e);function j(e,t,r,n){const s=[],o=ne(r,n),l=se(e,n),a=r.method,d=r.method!==b.Get?{}:{...r.data,...n.data},h={"x-algolia-agent":e.userAgent.value,...e.queryParameters,...d,...n.queryParameters};let u=0;const c=(m,g)=>{const f=m.pop();if(f===void 0)throw ce(q(s));const T={data:o,headers:l,method:a,url:te(f,r.path,h),connectTimeout:g(u,e.timeouts.connect),responseTimeout:g(u,n.timeout)},A=i=>{const y={request:T,response:i,host:f,triesLeft:m.length};return s.push(y),y},p={onSuccess:i=>V(i),onRetry(i){const y=A(i);return i.isTimedOut&&u++,Promise.all([e.logger.info("Retryable failure",I(y)),e.hostsCache.set(f,$(f,i.isTimedOut?S.Timeouted:S.Down))]).then(()=>c(m,g))},onFail(i){throw A(i),ee(i,q(s))}};return e.requester.send(T).then(i=>K(i,p))};return _(e.hostsCache,t).then(m=>c([...m.statelessHosts].reverse(),m.getTimeout))}function Y(e){const{hostsCache:t,logger:r,requester:n,requestsCache:s,responsesCache:o,timeouts:l,userAgent:a,hosts:d,queryParameters:h,headers:u}=e,c={hostsCache:t,logger:r,requester:n,requestsCache:s,responsesCache:o,timeouts:l,userAgent:a,headers:u,queryParameters:h,hosts:d.map(m=>D(m)),read(m,g){const f=N(g,c.timeouts.read),T=()=>j(c,c.hosts.filter(i=>(i.accept&P.Read)!==0),m,f);if((f.cacheable!==void 0?f.cacheable:m.cacheable)!==!0)return T();const p={request:m,mappedRequestOptions:f,transporter:{queryParameters:c.queryParameters,headers:c.headers}};return c.responsesCache.get(p,()=>c.requestsCache.get(p,()=>c.requestsCache.set(p,T()).then(i=>Promise.all([c.requestsCache.delete(p),i]),i=>Promise.all([c.requestsCache.delete(p),Promise.reject(i)])).then(([i,y])=>y)),{miss:i=>c.responsesCache.set(p,i)})},write(m,g){return j(c,c.hosts.filter(f=>(f.accept&P.Write)!==0),m,N(g,c.timeouts.write))}};return c}function Z(e){const t={value:`Algolia for JavaScript (${e})`,add(r){const n=`; ${r.segment}${r.version!==void 0?` (${r.version})`:""}`;return t.value.indexOf(n)===-1&&(t.value=`${t.value}${n}`),t}};return t}function V(e){try{return JSON.parse(e.content)}catch(t){throw oe(t.message,e)}}function ee({content:e,status:t},r){let n=e;try{n=JSON.parse(e).message}catch{}return ae(n,t,r)}function te(e,t,r){const n=re(r);let s=`${e.protocol}://${e.url}/${t.charAt(0)==="/"?t.substr(1):t}`;return n.length&&(s+=`?${n}`),s}function re(e){const t=r=>Object.prototype.toString.call(r)==="[object Object]"||Object.prototype.toString.call(r)==="[object Array]";return Object.keys(e).map(r=>W("%s=%s",r,t(e[r])?JSON.stringify(e[r]):e[r])).join("&")}function ne(e,t){if(e.method===b.Get||e.data===void 0&&t.data===void 0)return;const r=Array.isArray(e.data)?e.data:{...e.data,...t.data};return JSON.stringify(r)}function se(e,t){const r={...e.headers,...t.headers},n={};return Object.keys(r).forEach(s=>{const o=r[s];n[s.toLowerCase()]=o}),n}function q(e){return e.map(t=>I(t))}function I(e){const t=e.request.headers["x-algolia-api-key"]?{"x-algolia-api-key":"*****"}:{};return{...e,request:{...e.request,headers:{...e.request.headers,...t}}}}function ae(e,t,r){return{name:"ApiError",message:e,status:t,transporterStackTrace:r}}function oe(e,t){return{name:"DeserializationError",message:e,response:t}}function ce(e){return{name:"RetryError",message:"Unreachable hosts - your application id may be incorrect. If the error persists, contact support@algolia.com.",transporterStackTrace:e}}const ie=e=>{const t=e.appId,r=U(e.authMode!==void 0?e.authMode:v.WithinHeaders,t,e.apiKey),n=Y({hosts:[{url:`${t}-dsn.algolia.net`,accept:P.Read},{url:`${t}.algolia.net`,accept:P.Write}].concat(z([{url:`${t}-1.algolianet.com`},{url:`${t}-2.algolianet.com`},{url:`${t}-3.algolianet.com`}])),...e,headers:{...r.headers(),"content-type":"application/x-www-form-urlencoded",...e.headers},queryParameters:{...r.queryParameters(),...e.queryParameters}});return H({transporter:n,appId:t,addAlgoliaAgent(o,l){n.userAgent.add({segment:o,version:l})},clearCache(){return Promise.all([n.requestsCache.clear(),n.responsesCache.clear()]).then(()=>{})}},e.methods)},E=e=>(t,r)=>{const n=t.map(s=>({...s,threshold:s.threshold||0}));return e.transporter.read({method:b.Post,path:"1/indexes/*/recommendations",data:{requests:n},cacheable:!0},r)},ue=e=>(t,r)=>E(e)(t.map(n=>({...n,fallbackParameters:{},model:"bought-together"})),r),le=e=>(t,r)=>E(e)(t.map(n=>({...n,model:"related-products"})),r),de=e=>(t,r)=>{const n=t.map(s=>({...s,model:"trending-facets",threshold:s.threshold||0}));return e.transporter.read({method:b.Post,path:"1/indexes/*/recommendations",data:{requests:n},cacheable:!0},r)},me=e=>(t,r)=>{const n=t.map(s=>({...s,model:"trending-items",threshold:s.threshold||0}));return e.transporter.read({method:b.Post,path:"1/indexes/*/recommendations",data:{requests:n},cacheable:!0},r)},he=e=>(t,r)=>E(e)(t.map(n=>({...n,model:"looking-similar"})),r),fe=e=>(t,r)=>{const n=t.map(s=>({...s,model:"recommended-for-you",threshold:s.threshold||0}));return e.transporter.read({method:b.Post,path:"1/indexes/*/recommendations",data:{requests:n},cacheable:!0},r)};function ge(e,t,r){const n={appId:e,apiKey:t,timeouts:{connect:1,read:2,write:30},requester:M(),logger:L(R.Error),responsesCache:w(),requestsCache:w({serializable:!1}),hostsCache:O({caches:[J({key:`${C}-${e}`}),w()]}),userAgent:Z(C).add({segment:"Recommend",version:C}).add({segment:"Browser"}),authMode:v.WithinQueryParameters};return ie({...n,...r,methods:{getFrequentlyBoughtTogether:ue,getRecommendations:E,getRelatedProducts:le,getTrendingFacets:de,getTrendingItems:me,getLookingSimilar:he,getRecommendedForYou:fe}})}ge.version=C;export{ge as default};
