(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/monitoring"] = {})); })(this, (function (exports) { 'use strict'; function U(){function r(e){return new Promise(s=>{let t=new XMLHttpRequest;t.open(e.method,e.url,true),Object.keys(e.headers).forEach(o=>t.setRequestHeader(o,e.headers[o]));let n=(o,a)=>setTimeout(()=>{t.abort(),s({status:0,content:a,isTimedOut:true});},o),d=n(e.connectTimeout,"Connection timeout"),i;t.onreadystatechange=()=>{t.readyState>t.OPENED&&i===void 0&&(clearTimeout(d),i=n(e.responseTimeout,"Socket timeout"));},t.onerror=()=>{t.status===0&&(clearTimeout(d),clearTimeout(i),s({content:t.responseText||"Network request failed",status:t.status,isTimedOut:false}));},t.onload=()=>{clearTimeout(d),clearTimeout(i),s({content:t.responseText,status:t.status,isTimedOut:false});},t.send(e.data);})}return {send:r}}function M(r){let e,s=`algolia-client-js-${r.key}`;function t(){return e===void 0&&(e=r.localStorage||window.localStorage),e}function n(){return JSON.parse(t().getItem(s)||"{}")}function d(o){t().setItem(s,JSON.stringify(o));}function i(){let o=r.timeToLive?r.timeToLive*1e3:null,a=n(),c=Object.fromEntries(Object.entries(a).filter(([,m])=>m.timestamp!==void 0));if(d(c),!o)return;let u=Object.fromEntries(Object.entries(c).filter(([,m])=>{let h=new Date().getTime();return !(m.timestamp+oPromise.resolve()}){return Promise.resolve().then(()=>(i(),n()[JSON.stringify(o)])).then(u=>Promise.all([u?u.value:a(),u!==void 0])).then(([u,m])=>Promise.all([u,m||c.miss(u)])).then(([u])=>u)},set(o,a){return Promise.resolve().then(()=>{let c=n();return c[JSON.stringify(o)]={timestamp:new Date().getTime(),value:a},t().setItem(s,JSON.stringify(c)),a})},delete(o){return Promise.resolve().then(()=>{let a=n();delete a[JSON.stringify(o)],t().setItem(s,JSON.stringify(a));})},clear(){return Promise.resolve().then(()=>{t().removeItem(s);})}}}function K(){return {get(r,e,s={miss:()=>Promise.resolve()}){return e().then(n=>Promise.all([n,s.miss(n)])).then(([n])=>n)},set(r,e){return Promise.resolve(e)},delete(r){return Promise.resolve()},clear(){return Promise.resolve()}}}function E(r){let e=[...r.caches],s=e.shift();return s===void 0?K():{get(t,n,d={miss:()=>Promise.resolve()}){return s.get(t,n,d).catch(()=>E({caches:e}).get(t,n,d))},set(t,n){return s.set(t,n).catch(()=>E({caches:e}).set(t,n))},delete(t){return s.delete(t).catch(()=>E({caches:e}).delete(t))},clear(){return s.clear().catch(()=>E({caches:e}).clear())}}}function O(r={serializable:true}){let e={};return {get(s,t,n={miss:()=>Promise.resolve()}){let d=JSON.stringify(s);if(d in e)return Promise.resolve(r.serializable?JSON.parse(e[d]):e[d]);let i=t();return i.then(o=>n.miss(o)).then(()=>i)},set(s,t){return e[JSON.stringify(s)]=r.serializable?JSON.stringify(t):t,Promise.resolve(t)},delete(s){return delete e[JSON.stringify(s)],Promise.resolve()},clear(){return e={},Promise.resolve()}}}function V(r){let e={value:`Algolia for JavaScript (${r})`,add(s){let t=`; ${s.segment}${s.version!==void 0?` (${s.version})`:""}`;return e.value.indexOf(t)===-1&&(e.value=`${e.value}${t}`),e}};return e}function Q(r,e,s="WithinHeaders"){let t={"x-algolia-api-key":e,"x-algolia-application-id":r};return {headers(){return s==="WithinHeaders"?t:{}},queryParameters(){return s==="WithinQueryParameters"?t:{}}}}function W({algoliaAgents:r,client:e,version:s}){let t=V(s).add({segment:e,version:s});return r.forEach(n=>t.add(n)),t}function $(){return {debug(r,e){return Promise.resolve()},info(r,e){return Promise.resolve()},error(r,e){return Promise.resolve()}}}var k=2*60*1e3;function L(r,e="up"){let s=Date.now();function t(){return e==="up"||Date.now()-s>k}function n(){return e==="timed out"&&Date.now()-s<=k}return {...r,status:e,lastUpdate:s,isUp:t,isTimedOut:n}}var j=class extends Error{name="AlgoliaError";constructor(r,e){super(r),e&&(this.name=e);}},J=class extends j{stackTrace;constructor(r,e,s){super(r,s),this.stackTrace=e;}},Y=class extends J{constructor(r){super("Unreachable hosts - your application id may be incorrect. If the error persists, please reach out to the Algolia Support team: https://alg.li/support.",r,"RetryError");}},I=class extends J{status;constructor(r,e,s,t="ApiError"){super(r,s,t),this.status=e;}},Z=class extends j{response;constructor(r,e){super(r,"DeserializationError"),this.response=e;}},ee=class extends I{error;constructor(r,e,s,t){super(r,e,t,"DetailedApiError"),this.error=s;}};function re(r,e,s){let t=te(s),n=`${r.protocol}://${r.url}${r.port?`:${r.port}`:""}/${e.charAt(0)==="/"?e.substring(1):e}`;return t.length&&(n+=`?${t}`),n}function te(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 se(r,e){if(r.method==="GET"||r.data===void 0&&e.data===void 0)return;let s=Array.isArray(r.data)?r.data:{...r.data,...e.data};return JSON.stringify(s)}function oe(r,e,s){let t={Accept:"application/json",...r,...e,...s},n={};return Object.keys(t).forEach(d=>{let i=t[d];n[d.toLowerCase()]=i;}),n}function ae(r){try{return JSON.parse(r.content)}catch(e){throw new Z(e.message,r)}}function ne({content:r,status:e},s){try{let t=JSON.parse(r);return "error"in t?new ee(t.message,e,t.error,s):new I(t.message,e,s)}catch{}return new I(r,e,s)}function ie({isTimedOut:r,status:e}){return !r&&~~e===0}function ce({isTimedOut:r,status:e}){return r||ie({isTimedOut:r,status:e})||~~(e/100)!==2&&~~(e/100)!==4}function ue({status:r}){return ~~(r/100)===2}function le(r){return r.map(e=>z(e))}function z(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 F({hosts:r,hostsCache:e,baseHeaders:s,logger:t,baseQueryParameters:n,algoliaAgent:d,timeouts:i,requester:o,requestsCache:a,responsesCache:c}){async function u(l){let p=await Promise.all(l.map(P=>e.get(P,()=>Promise.resolve(L(P))))),T=p.filter(P=>P.isUp()),g=p.filter(P=>P.isTimedOut()),w=[...T,...g];return {hosts:w.length>0?w:l,getTimeout(P,q){return (g.length===0&&P===0?1:g.length+3+P)*q}}}async function m(l,p,T=true){let g=[],w=se(l,p),y=oe(s,l.headers,p.headers),P=l.method==="GET"?{...l.data,...p.data}:{},q={...n,...l.queryParameters,...P};if(d.value&&(q["x-algolia-agent"]=d.value),p&&p.queryParameters)for(let f of Object.keys(p.queryParameters))!p.queryParameters[f]||Object.prototype.toString.call(p.queryParameters[f])==="[object Object]"?q[f]=p.queryParameters[f]:q[f]=p.queryParameters[f].toString();let x=0,N=async(f,b)=>{let v=f.pop();if(v===void 0)throw new Y(le(g));let A={...i,...p.timeouts},_={data:w,headers:y,method:l.method,url:re(v,l.path,q),connectTimeout:b(x,A.connect),responseTimeout:b(x,T?A.read:A.write)},G=S=>{let H={request:_,response:S,host:v,triesLeft:f.length};return g.push(H),H},R=await o.send(_);if(ce(R)){let S=G(R);return R.isTimedOut&&x++,t.info("Retryable failure",z(S)),await e.set(v,L(v,R.isTimedOut?"timed out":"down")),N(f,b)}if(ue(R))return ae(R);throw G(R),ne(R,g)},X=r.filter(f=>f.accept==="readWrite"||(T?f.accept==="read":f.accept==="write")),D=await u(X);return N([...D.hosts].reverse(),D.getTimeout)}function h(l,p={}){let T=l.useReadTransporter||l.method==="GET";if(!T)return m(l,p,T);let g=()=>m(l,p);if((p.cacheable||l.cacheable)!==true)return g();let y={request:l,requestOptions:p,transporter:{queryParameters:n,headers:s}};return c.get(y,()=>a.get(y,()=>a.set(y,g()).then(P=>Promise.all([a.delete(y),P]),P=>Promise.all([a.delete(y),Promise.reject(P)])).then(([P,q])=>q)),{miss:P=>c.set(y,P)})}return {hostsCache:e,requester:o,timeouts:i,logger:t,algoliaAgent:d,baseHeaders:s,baseQueryParameters:n,hosts:r,request:h,requestsCache:a,responsesCache:c}}var C="1.20.3";function me(){return [{url:"status.algolia.com",accept:"readWrite",protocol:"https"}]}function B({appId:r,apiKey:e,authMode:s,algoliaAgents:t,...n}){let d=Q(r,e,s),i=F({hosts:me(),...n,algoliaAgent:W({algoliaAgents:t,client:"Monitoring",version:C}),baseHeaders:{"content-type":"text/plain",...d.headers(),...n.baseHeaders},baseQueryParameters:{...d.queryParameters(),...n.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(o,a){i.algoliaAgent.add({segment:o,version:a});},setClientApiKey({apiKey:o}){!s||s==="WithinHeaders"?i.baseHeaders["x-algolia-api-key"]=o:i.baseQueryParameters["x-algolia-api-key"]=o;},customDelete({path:o,parameters:a},c){if(!o)throw new Error("Parameter `path` is required when calling `customDelete`.");let l={method:"DELETE",path:"/{path}".replace("{path}",o),queryParameters:a||{},headers:{}};return i.request(l,c)},customGet({path:o,parameters:a},c){if(!o)throw new Error("Parameter `path` is required when calling `customGet`.");let l={method:"GET",path:"/{path}".replace("{path}",o),queryParameters:a||{},headers:{}};return i.request(l,c)},customPost({path:o,parameters:a,body:c},u){if(!o)throw new Error("Parameter `path` is required when calling `customPost`.");let p={method:"POST",path:"/{path}".replace("{path}",o),queryParameters:a||{},headers:{},data:c||{}};return i.request(p,u)},customPut({path:o,parameters:a,body:c},u){if(!o)throw new Error("Parameter `path` is required when calling `customPut`.");let p={method:"PUT",path:"/{path}".replace("{path}",o),queryParameters:a||{},headers:{},data:c||{}};return i.request(p,u)},getClusterIncidents({clusters:o},a){if(!o)throw new Error("Parameter `clusters` is required when calling `getClusterIncidents`.");let h={method:"GET",path:"/1/incidents/{clusters}".replace("{clusters}",encodeURIComponent(o)),queryParameters:{},headers:{}};return i.request(h,a)},getClusterStatus({clusters:o},a){if(!o)throw new Error("Parameter `clusters` is required when calling `getClusterStatus`.");let h={method:"GET",path:"/1/status/{clusters}".replace("{clusters}",encodeURIComponent(o)),queryParameters:{},headers:{}};return i.request(h,a)},getIncidents(o){let m={method:"GET",path:"/1/incidents",queryParameters:{},headers:{}};return i.request(m,o)},getIndexingTime({clusters:o},a){if(!o)throw new Error("Parameter `clusters` is required when calling `getIndexingTime`.");let h={method:"GET",path:"/1/indexing/{clusters}".replace("{clusters}",encodeURIComponent(o)),queryParameters:{},headers:{}};return i.request(h,a)},getLatency({clusters:o},a){if(!o)throw new Error("Parameter `clusters` is required when calling `getLatency`.");let h={method:"GET",path:"/1/latency/{clusters}".replace("{clusters}",encodeURIComponent(o)),queryParameters:{},headers:{}};return i.request(h,a)},getMetrics({metric:o,period:a},c){if(!o)throw new Error("Parameter `metric` is required when calling `getMetrics`.");if(!a)throw new Error("Parameter `period` is required when calling `getMetrics`.");let l={method:"GET",path:"/1/infrastructure/{metric}/period/{period}".replace("{metric}",encodeURIComponent(o)).replace("{period}",encodeURIComponent(a)),queryParameters:{},headers:{}};return i.request(l,c)},getReachability({clusters:o},a){if(!o)throw new Error("Parameter `clusters` is required when calling `getReachability`.");let h={method:"GET",path:"/1/reachability/{clusters}/probes".replace("{clusters}",encodeURIComponent(o)),queryParameters:{},headers:{}};return i.request(h,a)},getServers(o){let m={method:"GET",path:"/1/inventory/servers",queryParameters:{},headers:{}};return i.request(m,o)},getStatus(o){let m={method:"GET",path:"/1/status",queryParameters:{},headers:{}};return i.request(m,o)}}}function Ke(r,e,s){if(!r||typeof r!="string")throw new Error("`appId` is missing.");if(!e||typeof e!="string")throw new Error("`apiKey` is missing.");return B({appId:r,apiKey:e,timeouts:{connect:1e3,read:2e3,write:3e4},logger:$(),requester:U(),algoliaAgents:[{segment:"Browser"}],authMode:"WithinQueryParameters",responsesCache:O(),requestsCache:O({serializable:false}),hostsCache:E({caches:[M({key:`${C}-${r}`}),O()]}),...s})} exports.apiClientVersion = C; exports.monitoringClient = Ke; }));