@stackone/transport 1.10.0 → 1.11.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.mts CHANGED
@@ -509,15 +509,15 @@ declare const buildHttpClientInstance: <TError extends Error = Error>(redisClien
509
509
  declare class HttpClientManager {
510
510
  private static httpClientInstance;
511
511
  static getInstance<TError extends Error = Error>({
512
- getHttpClient,
513
512
  redisClientConfig,
514
513
  logger,
515
- errorMappingFn
514
+ errorMappingFn,
515
+ getHttpClient
516
516
  }: {
517
- getHttpClient: typeof buildHttpClientInstance;
518
517
  redisClientConfig: RedisClientConfig;
519
518
  logger?: ILogger;
520
519
  errorMappingFn?: ErrorMappingFn<TError>;
520
+ getHttpClient?: typeof buildHttpClientInstance;
521
521
  }): Promise<IHttpClient>;
522
522
  static resetInstance(): void;
523
523
  }
package/dist/index.d.ts CHANGED
@@ -509,15 +509,15 @@ declare const buildHttpClientInstance: <TError extends Error = Error>(redisClien
509
509
  declare class HttpClientManager {
510
510
  private static httpClientInstance;
511
511
  static getInstance<TError extends Error = Error>({
512
- getHttpClient,
513
512
  redisClientConfig,
514
513
  logger,
515
- errorMappingFn
514
+ errorMappingFn,
515
+ getHttpClient
516
516
  }: {
517
- getHttpClient: typeof buildHttpClientInstance;
518
517
  redisClientConfig: RedisClientConfig;
519
518
  logger?: ILogger;
520
519
  errorMappingFn?: ErrorMappingFn<TError>;
520
+ getHttpClient?: typeof buildHttpClientInstance;
521
521
  }): Promise<IHttpClient>;
522
522
  static resetInstance(): void;
523
523
  }
package/dist/index.js CHANGED
@@ -290,4 +290,4 @@ var $c=9e15,el=1e9,tl=`0123456789abcdef`,nl=`2.302585092994045684017991454684364
290
290
  ${r}
291
291
  ${e}
292
292
  return o
293
- `}}),af=o((exports,t)=>{t.exports=n;function n(e){let{secret:t,censor:n,compileRestore:r,serialize:i,groupRedact:a,nestedRedact:o,wildcards:s,wcLen:c}=e,l=[{secret:t,censor:n,compileRestore:r}];return i!==!1&&l.push({serialize:i}),c>0&&l.push({groupRedact:a,nestedRedact:o,wildcards:s,wcLen:c}),Object.assign(...l)}}),sf=o((exports,t)=>{let n=Qd(),r=ef(),i=tf(),a=rf(),{groupRedact:o,nestedRedact:s}=nf(),c=af(),l=$d(),u=n(),d=e=>e;d.restore=d;let f=`[REDACTED]`;p.rx=l,p.validator=n,t.exports=p;function p(e={}){let t=Array.from(new Set(e.paths||[])),n=`serialize`in e&&(e.serialize===!1||typeof e.serialize==`function`)?e.serialize:JSON.stringify,l=e.remove;if(l===!0&&n!==JSON.stringify)throw Error(`fast-redact – remove option may only be set when serializer is JSON.stringify`);let p=l===!0?void 0:`censor`in e?e.censor:f,m=typeof p==`function`,h=m&&p.length>1;if(t.length===0)return n||d;u({paths:t,serialize:n,censor:p});let{wildcards:g,wcLen:_,secret:v}=r({paths:t,censor:p}),y=a(),b=`strict`in e?e.strict:!0;return i({secret:v,wcLen:_,serialize:n,strict:b,isCensorFct:m,censorFctTakesPath:h},c({secret:v,censor:p,compileRestore:y,serialize:n,groupRedact:o,nestedRedact:s,wildcards:g,wcLen:_}))}}),cf=c(sf(),1);const lf=[`client_secret`,`access_token`,`refresh_token`,`api_key`,`password`,`job_board_token`,`private_key`,`certificate`,`service_user_token`,`key_id`,`secret_key`,`provhash`,`admin_key`,`session_key`,`id_token`,`authorization`,`bh_rest_token`,`external_trigger_token`,`tempauth`],uf=[`req.headers.authorization`,`req.headers.cookie`,`req.headers.cookies`,`req.headers["set-cookie"]`,`req.headers["set-cookies"]`,`req.headers.httpsAgent.options.cert`,`req.headers.httpsAgent.options.key`,`req.headers["x-stackone-external-trigger-token"]`,`error.config.headers.authorization`,`error.config.data`,`error.config.headers.cookie`,`error.config.headers.cookies`,`error.config.headers["set-cookie"]`,`error.config.headers["set-cookies"]`,`error.config.httpsAgent.options.cert`,`error.config.httpsAgent.options.key`,`err.config.headers.authorization`,`err.config.data`,`err.config.headers.cookie`,`err.config.headers.cookies`,`err.config.headers["set-cookie"]`,`err.config.headers["set-cookies"]`,`err.config.httpsAgent.options.cert`,`err.config.httpsAgent.options.key`,`res.headers.authorization`,`res.headers.cookie`,`res.headers.cookies`,`res.headers["set-cookie"]`,`res.headers["set-cookies"]`,`res.headers.httpsAgent.options.cert`,`res.headers.httpsAgent.options.key`,`context.credentials`,...lf],df=`**redacted**`;let ff=function(e){return e.FULL=`FULL`,e.PARTIAL=`PARTIAL`,e}({});const pf=e=>df,mf=e=>typeof e==`string`?e.startsWith(df)?e:e.length<10?df:`${df}${e.slice(-5)}`:df,hf=(e=[],t=!0)=>{if(!t)return[];let n=e.map(e=>_f(e));return[...e,...n]},gf=(e=[],t=!0)=>{if(!t)return[];let n=new Set;return e.forEach(e=>{if(n.add(e),e.includes(`_`)){let t=e.replace(/_([a-z])/g,(e,t)=>t.toUpperCase());n.add(t)}else{let t=e.replace(/([A-Z])/g,`_$1`).toLowerCase();n.add(t)}}),Array.from(n)},_f=e=>{let t=yf(e);return t||vf(e)},vf=e=>{let t=e.split(`.`);if(t.length<2)return bf(e);let n=t.pop()??``,r=bf(n);return[...t,r].join(`.`)},yf=e=>{let t=e.lastIndexOf(`[`),n=e.indexOf(`]`,t);if(t===-1||n===-1)return;let r=e.slice(t,n+1),i=r.replace(/(["'])([^"']*)(["'])/g,(e,t,n)=>n?t+bf(n)+t:t+t);return`${e.slice(0,t)}${i}${e.slice(n+1)}`},bf=e=>`${e.charAt(0).toUpperCase()}${e.slice(1)}`,xf=hf(uf),Sf=gf(lf),Cf={[ff.FULL]:pf,[ff.PARTIAL]:mf},wf={[ff.FULL]:(0,cf.default)({paths:xf,serialize:!1,censor:Cf[ff.FULL]}),[ff.PARTIAL]:(0,cf.default)({paths:xf,serialize:!1,censor:Cf[ff.PARTIAL]})},Tf=(e,t=ff.FULL)=>(0,l.isMissing)(e)||typeof e!=`object`||!e?e:wf[t]((0,l.deepCopy)(e)),Ef=(e,t=ff.FULL,n)=>{if(!(0,l.isMissing)(e))try{let n=new URL(e),r=[...n.searchParams].reduce((e,[n,r])=>{let i=n.toLowerCase();return e.set(n,Sf.some(e=>e.toLowerCase()===i)?Cf[t](r):r),e},new URLSearchParams);return`${n.origin}${n.pathname}${r.toString()?`?`+r:``}${n.hash}`}catch(t){return n?.warning({message:`Invalid URL provided, unable to redact`,context:{value:e,error:t},category:`redactUrl`}),e}},Df=(e,t=ff.FULL,n)=>{if(!(0,l.isMissing)(e))try{let[n,r]=e.split(`?`);if(!r)return e;let i=[...new URLSearchParams(r)].reduce((e,[n,r])=>{let i=n.toLowerCase();return e.set(n,Sf.some(e=>e.toLowerCase()===i)?Cf[t](r):r),e},new URLSearchParams);return`${n}?${i}`}catch(t){return n?.warning({message:`Invalid path provided, unable to redact`,context:{value:e,error:t},category:`redactPath`}),e}},Of=(e,t=ff.FULL)=>{if(!(0,l.isMissing)(e))return typeof e==`string`?Cf[t](e):Object.entries(e).reduce((e,[n,r])=>(e[n]=Sf.some(e=>e.toLowerCase()===n.toLowerCase())?Cf[t](r):r,e),{})};var kf=class e{#transportFactory;#getRedisClient;#logger;#redisClientConfig;#errorMappingFn;#redisClient;constructor({transportFactory:e=Jd,getRedisClient:t=ce,logger:n,redisClientConfig:r,errorMappingFn:i}={}){this.#transportFactory=e,this.#getRedisClient=t,this.#logger=n,this.#redisClientConfig=r,this.#errorMappingFn=i}#generateCacheKey({url:e,payload:t,method:n,context:r}){let i=20;if(!r?.accountSecureId||r.accountSecureId.length<i||!e||!n)return null;let a=t?(0,l.getContentHash)(t):``;return`${r.accountSecureId}-${n.toUpperCase()}${a}-${e}`}async#getCachedResponse({url:t,payload:n,method:r,cacheTTL:i,context:a}){if(!this.#redisClient||!i||i<=0)return null;let o=this.#generateCacheKey({url:t,payload:n,method:r,context:a});if(!o)return null;let s=await this.#redisClient.getData(o);return s?(this.#logger?.debug({category:e.name,message:`Cache hit for key [${o}].`}),s):(this.#logger?.debug({category:e.name,message:`Cache miss for key [${o}].`}),null)}async#cacheResponse({url:t,payload:n,method:r,cacheTTL:i,context:a,response:o}){if(!this.#redisClient||!i||i<=0)return!1;let s=this.#generateCacheKey({url:t,payload:n,method:r,context:a});return s?(this.#logger?.debug({category:e.name,message:`Caching result for key [${s}].`}),this.#redisClient.setData({key:s,value:o,cacheTTL:i*60})):!1}async request({headers:t={},url:n,method:r=`get`,maxRedirects:i=0,responseType:a,cacheTTL:o,context:s,traceId:c,payload:u,httpsAgent:d,httpAgent:f}){try{(0,l.notMissing)(this.#redisClientConfig)&&(0,l.isMissing)(this.#redisClient)&&(this.#redisClient=await this.#getRedisClient(this.#redisClientConfig,this.#logger));let e=this.#normalizeHeaders(t),p=await this.#getCachedResponse({url:n,payload:u,method:r,cacheTTL:o,context:s});if(p)return{...p,responseTime:new Date};let m=ho.getInstance(),h=(0,l.notMissing)(c)?await m.get(c):null,g=h?.signal,_=await this.#transportFactory({redisClientConfig:this.#redisClientConfig,logger:this.#logger,context:s}),v=await _.request({headers:e,url:n,method:r,maxRedirects:i,responseType:a,data:this.#getSafePayload(u,e),httpsAgent:d,httpAgent:f,signal:g}),y={data:v.data,status:v.status,body:u,method:r,headers:this.#extractAxiosHeaders(v.headers),requestUrl:n,responseType:v?.config?.responseType,responseTime:new Date};return await this.#cacheResponse({url:n,payload:u,method:r,cacheTTL:o,context:s,response:y}),y}catch(t){let i=t;i.url=Ef(n),this.#logger?.warning({category:e.name,message:`Request error [${r?.toUpperCase()} ${i.url}]: ${i.message}.`,error:i});let a=this.#mapErrorToHttpException(i);throw(0,l.notMissing)(a)?a:t}}async get({headers:e,url:t,maxRedirects:n,cacheTTL:r,context:i,traceId:a}){return this.request({url:t,method:`get`,headers:e,maxRedirects:n,cacheTTL:r,context:i,traceId:a})}async post({headers:e,url:t,maxRedirects:n,cacheTTL:r,context:i,traceId:a,payload:o}){return this.request({url:t,method:`post`,headers:e,maxRedirects:n,cacheTTL:r,context:i,traceId:a,payload:o})}#normalizeHeaders(e){if(!e)return{};let t={};return Object.keys(e).forEach(n=>{t[n.toLowerCase()]=e[n]||``}),t}#extractAxiosHeaders(e){if(!e)return{};let t={};return Object.keys(e).forEach(n=>{t[n]=e[n]||``}),t}#isFormUrlEncoded(e){return e[`content-type`]===`application/x-www-form-urlencoded`}#getSafePayload(e,t){if(e)return this.#isFormUrlEncoded(t)?g.default.stringify(e):e}#mapErrorToHttpException(e){if((0,d.isAxiosError)(e)&&this.#errorMappingFn)return this.#errorMappingFn(e)}};const Af=(e,t,n)=>new kf({redisClientConfig:e,logger:t,errorMappingFn:n});var jf=class{static httpClientInstance=null;static async getInstance({getHttpClient:e=Af,redisClientConfig:t,logger:n,errorMappingFn:r}){return this.httpClientInstance??=e(t,n,r),this.httpClientInstance}static resetInstance(){this.httpClientInstance=null}};const Mf=[`get`,`post`,`put`,`delete`,`patch`],Nf=e=>e.reduce((e,t)=>(Array.isArray(e[t.in][t.name])?e[t.in][t.name]=e[t.in][t.name].concat(t.value):typeof e[t.in][t.name]==`object`&&typeof t.value==`object`?e[t.in][t.name]={...e[t.in][t.name],...t.value}:e[t.in][t.name]=t.in===`body`?t.value:String(t.value),e),{query:{},body:{},headers:{}}),Pf=[`query`,`body`,`headers`],Ff=(e,t)=>{if((0,l.isMissing)(t)||t?.length===0||(0,l.isMissing)(e))return{data:e.data,status:e.status,headers:e.headers,requestUrl:e.requestUrl,responseType:e.responseType,responseTime:e.responseTime,message:e.message};let n=t?.filter(t=>t.receivedStatus===e.status);if(n?.length)for(let t of n){let n=t.condition,r=(0,_.safeEvaluate)(n,e)===!0;if((0,l.isMissing)(n)||r)return{data:e.data,headers:e.headers,requestUrl:e.requestUrl,responseType:e.responseType,responseTime:e.responseTime,status:t.targetStatus,message:t?.message??uo[t.targetStatus]??`Unknown error`}}return e},If=e=>(0,l.notMissing)(e)&&e>=200&&e<=299,Lf=e=>(0,l.notMissing)(e)&&e>=400&&e<=599,Rf=e=>(0,l.notMissing)(e)&&e>=100&&e<=199;var zf=class{async performRequest({httpClient:e,url:t,method:n,headers:r,body:i,customErrorConfigs:a}){let o;try{o=await e?.request({method:n,url:t,headers:r,maxRedirects:0,payload:i})}catch(e){if((0,l.isMissing)(e?.response))throw e;o=e.response}let s=Ff(o,a);if(Lf(s?.status))throw new fo(s,s.message);return s}},Bf=class{static build(e=`rest`){if(e===`rest`)return new zf;throw Error(`Unknown request client type: ${e}`)}};exports.CUSTOM_ERROR_CONFIG_SCHEMA=lo,exports.ConcurrencyManager=Ge,exports.EventClient=se,exports.HttpClient=kf,exports.HttpClientManager=jf,exports.HttpErrorMessages=uo,exports.HttpMethods=Mf,exports.HttpResponseError=fo,exports.HttpTransportFactory=po,exports.InstanceManager=ho,exports.LockManager=x,exports.MemoryStore=O,exports.QueueManager=Te,exports.RateLimitManager=ko,exports.RedisClient=le,exports.RequestClientFactory=Bf,exports.RequestParameterLocations=Pf,exports.ScriptManager=pe,exports.SubscriptionManager=me,exports.buildHttpClientInstance=Af,exports.createAuthorizationHeaders=v,exports.getTransportInstance=Jd,exports.isFailedStatusCode=Lf,exports.isInfoStatusCode=Rf,exports.isSuccessStatusCode=If,exports.parseRequestParameters=Nf;
293
+ `}}),af=o((exports,t)=>{t.exports=n;function n(e){let{secret:t,censor:n,compileRestore:r,serialize:i,groupRedact:a,nestedRedact:o,wildcards:s,wcLen:c}=e,l=[{secret:t,censor:n,compileRestore:r}];return i!==!1&&l.push({serialize:i}),c>0&&l.push({groupRedact:a,nestedRedact:o,wildcards:s,wcLen:c}),Object.assign(...l)}}),sf=o((exports,t)=>{let n=Qd(),r=ef(),i=tf(),a=rf(),{groupRedact:o,nestedRedact:s}=nf(),c=af(),l=$d(),u=n(),d=e=>e;d.restore=d;let f=`[REDACTED]`;p.rx=l,p.validator=n,t.exports=p;function p(e={}){let t=Array.from(new Set(e.paths||[])),n=`serialize`in e&&(e.serialize===!1||typeof e.serialize==`function`)?e.serialize:JSON.stringify,l=e.remove;if(l===!0&&n!==JSON.stringify)throw Error(`fast-redact – remove option may only be set when serializer is JSON.stringify`);let p=l===!0?void 0:`censor`in e?e.censor:f,m=typeof p==`function`,h=m&&p.length>1;if(t.length===0)return n||d;u({paths:t,serialize:n,censor:p});let{wildcards:g,wcLen:_,secret:v}=r({paths:t,censor:p}),y=a(),b=`strict`in e?e.strict:!0;return i({secret:v,wcLen:_,serialize:n,strict:b,isCensorFct:m,censorFctTakesPath:h},c({secret:v,censor:p,compileRestore:y,serialize:n,groupRedact:o,nestedRedact:s,wildcards:g,wcLen:_}))}}),cf=c(sf(),1);const lf=[`client_secret`,`access_token`,`refresh_token`,`api_key`,`password`,`job_board_token`,`private_key`,`certificate`,`service_user_token`,`key_id`,`secret_key`,`provhash`,`admin_key`,`session_key`,`id_token`,`authorization`,`bh_rest_token`,`external_trigger_token`,`tempauth`],uf=[`req.headers.authorization`,`req.headers.cookie`,`req.headers.cookies`,`req.headers["set-cookie"]`,`req.headers["set-cookies"]`,`req.headers.httpsAgent.options.cert`,`req.headers.httpsAgent.options.key`,`req.headers["x-stackone-external-trigger-token"]`,`error.config.headers.authorization`,`error.config.data`,`error.config.headers.cookie`,`error.config.headers.cookies`,`error.config.headers["set-cookie"]`,`error.config.headers["set-cookies"]`,`error.config.httpsAgent.options.cert`,`error.config.httpsAgent.options.key`,`err.config.headers.authorization`,`err.config.data`,`err.config.headers.cookie`,`err.config.headers.cookies`,`err.config.headers["set-cookie"]`,`err.config.headers["set-cookies"]`,`err.config.httpsAgent.options.cert`,`err.config.httpsAgent.options.key`,`res.headers.authorization`,`res.headers.cookie`,`res.headers.cookies`,`res.headers["set-cookie"]`,`res.headers["set-cookies"]`,`res.headers.httpsAgent.options.cert`,`res.headers.httpsAgent.options.key`,`context.credentials`,...lf],df=`**redacted**`;let ff=function(e){return e.FULL=`FULL`,e.PARTIAL=`PARTIAL`,e}({});const pf=e=>df,mf=e=>typeof e==`string`?e.startsWith(df)?e:e.length<10?df:`${df}${e.slice(-5)}`:df,hf=(e=[],t=!0)=>{if(!t)return[];let n=e.map(e=>_f(e));return[...e,...n]},gf=(e=[],t=!0)=>{if(!t)return[];let n=new Set;return e.forEach(e=>{if(n.add(e),e.includes(`_`)){let t=e.replace(/_([a-z])/g,(e,t)=>t.toUpperCase());n.add(t)}else{let t=e.replace(/([A-Z])/g,`_$1`).toLowerCase();n.add(t)}}),Array.from(n)},_f=e=>{let t=yf(e);return t||vf(e)},vf=e=>{let t=e.split(`.`);if(t.length<2)return bf(e);let n=t.pop()??``,r=bf(n);return[...t,r].join(`.`)},yf=e=>{let t=e.lastIndexOf(`[`),n=e.indexOf(`]`,t);if(t===-1||n===-1)return;let r=e.slice(t,n+1),i=r.replace(/(["'])([^"']*)(["'])/g,(e,t,n)=>n?t+bf(n)+t:t+t);return`${e.slice(0,t)}${i}${e.slice(n+1)}`},bf=e=>`${e.charAt(0).toUpperCase()}${e.slice(1)}`,xf=hf(uf),Sf=gf(lf),Cf={[ff.FULL]:pf,[ff.PARTIAL]:mf},wf={[ff.FULL]:(0,cf.default)({paths:xf,serialize:!1,censor:Cf[ff.FULL]}),[ff.PARTIAL]:(0,cf.default)({paths:xf,serialize:!1,censor:Cf[ff.PARTIAL]})},Tf=(e,t=ff.FULL)=>(0,l.isMissing)(e)||typeof e!=`object`||!e?e:wf[t]((0,l.deepCopy)(e)),Ef=(e,t=ff.FULL,n)=>{if(!(0,l.isMissing)(e))try{let n=new URL(e),r=[...n.searchParams].reduce((e,[n,r])=>{let i=n.toLowerCase();return e.set(n,Sf.some(e=>e.toLowerCase()===i)?Cf[t](r):r),e},new URLSearchParams);return`${n.origin}${n.pathname}${r.toString()?`?`+r:``}${n.hash}`}catch(t){return n?.warning({message:`Invalid URL provided, unable to redact`,context:{value:e,error:t},category:`redactUrl`}),e}},Df=(e,t=ff.FULL,n)=>{if(!(0,l.isMissing)(e))try{let[n,r]=e.split(`?`);if(!r)return e;let i=[...new URLSearchParams(r)].reduce((e,[n,r])=>{let i=n.toLowerCase();return e.set(n,Sf.some(e=>e.toLowerCase()===i)?Cf[t](r):r),e},new URLSearchParams);return`${n}?${i}`}catch(t){return n?.warning({message:`Invalid path provided, unable to redact`,context:{value:e,error:t},category:`redactPath`}),e}},Of=(e,t=ff.FULL)=>{if(!(0,l.isMissing)(e))return typeof e==`string`?Cf[t](e):Object.entries(e).reduce((e,[n,r])=>(e[n]=Sf.some(e=>e.toLowerCase()===n.toLowerCase())?Cf[t](r):r,e),{})};var kf=class e{#transportFactory;#getRedisClient;#logger;#redisClientConfig;#errorMappingFn;#redisClient;constructor({transportFactory:e=Jd,getRedisClient:t=ce,logger:n,redisClientConfig:r,errorMappingFn:i}={}){this.#transportFactory=e,this.#getRedisClient=t,this.#logger=n,this.#redisClientConfig=r,this.#errorMappingFn=i}#generateCacheKey({url:e,payload:t,method:n,context:r}){let i=20;if(!r?.accountSecureId||r.accountSecureId.length<i||!e||!n)return null;let a=t?(0,l.getContentHash)(t):``;return`${r.accountSecureId}-${n.toUpperCase()}${a}-${e}`}async#getCachedResponse({url:t,payload:n,method:r,cacheTTL:i,context:a}){if(!this.#redisClient||!i||i<=0)return null;let o=this.#generateCacheKey({url:t,payload:n,method:r,context:a});if(!o)return null;let s=await this.#redisClient.getData(o);return s?(this.#logger?.debug({category:e.name,message:`Cache hit for key [${o}].`}),s):(this.#logger?.debug({category:e.name,message:`Cache miss for key [${o}].`}),null)}async#cacheResponse({url:t,payload:n,method:r,cacheTTL:i,context:a,response:o}){if(!this.#redisClient||!i||i<=0)return!1;let s=this.#generateCacheKey({url:t,payload:n,method:r,context:a});return s?(this.#logger?.debug({category:e.name,message:`Caching result for key [${s}].`}),this.#redisClient.setData({key:s,value:o,cacheTTL:i*60})):!1}async request({headers:t={},url:n,method:r=`get`,maxRedirects:i=0,responseType:a,cacheTTL:o,context:s,traceId:c,payload:u,httpsAgent:d,httpAgent:f}){try{(0,l.notMissing)(this.#redisClientConfig)&&(0,l.isMissing)(this.#redisClient)&&(this.#redisClient=await this.#getRedisClient(this.#redisClientConfig,this.#logger));let e=this.#normalizeHeaders(t),p=this.#getSafePayload(u,t),m=await this.#getCachedResponse({url:n,payload:p,method:r,cacheTTL:o,context:s});if(m)return{...m,responseTime:new Date};let h=ho.getInstance(),g=(0,l.notMissing)(c)?await h.get(c):null,_=g?.signal,v=await this.#transportFactory({redisClientConfig:this.#redisClientConfig,logger:this.#logger,context:s}),y=await v.request({headers:e,url:n,method:r,maxRedirects:i,responseType:a,data:p,httpsAgent:d,httpAgent:f,signal:_}),b={data:y.data,status:y.status,body:p,method:r,headers:this.#extractAxiosHeaders(y.headers),requestUrl:n,responseType:y?.config?.responseType,responseTime:new Date};return await this.#cacheResponse({url:n,payload:p,method:r,cacheTTL:o,context:s,response:b}),b}catch(t){let i=t;i.url=Ef(n),this.#logger?.warning({category:e.name,message:`Request error [${r?.toUpperCase()} ${i.url}]: ${i.message}.`,error:i});let a=this.#mapErrorToHttpException(i);throw(0,l.notMissing)(a)?a:t}}async get({headers:e,url:t,maxRedirects:n,cacheTTL:r,context:i,traceId:a}){return this.request({url:t,method:`get`,headers:e,maxRedirects:n,cacheTTL:r,context:i,traceId:a})}async post({headers:e,url:t,maxRedirects:n,cacheTTL:r,context:i,traceId:a,payload:o}){return this.request({url:t,method:`post`,headers:e,maxRedirects:n,cacheTTL:r,context:i,traceId:a,payload:o})}#normalizeHeaders(e){if(!e)return{};let t={};return Object.keys(e).forEach(n=>{t[n.toLowerCase()]=e[n]||``}),t}#extractAxiosHeaders(e){if(!e)return{};let t={};return Object.keys(e).forEach(n=>{t[n]=e[n]||``}),t}#isFormUrlEncoded(e){return e[`content-type`]===`application/x-www-form-urlencoded`}#getSafePayload(e,t){if(!((0,l.isMissing)(e)||(0,l.isObject)(e)&&Object.keys(e).length===0))return this.#isFormUrlEncoded(t)?g.default.stringify(e):e}#mapErrorToHttpException(e){if((0,d.isAxiosError)(e)&&this.#errorMappingFn)return this.#errorMappingFn(e)}};const Af=(e,t,n)=>new kf({redisClientConfig:e,logger:t,errorMappingFn:n});var jf=class{static httpClientInstance=null;static async getInstance({redisClientConfig:e,logger:t,errorMappingFn:n,getHttpClient:r=Af}){return this.httpClientInstance??=r(e,t,n),this.httpClientInstance}static resetInstance(){this.httpClientInstance=null}};const Mf=[`get`,`post`,`put`,`delete`,`patch`],Nf=e=>e.reduce((e,t)=>(Array.isArray(e[t.in][t.name])?e[t.in][t.name]=e[t.in][t.name].concat(t.value):typeof e[t.in][t.name]==`object`&&typeof t.value==`object`?e[t.in][t.name]={...e[t.in][t.name],...t.value}:e[t.in][t.name]=t.in===`body`?t.value:String(t.value),e),{query:{},body:{},headers:{}}),Pf=[`query`,`body`,`headers`],Ff=(e,t)=>{if((0,l.isMissing)(t)||t?.length===0||(0,l.isMissing)(e))return{data:e.data,status:e.status,headers:e.headers,requestUrl:e.requestUrl,responseType:e.responseType,responseTime:e.responseTime,message:e.message};let n=t?.filter(t=>t.receivedStatus===e.status);if(n?.length)for(let t of n){let n=t.condition,r=(0,_.safeEvaluate)(n,e)===!0;if((0,l.isMissing)(n)||r)return{data:e.data,headers:e.headers,requestUrl:e.requestUrl,responseType:e.responseType,responseTime:e.responseTime,status:t.targetStatus,message:t?.message??uo[t.targetStatus]??`Unknown error`}}return e},If=e=>(0,l.notMissing)(e)&&e>=200&&e<=299,Lf=e=>(0,l.notMissing)(e)&&e>=400&&e<=599,Rf=e=>(0,l.notMissing)(e)&&e>=100&&e<=199;var zf=class{async performRequest({httpClient:e,url:t,method:n,headers:r,body:i,customErrorConfigs:a}){let o;try{o=await e?.request({method:n,url:t,headers:r,maxRedirects:0,payload:i})}catch(e){if((0,l.isMissing)(e?.response))throw e;o=e.response}let s=Ff(o,a);if(Lf(s?.status))throw new fo(s,s.message);return s}},Bf=class{static build(e=`rest`){if(e===`rest`)return new zf;throw Error(`Unknown request client type: ${e}`)}};exports.CUSTOM_ERROR_CONFIG_SCHEMA=lo,exports.ConcurrencyManager=Ge,exports.EventClient=se,exports.HttpClient=kf,exports.HttpClientManager=jf,exports.HttpErrorMessages=uo,exports.HttpMethods=Mf,exports.HttpResponseError=fo,exports.HttpTransportFactory=po,exports.InstanceManager=ho,exports.LockManager=x,exports.MemoryStore=O,exports.QueueManager=Te,exports.RateLimitManager=ko,exports.RedisClient=le,exports.RequestClientFactory=Bf,exports.RequestParameterLocations=Pf,exports.ScriptManager=pe,exports.SubscriptionManager=me,exports.buildHttpClientInstance=Af,exports.createAuthorizationHeaders=v,exports.getTransportInstance=Jd,exports.isFailedStatusCode=Lf,exports.isInfoStatusCode=Rf,exports.isSuccessStatusCode=If,exports.parseRequestParameters=Nf;
package/dist/index.mjs CHANGED
@@ -290,4 +290,4 @@ var ul=9e15,dl=1e9,fl=`0123456789abcdef`,pl=`2.302585092994045684017991454684364
290
290
  ${r}
291
291
  ${e}
292
292
  return o
293
- `}}),vf=T((exports,t)=>{t.exports=n;function n(e){let{secret:t,censor:n,compileRestore:r,serialize:i,groupRedact:a,nestedRedact:o,wildcards:s,wcLen:c}=e,l=[{secret:t,censor:n,compileRestore:r}];return i!==!1&&l.push({serialize:i}),c>0&&l.push({groupRedact:a,nestedRedact:o,wildcards:s,wcLen:c}),Object.assign(...l)}}),yf=T((exports,t)=>{let n=ff(),r=mf(),i=hf(),a=_f(),{groupRedact:o,nestedRedact:s}=gf(),c=vf(),l=pf(),u=n(),d=e=>e;d.restore=d;let f=`[REDACTED]`;p.rx=l,p.validator=n,t.exports=p;function p(e={}){let t=Array.from(new Set(e.paths||[])),n=`serialize`in e&&(e.serialize===!1||typeof e.serialize==`function`)?e.serialize:JSON.stringify,l=e.remove;if(l===!0&&n!==JSON.stringify)throw Error(`fast-redact – remove option may only be set when serializer is JSON.stringify`);let p=l===!0?void 0:`censor`in e?e.censor:f,m=typeof p==`function`,h=m&&p.length>1;if(t.length===0)return n||d;u({paths:t,serialize:n,censor:p});let{wildcards:g,wcLen:_,secret:v}=r({paths:t,censor:p}),y=a(),b=`strict`in e?e.strict:!0;return i({secret:v,wcLen:_,serialize:n,strict:b,isCensorFct:m,censorFctTakesPath:h},c({secret:v,censor:p,compileRestore:y,serialize:n,groupRedact:o,nestedRedact:s,wildcards:g,wcLen:_}))}}),bf=E(yf(),1);const xf=[`client_secret`,`access_token`,`refresh_token`,`api_key`,`password`,`job_board_token`,`private_key`,`certificate`,`service_user_token`,`key_id`,`secret_key`,`provhash`,`admin_key`,`session_key`,`id_token`,`authorization`,`bh_rest_token`,`external_trigger_token`,`tempauth`],Sf=[`req.headers.authorization`,`req.headers.cookie`,`req.headers.cookies`,`req.headers["set-cookie"]`,`req.headers["set-cookies"]`,`req.headers.httpsAgent.options.cert`,`req.headers.httpsAgent.options.key`,`req.headers["x-stackone-external-trigger-token"]`,`error.config.headers.authorization`,`error.config.data`,`error.config.headers.cookie`,`error.config.headers.cookies`,`error.config.headers["set-cookie"]`,`error.config.headers["set-cookies"]`,`error.config.httpsAgent.options.cert`,`error.config.httpsAgent.options.key`,`err.config.headers.authorization`,`err.config.data`,`err.config.headers.cookie`,`err.config.headers.cookies`,`err.config.headers["set-cookie"]`,`err.config.headers["set-cookies"]`,`err.config.httpsAgent.options.cert`,`err.config.httpsAgent.options.key`,`res.headers.authorization`,`res.headers.cookie`,`res.headers.cookies`,`res.headers["set-cookie"]`,`res.headers["set-cookies"]`,`res.headers.httpsAgent.options.cert`,`res.headers.httpsAgent.options.key`,`context.credentials`,...xf],Cf=`**redacted**`;let wf=function(e){return e.FULL=`FULL`,e.PARTIAL=`PARTIAL`,e}({});const Tf=e=>Cf,Ef=e=>typeof e==`string`?e.startsWith(Cf)?e:e.length<10?Cf:`${Cf}${e.slice(-5)}`:Cf,Df=(e=[],t=!0)=>{if(!t)return[];let n=e.map(e=>kf(e));return[...e,...n]},Of=(e=[],t=!0)=>{if(!t)return[];let n=new Set;return e.forEach(e=>{if(n.add(e),e.includes(`_`)){let t=e.replace(/_([a-z])/g,(e,t)=>t.toUpperCase());n.add(t)}else{let t=e.replace(/([A-Z])/g,`_$1`).toLowerCase();n.add(t)}}),Array.from(n)},kf=e=>{let t=jf(e);return t||Af(e)},Af=e=>{let t=e.split(`.`);if(t.length<2)return Mf(e);let n=t.pop()??``,r=Mf(n);return[...t,r].join(`.`)},jf=e=>{let t=e.lastIndexOf(`[`),n=e.indexOf(`]`,t);if(t===-1||n===-1)return;let r=e.slice(t,n+1),i=r.replace(/(["'])([^"']*)(["'])/g,(e,t,n)=>n?t+Mf(n)+t:t+t);return`${e.slice(0,t)}${i}${e.slice(n+1)}`},Mf=e=>`${e.charAt(0).toUpperCase()}${e.slice(1)}`,Nf=Df(Sf),Pf=Of(xf),Ff={[wf.FULL]:Tf,[wf.PARTIAL]:Ef},If={[wf.FULL]:(0,bf.default)({paths:Nf,serialize:!1,censor:Ff[wf.FULL]}),[wf.PARTIAL]:(0,bf.default)({paths:Nf,serialize:!1,censor:Ff[wf.PARTIAL]})},Lf=(t,n=wf.FULL)=>s(t)||typeof t!=`object`||!t?t:If[n](e(t)),Rf=(e,t=wf.FULL,n)=>{if(!s(e))try{let n=new URL(e),r=[...n.searchParams].reduce((e,[n,r])=>{let i=n.toLowerCase();return e.set(n,Pf.some(e=>e.toLowerCase()===i)?Ff[t](r):r),e},new URLSearchParams);return`${n.origin}${n.pathname}${r.toString()?`?`+r:``}${n.hash}`}catch(t){return n?.warning({message:`Invalid URL provided, unable to redact`,context:{value:e,error:t},category:`redactUrl`}),e}},zf=(e,t=wf.FULL,n)=>{if(!s(e))try{let[n,r]=e.split(`?`);if(!r)return e;let i=[...new URLSearchParams(r)].reduce((e,[n,r])=>{let i=n.toLowerCase();return e.set(n,Pf.some(e=>e.toLowerCase()===i)?Ff[t](r):r),e},new URLSearchParams);return`${n}?${i}`}catch(t){return n?.warning({message:`Invalid path provided, unable to redact`,context:{value:e,error:t},category:`redactPath`}),e}},Bf=(e,t=wf.FULL)=>{if(!s(e))return typeof e==`string`?Ff[t](e):Object.entries(e).reduce((e,[n,r])=>(e[n]=Pf.some(e=>e.toLowerCase()===n.toLowerCase())?Ff[t](r):r,e),{})};var Vf=class e{#transportFactory;#getRedisClient;#logger;#redisClientConfig;#errorMappingFn;#redisClient;constructor({transportFactory:e=cf,getRedisClient:t=A,logger:n,redisClientConfig:r,errorMappingFn:i}={}){this.#transportFactory=e,this.#getRedisClient=t,this.#logger=n,this.#redisClientConfig=r,this.#errorMappingFn=i}#generateCacheKey({url:e,payload:t,method:n,context:r}){let a=20;if(!r?.accountSecureId||r.accountSecureId.length<a||!e||!n)return null;let o=t?i(t):``;return`${r.accountSecureId}-${n.toUpperCase()}${o}-${e}`}async#getCachedResponse({url:t,payload:n,method:r,cacheTTL:i,context:a}){if(!this.#redisClient||!i||i<=0)return null;let o=this.#generateCacheKey({url:t,payload:n,method:r,context:a});if(!o)return null;let s=await this.#redisClient.getData(o);return s?(this.#logger?.debug({category:e.name,message:`Cache hit for key [${o}].`}),s):(this.#logger?.debug({category:e.name,message:`Cache miss for key [${o}].`}),null)}async#cacheResponse({url:t,payload:n,method:r,cacheTTL:i,context:a,response:o}){if(!this.#redisClient||!i||i<=0)return!1;let s=this.#generateCacheKey({url:t,payload:n,method:r,context:a});return s?(this.#logger?.debug({category:e.name,message:`Caching result for key [${s}].`}),this.#redisClient.setData({key:s,value:o,cacheTTL:i*60})):!1}async request({headers:t={},url:n,method:r=`get`,maxRedirects:i=0,responseType:a,cacheTTL:o,context:c,traceId:l,payload:u,httpsAgent:f,httpAgent:p}){try{d(this.#redisClientConfig)&&s(this.#redisClient)&&(this.#redisClient=await this.#getRedisClient(this.#redisClientConfig,this.#logger));let e=this.#normalizeHeaders(t),m=await this.#getCachedResponse({url:n,payload:u,method:r,cacheTTL:o,context:c});if(m)return{...m,responseTime:new Date};let h=Eo.getInstance(),g=d(l)?await h.get(l):null,_=g?.signal,v=await this.#transportFactory({redisClientConfig:this.#redisClientConfig,logger:this.#logger,context:c}),y=await v.request({headers:e,url:n,method:r,maxRedirects:i,responseType:a,data:this.#getSafePayload(u,e),httpsAgent:f,httpAgent:p,signal:_}),b={data:y.data,status:y.status,body:u,method:r,headers:this.#extractAxiosHeaders(y.headers),requestUrl:n,responseType:y?.config?.responseType,responseTime:new Date};return await this.#cacheResponse({url:n,payload:u,method:r,cacheTTL:o,context:c,response:b}),b}catch(t){let i=t;i.url=Rf(n),this.#logger?.warning({category:e.name,message:`Request error [${r?.toUpperCase()} ${i.url}]: ${i.message}.`,error:i});let a=this.#mapErrorToHttpException(i);throw d(a)?a:t}}async get({headers:e,url:t,maxRedirects:n,cacheTTL:r,context:i,traceId:a}){return this.request({url:t,method:`get`,headers:e,maxRedirects:n,cacheTTL:r,context:i,traceId:a})}async post({headers:e,url:t,maxRedirects:n,cacheTTL:r,context:i,traceId:a,payload:o}){return this.request({url:t,method:`post`,headers:e,maxRedirects:n,cacheTTL:r,context:i,traceId:a,payload:o})}#normalizeHeaders(e){if(!e)return{};let t={};return Object.keys(e).forEach(n=>{t[n.toLowerCase()]=e[n]||``}),t}#extractAxiosHeaders(e){if(!e)return{};let t={};return Object.keys(e).forEach(n=>{t[n]=e[n]||``}),t}#isFormUrlEncoded(e){return e[`content-type`]===`application/x-www-form-urlencoded`}#getSafePayload(e,t){if(e)return this.#isFormUrlEncoded(t)?y.stringify(e):e}#mapErrorToHttpException(e){if(m(e)&&this.#errorMappingFn)return this.#errorMappingFn(e)}};const Hf=(e,t,n)=>new Vf({redisClientConfig:e,logger:t,errorMappingFn:n});var Uf=class{static httpClientInstance=null;static async getInstance({getHttpClient:e=Hf,redisClientConfig:t,logger:n,errorMappingFn:r}){return this.httpClientInstance??=e(t,n,r),this.httpClientInstance}static resetInstance(){this.httpClientInstance=null}};const Wf=[`get`,`post`,`put`,`delete`,`patch`],Gf=e=>e.reduce((e,t)=>(Array.isArray(e[t.in][t.name])?e[t.in][t.name]=e[t.in][t.name].concat(t.value):typeof e[t.in][t.name]==`object`&&typeof t.value==`object`?e[t.in][t.name]={...e[t.in][t.name],...t.value}:e[t.in][t.name]=t.in===`body`?t.value:String(t.value),e),{query:{},body:{},headers:{}}),Kf=[`query`,`body`,`headers`],qf=(e,t)=>{if(s(t)||t?.length===0||s(e))return{data:e.data,status:e.status,headers:e.headers,requestUrl:e.requestUrl,responseType:e.responseType,responseTime:e.responseTime,message:e.message};let n=t?.filter(t=>t.receivedStatus===e.status);if(n?.length)for(let t of n){let n=t.condition,r=b(n,e)===!0;if(s(n)||r)return{data:e.data,headers:e.headers,requestUrl:e.requestUrl,responseType:e.responseType,responseTime:e.responseTime,status:t.targetStatus,message:t?.message??So[t.targetStatus]??`Unknown error`}}return e},Jf=e=>d(e)&&e>=200&&e<=299,Yf=e=>d(e)&&e>=400&&e<=599,Xf=e=>d(e)&&e>=100&&e<=199;var Zf=class{async performRequest({httpClient:e,url:t,method:n,headers:r,body:i,customErrorConfigs:a}){let o;try{o=await e?.request({method:n,url:t,headers:r,maxRedirects:0,payload:i})}catch(e){if(s(e?.response))throw e;o=e.response}let c=qf(o,a);if(Yf(c?.status))throw new Co(c,c.message);return c}},Qf=class{static build(e=`rest`){if(e===`rest`)return new Zf;throw Error(`Unknown request client type: ${e}`)}};export{xo as CUSTOM_ERROR_CONFIG_SCHEMA,nt as ConcurrencyManager,ye as EventClient,Vf as HttpClient,Uf as HttpClientManager,So as HttpErrorMessages,Wf as HttpMethods,Co as HttpResponseError,wo as HttpTransportFactory,Eo as InstanceManager,ie as LockManager,he as MemoryStore,Ie as QueueManager,Bo as RateLimitManager,be as RedisClient,Qf as RequestClientFactory,Kf as RequestParameterLocations,we as ScriptManager,Te as SubscriptionManager,Hf as buildHttpClientInstance,re as createAuthorizationHeaders,cf as getTransportInstance,Yf as isFailedStatusCode,Xf as isInfoStatusCode,Jf as isSuccessStatusCode,Gf as parseRequestParameters};
293
+ `}}),vf=T((exports,t)=>{t.exports=n;function n(e){let{secret:t,censor:n,compileRestore:r,serialize:i,groupRedact:a,nestedRedact:o,wildcards:s,wcLen:c}=e,l=[{secret:t,censor:n,compileRestore:r}];return i!==!1&&l.push({serialize:i}),c>0&&l.push({groupRedact:a,nestedRedact:o,wildcards:s,wcLen:c}),Object.assign(...l)}}),yf=T((exports,t)=>{let n=ff(),r=mf(),i=hf(),a=_f(),{groupRedact:o,nestedRedact:s}=gf(),c=vf(),l=pf(),u=n(),d=e=>e;d.restore=d;let f=`[REDACTED]`;p.rx=l,p.validator=n,t.exports=p;function p(e={}){let t=Array.from(new Set(e.paths||[])),n=`serialize`in e&&(e.serialize===!1||typeof e.serialize==`function`)?e.serialize:JSON.stringify,l=e.remove;if(l===!0&&n!==JSON.stringify)throw Error(`fast-redact – remove option may only be set when serializer is JSON.stringify`);let p=l===!0?void 0:`censor`in e?e.censor:f,m=typeof p==`function`,h=m&&p.length>1;if(t.length===0)return n||d;u({paths:t,serialize:n,censor:p});let{wildcards:g,wcLen:_,secret:v}=r({paths:t,censor:p}),y=a(),b=`strict`in e?e.strict:!0;return i({secret:v,wcLen:_,serialize:n,strict:b,isCensorFct:m,censorFctTakesPath:h},c({secret:v,censor:p,compileRestore:y,serialize:n,groupRedact:o,nestedRedact:s,wildcards:g,wcLen:_}))}}),bf=E(yf(),1);const xf=[`client_secret`,`access_token`,`refresh_token`,`api_key`,`password`,`job_board_token`,`private_key`,`certificate`,`service_user_token`,`key_id`,`secret_key`,`provhash`,`admin_key`,`session_key`,`id_token`,`authorization`,`bh_rest_token`,`external_trigger_token`,`tempauth`],Sf=[`req.headers.authorization`,`req.headers.cookie`,`req.headers.cookies`,`req.headers["set-cookie"]`,`req.headers["set-cookies"]`,`req.headers.httpsAgent.options.cert`,`req.headers.httpsAgent.options.key`,`req.headers["x-stackone-external-trigger-token"]`,`error.config.headers.authorization`,`error.config.data`,`error.config.headers.cookie`,`error.config.headers.cookies`,`error.config.headers["set-cookie"]`,`error.config.headers["set-cookies"]`,`error.config.httpsAgent.options.cert`,`error.config.httpsAgent.options.key`,`err.config.headers.authorization`,`err.config.data`,`err.config.headers.cookie`,`err.config.headers.cookies`,`err.config.headers["set-cookie"]`,`err.config.headers["set-cookies"]`,`err.config.httpsAgent.options.cert`,`err.config.httpsAgent.options.key`,`res.headers.authorization`,`res.headers.cookie`,`res.headers.cookies`,`res.headers["set-cookie"]`,`res.headers["set-cookies"]`,`res.headers.httpsAgent.options.cert`,`res.headers.httpsAgent.options.key`,`context.credentials`,...xf],Cf=`**redacted**`;let wf=function(e){return e.FULL=`FULL`,e.PARTIAL=`PARTIAL`,e}({});const Tf=e=>Cf,Ef=e=>typeof e==`string`?e.startsWith(Cf)?e:e.length<10?Cf:`${Cf}${e.slice(-5)}`:Cf,Df=(e=[],t=!0)=>{if(!t)return[];let n=e.map(e=>kf(e));return[...e,...n]},Of=(e=[],t=!0)=>{if(!t)return[];let n=new Set;return e.forEach(e=>{if(n.add(e),e.includes(`_`)){let t=e.replace(/_([a-z])/g,(e,t)=>t.toUpperCase());n.add(t)}else{let t=e.replace(/([A-Z])/g,`_$1`).toLowerCase();n.add(t)}}),Array.from(n)},kf=e=>{let t=jf(e);return t||Af(e)},Af=e=>{let t=e.split(`.`);if(t.length<2)return Mf(e);let n=t.pop()??``,r=Mf(n);return[...t,r].join(`.`)},jf=e=>{let t=e.lastIndexOf(`[`),n=e.indexOf(`]`,t);if(t===-1||n===-1)return;let r=e.slice(t,n+1),i=r.replace(/(["'])([^"']*)(["'])/g,(e,t,n)=>n?t+Mf(n)+t:t+t);return`${e.slice(0,t)}${i}${e.slice(n+1)}`},Mf=e=>`${e.charAt(0).toUpperCase()}${e.slice(1)}`,Nf=Df(Sf),Pf=Of(xf),Ff={[wf.FULL]:Tf,[wf.PARTIAL]:Ef},If={[wf.FULL]:(0,bf.default)({paths:Nf,serialize:!1,censor:Ff[wf.FULL]}),[wf.PARTIAL]:(0,bf.default)({paths:Nf,serialize:!1,censor:Ff[wf.PARTIAL]})},Lf=(t,n=wf.FULL)=>s(t)||typeof t!=`object`||!t?t:If[n](e(t)),Rf=(e,t=wf.FULL,n)=>{if(!s(e))try{let n=new URL(e),r=[...n.searchParams].reduce((e,[n,r])=>{let i=n.toLowerCase();return e.set(n,Pf.some(e=>e.toLowerCase()===i)?Ff[t](r):r),e},new URLSearchParams);return`${n.origin}${n.pathname}${r.toString()?`?`+r:``}${n.hash}`}catch(t){return n?.warning({message:`Invalid URL provided, unable to redact`,context:{value:e,error:t},category:`redactUrl`}),e}},zf=(e,t=wf.FULL,n)=>{if(!s(e))try{let[n,r]=e.split(`?`);if(!r)return e;let i=[...new URLSearchParams(r)].reduce((e,[n,r])=>{let i=n.toLowerCase();return e.set(n,Pf.some(e=>e.toLowerCase()===i)?Ff[t](r):r),e},new URLSearchParams);return`${n}?${i}`}catch(t){return n?.warning({message:`Invalid path provided, unable to redact`,context:{value:e,error:t},category:`redactPath`}),e}},Bf=(e,t=wf.FULL)=>{if(!s(e))return typeof e==`string`?Ff[t](e):Object.entries(e).reduce((e,[n,r])=>(e[n]=Pf.some(e=>e.toLowerCase()===n.toLowerCase())?Ff[t](r):r,e),{})};var Vf=class e{#transportFactory;#getRedisClient;#logger;#redisClientConfig;#errorMappingFn;#redisClient;constructor({transportFactory:e=cf,getRedisClient:t=A,logger:n,redisClientConfig:r,errorMappingFn:i}={}){this.#transportFactory=e,this.#getRedisClient=t,this.#logger=n,this.#redisClientConfig=r,this.#errorMappingFn=i}#generateCacheKey({url:e,payload:t,method:n,context:r}){let a=20;if(!r?.accountSecureId||r.accountSecureId.length<a||!e||!n)return null;let o=t?i(t):``;return`${r.accountSecureId}-${n.toUpperCase()}${o}-${e}`}async#getCachedResponse({url:t,payload:n,method:r,cacheTTL:i,context:a}){if(!this.#redisClient||!i||i<=0)return null;let o=this.#generateCacheKey({url:t,payload:n,method:r,context:a});if(!o)return null;let s=await this.#redisClient.getData(o);return s?(this.#logger?.debug({category:e.name,message:`Cache hit for key [${o}].`}),s):(this.#logger?.debug({category:e.name,message:`Cache miss for key [${o}].`}),null)}async#cacheResponse({url:t,payload:n,method:r,cacheTTL:i,context:a,response:o}){if(!this.#redisClient||!i||i<=0)return!1;let s=this.#generateCacheKey({url:t,payload:n,method:r,context:a});return s?(this.#logger?.debug({category:e.name,message:`Caching result for key [${s}].`}),this.#redisClient.setData({key:s,value:o,cacheTTL:i*60})):!1}async request({headers:t={},url:n,method:r=`get`,maxRedirects:i=0,responseType:a,cacheTTL:o,context:c,traceId:l,payload:u,httpsAgent:f,httpAgent:p}){try{d(this.#redisClientConfig)&&s(this.#redisClient)&&(this.#redisClient=await this.#getRedisClient(this.#redisClientConfig,this.#logger));let e=this.#normalizeHeaders(t),m=this.#getSafePayload(u,t),h=await this.#getCachedResponse({url:n,payload:m,method:r,cacheTTL:o,context:c});if(h)return{...h,responseTime:new Date};let g=Eo.getInstance(),_=d(l)?await g.get(l):null,v=_?.signal,y=await this.#transportFactory({redisClientConfig:this.#redisClientConfig,logger:this.#logger,context:c}),b=await y.request({headers:e,url:n,method:r,maxRedirects:i,responseType:a,data:m,httpsAgent:f,httpAgent:p,signal:v}),x={data:b.data,status:b.status,body:m,method:r,headers:this.#extractAxiosHeaders(b.headers),requestUrl:n,responseType:b?.config?.responseType,responseTime:new Date};return await this.#cacheResponse({url:n,payload:m,method:r,cacheTTL:o,context:c,response:x}),x}catch(t){let i=t;i.url=Rf(n),this.#logger?.warning({category:e.name,message:`Request error [${r?.toUpperCase()} ${i.url}]: ${i.message}.`,error:i});let a=this.#mapErrorToHttpException(i);throw d(a)?a:t}}async get({headers:e,url:t,maxRedirects:n,cacheTTL:r,context:i,traceId:a}){return this.request({url:t,method:`get`,headers:e,maxRedirects:n,cacheTTL:r,context:i,traceId:a})}async post({headers:e,url:t,maxRedirects:n,cacheTTL:r,context:i,traceId:a,payload:o}){return this.request({url:t,method:`post`,headers:e,maxRedirects:n,cacheTTL:r,context:i,traceId:a,payload:o})}#normalizeHeaders(e){if(!e)return{};let t={};return Object.keys(e).forEach(n=>{t[n.toLowerCase()]=e[n]||``}),t}#extractAxiosHeaders(e){if(!e)return{};let t={};return Object.keys(e).forEach(n=>{t[n]=e[n]||``}),t}#isFormUrlEncoded(e){return e[`content-type`]===`application/x-www-form-urlencoded`}#getSafePayload(e,t){if(!(s(e)||l(e)&&Object.keys(e).length===0))return this.#isFormUrlEncoded(t)?y.stringify(e):e}#mapErrorToHttpException(e){if(m(e)&&this.#errorMappingFn)return this.#errorMappingFn(e)}};const Hf=(e,t,n)=>new Vf({redisClientConfig:e,logger:t,errorMappingFn:n});var Uf=class{static httpClientInstance=null;static async getInstance({redisClientConfig:e,logger:t,errorMappingFn:n,getHttpClient:r=Hf}){return this.httpClientInstance??=r(e,t,n),this.httpClientInstance}static resetInstance(){this.httpClientInstance=null}};const Wf=[`get`,`post`,`put`,`delete`,`patch`],Gf=e=>e.reduce((e,t)=>(Array.isArray(e[t.in][t.name])?e[t.in][t.name]=e[t.in][t.name].concat(t.value):typeof e[t.in][t.name]==`object`&&typeof t.value==`object`?e[t.in][t.name]={...e[t.in][t.name],...t.value}:e[t.in][t.name]=t.in===`body`?t.value:String(t.value),e),{query:{},body:{},headers:{}}),Kf=[`query`,`body`,`headers`],qf=(e,t)=>{if(s(t)||t?.length===0||s(e))return{data:e.data,status:e.status,headers:e.headers,requestUrl:e.requestUrl,responseType:e.responseType,responseTime:e.responseTime,message:e.message};let n=t?.filter(t=>t.receivedStatus===e.status);if(n?.length)for(let t of n){let n=t.condition,r=b(n,e)===!0;if(s(n)||r)return{data:e.data,headers:e.headers,requestUrl:e.requestUrl,responseType:e.responseType,responseTime:e.responseTime,status:t.targetStatus,message:t?.message??So[t.targetStatus]??`Unknown error`}}return e},Jf=e=>d(e)&&e>=200&&e<=299,Yf=e=>d(e)&&e>=400&&e<=599,Xf=e=>d(e)&&e>=100&&e<=199;var Zf=class{async performRequest({httpClient:e,url:t,method:n,headers:r,body:i,customErrorConfigs:a}){let o;try{o=await e?.request({method:n,url:t,headers:r,maxRedirects:0,payload:i})}catch(e){if(s(e?.response))throw e;o=e.response}let c=qf(o,a);if(Yf(c?.status))throw new Co(c,c.message);return c}},Qf=class{static build(e=`rest`){if(e===`rest`)return new Zf;throw Error(`Unknown request client type: ${e}`)}};export{xo as CUSTOM_ERROR_CONFIG_SCHEMA,nt as ConcurrencyManager,ye as EventClient,Vf as HttpClient,Uf as HttpClientManager,So as HttpErrorMessages,Wf as HttpMethods,Co as HttpResponseError,wo as HttpTransportFactory,Eo as InstanceManager,ie as LockManager,he as MemoryStore,Ie as QueueManager,Bo as RateLimitManager,be as RedisClient,Qf as RequestClientFactory,Kf as RequestParameterLocations,we as ScriptManager,Te as SubscriptionManager,Hf as buildHttpClientInstance,re as createAuthorizationHeaders,cf as getTransportInstance,Yf as isFailedStatusCode,Xf as isInfoStatusCode,Jf as isSuccessStatusCode,Gf as parseRequestParameters};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@stackone/transport",
3
- "version": "1.10.0",
3
+ "version": "1.11.1",
4
4
  "description": "",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.mjs",