axios-retryer
Version:
TypeScript-first Axios retry library with concurrency limits, request priority, token refresh, response caching, and circuit breaker plugins.
1 lines • 71.5 kB
JavaScript
import e,{AxiosError as t}from"axios";const s="GET",r=new Set(["retryAttempt","requestRetries","requestMode","requestId","correlationId","isRetrying","priority","timestamp","backoffType","retryableStatuses","extra","isRetryRefreshRequest","manualReplayAttempt","retryAfterMs","silentlyCancelled","cachingOptions"]);function i(e){return r.has(e)&&"__proto__"!==e&&"constructor"!==e&&"prototype"!==e}function n(e){const t={};if(Object.defineProperty(t,"toJSON",{value:()=>{},enumerable:!1,writable:!1,configurable:!1}),e)for(const s of Object.keys(e))i(s)&&(t[s]=e[s]);return t}function o(e){const t=e;return t.__axiosRetryer?"function"!=typeof t.__axiosRetryer.toJSON&&(t.__axiosRetryer=n(t.__axiosRetryer)):t.__axiosRetryer=n(),t.__axiosRetryer}function a(e){if(e)return e.__axiosRetryer}function c(e,t,s){const r=o(e);return void 0===s?delete r[t]:r[t]=s,r}function u(e,t){const s=o(e);for(const e of Object.keys(t)){if(!i(e))continue;const r=t[e];void 0===r?delete s[e]:s[e]=r}return s}class l extends Error{constructor(){super("URL is required for cache key generation"),this.name="InvalidCacheKeyError"}}class h extends Error{constructor(e,t){super(e),this.name=new.target.name,this.code=t,Object.setPrototypeOf(this,new.target.prototype)}}class d extends h{constructor(e,t,s){super(e,"EINVALID_CONFIG"),this.optionName=t,this.optionValue=s}}class p{constructor(){this.storage=new Map}get(e){return this.storage.get(e)}set(e,t){this.storage.set(e,t)}delete(e){this.storage.delete(e)}clear(){this.storage.clear()}entries(){return Array.from(this.storage,([e,t])=>({key:e,value:t}))}}function f(e){let t=2166136261;for(let s=0;s<e.length;s++)t^=e.charCodeAt(s),t=Math.imul(t,16777619);return`fp_${(t>>>0).toString(16).padStart(8,"0")}`}function g([e,t],[s,r]){return e.localeCompare(s)||t.localeCompare(r)}function m(e){const t=e.indexOf("#"),s=-1===t?e:e.slice(0,t),r=s.indexOf("?");if(-1===r)return s;const i=s.slice(0,r),n=s.slice(r+1);if(!n)return i;const o=Array.from(new URLSearchParams(n).entries()).sort(g);return 0===o.length?i:`${i}?${o.map(([e,t])=>`${encodeURIComponent(e)}=${encodeURIComponent(t)}`).join("&")}`}function y(e,t=!1){if(void 0!==e){if(null===e||"string"==typeof e||"number"==typeof e||"boolean"==typeof e)return e;if(e instanceof Date)return e.toISOString();if("undefined"!=typeof URLSearchParams&&e instanceof URLSearchParams)return Array.from(e.entries()).sort(g);if(e instanceof Map)return Array.from(e.entries()).map(([e,s])=>[String(e),y(s,t)]).sort(([e],[t])=>e.localeCompare(t));if(e instanceof Set)return Array.from(e.values()).map(e=>y(e,t));if(Array.isArray(e))return e.map(e=>y(e,t));if("object"==typeof e){const s="function"==typeof e.toJSON?e.toJSON():e;if(s!==e)return y(s,t);const r={};return Object.entries(s).map(([e,s])=>[t?e.toLowerCase():e,y(s,t)]).sort(([e],[t])=>e.localeCompare(t)).forEach(([e,t])=>{r[e]=t}),r}return String(e)}}function v(e,t=!1){if(null==e)return"";if("string"==typeof e){const s=e.trim();if(s.startsWith("{")&&s.endsWith("}")||s.startsWith("[")&&s.endsWith("]"))try{return JSON.stringify(y(JSON.parse(s),t))}catch(e){}return e}return"number"==typeof e||"boolean"==typeof e?String(e):JSON.stringify(y(e,t))}function R(e){return[e.method,e.normalizedUrl,e.normalizedParams,e.normalizedData,e.normalizedHeaders].join("|")}function w(e){return e instanceof RegExp?{type:"regexp",fingerprint:f(String(e))}:"string"==typeof e?{type:"exact",fingerprint:f(e)}:{type:"exact"in e?"exact":"prefix",fingerprint:f("exact"in e?e.exact:e.prefix)}}const S=new Set(["authorization","proxy-authorization","cookie","x-auth-token","x-api-key"]);function C(e){if(!e.headers)return!1;const t=e.headers;for(const e of Object.keys(t))if(S.has(e.toLowerCase()))return!0;return!1}function x(e){return!!e&&"function"==typeof e.then}function k(e){return e instanceof Error?{errorName:e.name}:{}}function E(e){var t;return null!==(t=e.lastAccessedAt)&&void 0!==t?t:e.timestamp}function b(e){return[...e].sort((e,t)=>E(e.value)-E(t.value)||e.key.localeCompare(t.key))}function A(e,t=new WeakMap){if(null===e||"object"!=typeof e)return e;if(e instanceof Date)return new Date(e.getTime());if("undefined"!=typeof URLSearchParams&&e instanceof URLSearchParams)return new URLSearchParams(e.toString());if("undefined"!=typeof ArrayBuffer){if(e instanceof ArrayBuffer)return e.slice(0);if(ArrayBuffer.isView(e))return function(e){const t="undefined"!=typeof globalThis?globalThis.Buffer:void 0;return(null==t?void 0:t.isBuffer(e))?t.from(e):e instanceof DataView?new DataView(e.buffer.slice(e.byteOffset,e.byteOffset+e.byteLength)):"function"==typeof e.slice?e.slice():new Uint8Array(e.buffer.slice(e.byteOffset,e.byteOffset+e.byteLength))}(e)}if("undefined"!=typeof Blob&&e instanceof Blob)return e.slice(0,e.size,e.type);const s=t.get(e);if(void 0!==s)return s;if(Array.isArray(e)){const s=[];return t.set(e,s),e.forEach((e,r)=>{s[r]=A(e,t)}),s}if(e instanceof Map){const s=new Map;return t.set(e,s),e.forEach((e,r)=>{s.set(A(r,t),A(e,t))}),s}if(e instanceof Set){const s=new Set;return t.set(e,s),e.forEach(e=>{s.add(A(e,t))}),s}let r=e;if(function(e){return"object"==typeof e&&null!==e&&"function"==typeof e.toJSON}(e))try{r=e.toJSON()}catch{}if(r!==e)return A(r,t);const i=Object.getPrototypeOf(e),n=Object.create(null===i?null:i);return t.set(e,n),Reflect.ownKeys(e).forEach(s=>{const r=Object.getOwnPropertyDescriptor(e,s);(null==r?void 0:r.enumerable)&&(n[s]=A(e[s],t))}),n}function T(e){if("function"==typeof structuredClone)try{return structuredClone(e)}catch(e){}return A(e)}function q(e,t){const s=T(e.headers);if(t.length>0){const e=new Set(t.map(e=>e.toLowerCase()));for(const t of Object.keys(s))e.has(t.toLowerCase())&&delete s[t]}return{config:{},data:T(e.data),headers:s,status:e.status,statusText:e.statusText}}function _(e,t){return{config:t,data:T(e.data),headers:T(e.headers),status:e.status,statusText:e.statusText}}class M{constructor(e){this.options=e,this.timer=null,this.consecutiveFailures=0}start(){this.timer||this.options.intervalMs<=0||(this.timer=setInterval(()=>this.runOnce(),this.options.intervalMs))}stop(){this.timer&&(clearInterval(this.timer),this.timer=null)}get consecutiveFailureCount(){return this.consecutiveFailures}runOnce(){let e;const t=new Promise((t,s)=>{e=setTimeout(()=>s(new Error(`Cache cleanup exceeded ${this.options.timeoutMs} ms timeout`)),this.options.timeoutMs)});Promise.race([this.options.runCleanup(),t]).then(()=>{this.consecutiveFailures=0}).catch(e=>{var t,s;this.consecutiveFailures+=1,null===(t=this.options.getLogger())||void 0===t||t.warn("[CachingPlugin] Failed to run cache cleanup",{...k(e),consecutiveFailures:this.consecutiveFailures}),this.consecutiveFailures>=this.options.disableAfterFailures&&(null===(s=this.options.getLogger())||void 0===s||s.error("[CachingPlugin] Disabling cleanup after repeated failures",{consecutiveFailures:this.consecutiveFailures}),this.stop())}).finally(()=>{void 0!==e&&clearTimeout(e)})}}class I{constructor(e){this.options=e,this.inflightRequests=new Map,this.inflightLeaders=new Map,this.inflightFollowers=new Map,this.servedFromCache=new Set,this.trackingIdFallback=new WeakMap}getOrAssignTrackingId(e){var t,s;const r=null===(t=a(e))||void 0===t?void 0:t.requestId;if(r)return r;let i=this.trackingIdFallback.get(e);return i||(i=`ct_${Math.random().toString(36).slice(2)}`,this.trackingIdFallback.set(e,i),null===(s=this.options.getLogger())||void 0===s||s.warn("[CachingPlugin] Request lacks requestId; falling back to WeakMap-keyed tracking id. Register CachingPlugin AFTER any plugin that mutates the request config.")),i}peekInflight(e){return this.inflightRequests.get(e)}registerLeader(e,t){const s=function(){let e,t;const s=new Promise((s,r)=>{e=s,t=r});return s.catch(()=>{}),{promise:s,resolve:e,reject:t}}();return this.inflightRequests.set(t,s),this.inflightLeaders.set(this.getOrAssignTrackingId(e),t),s}registerFollower(e,t){this.inflightFollowers.set(this.getOrAssignTrackingId(e),t)}consumeFollower(e){if(!e)return!1;const t=this.getOrAssignTrackingId(e);return!!this.inflightFollowers.has(t)&&(this.inflightFollowers.delete(t),!0)}clearFollower(e){this.inflightFollowers.delete(this.getOrAssignTrackingId(e))}markServedFromCache(e){this.servedFromCache.add(this.getOrAssignTrackingId(e))}consumeServedFromCache(e){if(!e)return!1;const t=this.getOrAssignTrackingId(e);return!!this.servedFromCache.has(t)&&(this.servedFromCache.delete(t),!0)}resolve(e,t){if(!e)return;const s=this.getOrAssignTrackingId(e),r=this.inflightLeaders.get(s);if(!r)return;const i=this.inflightRequests.get(r);i&&(i.resolve(t),this.inflightRequests.delete(r)),this.inflightLeaders.delete(s)}reject(e,t){const s=this.getOrAssignTrackingId(e),r=this.inflightLeaders.get(s);if(!r)return;const i=this.inflightRequests.get(r);i&&(i.reject(t),this.inflightRequests.delete(r)),this.inflightLeaders.delete(s)}clearInflightOnly(){this.inflightRequests.clear()}clearAll(){this.inflightRequests.clear(),this.inflightLeaders.clear(),this.inflightFollowers.clear(),this.servedFromCache.clear()}}class L{constructor(e){this.name="CachingPlugin",this.version="1.0.0",this.interceptorIdReq=null,this.interceptorIdRes=null,this.cache=new Map,this.options=function(e){var t,r;return{sensitiveResponseHeaders:["set-cookie"],compareHeaders:!1,timeToRevalidate:0,cacheMethods:[s],cleanupInterval:0,maxAge:0,maxItems:1e3,maxEntrySize:0,cacheOnlyRetriedRequests:!1,storage:null!==(t=null==e?void 0:e.storage)&&void 0!==t?t:new p,dedupeConcurrentRequests:!0,cacheKeyBuilder:null!==(r=null==e?void 0:e.cacheKeyBuilder)&&void 0!==r?r:R,skipWhenAuthPresent:!0,varyHeaders:[],...e}}(e),this.storage=this.options.storage,function(e){if(!Number.isInteger(e.cleanupInterval)||e.cleanupInterval<0)throw new d("cleanupInterval must be a non-negative integer","cleanupInterval",e.cleanupInterval);if(!Number.isInteger(e.maxAge)||e.maxAge<0)throw new d("maxAge must be a non-negative integer","maxAge",e.maxAge);if(!Number.isInteger(e.maxItems)||e.maxItems<0)throw new d("maxItems must be a non-negative integer","maxItems",e.maxItems);if(!Number.isInteger(e.maxEntrySize)||e.maxEntrySize<0)throw new d("maxEntrySize must be a non-negative integer","maxEntrySize",e.maxEntrySize);if(!Number.isInteger(e.timeToRevalidate)||e.timeToRevalidate<0)throw new d("timeToRevalidate must be a non-negative integer","timeToRevalidate",e.timeToRevalidate)}(this.options);const t=()=>{var e,t;return null!==(t=null===(e=this.context)||void 0===e?void 0:e.getLogger())&&void 0!==t?t:null};this.inflight=new I({getLogger:t}),this.cleanup=new M({intervalMs:this.options.cleanupInterval,timeoutMs:L.CACHE_CLEANUP_TIMEOUT_MS,disableAfterFailures:L.CACHE_CLEANUP_DISABLE_AFTER,runCleanup:()=>this.runCacheCleanup(),getLogger:t})}initialize(e){this.context=e;const t=e.axiosInstance;this.interceptorIdReq=t.interceptors.request.use(e=>this.handleRequest(e),e=>Promise.reject(e)),this.interceptorIdRes=t.interceptors.response.use(e=>this.handleResponseSuccess(e),e=>this.handleResponseError(e)),this.options.cleanupInterval>0&&this.cleanup.start()}onBeforeDestroyed(){null!==this.interceptorIdReq&&this.context.axiosInstance.interceptors.request.eject(this.interceptorIdReq),null!==this.interceptorIdRes&&this.context.axiosInstance.interceptors.response.eject(this.interceptorIdRes),this.cleanup.stop(),this.inflight.clearAll()}getCacheKeyFingerprint(e){return f(e)}async handleRequest(e){var t,r,i,n,a,c,u;const l=o(e),h=this.getRequestCachingOptions(e),d=(e.method||s).toUpperCase();if(h&&(l.cachingOptions=h),!1===(null==h?void 0:h.cache))return null===(t=this.context.getLogger())||void 0===t||t.debug("[CachingPlugin] Skipping cache for request (explicitly disabled)"),e;if(this.options.skipWhenAuthPresent&&C(e))return null===(r=this.context.getLogger())||void 0===r||r.debug("[CachingPlugin] Skipping cache for authenticated request"),e;if(!0!==(null==h?void 0:h.cache)&&!this.options.cacheMethods.includes(d))return e;if(this.options.cacheOnlyRetriedRequests&&!l.isRetrying)return e;const p=this.buildCacheKey(e),f=this.getCacheKeyFingerprint(p);let g=this.cache.get(p);if(!g)try{g=await this.storage.get(p)}catch(t){return null===(i=this.context.getLogger())||void 0===i||i.warn("[CachingPlugin] Failed to read cache entry",{cacheKeyFingerprint:f,...k(t)}),e}if(g){const t=Date.now(),s=t-g.timestamp,r=null!==(n=g.ttr)&&void 0!==n?n:this.options.timeToRevalidate;if(0===r||s<r){const r=this.touchCacheEntry(p,g,t);return await this.persistCacheTouchIfNeeded(p,r,f),null===(a=this.context.getLogger())||void 0===a||a.debug("[CachingPlugin] Cache hit",{cacheKeyFingerprint:f,ageMs:s}),this.context.triggerAndEmit("onCacheHit",{keyFingerprint:f,config:e,ageMs:s}),this.inflight.markServedFromCache(e),{...e,adapter:()=>Promise.resolve(_(r.response,e))}}null===(c=this.context.getLogger())||void 0===c||c.debug("[CachingPlugin] Cache stale",{cacheKeyFingerprint:f,ageMs:s}),this.context.triggerAndEmit("onCacheMiss",{keyFingerprint:f,config:e,reason:"stale"}),await this.deleteCacheEntry(p)}else this.context.triggerAndEmit("onCacheMiss",{keyFingerprint:f,config:e,reason:"empty"});if(!this.options.dedupeConcurrentRequests)return e;const m=this.inflight.peekInflight(p);return m?(this.inflight.registerFollower(e,p),null===(u=this.context.getLogger())||void 0===u||u.debug("[CachingPlugin] Piggybacking on in-flight request",{cacheKeyFingerprint:f}),{...e,adapter:async()=>_(await m.promise,e)}):(this.inflight.registerLeader(e,p),e)}async handleResponseSuccess(e){var t,r,i,n,o,c;const u=e.config?a(e.config):void 0;if(this.inflight.consumeFollower(e.config))return e;if(this.inflight.consumeServedFromCache(e.config))return e;const l=this.getRequestCachingOptions(e.config);if(!1===(null==l?void 0:l.cache))return this.inflight.resolve(e.config,e),e;if(this.options.skipWhenAuthPresent&&C(e.config))return this.inflight.resolve(e.config,e),e;if(!0!==(null==l?void 0:l.cache)){const r=((null===(t=e.config)||void 0===t?void 0:t.method)||s).toUpperCase();if(!this.options.cacheMethods.includes(r))return this.inflight.resolve(e.config,e),e;if(this.options.cacheOnlyRetriedRequests&&e.config&&!(null==u?void 0:u.isRetrying))return this.inflight.resolve(e.config,e),e}if(e.status>=200&&e.status<300){const t=this.buildCacheKey(e.config),s=this.getCacheKeyFingerprint(t),a=null==l?void 0:l.ttr;if(this.options.maxEntrySize>0)try{const t=null!==(i=null===(r=JSON.stringify(e.data))||void 0===r?void 0:r.length)&&void 0!==i?i:0;if(t>this.options.maxEntrySize)return null===(n=this.context.getLogger())||void 0===n||n.debug("[CachingPlugin] Skipping oversized response",{cacheKeyFingerprint:s,estimatedSize:t,maxEntrySize:this.options.maxEntrySize}),this.inflight.resolve(e.config,e),e}catch{return this.inflight.resolve(e.config,e),e}try{null===(o=this.context.getLogger())||void 0===o||o.debug("[CachingPlugin] Caching response",{cacheKeyFingerprint:s,...a?{ttrMs:a}:{}}),await this.upsertCacheEntry(t,{response:q(e,this.options.sensitiveResponseHeaders),timestamp:Date.now(),ttr:a,lastAccessedAt:Date.now()})}catch(e){null===(c=this.context.getLogger())||void 0===c||c.warn("[CachingPlugin] Failed to cache response",{cacheKeyFingerprint:s,...k(e)})}finally{this.inflight.resolve(e.config,e)}}else this.inflight.resolve(e.config,e);return e}handleResponseError(e){return e.config&&(this.inflight.reject(e.config,e),this.inflight.clearFollower(e.config)),Promise.reject(e)}buildCacheKey(e){if(!e.url)throw new l;return this.options.cacheKeyBuilder(this.buildCacheKeyContext(e))}async runCacheCleanup(){var e;const t=await this.readCacheEntriesForScan();this.syncLocalCache(t);const s=Date.now(),r=new Set;if(this.options.maxAge>0&&t.forEach(({key:e,value:t})=>{s-t.timestamp>this.options.maxAge&&r.add(e)}),this.options.maxItems>0&&t.length>this.options.maxItems){const e=t.length-this.options.maxItems,s=b(t);for(let t=0;t<s.length&&r.size<e;t++)r.add(s[t].key)}r.size>0&&(await Promise.all(Array.from(r,e=>this.deleteCacheEntry(e))),null===(e=this.context.getLogger())||void 0===e||e.debug(`[CachingPlugin] Cleaned up ${r.size} cached items`))}clearCache(){var e;const t=this.cache.size;this.cache.clear(),this.inflight.clearInflightOnly(),null===(e=this.context.getLogger())||void 0===e||e.debug("[CachingPlugin] Cache cleared."),this.context.triggerAndEmit("onCacheInvalidated",{count:t,matcher:"all"});const s=this.storage.clear();if(x(s))return s.then(()=>{})}invalidateCache(e){const t=this.storage.entries();return x(t)?Promise.resolve(t).then(t=>this.invalidateCacheEntries(e,t)):this.invalidateCacheEntries(e,t)}getCacheStats(){const e=Date.now(),t=Array.from(this.cache.values());if(0===t.length)return{size:0,oldestItemAge:0,newestItemAge:0,averageAge:0};const s=t.map(t=>e-t.timestamp);return{size:this.cache.size,oldestItemAge:Math.max(...s),newestItemAge:Math.min(...s),averageAge:s.reduce((e,t)=>e+t,0)/s.length}}async upsertCacheEntry(e,t){var s;await this.enforceMaxItemsBeforeUpsert(e);const r=this.touchCacheEntry(e,t,null!==(s=t.lastAccessedAt)&&void 0!==s?s:t.timestamp);await this.storage.set(e,r)}touchCacheEntry(e,t,s=Date.now()){const r=t.lastAccessedAt===s?t:{...t,lastAccessedAt:s};return this.cache.delete(e),this.cache.set(e,r),r}deleteCacheEntry(e){this.cache.delete(e);const t=this.storage.delete(e);if(x(t))return t.then(()=>{})}getRequestCachingOptions(e){var t,s;return null!==(t=e.__cachingOptions)&&void 0!==t?t:null===(s=a(e))||void 0===s?void 0:s.cachingOptions}async readCacheEntriesForScan(){return Array.from(await this.storage.entries())}syncLocalCache(e){this.cache.clear(),b(e).forEach(({key:e,value:t})=>{this.cache.set(e,t)})}async enforceMaxItemsBeforeUpsert(e){if(0===this.options.maxItems)return;if(this.cache.size>0){if(this.cache.has(e))return;if(this.cache.size<this.options.maxItems)return;const t=this.cache.size-this.options.maxItems+1,s=b(Array.from(this.cache,([e,t])=>({key:e,value:t})));return void await Promise.all(s.slice(0,t).map(({key:e})=>this.deleteCacheEntry(e)))}const t=await this.readCacheEntriesForScan();if(this.syncLocalCache(t),t.some(t=>t.key===e))return;const s=t.length-this.options.maxItems+1;if(s<=0)return;const r=b(t).slice(0,s).map(e=>e.key);await Promise.all(r.map(e=>this.deleteCacheEntry(e)))}async persistCacheTouchIfNeeded(e,t,s){var r;if(0!==this.options.maxItems)try{await this.storage.set(e,t)}catch(e){null===(r=this.context.getLogger())||void 0===r||r.warn("[CachingPlugin] Failed to persist cache access metadata",{cacheKeyFingerprint:s,...k(e)})}}invalidateCacheEntries(e,t){this.syncLocalCache(t);const s=t.filter(({key:t})=>function(e,t){return t instanceof RegExp?t.test(e):"string"==typeof t?e===t:"exact"in t?e===t.exact:e.startsWith(t.prefix)}(t,e)).map(({key:e})=>e);if(0===s.length)return 0;const r=s.map(e=>this.deleteCacheEntry(e)),i=()=>{var t;return null===(t=this.context.getLogger())||void 0===t||t.debug("[CachingPlugin] Invalidated cache entries",{count:s.length,matcher:w(e)}),this.context.triggerAndEmit("onCacheInvalidated",{count:s.length,matcher:"custom"}),s.length};return r.some(e=>x(e))?Promise.all(r.map(e=>Promise.resolve(e))).then(()=>i()):i()}buildCacheKeyContext(e){return function(e,t){var r;let i;if(t.compareHeaders&&e.headers)i=v(e.headers,!0);else if(t.varyHeaders.length>0&&e.headers){const s=e.headers,r=new Set(t.varyHeaders.map(e=>e.toLowerCase())),n=[];for(const e of Object.keys(s))r.has(e.toLowerCase())&&n.push([e.toLowerCase(),String(s[e])]);n.sort(g),i=n.length>0?JSON.stringify(n):""}else i="";return{config:e,method:(e.method||s).toUpperCase(),normalizedUrl:m(null!==(r=e.url)&&void 0!==r?r:""),normalizedParams:v(e.params),normalizedData:v(e.data),normalizedHeaders:i}}(e,this.options)}}function P(e){return new L(e)}L.CACHE_CLEANUP_TIMEOUT_MS=3e4,L.CACHE_CLEANUP_DISABLE_AFTER=5;const O=[{name:"nested quantifier",test:e=>/\([^)]*[+*][^)]*\)[+*{]/.test(e)},{name:"alternation with quantifier",test:e=>/\([^)]*\|[^)]*\)[+*{]/.test(e)}];class F{constructor(e){this.responseMetrics={},this.percentile=e.percentile,this.sampleSize=e.sampleSize,this.multiplier=e.multiplier,this.maxTrackedScopes=e.maxTrackedScopes}trackResponseTime(e,t,s,r){var i,n;if(!e.config.url)return;let o=0;if(e.headers&&e.headers["x-response-time"]?o=parseInt(e.headers["x-response-time"],10):(null===(i=a(e.config))||void 0===i?void 0:i.timestamp)&&(o=Date.now()-((null===(n=a(e.config))||void 0===n?void 0:n.timestamp)||0)),o<=0&&(o=100),!this.responseMetrics[t]){const e=Object.keys(this.responseMetrics);e.length>=this.maxTrackedScopes&&delete this.responseMetrics[e[0]],this.responseMetrics[t]={times:[],sampleSize:this.sampleSize,lastCalculated:0,currentPercentileMs:0,scopeKey:t,normalizedUrl:s,host:r}}const c=this.responseMetrics[t];c.times.push(o),c.times.length>c.sampleSize&&c.times.shift(),this.updatePercentile(t)}getComputedTimeout(e){const t=this.responseMetrics[e];if(t&&this.isActive(t))return Math.round(t.currentPercentileMs*this.multiplier)}isActive(e){return e.times.length>=e.sampleSize&&e.currentPercentileMs>0}getAdaptiveTimeoutMetrics(){return Object.values(this.responseMetrics).map(e=>({scopeKey:e.scopeKey,url:e.normalizedUrl,host:e.host,timeoutMs:Math.round(e.currentPercentileMs*this.multiplier),p95ResponseTimeMs:e.currentPercentileMs,samplesCount:e.times.length}))}reset(){this.responseMetrics={}}updatePercentile(e){const t=this.responseMetrics[e];if(!t||0===t.times.length)return;if(t.times.length<t.sampleSize)return void(t.currentPercentileMs=0);const s=[...t.times].sort((e,t)=>e-t),r=Math.max(0,Math.min(Math.ceil(s.length*this.percentile)-1,s.length-1));t.currentPercentileMs=s[r],t.lastCalculated=Date.now()}}const D={CLOSED:"CLOSED",OPEN:"OPEN",HALF_OPEN:"HALF_OPEN"},z={HOST:"host",URL:"url",HOST_AND_URL:"host+url"};function j(e){return{...e,recentFailures:e.recentFailures.map(e=>({...e}))}}function H(e){return!!e&&"function"==typeof e.then}const N={log:()=>{},error:()=>{},warn:()=>{},debug:()=>{}};class U{constructor(){this.state=new Map}get(e){const t=this.state.get(e);return t?j(t):void 0}set(e,t){this.state.set(e,j(t))}delete(e){this.state.delete(e)}clear(){this.state.clear()}}class K{constructor(e){this.scopeStateCache=new Map,this.knownScopes=new Map,this.scopeLocks=new Map,this.logger=N,this.scope=e.scope,this.stateAdapter=e.stateAdapter,this.maxTrackedScopes=e.maxTrackedScopes}setLogger(e){this.logger=e}createInitialState(){return{state:D.CLOSED,failureCount:0,successCount:0,halfOpenCount:0,nextAttempt:Date.now(),recentFailures:[],lastFailureStatus:void 0,lastFailureCode:void 0}}withLock(e,t){var s;const r=(null!==(s=this.scopeLocks.get(e))&&void 0!==s?s:Promise.resolve()).then(t,t);return this.scopeLocks.set(e,r.then(()=>{},()=>{})),r}async readState(e){let t;try{t=await this.stateAdapter.get(e)}catch(t){this.handleAdapterError("get",e,t)}const s=this.scopeStateCache.get(e),r=t?j(t):s?j(s):this.createInitialState();return this.scopeStateCache.set(e,r),r}async writeState(e,t){const s=this.scopeStateCache.get(e),r=j(t);this.scopeStateCache.set(e,r);try{await this.stateAdapter.set(e,r)}catch(t){s?this.scopeStateCache.set(e,s):this.scopeStateCache.delete(e),this.handleAdapterError("set",e,t)}}getScopeDetails(e){const t=this.normalizeUrl(this.extractPath(e)),s=this.extractHost(e),r=this.resolveScopeKey(e,t,s);if(!this.knownScopes.has(r)){if(this.knownScopes.size>=this.maxTrackedScopes){const e=this.knownScopes.keys().next().value;this.knownScopes.delete(e),this.scopeStateCache.delete(e)}this.knownScopes.set(r,{scopeKey:r,normalizedUrl:t,host:s})}return this.knownScopes.get(r)}getKnownScopes(){return this.knownScopes.values()}getTrackedScopeKeys(e){return e?[e]:Array.from(new Set([...this.knownScopes.keys(),...this.scopeStateCache.keys()]))}deleteDistributedScope(e){try{const t=this.stateAdapter.delete(e);H(t)&&t.catch(t=>{this.handleAdapterError("delete",e,t),this.restoreDistributedClosedState([e])})}catch(t){this.handleAdapterError("delete",e,t),this.restoreDistributedClosedState([e])}}clearDistributedState(e){try{const t=this.stateAdapter.clear();H(t)&&t.catch(t=>{this.handleAdapterError("clear","*",t),this.restoreDistributedClosedState(e)})}catch(t){this.handleAdapterError("clear","*",t),this.restoreDistributedClosedState(e)}}restoreDistributedClosedState(e){e.forEach(e=>{const t=this.stateAdapter.set(e,this.createInitialState());H(t)&&t.catch(t=>{this.handleAdapterError("set",e,t)})})}resolveScopeKey(e,t,s){const r=s?`${s}${t}`:t||"unknown";if("function"==typeof this.scope)try{const t=this.scope(e);return"string"==typeof t&&t.length>0?t:(this.logger.warn("CircuitBreakerPlugin: Custom scope callback returned an empty scope key; using default",{url:e.url}),r)}catch(t){return this.logger.warn("CircuitBreakerPlugin: Custom scope callback threw; using default scope",{error:t instanceof Error?t.message:t,url:e.url}),r}switch(this.scope){case z.HOST:return s||t||"unknown";case z.URL:return t||s||"unknown";default:return r}}normalizeUrl(e){let t=e.split("?")[0].split("#")[0];return t=t.replace(/\/([0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}|\d+)(\/|$)/gi,"/:id$2"),t}resolveScopeKeyPublic(e,t,s){return this.resolveScopeKey(e,t,s)}extractPath(e){const t=this.resolveUrl(e);return t?`${t.pathname}${t.search}${t.hash}`||"/":e.url||"/"}extractHost(e){var t;return null===(t=this.resolveUrl(e))||void 0===t?void 0:t.host}resolveUrl(e){var t,s;if(!e.url)return null;const r=null!==(t=e.baseURL)&&void 0!==t?t:null===(s=this.baseURLGetter)||void 0===s?void 0:s.call(this);if(!/^[a-z][a-z\d+\-.]*:\/\//i.test(e.url)&&!r)return null;try{return new URL(e.url,r)}catch(e){return null}}handleAdapterError(e,t,s){this.logger.warn(`CircuitBreakerPlugin: State adapter ${e} failed; continuing with local circuit state`,{scopeKey:t,error:s instanceof Error?s.message:s})}}const B={failureThreshold:5,openTimeout:3e4,halfOpenMax:1,successThreshold:1,useSlidingWindow:!1,slidingWindowSize:6e4,adaptiveTimeout:!1,adaptiveTimeoutPercentile:.95,adaptiveTimeoutSampleSize:100,adaptiveTimeoutMultiplier:1.5,maxTrackedScopes:500,excludeUrls:[]};class $ extends t{constructor(e,t,s,r,i){super(e,null!=r?r:"ECIRCUIT_BREAKER_STATE",s,void 0,i),this.name="CircuitBreakerStateError",this.circuitState=t,Object.setPrototypeOf(this,new.target.prototype)}}class W{constructor(e){this.options=e}rememberLast(e,t){var s;e.lastFailureStatus=null===(s=t.response)||void 0===s?void 0:s.status,e.lastFailureCode=t.code}add(e,t){var s,r;e.recentFailures.push({timestamp:Date.now(),url:(null===(s=t.config)||void 0===s?void 0:s.url)||"unknown",status:null===(r=t.response)||void 0===r?void 0:r.status,errorCode:t.code}),e.failureCount++,this.cleanup(e)}cleanup(e){if(!this.options.useSlidingWindow)return;const t=Date.now()-this.options.slidingWindowSize,s=e.recentFailures.length;e.recentFailures=e.recentFailures.filter(e=>e.timestamp>=t);const r=s-e.recentFailures.length;r>0&&(e.failureCount=Math.max(0,e.failureCount-r))}count(e){return this.options.useSlidingWindow?(this.cleanup(e),e.recentFailures.length):e.failureCount}countSince(e,t){return this.cleanup(e),e.recentFailures.filter(e=>e.timestamp>=t).length}}class Q{constructor(e={}){this.name="CircuitBreakerPlugin",this.version="2.0.0",this._metricBaselines=new Map,this._options=function(e={}){var t,s;const r={...B,...e,scope:null!==(t=e.scope)&&void 0!==t?t:z.HOST_AND_URL,stateAdapter:null!==(s=e.stateAdapter)&&void 0!==s?s:new U};return function(e){if(!Number.isInteger(e.failureThreshold)||e.failureThreshold<1)throw new d("failureThreshold must be a positive integer","failureThreshold",e.failureThreshold);if(!Number.isInteger(e.openTimeout)||e.openTimeout<0)throw new d("openTimeout must be a non-negative integer","openTimeout",e.openTimeout);if(!Number.isInteger(e.halfOpenMax)||e.halfOpenMax<1)throw new d("halfOpenMax must be a positive integer","halfOpenMax",e.halfOpenMax);if(void 0!==e.successThreshold&&(!Number.isInteger(e.successThreshold)||e.successThreshold<1))throw new d("successThreshold must be a positive integer","successThreshold",e.successThreshold);if(e.successThreshold>e.halfOpenMax&&(e.successThreshold=e.halfOpenMax),0===e.excludeUrls.length)return;const t=function(e){const t=[];for(let s=0;s<e.length;s++){const r=e[s];if(r instanceof RegExp)for(const e of O)if(e.test(r.source)){t.push({index:s,pattern:r,reason:`Potentially catastrophic backtracking detected (${e.name}): ${r}. Use a string for exact-match exclusions, or simplify the pattern to avoid nested quantifiers.`});break}}return t}(e.excludeUrls);if(0!==t.length)throw new d(t.map(e=>e.reason).join("\n"),"excludeUrls",t.map(e=>e.pattern))}(r),r}(e),this._adaptiveTimeoutTracker=new F({percentile:this._options.adaptiveTimeoutPercentile,sampleSize:this._options.adaptiveTimeoutSampleSize,multiplier:this._options.adaptiveTimeoutMultiplier,maxTrackedScopes:this._options.maxTrackedScopes}),this._scopeManager=new K({scope:this._options.scope,stateAdapter:this._options.stateAdapter,maxTrackedScopes:this._options.maxTrackedScopes}),this._failureWindow=new W({useSlidingWindow:this._options.useSlidingWindow,slidingWindowSize:this._options.slidingWindowSize})}get _responseMetrics(){return this._adaptiveTimeoutTracker.responseMetrics}get _scopeStateCache(){return this._scopeManager.scopeStateCache}get _knownScopes(){return this._scopeManager.knownScopes}_normalizeUrl(e){return this._scopeManager.normalizeUrl(e)}_resolveScopeKey(e,t,s){return this._scopeManager.resolveScopeKeyPublic(e,t,s)}_getScopeDetails(e){return this._scopeManager.getScopeDetails(e)}async _writeScopeState(e,t){return this._scopeManager.writeState(e,t)}initialize(e){this._context=e;const t=e.getLogger();this._scopeManager.setLogger(t),this._scopeManager.baseURLGetter=()=>e.axiosInstance.defaults.baseURL,t.debug("CircuitBreakerPlugin: Initializing with options:",{...this._options});const s=e.axiosInstance;this._requestInterceptorId=s.interceptors.request.use(async e=>{const s=o(e);if(this._options.adaptiveTimeout&&e.url&&!s.timestamp&&u(e,{timestamp:Date.now()}),this._isUrlExcluded(e))return t.debug(`CircuitBreakerPlugin: URL excluded from circuit breaking: ${e.url}`),e;const r=this._scopeManager.getScopeDetails(e),i=await this._scopeManager.withLock(r.scopeKey,async()=>{let e=await this._scopeManager.readState(r.scopeKey);if(e.state===D.OPEN){if(!(Date.now()>=e.nextAttempt))return{action:"reject-open",scopeState:e};e=await this._transitionToHalfOpen(r.scopeKey,e)}if(e.state===D.HALF_OPEN){if(e.halfOpenCount>=this._options.halfOpenMax)return{action:"reject-half-open",scopeState:e};e.halfOpenCount++,await this._scopeManager.writeState(r.scopeKey,e),t.debug(`CircuitBreakerPlugin: HALF_OPEN test request #${e.halfOpenCount} of ${this._options.halfOpenMax} for ${r.scopeKey}`)}return{action:"allow",scopeState:e}});if("reject-open"===i.action){const s=i.scopeState.nextAttempt-Date.now();return t.debug(`CircuitBreakerPlugin: Circuit is OPEN for ${r.scopeKey}: failing fast. Will retry in ${s}ms`),Promise.reject(this._createCircuitStateError(e,i.scopeState,"Circuit is open: failing fast."))}if("reject-half-open"===i.action)return t.debug(`CircuitBreakerPlugin: Circuit is HALF_OPEN for ${r.scopeKey}: too many test requests.`),Promise.reject(this._createCircuitStateError(e,i.scopeState,"Circuit is half-open: too many test requests."));if(this._options.adaptiveTimeout){const s=this._adaptiveTimeoutTracker.getComputedTimeout(r.scopeKey);void 0!==s&&(e.timeout=s,t.debug(`CircuitBreakerPlugin: Setting adaptive timeout for ${r.scopeKey}: ${s}ms`))}return e}),this._responseInterceptorId=s.interceptors.response.use(async e=>{if(this._options.adaptiveTimeout&&e.config.url){const t=this._scopeManager.getScopeDetails(e.config);this._adaptiveTimeoutTracker.trackResponseTime(e,t.scopeKey,t.normalizedUrl,t.host)}if(this._isUrlExcluded(e.config))return e;const s=this._scopeManager.getScopeDetails(e.config);return await this._scopeManager.withLock(s.scopeKey,async()=>{const e=await this._scopeManager.readState(s.scopeKey);if(e.state===D.HALF_OPEN){e.successCount++;const r=this._options.successThreshold||1;e.successCount>=r?(t.debug(`CircuitBreakerPlugin: HALF_OPEN success threshold reached (${e.successCount}/${r}) for ${s.scopeKey}`),await this._resetScope(s.scopeKey)):(await this._scopeManager.writeState(s.scopeKey,e),t.debug(`CircuitBreakerPlugin: HALF_OPEN success: ${e.successCount}/${r} successful test requests for ${s.scopeKey}`))}else e.state===D.CLOSED&&e.failureCount>0&&(e.failureCount=0,e.lastFailureStatus=void 0,e.lastFailureCode=void 0,await this._scopeManager.writeState(s.scopeKey,e))}),e},async e=>{if(!e.config)return Promise.reject(e);if(this._isUrlExcluded(e.config))return Promise.reject(e);if(!this._shouldCountError(e))return t.debug("CircuitBreakerPlugin: Error excluded from circuit breaking by shouldCountError"),Promise.reject(e);const s=this._scopeManager.getScopeDetails(e.config);return await this._scopeManager.withLock(s.scopeKey,async()=>{const r=await this._scopeManager.readState(s.scopeKey);if(this._failureWindow.rememberLast(r,e),this._options.useSlidingWindow){this._failureWindow.add(r,e);const i=this._failureWindow.count(r);i>=this._options.failureThreshold?(t.debug(`CircuitBreakerPlugin: Sliding window failure threshold reached for ${s.scopeKey}: ${i} failures in window`),await this._tripScope(s.scopeKey,r)):await this._scopeManager.writeState(s.scopeKey,r)}else r.failureCount++,t.debug(`CircuitBreakerPlugin: Failure count increased for ${s.scopeKey}: ${r.failureCount}/${this._options.failureThreshold}`),r.state===D.HALF_OPEN||r.failureCount>=this._options.failureThreshold?await this._tripScope(s.scopeKey,r):await this._scopeManager.writeState(s.scopeKey,r)}),Promise.reject(e)})}onBeforeDestroyed(e){e.getLogger().debug("CircuitBreakerPlugin: Removing CircuitBreakerPlugin");const t=e.axiosInstance;void 0!==this._requestInterceptorId&&t.interceptors.request.eject(this._requestInterceptorId),void 0!==this._responseInterceptorId&&t.interceptors.response.eject(this._responseInterceptorId)}getState(e){var t,s;if(e)return null!==(s=null===(t=this._scopeManager.scopeStateCache.get(e))||void 0===t?void 0:t.state)&&void 0!==s?s:D.CLOSED;const r=Array.from(this._scopeManager.scopeStateCache.values()).map(e=>e.state);return r.includes(D.OPEN)?D.OPEN:r.includes(D.HALF_OPEN)?D.HALF_OPEN:D.CLOSED}manualReset(e){var t,s;const r=this._scopeManager.getTrackedScopeKeys(e);if(r.forEach(e=>{var t,s;const r=null!==(s=null===(t=this._scopeManager.scopeStateCache.get(e))||void 0===t?void 0:t.state)&&void 0!==s?s:D.CLOSED;this._scopeManager.scopeStateCache.set(e,this._scopeManager.createInitialState()),this._metricBaselines.delete(e),r!==D.CLOSED&&this._emitStateChange(e,r,D.CLOSED,"manual-reset")}),e)return this._scopeManager.deleteDistributedScope(e),void(null===(t=this._context)||void 0===t||t.getLogger().debug(`CircuitBreakerPlugin: Circuit reset for ${e}`));this._scopeManager.clearDistributedState(r),null===(s=this._context)||void 0===s||s.getLogger().debug("CircuitBreakerPlugin: Circuit reset: entering CLOSED state")}_reset(e){this.manualReset(e)}_trackResponseTime(e){if(!e.config.url||!this._options.adaptiveTimeout)return;const t=this._scopeManager.getScopeDetails(e.config);this._adaptiveTimeoutTracker.trackResponseTime(e,t.scopeKey,t.normalizedUrl,t.host)}resetMetrics(){var e;const t=Date.now();this._metricBaselines.clear(),this._scopeManager.getTrackedScopeKeys().forEach(e=>{var s;const r=null!==(s=this._scopeManager.scopeStateCache.get(e))&&void 0!==s?s:this._scopeManager.createInitialState();this._metricBaselines.set(e,{failureCount:r.failureCount,successCount:r.successCount,halfOpenCount:r.halfOpenCount,resetAt:t})}),this._adaptiveTimeoutTracker.reset(),null===(e=this._context)||void 0===e||e.getLogger().debug("CircuitBreakerPlugin: Circuit metrics reset.")}getAdaptiveTimeoutMetrics(){return this._options.adaptiveTimeout?this._adaptiveTimeoutTracker.getAdaptiveTimeoutMetrics():[]}getMetrics(){const e=this._getScopeMetrics();return{state:this.getState(),failureCount:e.reduce((e,t)=>e+t.failureCount,0),halfOpenCount:e.reduce((e,t)=>e+t.halfOpenCount,0),successCount:e.reduce((e,t)=>e+t.successCount,0),nextAttemptIn:e.reduce((e,t)=>Math.max(e,t.nextAttemptIn),0),failuresInWindow:e.reduce((e,t)=>e+t.failuresInWindow,0),adaptiveTimeouts:this.getAdaptiveTimeoutMetrics(),scopeMetrics:e}}async _tripScope(e,t){var s;if(t.state!==D.OPEN){const r=t.state;t.state=D.OPEN,t.nextAttempt=Date.now()+this._options.openTimeout,t.successCount=0,t.halfOpenCount=0,await this._scopeManager.writeState(e,t),this._emitStateChange(e,r,D.OPEN,r===D.HALF_OPEN?"half-open-failure":"failure-threshold",Math.max(0,t.nextAttempt-Date.now())),null===(s=this._context)||void 0===s||s.getLogger().error(`CircuitBreakerPlugin: Circuit tripped: entering OPEN state for ${e} until ${new Date(t.nextAttempt).toISOString()}`)}}async _resetScope(e){var t,s,r;const i=null!==(s=null===(t=this._scopeManager.scopeStateCache.get(e))||void 0===t?void 0:t.state)&&void 0!==s?s:D.CLOSED;await this._scopeManager.writeState(e,this._scopeManager.createInitialState()),i!==D.CLOSED&&this._emitStateChange(e,i,D.CLOSED,"success-threshold-reached"),null===(r=this._context)||void 0===r||r.getLogger().debug(`CircuitBreakerPlugin: Circuit reset: entering CLOSED state for ${e}.`)}async _transitionToHalfOpen(e,t){var s;const r=t.state;return t.state=D.HALF_OPEN,t.halfOpenCount=0,t.successCount=0,await this._scopeManager.writeState(e,t),this._emitStateChange(e,r,D.HALF_OPEN,"open-timeout-elapsed"),null===(s=this._context)||void 0===s||s.getLogger().debug(`CircuitBreakerPlugin: Transitioning to HALF_OPEN for ${e}.`),t}_emitStateChange(e,t,s,r,i){var n,o;t!==s&&(null===(o=null===(n=this._context)||void 0===n?void 0:n.triggerAndEmit)||void 0===o||o.call(n,"onCircuitStateChanged",{scopeKey:e,from:t,to:s,reason:r,...void 0!==i?{nextAttemptIn:i}:{}}))}_shouldCountError(e){var t;if(!this._options.shouldCountError)return!0;try{return this._options.shouldCountError(e)}catch(e){return null===(t=this._context)||void 0===t||t.getLogger().warn("CircuitBreakerPlugin: shouldCountError callback threw; counting error by default",{error:e instanceof Error?e.message:e}),!0}}_isUrlExcluded(e){return!(!e.url||!this._options.excludeUrls||0===this._options.excludeUrls.length)&&this._options.excludeUrls.some(t=>t instanceof RegExp?t.test(e.url||""):e.url===t)}_createCircuitStateError(e,t,s){const r={...e};return u(r,{requestRetries:0}),new $(s,t.state,r,t.lastFailureCode,void 0!==t.lastFailureStatus?{status:t.lastFailureStatus,statusText:"Circuit Open",config:r,headers:{},data:{error:s}}:void 0)}_getScopeMetrics(){const e=Date.now();return Array.from(this._scopeManager.getKnownScopes()).map(t=>{var s;const r=null!==(s=this._scopeManager.scopeStateCache.get(t.scopeKey))&&void 0!==s?s:this._scopeManager.createInitialState();return{scopeKey:t.scopeKey,url:t.normalizedUrl,host:t.host,state:r.state,failureCount:this._getVisibleCounter(t.scopeKey,"failureCount",r.failureCount),halfOpenCount:this._getVisibleCounter(t.scopeKey,"halfOpenCount",r.halfOpenCount),successCount:this._getVisibleCounter(t.scopeKey,"successCount",r.successCount),nextAttemptIn:Math.max(0,r.nextAttempt-e),failuresInWindow:this._getVisibleFailuresInWindow(t.scopeKey,r)}})}_getVisibleCounter(e,t,s){var r;const i=this._metricBaselines.get(e);return Math.max(0,s-(null!==(r=null==i?void 0:i[t])&&void 0!==r?r:0))}_getVisibleFailuresInWindow(e,t){var s,r;if(!this._options.useSlidingWindow)return this._getVisibleCounter(e,"failureCount",t.failureCount);const i=null!==(r=null===(s=this._metricBaselines.get(e))||void 0===s?void 0:s.resetAt)&&void 0!==r?r:0;return this._failureWindow.countSince(t,i)}}function V(e={}){return new Q(e)}Q.STATES=D;const J=["authorization","x-api-key","api-key","apikey","password","x-auth-token","token","refresh-token","x-refresh-token","secret","x-api-secret","client-secret","x-client-secret","access-token","api-token"],G=["password","token","accessToken","access_token","refreshToken","refresh_token","secret","apiKey","api_key","apiSecret","api_secret","clientSecret","client_secret","credentials","credential","private_key","privateKey"],X={sensitiveHeaders:[],sensitiveFields:[],redactionChar:"*",sanitizeRequestData:!0,sanitizeResponseData:!0,sanitizeUrlParams:!0,allowedFields:[],allowlistOnly:!0},Y=e=>e.repeat(8),Z=new Map;function ee(e){return Array.from(new Set(e.map(e=>e.trim().toLowerCase()).filter(Boolean))).sort()}function te(e){const t=ee([...G,...e.sensitiveFields]),s=ee([...J,...e.sensitiveHeaders]),r=ee(e.allowedFields),i=[t.join("|"),s.join("|"),r.join("|")].join("::"),n=Z.get(i);if(n)return n;const o={sensitiveFields:t,sensitiveFieldsSet:new Set(t),sensitiveHeaders:s,sensitiveHeadersSet:new Set(s),allowedFieldsSet:new Set(r)};return Z.set(i,o),o}function se(e,t){return t.has(e.toLowerCase())}function re(e,t,s){const r=e.toLowerCase();if(t.has(r))return!0;for(const e of s)if(r.includes(e))return!0;return!1}function ie(e,t={}){if(!e)return e;const s={...X,...t},r=te(s),i=Y(s.redactionChar),n=new WeakMap,o=(e,t)=>{if(null==e)return e;if("object"!=typeof e)return s.allowlistOnly?t&&se(t,r.allowedFieldsSet)?e:i:e;if(e instanceof Date)return!s.allowlistOnly||t&&se(t,r.allowedFieldsSet)?new Date(e.getTime()):i;const a=n.get(e);if(a)return a;if(Array.isArray(e)){const t=[];return n.set(e,t),e.forEach((e,s)=>{t[s]=o(e)}),t}const c={};return n.set(e,c),Object.keys(e).forEach(t=>{const n=e[t];c[t]=re(t,r.sensitiveFieldsSet,r.sensitiveFields)?i:n&&"object"==typeof n?o(n,t):!s.allowlistOnly||se(t,r.allowedFieldsSet)?n:i}),c};return o(e)}function ne(e,t={}){if(!e)return e;const s={...X,...t},r=te(s),i=Y(s.redactionChar),n={...e};for(const e of Object.keys(n)){const t=e.toLowerCase();(r.sensitiveHeadersSet.has(t)||r.sensitiveHeaders.some(e=>t.includes(e)))&&(n[e]=i)}return n}function oe(e,t={}){if(!e)return e;const s={...X,...t};if(!s.sanitizeUrlParams)return e;const r=te(s),i=Y(s.redactionChar);try{if(!e.includes("?"))return e;const t=e.indexOf("#"),s=-1===t?"":e.slice(t),n=-1===t?e:e.slice(0,t),o=n.indexOf("?");if(-1===o)return e;const a=n.slice(0,o),c=n.slice(o+1);if(!c)return e;const u=new URLSearchParams(c);let l=!1;const h=new Set;return u.forEach((e,t)=>{h.add(t)}),h.forEach(e=>{re(e,r.sensitiveFieldsSet,r.sensitiveFields)&&(u.set(e,i),l=!0)}),l?`${a}?${u.toString()}${s}`:e}catch{return e}}class ae{constructor(e={}){this.name="DebugSanitizationPlugin",this.version="1.0.0",this.interceptorIdReq=null,this.interceptorIdRes=null,this.sanitizeOptions=function(e={}){var t;return null!==(t=e.sanitizeOptions)&&void 0!==t?t:{}}(e)}initialize(e){this.context=e,this.interceptorIdReq=e.axiosInstance.interceptors.request.use(e=>(this.logSanitizedRequest(e),e)),this.interceptorIdRes=e.axiosInstance.interceptors.response.use(void 0,e=>(e.config&&this.logSanitizedError(e.config,e),Promise.reject(e)))}onBeforeDestroyed(e){null!==this.interceptorIdReq&&e.axiosInstance.interceptors.request.eject(this.interceptorIdReq),null!==this.interceptorIdRes&&e.axiosInstance.interceptors.response.eject(this.interceptorIdRes)}logSanitizedRequest(e){var t,s;const r=a(e);null===(t=this.context.getLogger())||void 0===t||t.debug("[DebugSanitizationPlugin] Sanitized request",{requestId:null==r?void 0:r.requestId,url:oe(e.url||"",this.sanitizeOptions),method:null===(s=e.method)||void 0===s?void 0:s.toUpperCase(),headers:ne(e.headers,this.sanitizeOptions),priority:null==r?void 0:r.priority})}logSanitizedError(e,t){var s,r,i,n;const o=a(e);null===(s=this.context.getLogger())||void 0===s||s.debug("[DebugSanitizationPlugin] Sanitized error",{requestId:null==o?void 0:o.requestId,url:oe(e.url||"",this.sanitizeOptions),method:null===(r=e.method)||void 0===r?void 0:r.toUpperCase(),status:null===(i=t.response)||void 0===i?void 0:i.status,statusText:null===(n=t.response)||void 0===n?void 0:n.statusText,code:t.code,message:t.message,headers:ne(e.headers,this.sanitizeOptions),data:!1!==this.sanitizeOptions.sanitizeRequestData?ie(e.data,this.sanitizeOptions):void 0,response:t.response?{data:!1!==this.sanitizeOptions.sanitizeResponseData?ie(t.response.data,this.sanitizeOptions):void 0,headers:ne(t.response.headers,this.sanitizeOptions)}:void 0})}}function ce(e){return new ae(e)}class ue{constructor(e=200,t){this.maxStoreSize=e,this.emit=t,this.requests=[]}add(e){if(o(e),this.requests.push(e),this.requests.length>this.maxStoreSize){const e=this.requests.shift();e&&this.emit("onRequestRemovedFromStore",e)}}remove(e){var t;const s=null===(t=a(e))||void 0===t?void 0:t.requestId;this.requests=this.requests.filter(e=>{var t;return(null===(t=a(e))||void 0===t?void 0:t.requestId)!==s})}getAll(){return this.requests.slice()}clear(){this.requests=[]}}const le={maxRequestsToStore:200,manualRetryMaxAge:3e5,storeNonIdempotent:!1,storeAuthRequests:!1},he=new Set(["get","head","options"]),de=["authorization","proxy-authorization","cookie","set-cookie","x-auth-token","x-api-key","api-key","apikey","token","refresh-token","x-refresh-token","x-csrf-token","x-xsrf-token"],pe=new Set(de);class fe{constructor(e={}){this.name="ManualRetryPlugin",this.version="1.0.0";const t=function(e={}){return{...le,...e}}(e);this.maxRequestsToStore=t.maxRequestsToStore,this.maxAge=t.manualRetryMaxAge,this.storeNonIdempotent=t.storeNonIdempotent,this.storeAuthRequests=t.storeAuthRequests,this.beforeRetryCallback=t.beforeRetry,this.prepareRequestForStoreCallback=t.prepareRequestForStore,this.rehydrateAuthCallback=t.rehydrateAuth,this.customStore=t.requestStore}initialize(e){var t;this.context=e,this.store=null!==(t=this.customStore)&&void 0!==t?t:new ue(this.maxRequestsToStore,e.triggerAndEmit),this.onFailureHandler=e=>{const t=this.prepareStoredRequest(e);t&&this.store.add(t)},e.on("onFailure",this.onFailureHandler)}onBeforeDestroyed(e){var t;e.off("onFailure",this.onFailureHandler),null===(t=this.store)||void 0===t||t.clear()}async retryFailedRequests(){var e,t,s,r,i;const n=this.store.getAll();this.store.clear();const o=Date.now(),u=n.filter(e=>{var t,s,r;const i=o-((null===(t=a(e))||void 0===t?void 0:t.timestamp)||0);return!(i>this.maxAge&&(null===(s=this.context.getLogger())||void 0===s||s.debug("[ManualRetryPlugin] Discarding expired stored request",{requestId:null===(r=a(e))||void 0===r?void 0:r.requestId,ageMs:i,maxAgeMs:this.maxAge}),1))});if(0===u.length)return[];null===(e=this.context.getLogger())||void 0===e||e.debug("[ManualRetryPlugin] Starting manual retry process",{count:u.length,discarded:n.length-u.length}),this.context.triggerAndEmit("onManualRetryProcessStarted");const l=[];for(let e=0;e<u.length;e++){const n=u[e],o=this.beforeRetryCallback?this.beforeRetryCallback(n):n;if(!o){null===(t=this.context.getLogger())||void 0===t||t.debug("[ManualRetryPlugin] Request skipped by beforeRetry callback",{requestId:null===(s=a(n))||void 0===s?void 0:s.requestId});continue}if(this.rehydrateAuthCallback){if(!this.rehydrateAuthCallback(o)){null===(r=this.context.getLogger())||void 0===r||r.debug("[ManualRetryPlugin] Request skipped by rehydrateAuth callback",{requestId:null===(i=a(n))||void 0===i?void 0:i.requestId});continue}}else this.neutralizeDefaultAuthHeaders(o);delete o.signal,c(o,"retryAttempt",0),c(o,"isRetrying",!1),c(o,"manualReplayAttempt",!0),e>0&&await new Promise(t=>setTimeout(t,Math.min(200*e,2e3)));const h=await this.context.axiosInstance.request(o);l.push(h)}return l}getStoredRequests(){return this.store.getAll()}clearStoredRequests(){this.store.clear()}isEligible(e){return function(e,t){if(t)return!0;const s=(e.method||"get").toLowerCase();return!!he.has(s)||function(e){var t;const s="Idempotency-Key".toLowerCase();return Object.keys(null!==(t=e.headers)&&void 0!==t?t:{}).some(e=>e.toLowerCase()===s)}(e)}(e,this.storeNonIdempotent)}prepareStoredRequest(e){var t,s,r,i,n,o,c;if(null===(t=a(e))||void 0===t?void 0:t.manualReplayAttempt)return null===(s=this.context.getLogger())||void 0===s||s.debug("[ManualRetryPlugin] Skipping replay failure to avoid re-storing it",{requestId:null===(r=a(e))||void 0===r?void 0:r.requestId}),null;if(!this.isEligible(e))return null;if(function(e){var t;return!!e.auth||Object.keys(null!==(t=e.headers)&&void 0!==t?t:{}).some(e=>pe.has(e.toLowerCase()))}(e)&&!this.storeAuthRequests)return null===(i=this.context.getLogger())||void 0===i||i.debug("[ManualRetryPlugin] Skipping storage for auth-bearing request",{requestId:null===(n=a(e))||void 0===n?void 0:n.requestId}),null;const u=function(e){const t={...e,data:T(e.data),headers:e.headers?{...e.headers}:{},params:T(e.params)};return function(e){if(e.headers){for(const t of Object.keys(e.headers))pe.has(t.toLowerCase())&&delete e.headers[t];delete e.auth}}(t),t}(e);if(!this.prepareRequestForStoreCallback)return u;const l=this.prepareRequestForStoreCallback(u);return l||null===(o=this.context.getLogger())||void 0===o||o.debug("[ManualRetryPlugin] Request skipped by prepareRequestForStore",{requestId:null===(c=a(e))||void 0===c?void 0:c.requestId}),l}neutralizeDefaultAuthHeaders(e){const t=this.context.axiosInstance.defaults;!function(e,t,s){var r;const i=null!==(r=null==t?void 0:t.common)&&void 0!==r?r:{};e.headers=e.headers||{};for(const s of de){const r=s.toLowerCase(),n=Object.keys(i).some(e=>e.toLowerCase()===r),o=!!t&&Object.keys(t).some(e=>e.toLowerCase()===r);(n||o)&&(e.headers[s]=void 0)}s&&(e.auth=void 0)}(e,t.headers,Boolean(t.auth))}}function ge(e){return new fe(e)}const me={activeTimers:0,activeRetryTimers:0},ye={total:0,successes:0,failures:0};class ve{constructor(e){this.getMetricsState=e,this.queueWaitHistory=[],this.retryDelayHistory=[]}recordRequestStart(e){var t;const s=this.getMetricsState();s.totalRequests++,s.requestCountsByPriority[e]=(null!==(t=s.requestCountsByPriority[e])&&void 0!==t?t:0)+1}recordQueueWait(e){this.getMetricsState().queueWaitDuration+=e,this.recordDuration(this.queueWaitHistory,e)}recordRetrySuccess(e){this.getMetricsState().successfulRetries++,this.getPriorityMetrics(e).successes++}recordRetryFailure(e,t){const s=this.getMetricsState();s.failedRetries++,t.response?t.response.status>=500?s.errorTypes.server5xx++:t.response.status>=400&&s.errorTy