(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["@algolia/client-abtesting"] = {})); })(this, (function (exports) { 'use strict'; function J(t){let e,s=`algolia-client-js-${t.key}`;function r(){return e===void 0&&(e=t.localStorage||window.localStorage),e}function i(){return JSON.parse(r().getItem(s)||"{}")}function l(a){r().setItem(s,JSON.stringify(a));}function f(){let a=t.timeToLive?t.timeToLive*1e3:null,o=i(),n=Object.fromEntries(Object.entries(o).filter(([,m])=>m.timestamp!==void 0));if(l(n),!a)return;let c=Object.fromEntries(Object.entries(n).filter(([,m])=>{let g=new Date().getTime();return !(m.timestamp+aPromise.resolve()}){return Promise.resolve().then(()=>(f(),i()[JSON.stringify(a)])).then(c=>Promise.all([c?c.value:o(),c!==void 0])).then(([c,m])=>Promise.all([c,m||n.miss(c)])).then(([c])=>c)},set(a,o){return Promise.resolve().then(()=>{let n=i();return n[JSON.stringify(a)]={timestamp:new Date().getTime(),value:o},r().setItem(s,JSON.stringify(n)),o})},delete(a){return Promise.resolve().then(()=>{let o=i();delete o[JSON.stringify(a)],r().setItem(s,JSON.stringify(o));})},clear(){return Promise.resolve().then(()=>{r().removeItem(s);})}}}function re(){return {get(t,e,s={miss:()=>Promise.resolve()}){return e().then(i=>Promise.all([i,s.miss(i)])).then(([i])=>i)},set(t,e){return Promise.resolve(e)},delete(t){return Promise.resolve()},clear(){return Promise.resolve()}}}function v(t){let e=[...t.caches],s=e.shift();return s===void 0?re():{get(r,i,l={miss:()=>Promise.resolve()}){return s.get(r,i,l).catch(()=>v({caches:e}).get(r,i,l))},set(r,i){return s.set(r,i).catch(()=>v({caches:e}).set(r,i))},delete(r){return s.delete(r).catch(()=>v({caches:e}).delete(r))},clear(){return s.clear().catch(()=>v({caches:e}).clear())}}}function b(t={serializable:true}){let e={};return {get(s,r,i={miss:()=>Promise.resolve()}){let l=JSON.stringify(s);if(l in e)return Promise.resolve(t.serializable?JSON.parse(e[l]):e[l]);let f=r();return f.then(a=>i.miss(a)).then(()=>f)},set(s,r){return e[JSON.stringify(s)]=t.serializable?JSON.stringify(r):r,Promise.resolve(r)},delete(s){return delete e[JSON.stringify(s)],Promise.resolve()},clear(){return e={},Promise.resolve()}}}function se(t){let e={value:`Algolia for JavaScript (${t})`,add(s){let r=`; ${s.segment}${s.version!==void 0?` (${s.version})`:""}`;return e.value.indexOf(r)===-1&&(e.value=`${e.value}${r}`),e}};return e}function Q(t,e,s="WithinHeaders"){let r={"x-algolia-api-key":e,"x-algolia-application-id":t};return {headers(){return s==="WithinHeaders"?r:{}},queryParameters(){return s==="WithinQueryParameters"?r:{}}}}function G({algoliaAgents:t,client:e,version:s}){let r=se(s).add({segment:e,version:s});return t.forEach(i=>r.add(i)),r}function M(){return {debug(t,e){return Promise.resolve()},info(t,e){return Promise.resolve()},error(t,e){return Promise.resolve()}}}var oe=750,W=120*1e3;function z(t,e="up"){let s=Date.now();function r(){return e==="up"||Date.now()-s>W}function i(){return e==="timed out"&&Date.now()-s<=W}return {...t,status:e,lastUpdate:s,isUp:r,isTimedOut:i}}var F=class extends Error{name="AlgoliaError";constructor(t,e){super(t),e&&(this.name=e);}};var X=class extends F{stackTrace;constructor(t,e,s){super(t,s),this.stackTrace=e;}},ae=class extends X{constructor(t){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",t,"RetryError");}},D=class extends X{status;constructor(t,e,s,r="ApiError"){super(t,s,r),this.status=e;}},ne=class extends F{response;constructor(t,e){super(t,"DeserializationError"),this.response=e;}},ie=class extends D{error;constructor(t,e,s,r){super(t,e,r,"DetailedApiError"),this.error=s;}};function ce(t,e,s){let r=ue(s),i=`${t.protocol}://${t.url}${t.port?`:${t.port}`:""}/${e.charAt(0)==="/"?e.substring(1):e}`;return r.length&&(i+=`?${r}`),i}function ue(t){return Object.keys(t).filter(e=>t[e]!==void 0).sort().map(e=>`${e}=${encodeURIComponent(Object.prototype.toString.call(t[e])==="[object Array]"?t[e].join(","):t[e]).replace(/\+/g,"%20")}`).join("&")}function le(t,e){if(t.method==="GET"||t.data===void 0&&e.data===void 0)return;let s=Array.isArray(t.data)?t.data:{...t.data,...e.data};return JSON.stringify(s)}function me(t,e,s){let r={Accept:"application/json",...t,...e,...s},i={};return Object.keys(r).forEach(l=>{let f=r[l];i[l.toLowerCase()]=f;}),i}function de(t){try{return JSON.parse(t.content)}catch(e){throw new ne(e.message,t)}}function pe({content:t,status:e},s){try{let r=JSON.parse(t);return "error"in r?new ie(r.message,e,r.error,s):new D(r.message,e,s)}catch{}return new D(t,e,s)}function he({isTimedOut:t,status:e}){return !t&&~~e===0}function fe({isTimedOut:t,status:e}){return t||he({isTimedOut:t,status:e})||~~(e/100)!==2&&~~(e/100)!==4}function ge({status:t}){return ~~(t/100)===2}function Pe(t){return t.map(e=>K(e))}function K(t){let e=t.request.headers["x-algolia-api-key"]?{"x-algolia-api-key":"*****"}:{};return {...t,request:{...t.request,headers:{...t.request.headers,...e}}}}function V({hosts:t,hostsCache:e,baseHeaders:s,logger:r,baseQueryParameters:i,algoliaAgent:l,timeouts:f,requester:a,requestsCache:o,responsesCache:n,compress:c,compression:m}){async function g(u){let d=await Promise.all(u.map(p=>e.get(p,()=>Promise.resolve(z(p))))),w=d.filter(p=>p.isUp()),A=d.filter(p=>p.isTimedOut()),E=[...w,...A];return {hosts:E.length>0?E:u,getTimeout(p,R){return (A.length===0&&p===0?1:A.length+3+p)*R}}}async function h(u,d,w){let A=[],E=le(u,d),T=me(s,u.headers,d.headers),p=m==="gzip"&&E!==void 0&&E.length>oe&&(u.method==="POST"||u.method==="PUT");p&&c===void 0&&r.info("Compression is disabled because no compress method is available.");let R=p&&c!==void 0,H=R?await c(E):E;R&&(T["content-encoding"]="gzip");let ee=u.method==="GET"?{...u.data,...d.data}:{},O={...i,...u.queryParameters,...ee};if(l.value&&(O["x-algolia-agent"]=l.value),d&&d.queryParameters)for(let P of Object.keys(d.queryParameters))!d.queryParameters[P]||Object.prototype.toString.call(d.queryParameters[P])==="[object Object]"?O[P]=d.queryParameters[P]:O[P]=d.queryParameters[P].toString();let B=0,L=async(P,C)=>{let x=P.pop();if(x===void 0)throw new ae(Pe(A));let N={...f,...d.timeouts},k={data:H,headers:T,method:u.method,url:ce(x,u.path,O),connectTimeout:C(B,N.connect),responseTimeout:C(B,w?N.read:N.write)},$=I=>{let j={request:k,response:I,host:x,triesLeft:P.length};return A.push(j),j},q=await a.send(k);if(fe(q)){let I=$(q);return q.isTimedOut&&B++,r.info("Retryable failure",K(I)),await e.set(x,z(x,q.isTimedOut?"timed out":"down")),L(P,C)}if(ge(q))return de(q);throw $(q),pe(q,A)},te=t.filter(P=>P.accept==="readWrite"||(w?P.accept==="read":P.accept==="write")),U=await g(te);return L([...U.hosts].reverse(),U.getTimeout)}function y(u,d={}){let w=()=>h(u,d,A),A=u.useReadTransporter||u.method==="GET";if((d.cacheable||u.cacheable)!==true)return w();let T={request:u,requestOptions:d,transporter:{queryParameters:i,headers:s}};return n.get(T,()=>o.get(T,()=>o.set(T,w()).then(p=>Promise.all([o.delete(T),p]),p=>Promise.all([o.delete(T),Promise.reject(p)])).then(([p,R])=>R)),{miss:p=>n.set(T,p)})}return {hostsCache:e,requester:a,timeouts:f,logger:r,algoliaAgent:l,baseHeaders:s,baseQueryParameters:i,hosts:t,request:y,requestsCache:o,responsesCache:n}}function Y(){function t(e){return new Promise(s=>{let r=new XMLHttpRequest;r.open(e.method,e.url,true),Object.keys(e.headers).forEach(a=>r.setRequestHeader(a,e.headers[a]));let i=(a,o)=>setTimeout(()=>{r.abort(),s({status:0,content:o,isTimedOut:true});},a),l=i(e.connectTimeout,"Connection timeout"),f;r.onreadystatechange=()=>{r.readyState>r.OPENED&&f===void 0&&(clearTimeout(l),f=i(e.responseTimeout,"Socket timeout"));},r.onerror=()=>{r.status===0&&(clearTimeout(l),clearTimeout(f),s({content:r.responseText||"Network request failed",status:r.status,isTimedOut:false}));},r.onload=()=>{clearTimeout(l),clearTimeout(f),s({content:r.responseText,status:r.status,isTimedOut:false});},r.send(e.data);})}return {send:t}}var S="5.52.0",_=["de","us"];function Te(t){return [{url:t?"analytics.{region}.algolia.com".replace("{region}",t):"analytics.algolia.com",accept:"readWrite",protocol:"https"}]}function Z({appId:t,apiKey:e,authMode:s,algoliaAgents:r,region:i,...l}){let f=Q(t,e,s),a=V({hosts:Te(i),...l,algoliaAgent:G({algoliaAgents:r,client:"Abtesting",version:S}),baseHeaders:{"content-type":"text/plain",...f.headers(),...l.baseHeaders},baseQueryParameters:{...f.queryParameters(),...l.baseQueryParameters}});return {transporter:a,appId:t,apiKey:e,clearCache(){return Promise.all([a.requestsCache.clear(),a.responsesCache.clear()]).then(()=>{})},get _ua(){return a.algoliaAgent.value},addAlgoliaAgent(o,n){a.algoliaAgent.add({segment:o,version:n});},setClientApiKey({apiKey:o}){!s||s==="WithinHeaders"?a.baseHeaders["x-algolia-api-key"]=o:a.baseQueryParameters["x-algolia-api-key"]=o;},addABTests(o,n){if(!o)throw new Error("Parameter `addABTestsRequest` is required when calling `addABTests`.");if(!o.name)throw new Error("Parameter `addABTestsRequest.name` is required when calling `addABTests`.");if(!o.variants)throw new Error("Parameter `addABTestsRequest.variants` is required when calling `addABTests`.");if(!o.endAt)throw new Error("Parameter `addABTestsRequest.endAt` is required when calling `addABTests`.");let h={method:"POST",path:"/2/abtests",queryParameters:{},headers:{},data:o};return a.request(h,n)},customDelete({path:o,parameters:n},c){if(!o)throw new Error("Parameter `path` is required when calling `customDelete`.");let y={method:"DELETE",path:"/{path}".replace("{path}",o),queryParameters:n||{},headers:{}};return a.request(y,c)},customGet({path:o,parameters:n},c){if(!o)throw new Error("Parameter `path` is required when calling `customGet`.");let y={method:"GET",path:"/{path}".replace("{path}",o),queryParameters:n||{},headers:{}};return a.request(y,c)},customPost({path:o,parameters:n,body:c},m){if(!o)throw new Error("Parameter `path` is required when calling `customPost`.");let u={method:"POST",path:"/{path}".replace("{path}",o),queryParameters:n||{},headers:{},data:c||{}};return a.request(u,m)},customPut({path:o,parameters:n,body:c},m){if(!o)throw new Error("Parameter `path` is required when calling `customPut`.");let u={method:"PUT",path:"/{path}".replace("{path}",o),queryParameters:n||{},headers:{},data:c||{}};return a.request(u,m)},deleteABTest({id:o},n){if(!o)throw new Error("Parameter `id` is required when calling `deleteABTest`.");let h={method:"DELETE",path:"/2/abtests/{id}".replace("{id}",encodeURIComponent(o)),queryParameters:{},headers:{}};return a.request(h,n)},estimateABTest(o,n){if(!o)throw new Error("Parameter `estimateABTestRequest` is required when calling `estimateABTest`.");if(!o.configuration)throw new Error("Parameter `estimateABTestRequest.configuration` is required when calling `estimateABTest`.");if(!o.variants)throw new Error("Parameter `estimateABTestRequest.variants` is required when calling `estimateABTest`.");let h={method:"POST",path:"/2/abtests/estimate",queryParameters:{},headers:{},data:o};return a.request(h,n)},getABTest({id:o},n){if(!o)throw new Error("Parameter `id` is required when calling `getABTest`.");let h={method:"GET",path:"/2/abtests/{id}".replace("{id}",encodeURIComponent(o)),queryParameters:{},headers:{}};return a.request(h,n)},listABTests({offset:o,limit:n,indexPrefix:c,indexSuffix:m}={},g=void 0){let h="/2/abtests",y={},u={};o!==void 0&&(u.offset=o.toString()),n!==void 0&&(u.limit=n.toString()),c!==void 0&&(u.indexPrefix=c.toString()),m!==void 0&&(u.indexSuffix=m.toString());let d={method:"GET",path:h,queryParameters:u,headers:y};return a.request(d,g)},stopABTest({id:o},n){if(!o)throw new Error("Parameter `id` is required when calling `stopABTest`.");let h={method:"POST",path:"/2/abtests/{id}/stop".replace("{id}",encodeURIComponent(o)),queryParameters:{},headers:{}};return a.request(h,n)}}}function ot(t,e,s,r){if(!t||typeof t!="string")throw new Error("`appId` is missing.");if(!e||typeof e!="string")throw new Error("`apiKey` is missing.");if(s&&(typeof s!="string"||!_.includes(s)))throw new Error(`\`region\` must be one of the following: ${_.join(", ")}`);let{compression:i,...l}=r||{};return Z({appId:t,apiKey:e,region:s,timeouts:{connect:1e3,read:2e3,write:3e4},logger:M(),requester:Y(),algoliaAgents:[{segment:"Browser"}],authMode:"WithinQueryParameters",responsesCache:b(),requestsCache:b({serializable:false}),hostsCache:v({caches:[J({key:`${S}-${t}`}),b()]}),...l})} exports.abtestingClient = ot; exports.apiClientVersion = S; }));