getta 0.3.0 → 0.4.0
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/CHANGELOG.md +6 -0
- package/lib/browser/index.js +1 -1
- package/lib/browser/index.js.map +1 -1
- package/lib/browser/production.analysis.txt +19 -19
- package/lib/main/constants.js +6 -2
- package/lib/main/main.js +55 -15
- package/lib/module/constants.js +3 -1
- package/lib/module/main.js +58 -16
- package/lib/types/constants.d.ts +2 -0
- package/lib/types/constants.d.ts.map +1 -1
- package/lib/types/main.d.ts +6 -4
- package/lib/types/main.d.ts.map +1 -1
- package/lib/types/types.d.ts +7 -0
- package/lib/types/types.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/constants.ts +3 -0
- package/src/main.test.ts +7 -6
- package/src/main.ts +61 -21
- package/src/types.ts +10 -0
package/CHANGELOG.md
CHANGED
package/lib/browser/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import e from"@babel/runtime/helpers/defineProperty";import t from"lodash/merge";import r from"lodash/castArray";import"core-js/modules/es.promise.js";import a from"md5";import i from"query-string";const s="arrayBuffer",h="blob",c="formData",o="json",n="text",u={ARRAY_BUFFER_FORMAT:"arrayBuffer",BLOB_FORMAT:"blob",FORM_DATA_FORMAT:"formData",JSON_FORMAT:o,TEXT_FORMAT:"text"},d=e=>e,l=5e3,m={"content-type":"application/json"},_=5,p=3,T=/({type})|({id})|({id,\+})|({brief\|standard})/g,R=/({[a-zA-Z0-9_]+\?})/g,y=50,f=100,g="Getta expected to receive 'basePath' in the constructor options,\n but recevied undefined.",q="The request exceeded the maximum number of redirects, which is",E="The request exceeded the maximum number of retries, which is",v="Getta expected to receive 'get', 'post', 'put' or 'delete', but received",P="The requested resource could not been found.",b="The request timed out. Getta did not get a response within",x="get",w="post",C="put",L="delete",k=["get","post","put","delete"],D="information",$="successful",A="redirection",O="clientError",j="serverError",S=304,H=404,M="Cookie",Q="ETag",F="Location",G="If-None-Match",W="Cache-Control";function B(e,t,r){const a=Object.keys(t);return e.replace(r,e=>a.reduce((r,a)=>e.includes(a)?t[a]:r,""))}function N(e,t,{optionalPathTemplateRegExp:r,pathTemplateCallback:a,pathTemplateData:s,pathTemplateRegExp:h,queryParams:c}){const o=e.endsWith("/")||t.startsWith("/")?"":"/";let n=`${e}${o}${t}`;if(s&&(n=a(n,s,h)),n=n.replace(r,""),n.endsWith("/")&&(n=n.substring(0,n.length-1)),c&&Object.keys(c).length){n=`${n}${i.extract(n)?"&":"?"}${i.stringify(c)}`}return n}class I{constructor(t){e(this,"_basePath",void 0),e(this,"_bodyParser",void 0),e(this,"_cache",void 0),e(this,"_conditionalRequestsEnabled",void 0),e(this,"_fetchTimeout",void 0),e(this,"_headers",void 0),e(this,"_maxRedirects",void 0),e(this,"_maxRetries",void 0),e(this,"_optionalPathTemplateRegExp",void 0),e(this,"_pathTemplateCallback",void 0),e(this,"_pathTemplateRegExp",void 0),e(this,"_queryParams",void 0),e(this,"_rateLimitCount",0),e(this,"_rateLimitedRequestQueue",[]),e(this,"_rateLimitPerSecond",void 0),e(this,"_rateLimitTimer",null),e(this,"_requestRetryWait",void 0),e(this,"_requestTracker",{active:[],pending:new Map}),e(this,"_streamReader",void 0);const{basePath:r,bodyParser:a=d,cache:i,enableConditionalRequests:s=!0,fetchTimeout:h=l,headers:c,maxRedirects:n=_,maxRetries:u=p,optionalPathTemplateRegExp:q=R,pathTemplateCallback:E=B,pathTemplateRegExp:v=T,queryParams:P={},rateLimitPerSecond:b=y,requestRetryWait:x=f,streamReader:w=o}=t;if(!r)throw new Error(g);this._basePath=r,this._bodyParser=a,this._cache=i,this._conditionalRequestsEnabled=s,this._fetchTimeout=h,this._headers={...m,...c||{}},this._maxRedirects=n,this._maxRetries=u,this._optionalPathTemplateRegExp=q,this._pathTemplateCallback=E,this._pathTemplateRegExp=v,this._queryParams=P,this._rateLimitPerSecond=b,this._requestRetryWait=x,this._streamReader=w}get cache(){return this._cache}createShortcut(e,r,{method:a,...i}){if(!k.includes(a))throw new Error("Getta expected to receive 'get', 'post', 'put' or 'delete', but received "+a);this[e]=async({method:e,...s}={})=>this[null!=e?e:a](r,t({},i,s))}async delete(e,t={}){return this._delete(e,t)}async get(e,t={}){return this._get(e,t)}async post(e,t){return this._request(e,{...t,method:"post"})}async put(e,t){return this._request(e,{...t,method:"put"})}_addRequestToRateLimitedQueue(e,t){return new Promise(r=>{this._rateLimitedRequestQueue.push([r,e,t])})}async _cacheEntryDelete(e){if(!this._cache)return!1;try{return await this._cache.delete(e)}catch(e){return Promise.reject(e)}}async _cacheEntryGet(e){if(this._cache)try{return await this._cache.get(e)}catch(e){return Promise.reject(e)}}async _cacheEntryHas(e){if(!this._cache)return!1;try{return await this._cache.has(e)}catch(e){return!1}}async _cacheEntrySet(e,t,r){if(this._cache)try{return await this._cache.set(e,t,{cacheHeaders:r})}catch(e){return Promise.reject(e)}}async _delete(e,{headers:t={},pathTemplateData:r,queryParams:i={},...s}){const h=N(this._basePath,e,{optionalPathTemplateRegExp:this._optionalPathTemplateRegExp,pathTemplateCallback:this._pathTemplateCallback,pathTemplateData:r,pathTemplateRegExp:this._pathTemplateRegExp,queryParams:{...this._queryParams,...i}}),c=a(h);return await this._cacheEntryHas(c)&&this._cacheEntryDelete(c),this._fetch(h,{headers:{...this._headers,...t},method:"delete",...s})}async _fetch(e,{redirects:t,retries:a,...i}){try{return new Promise(async(r,s)=>{const h=setTimeout(()=>{s(new Error(`${b} ${this._fetchTimeout}ms.`))},this._fetchTimeout);if(this._rateLimit(),!(this._rateLimitCount<this._rateLimitPerSecond))return void r(await this._addRequestToRateLimitedQueue(e,{redirects:t,retries:a,...i}));const c=await fetch(e,i);clearTimeout(h);const{headers:o,status:n}=c,u=function(e){switch(!0){case e<200:return"information";case e<300:return"successful";case e<400:return"redirection";case e<500:return"clientError";default:return"serverError"}}(n);if("redirection"===u&&o.get("Location"))return void r(await this._fetchRedirectHandler(o.get("Location"),{redirects:t,status:n,...i}));if("serverError"===u)return void r(await this._fetchRetryHandler(e,{retries:a,...i}));const d=c;try{d.data=c.body?this._bodyParser(await c[this._streamReader]()):void 0,r(d)}catch(t){s([t,new Error(`Unable to ${i.method} ${e} due to previous error`)])}})}catch(e){return{errors:r(e)}}}async _fetchRedirectHandler(e,{method:t,redirects:r=1,status:a,...i}){if(r===this._maxRedirects){return{errors:[new Error(`The request exceeded the maximum number of redirects, which is ${this._maxRedirects}.`)]}}r+=1;const s=303===a?"get":t;return this._fetch(e,{method:s,redirects:r,...i})}async _fetchRetryHandler(e,{retries:t=1,...r}){return t===this._maxRetries?{errors:[new Error(`The request exceeded the maximum number of retries, which is ${this._maxRetries}.`)]}:(t+=1,await(a=this._requestRetryWait,new Promise(e=>setTimeout(e,a))),this._fetch(e,{retries:t,...r}));var a}async _get(e,{headers:t={},pathTemplateData:r,queryParams:i={}}){const s=N(this._basePath,e,{optionalPathTemplateRegExp:this._optionalPathTemplateRegExp,pathTemplateCallback:this._pathTemplateCallback,pathTemplateData:r,pathTemplateRegExp:this._pathTemplateRegExp,queryParams:{...this._queryParams,...i}}),h=a(s),c=await this._cacheEntryHas(h);if(c){if(function(e){var t,r,a;return!(null!==(t=null==e||null===(r=e.metadata)||void 0===r||null===(a=r.cacheControl)||void 0===a?void 0:a.noCache)&&void 0!==t&&t)&&e.checkTTL()}(c))return{data:await this._cacheEntryGet(h),headers:new Headers({"cache-control":c.printCacheControl()})};if(this._conditionalRequestsEnabled){var o,n;const e=null!==(o=null==c||null===(n=c.metadata)||void 0===n?void 0:n.etag)&&void 0!==o?o:null;e&&(t["If-None-Match"]=e)}}const u=this._trackRequest(h);return u||this._getResolve(h,await this._fetch(s,{headers:{...this._headers,...t},method:"get"}))}async _getResolve(e,t){const{data:r,headers:a,status:i}=t;if(404===i)this._cacheEntryDelete(e),t.errors||(t.errors=[]),t.errors.push(new Error("The requested resource could not been found."));else if(304===i&&a){const r=await this._cacheEntryGet(e);r&&(this._cacheEntrySet(e,r,{cacheControl:a.get("Cache-Control")||void 0,etag:a.get("ETag")||void 0}),t.data=r)}else r&&a&&this._cacheEntrySet(e,r,{cacheControl:a.get("Cache-Control")||void 0,etag:a.get("ETag")||void 0});return this._resolvePendingRequests(e,t),this._requestTracker.active=this._requestTracker.active.filter(t=>t!==e),t}_rateLimit(){this._rateLimitTimer||(this._rateLimitTimer=setTimeout(()=>{this._rateLimitTimer=null,this._rateLimitCount=0,this._rateLimitedRequestQueue.length&&this._releaseRateLimitedRequestQueue()},1e3)),this._rateLimitCount+=1}_releaseRateLimitedRequestQueue(){this._rateLimitedRequestQueue.forEach(async([e,t,r])=>{e(await this._fetch(t,r))}),this._rateLimitedRequestQueue=[]}async _request(e,{body:t,headers:r,method:a,pathTemplateData:i,queryParams:s,...h}){const c=N(this._basePath,e,{optionalPathTemplateRegExp:this._optionalPathTemplateRegExp,pathTemplateCallback:this._pathTemplateCallback,pathTemplateData:i,pathTemplateRegExp:this._pathTemplateRegExp,queryParams:{...this._queryParams,...s}});return this._fetch(c,{body:t,headers:{...this._headers,...r},method:a,...h})}_resolvePendingRequests(e,t){const r=this._requestTracker.pending.get(e);r&&(r.forEach(({resolve:e})=>{e(t)}),this._requestTracker.pending.delete(e))}_setPendingRequest(e,t){let r=this._requestTracker.pending.get(e);r||(r=[]),r.push(t),this._requestTracker.pending.set(e,r)}_trackRequest(e){if(this._requestTracker.active.includes(e))return new Promise(t=>{this._setPendingRequest(e,{resolve:t})});this._requestTracker.active.push(e)}}export default function(e,t){const r=new I(e);return t?(Object.keys(t).forEach(e=>{r.createShortcut(e,...t[e])}),r):r}export{s as ARRAY_BUFFER_FORMAT,h as BLOB_FORMAT,W as CACHE_CONTROL_HEADER,O as CLIENT_ERROR_REPSONSE,M as COOKIE_HEADER,d as DEFAULT_BODY_PARSER,l as DEFAULT_FETCH_TIMEOUT,m as DEFAULT_HEADERS,_ as DEFAULT_MAX_REDIRECTS,p as DEFAULT_MAX_RETRIES,T as DEFAULT_PATH_TEMPLATE_REGEX,y as DEFAULT_RATE_LIMIT,f as DEFAULT_REQUEST_RETRY_WAIT,L as DELETE_METHOD,Q as ETAG_HEADER,k as FETCH_METHODS,b as FETCH_TIMEOUT_ERROR,c as FORM_DATA_FORMAT,x as GET_METHOD,I as Getta,G as IF_NONE_MATCH_HEADER,D as INFORMATION_REPSONSE,v as INVALID_FETCH_METHOD_ERROR,o as JSON_FORMAT,F as LOCATION_HEADER,q as MAX_REDIRECTS_EXCEEDED_ERROR,E as MAX_RETRIES_EXCEEDED_ERROR,g as MISSING_BASE_PATH_ERROR,H as NOT_FOUND_STATUS_CODE,S as NOT_MODIFIED_STATUS_CODE,R as OPTIONAL_PATH_TEMPLATE_REGEX,w as POST_METHOD,C as PUT_METHOD,A as REDIRECTION_REPSONSE,P as RESOURCE_NOT_FOUND_ERROR,j as SERVER_ERROR_REPSONSE,u as STREAM_READERS,$ as SUCCESSFUL_REPSONSE,n as TEXT_FORMAT,B as defaultPathTemplateCallback};
|
|
1
|
+
import e from"@babel/runtime/helpers/defineProperty";import t from"lodash/merge";import r from"lodash/castArray";import"core-js/modules/es.promise.js";import a from"md5";import i from"query-string";const s="arrayBuffer",h="blob",o="formData",c="json",n="text",u={ARRAY_BUFFER_FORMAT:"arrayBuffer",BLOB_FORMAT:"blob",FORM_DATA_FORMAT:"formData",JSON_FORMAT:c,TEXT_FORMAT:"text"},d=e=>e,l=5e3,m={"content-type":"application/json"},_=5,p=3,T=/({type})|({id})|({id,\+})|({brief\|standard})/g,f=/({[a-zA-Z0-9_]+\?})/g,R=50,y=100,g="Getta expected to receive 'basePath' in the constructor options,\n but recevied undefined.",v="The request exceeded the maximum number of redirects, which is",q="The request exceeded the maximum number of retries, which is",E="Getta expected to receive 'get', 'post', 'put' or 'delete', but received",P="The requested resource could not been found.",b="The request timed out. Getta did not get a response within",x="get",w="post",C="put",L="delete",k=["get","post","put","delete"],D="information",$="successful",A="redirection",O="clientError",j="serverError",S=304,H=404,M="Cookie",Q="ETag",F="Location",G="If-None-Match",W="Cache-Control",B="request_sent",N="response_received";function I(e,t,r){const a=Object.keys(t);return e.replace(r,e=>a.reduce((r,a)=>e.includes(a)?t[a]:r,""))}function U(e,t,{optionalPathTemplateRegExp:r,pathTemplateCallback:a,pathTemplateData:s,pathTemplateRegExp:h,queryParams:o}){const c=e.endsWith("/")||t.startsWith("/")?"":"/";let n=`${e}${c}${t}`;if(s&&(n=a(n,s,h)),n=n.replace(r,""),n.endsWith("/")&&(n=n.substring(0,n.length-1)),o&&Object.keys(o).length){n=`${n}${i.extract(n)?"&":"?"}${i.stringify(o)}`}return n}class z{constructor(t){e(this,"_basePath",void 0),e(this,"_bodyParser",void 0),e(this,"_cache",void 0),e(this,"_conditionalRequestsEnabled",void 0),e(this,"_fetchTimeout",void 0),e(this,"_headers",void 0),e(this,"_log",void 0),e(this,"_maxRedirects",void 0),e(this,"_maxRetries",void 0),e(this,"_optionalPathTemplateRegExp",void 0),e(this,"_pathTemplateCallback",void 0),e(this,"_pathTemplateRegExp",void 0),e(this,"_performance",void 0),e(this,"_queryParams",void 0),e(this,"_rateLimitCount",0),e(this,"_rateLimitedRequestQueue",[]),e(this,"_rateLimitPerSecond",void 0),e(this,"_rateLimitTimer",null),e(this,"_requestRetryWait",void 0),e(this,"_requestTracker",{active:[],pending:new Map}),e(this,"_streamReader",void 0);const{basePath:r,bodyParser:a=d,cache:i,enableConditionalRequests:s=!0,fetchTimeout:h=l,headers:o,log:n,maxRedirects:u=_,maxRetries:v=p,optionalPathTemplateRegExp:q=f,pathTemplateCallback:E=I,pathTemplateRegExp:P=T,performance:b,queryParams:x={},rateLimitPerSecond:w=R,requestRetryWait:C=y,streamReader:L=c}=t;if(!r)throw new Error(g);this._basePath=r,this._bodyParser=a,this._cache=i,this._conditionalRequestsEnabled=s,this._fetchTimeout=h,this._headers={...m,...o||{}},this._log=n,this._maxRedirects=u,this._maxRetries=v,this._optionalPathTemplateRegExp=q,this._pathTemplateCallback=E,this._pathTemplateRegExp=P,this._performance=b,this._queryParams=x,this._rateLimitPerSecond=w,this._requestRetryWait=C,this._streamReader=L}get cache(){return this._cache}createShortcut(e,r,{method:a,...i}){if(!k.includes(a))throw new Error("Getta expected to receive 'get', 'post', 'put' or 'delete', but received "+a);this[e]=async({method:e,...s}={})=>this[null!=e?e:a](r,t({},i,s))}async delete(e,t={},r){return this._delete(e,t,r)}async get(e,t={},r){return this._get(e,t,r)}async post(e,t,r){return this._request(e,{...t,method:"post"},r)}async put(e,t,r){return this._request(e,{...t,method:"put"},r)}_addRequestToRateLimitedQueue(e,t){return new Promise(r=>{this._rateLimitedRequestQueue.push([r,e,t])})}async _cacheEntryDelete(e){if(!this._cache)return!1;try{return await this._cache.delete(e)}catch(e){return Promise.reject(e)}}async _cacheEntryGet(e){if(this._cache)try{return await this._cache.get(e)}catch(e){return Promise.reject(e)}}async _cacheEntryHas(e){if(!this._cache)return!1;try{return await this._cache.has(e)}catch(e){return!1}}async _cacheEntrySet(e,t,r){if(this._cache)try{return await this._cache.set(e,t,{cacheHeaders:r})}catch(e){return Promise.reject(e)}}async _delete(e,{headers:t={},pathTemplateData:r,queryParams:i={},...s},h){const o=U(this._basePath,e,{optionalPathTemplateRegExp:this._optionalPathTemplateRegExp,pathTemplateCallback:this._pathTemplateCallback,pathTemplateData:r,pathTemplateRegExp:this._pathTemplateRegExp,queryParams:{...this._queryParams,...i}}),c=a(o);return await this._cacheEntryHas(c)&&this._cacheEntryDelete(c),this._fetch(o,{headers:{...this._headers,...t},method:"delete",...s},h)}async _fetch(e,{redirects:t,retries:a,...i},s={}){try{return new Promise(async(r,h)=>{var o,c;const n=setTimeout(()=>{h(new Error(`${b} ${this._fetchTimeout}ms.`))},this._fetchTimeout);if(this._rateLimit(),!(this._rateLimitCount<this._rateLimitPerSecond))return void r(await this._addRequestToRateLimitedQueue(e,{redirects:t,retries:a,...i}));const u=this._performance.now();null===(o=this._log)||void 0===o||o.call(this,"request_sent",{context:{redirects:t,retries:a,url:e,...i,...s},stats:{startTime:u}});const d=await fetch(e,i),l=this._performance.now(),m=l-u;null===(c=this._log)||void 0===c||c.call(this,"response_received",{context:{redirects:t,retries:a,url:e,...i,...s},stats:{duration:m,endTime:l,startTime:u}}),clearTimeout(n);const{headers:_,status:p}=d,T=function(e){switch(!0){case e<200:return"information";case e<300:return"successful";case e<400:return"redirection";case e<500:return"clientError";default:return"serverError"}}(p);if("redirection"===T&&_.get("Location"))return void r(await this._fetchRedirectHandler(_.get("Location"),{redirects:t,status:p,...i}));if("serverError"===T)return void r(await this._fetchRetryHandler(e,{retries:a,...i}));const f=d;try{f.data=d.body?this._bodyParser(await d[this._streamReader]()):void 0,r(f)}catch(t){h([t,new Error(`Unable to ${i.method} ${e} due to previous error`)])}})}catch(e){return{errors:r(e)}}}async _fetchRedirectHandler(e,{method:t,redirects:r=1,status:a,...i}){if(r===this._maxRedirects){return{errors:[new Error(`The request exceeded the maximum number of redirects, which is ${this._maxRedirects}.`)]}}r+=1;const s=303===a?"get":t;return this._fetch(e,{method:s,redirects:r,...i})}async _fetchRetryHandler(e,{retries:t=1,...r}){return t===this._maxRetries?{errors:[new Error(`The request exceeded the maximum number of retries, which is ${this._maxRetries}.`)]}:(t+=1,await(a=this._requestRetryWait,new Promise(e=>setTimeout(e,a))),this._fetch(e,{retries:t,...r}));var a}async _get(e,{headers:t={},pathTemplateData:r,queryParams:i={}},s){const h=U(this._basePath,e,{optionalPathTemplateRegExp:this._optionalPathTemplateRegExp,pathTemplateCallback:this._pathTemplateCallback,pathTemplateData:r,pathTemplateRegExp:this._pathTemplateRegExp,queryParams:{...this._queryParams,...i}}),o=a(h),c=await this._cacheEntryHas(o);if(c){if(function(e){var t,r,a;return!(null!==(t=null==e||null===(r=e.metadata)||void 0===r||null===(a=r.cacheControl)||void 0===a?void 0:a.noCache)&&void 0!==t&&t)&&e.checkTTL()}(c))return{data:await this._cacheEntryGet(o),headers:new Headers({"cache-control":c.printCacheControl()})};if(this._conditionalRequestsEnabled){var n,u;const e=null!==(n=null==c||null===(u=c.metadata)||void 0===u?void 0:u.etag)&&void 0!==n?n:null;e&&(t["If-None-Match"]=e)}}const d=this._trackRequest(o);return d||this._getResolve(o,await this._fetch(h,{headers:{...this._headers,...t},method:"get"},s))}async _getResolve(e,t){const{data:r,headers:a,status:i}=t;if(404===i)this._cacheEntryDelete(e),t.errors||(t.errors=[]),t.errors.push(new Error("The requested resource could not been found."));else if(304===i&&a){const r=await this._cacheEntryGet(e);r&&(this._cacheEntrySet(e,r,{cacheControl:a.get("Cache-Control")||void 0,etag:a.get("ETag")||void 0}),t.data=r)}else r&&a&&this._cacheEntrySet(e,r,{cacheControl:a.get("Cache-Control")||void 0,etag:a.get("ETag")||void 0});return this._resolvePendingRequests(e,t),this._requestTracker.active=this._requestTracker.active.filter(t=>t!==e),t}_rateLimit(){this._rateLimitTimer||(this._rateLimitTimer=setTimeout(()=>{this._rateLimitTimer=null,this._rateLimitCount=0,this._rateLimitedRequestQueue.length&&this._releaseRateLimitedRequestQueue()},1e3)),this._rateLimitCount+=1}_releaseRateLimitedRequestQueue(){this._rateLimitedRequestQueue.forEach(async([e,t,r])=>{e(await this._fetch(t,r))}),this._rateLimitedRequestQueue=[]}async _request(e,{body:t,headers:r,method:a,pathTemplateData:i,queryParams:s,...h},o){const c=U(this._basePath,e,{optionalPathTemplateRegExp:this._optionalPathTemplateRegExp,pathTemplateCallback:this._pathTemplateCallback,pathTemplateData:i,pathTemplateRegExp:this._pathTemplateRegExp,queryParams:{...this._queryParams,...s}});return this._fetch(c,{body:t,headers:{...this._headers,...r},method:a,...h},o)}_resolvePendingRequests(e,t){const r=this._requestTracker.pending.get(e);r&&(r.forEach(({resolve:e})=>{e(t)}),this._requestTracker.pending.delete(e))}_setPendingRequest(e,t){let r=this._requestTracker.pending.get(e);r||(r=[]),r.push(t),this._requestTracker.pending.set(e,r)}_trackRequest(e){if(this._requestTracker.active.includes(e))return new Promise(t=>{this._setPendingRequest(e,{resolve:t})});this._requestTracker.active.push(e)}}export default function(e,t){const r=new z(e);return t?(Object.keys(t).forEach(e=>{r.createShortcut(e,...t[e])}),r):r}export{s as ARRAY_BUFFER_FORMAT,h as BLOB_FORMAT,W as CACHE_CONTROL_HEADER,O as CLIENT_ERROR_REPSONSE,M as COOKIE_HEADER,d as DEFAULT_BODY_PARSER,l as DEFAULT_FETCH_TIMEOUT,m as DEFAULT_HEADERS,_ as DEFAULT_MAX_REDIRECTS,p as DEFAULT_MAX_RETRIES,T as DEFAULT_PATH_TEMPLATE_REGEX,R as DEFAULT_RATE_LIMIT,y as DEFAULT_REQUEST_RETRY_WAIT,L as DELETE_METHOD,Q as ETAG_HEADER,k as FETCH_METHODS,b as FETCH_TIMEOUT_ERROR,o as FORM_DATA_FORMAT,x as GET_METHOD,z as Getta,G as IF_NONE_MATCH_HEADER,D as INFORMATION_REPSONSE,E as INVALID_FETCH_METHOD_ERROR,c as JSON_FORMAT,F as LOCATION_HEADER,v as MAX_REDIRECTS_EXCEEDED_ERROR,q as MAX_RETRIES_EXCEEDED_ERROR,g as MISSING_BASE_PATH_ERROR,H as NOT_FOUND_STATUS_CODE,S as NOT_MODIFIED_STATUS_CODE,f as OPTIONAL_PATH_TEMPLATE_REGEX,w as POST_METHOD,C as PUT_METHOD,A as REDIRECTION_REPSONSE,B as REQUEST_SENT,P as RESOURCE_NOT_FOUND_ERROR,N as RESPONSE_RECEIVED,j as SERVER_ERROR_REPSONSE,u as STREAM_READERS,$ as SUCCESSFUL_REPSONSE,n as TEXT_FORMAT,I as defaultPathTemplateCallback};
|
|
2
2
|
//# sourceMappingURL=index.js.map
|
package/lib/browser/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../getta/src/constants.ts","../getta/src/helpers/default-path-template-callback/index.ts","../getta/src/helpers/build-endpoint/index.ts","../getta/src/main.ts","../getta/src/helpers/get-response-group/index.ts","../getta/src/helpers/delay/index.ts","../getta/src/helpers/is-cacheability-valid/index.ts"],"sourcesContent":["import { PlainObject } from \"@repodog/types\";\n\nexport const ARRAY_BUFFER_FORMAT = \"arrayBuffer\" as const;\nexport const BLOB_FORMAT = \"blob\" as const;\nexport const FORM_DATA_FORMAT = \"formData\" as const;\nexport const JSON_FORMAT = \"json\" as const;\nexport const TEXT_FORMAT = \"text\" as const;\n\nexport const STREAM_READERS = {\n ARRAY_BUFFER_FORMAT,\n BLOB_FORMAT,\n FORM_DATA_FORMAT,\n JSON_FORMAT,\n TEXT_FORMAT,\n};\n\nexport const DEFAULT_BODY_PARSER = (body: PlainObject) => body;\nexport const DEFAULT_FETCH_TIMEOUT = 5000 as const;\nexport const DEFAULT_HEADERS = { \"content-type\": \"application/json\" };\nexport const DEFAULT_MAX_REDIRECTS = 5 as const;\nexport const DEFAULT_MAX_RETRIES = 3 as const;\nexport const DEFAULT_PATH_TEMPLATE_REGEX = /({type})|({id})|({id,\\+})|({brief\\|standard})/g;\nexport const OPTIONAL_PATH_TEMPLATE_REGEX = /({[a-zA-Z0-9_]+\\?})/g;\nexport const DEFAULT_RATE_LIMIT = 50;\nexport const DEFAULT_REQUEST_RETRY_WAIT = 100;\n\nexport const MISSING_BASE_PATH_ERROR = `Getta expected to receive 'basePath' in the constructor options,\n but recevied undefined.`;\n\nexport const MAX_REDIRECTS_EXCEEDED_ERROR = \"The request exceeded the maximum number of redirects, which is\";\n\nexport const MAX_RETRIES_EXCEEDED_ERROR = \"The request exceeded the maximum number of retries, which is\";\n\nexport const INVALID_FETCH_METHOD_ERROR = \"Getta expected to receive 'get', 'post', 'put' or 'delete', but received\";\n\nexport const RESOURCE_NOT_FOUND_ERROR = \"The requested resource could not been found.\";\n\nexport const FETCH_TIMEOUT_ERROR = \"The request timed out. Getta did not get a response within\";\n\nexport const GET_METHOD = \"get\" as const;\nexport const POST_METHOD = \"post\" as const;\nexport const PUT_METHOD = \"put\" as const;\nexport const DELETE_METHOD = \"delete\" as const;\n\nexport const FETCH_METHODS = [GET_METHOD, POST_METHOD, PUT_METHOD, DELETE_METHOD];\n\nexport const INFORMATION_REPSONSE = \"information\" as const;\nexport const SUCCESSFUL_REPSONSE = \"successful\" as const;\nexport const REDIRECTION_REPSONSE = \"redirection\" as const;\nexport const CLIENT_ERROR_REPSONSE = \"clientError\" as const;\nexport const SERVER_ERROR_REPSONSE = \"serverError\" as const;\n\nexport const NOT_MODIFIED_STATUS_CODE = 304 as const;\nexport const NOT_FOUND_STATUS_CODE = 404 as const;\n\nexport const COOKIE_HEADER = \"Cookie\" as const;\nexport const ETAG_HEADER = \"ETag\" as const;\nexport const LOCATION_HEADER = \"Location\" as const;\nexport const IF_NONE_MATCH_HEADER = \"If-None-Match\" as const;\nexport const CACHE_CONTROL_HEADER = \"Cache-Control\" as const;\n","import { StringObject } from \"@repodog/types\";\n\nexport default function defaultPathTemplateCallback(\n pathTemplate: string,\n data: StringObject,\n pathTemplateRegExp: RegExp,\n) {\n const dataKeys = Object.keys(data);\n\n return pathTemplate.replace(pathTemplateRegExp, match => {\n return dataKeys.reduce((value, key) => {\n if (match.includes(key)) return data[key];\n return value;\n }, \"\");\n });\n}\n","import queryString from \"query-string\";\nimport { BuildEndpointOptions } from \"./types\";\n\nexport default function buildEndpoint(\n basePath: string,\n path: string,\n {\n optionalPathTemplateRegExp,\n pathTemplateCallback,\n pathTemplateData,\n pathTemplateRegExp,\n queryParams,\n }: BuildEndpointOptions,\n) {\n const pathJoiner = basePath.endsWith(\"/\") || path.startsWith(\"/\") ? \"\" : \"/\";\n let endpoint = `${basePath}${pathJoiner}${path}`;\n\n if (pathTemplateData) {\n endpoint = pathTemplateCallback(endpoint, pathTemplateData, pathTemplateRegExp);\n }\n\n endpoint = endpoint.replace(optionalPathTemplateRegExp, \"\");\n\n if (endpoint.endsWith(\"/\")) {\n endpoint = endpoint.substring(0, endpoint.length - 1);\n }\n\n if (queryParams && Object.keys(queryParams).length) {\n const queryJoin = queryString.extract(endpoint) ? \"&\" : \"?\";\n endpoint = `${endpoint}${queryJoin}${queryString.stringify(queryParams)}`;\n }\n\n return endpoint;\n}\n","import Cachemap, { CacheHeaders } from \"@cachemap/core\";\nimport { Func, PlainObject, StringObject } from \"@repodog/types\";\nimport Cacheability from \"cacheability\";\nimport { castArray, merge } from \"lodash\";\nimport md5 from \"md5\";\nimport { Required } from \"utility-types\";\nimport {\n CACHE_CONTROL_HEADER,\n DEFAULT_BODY_PARSER,\n DEFAULT_FETCH_TIMEOUT,\n DEFAULT_HEADERS,\n DEFAULT_MAX_REDIRECTS,\n DEFAULT_MAX_RETRIES,\n DEFAULT_PATH_TEMPLATE_REGEX,\n DEFAULT_RATE_LIMIT,\n DEFAULT_REQUEST_RETRY_WAIT,\n DELETE_METHOD,\n ETAG_HEADER,\n FETCH_METHODS,\n FETCH_TIMEOUT_ERROR,\n GET_METHOD,\n IF_NONE_MATCH_HEADER,\n INVALID_FETCH_METHOD_ERROR,\n JSON_FORMAT,\n LOCATION_HEADER,\n MAX_REDIRECTS_EXCEEDED_ERROR,\n MAX_RETRIES_EXCEEDED_ERROR,\n MISSING_BASE_PATH_ERROR,\n NOT_FOUND_STATUS_CODE,\n NOT_MODIFIED_STATUS_CODE,\n OPTIONAL_PATH_TEMPLATE_REGEX,\n POST_METHOD,\n PUT_METHOD,\n REDIRECTION_REPSONSE,\n RESOURCE_NOT_FOUND_ERROR,\n SERVER_ERROR_REPSONSE,\n} from \"./constants\";\nimport buildEndpoint from \"./helpers/build-endpoint\";\nimport defaultPathTemplateCallback from \"./helpers/default-path-template-callback\";\nimport delay from \"./helpers/delay\";\nimport getResponseGroup from \"./helpers/get-response-group\";\nimport isCacheabilityValid from \"./helpers/is-cacheability-valid\";\nimport {\n ConstructorOptions,\n FetchOptions,\n FetchRedirectHandlerOptions,\n FetchResponse,\n PathTemplateCallback,\n PendingRequestResolver,\n PendingRequestResolvers,\n RequestOptions,\n RequestQueue,\n RequestTracker,\n ShortcutProperties,\n Shortcuts,\n StreamReader,\n} from \"./types\";\n\nexport class Getta {\n private _basePath: string;\n private _bodyParser: Func;\n private _cache?: Cachemap;\n private _conditionalRequestsEnabled: boolean;\n private _fetchTimeout: number;\n private _headers: StringObject;\n private _maxRedirects: number;\n private _maxRetries: number;\n private _optionalPathTemplateRegExp: RegExp;\n private _pathTemplateCallback: PathTemplateCallback;\n private _pathTemplateRegExp: RegExp;\n private _queryParams: PlainObject;\n private _rateLimitCount: number = 0;\n private _rateLimitedRequestQueue: RequestQueue = [];\n private _rateLimitPerSecond: number;\n private _rateLimitTimer: NodeJS.Timer | null = null;\n private _requestRetryWait: number;\n private _requestTracker: RequestTracker = { active: [], pending: new Map() };\n private _streamReader: StreamReader;\n\n constructor(options: ConstructorOptions) {\n const {\n basePath,\n bodyParser = DEFAULT_BODY_PARSER,\n cache,\n enableConditionalRequests = true,\n fetchTimeout = DEFAULT_FETCH_TIMEOUT,\n headers,\n maxRedirects = DEFAULT_MAX_REDIRECTS,\n maxRetries = DEFAULT_MAX_RETRIES,\n optionalPathTemplateRegExp = OPTIONAL_PATH_TEMPLATE_REGEX,\n pathTemplateCallback = defaultPathTemplateCallback,\n pathTemplateRegExp = DEFAULT_PATH_TEMPLATE_REGEX,\n queryParams = {},\n rateLimitPerSecond = DEFAULT_RATE_LIMIT,\n requestRetryWait = DEFAULT_REQUEST_RETRY_WAIT,\n streamReader = JSON_FORMAT,\n } = options;\n\n if (!basePath) {\n throw new Error(MISSING_BASE_PATH_ERROR);\n }\n\n this._basePath = basePath;\n this._bodyParser = bodyParser;\n this._cache = cache;\n this._conditionalRequestsEnabled = enableConditionalRequests;\n this._fetchTimeout = fetchTimeout;\n this._headers = { ...DEFAULT_HEADERS, ...(headers || {}) };\n this._maxRedirects = maxRedirects;\n this._maxRetries = maxRetries;\n this._optionalPathTemplateRegExp = optionalPathTemplateRegExp;\n this._pathTemplateCallback = pathTemplateCallback;\n this._pathTemplateRegExp = pathTemplateRegExp;\n this._queryParams = queryParams;\n this._rateLimitPerSecond = rateLimitPerSecond;\n this._requestRetryWait = requestRetryWait;\n this._streamReader = streamReader;\n }\n\n get cache(): Cachemap | undefined {\n return this._cache;\n }\n\n public createShortcut(name: string, path: string, { method, ...rest }: Required<RequestOptions, \"method\">) {\n if (!FETCH_METHODS.includes(method)) {\n throw new Error(`${INVALID_FETCH_METHOD_ERROR} ${method}`);\n }\n\n // @ts-ignore\n this[name] = async <Resource extends PlainObject>({ method: requestMethod, ...requestRest }: RequestOptions = {}) =>\n // @ts-ignore\n this[requestMethod ?? method](path, merge({}, rest, requestRest)) as Promise<FetchResponse<Resource>>;\n }\n\n public async delete(path: string, options: Omit<RequestOptions, \"method\"> = {}) {\n return this._delete(path, options);\n }\n\n public async get(path: string, options: Omit<RequestOptions, \"method\"> = {}) {\n return this._get(path, options);\n }\n\n public async post(path: string, options: Omit<Required<RequestOptions, \"body\">, \"method\">) {\n return this._request(path, { ...options, method: POST_METHOD });\n }\n\n public async put(path: string, options: Omit<Required<RequestOptions, \"body\">, \"methood\">) {\n return this._request(path, { ...options, method: PUT_METHOD });\n }\n\n private _addRequestToRateLimitedQueue(endpoint: string, options: FetchOptions) {\n return new Promise((resolve: (value: FetchResponse) => void) => {\n this._rateLimitedRequestQueue.push([resolve, endpoint, options]);\n });\n }\n\n private async _cacheEntryDelete(requestHash: string): Promise<boolean> {\n if (!this._cache) return false;\n\n try {\n return await this._cache.delete(requestHash);\n } catch (errors) {\n return Promise.reject(errors);\n }\n }\n\n private async _cacheEntryGet(requestHash: string): Promise<PlainObject | undefined> {\n if (!this._cache) return undefined;\n\n try {\n return await this._cache.get(requestHash);\n } catch (errors) {\n return Promise.reject(errors);\n }\n }\n\n private async _cacheEntryHas(requestHash: string): Promise<Cacheability | false> {\n if (!this._cache) return false;\n\n try {\n return await this._cache.has(requestHash);\n } catch (error) {\n return false;\n }\n }\n\n private async _cacheEntrySet(requestHash: string, data: PlainObject, cacheHeaders: CacheHeaders): Promise<void> {\n if (!this._cache) return undefined;\n\n try {\n return await this._cache.set(requestHash, data, { cacheHeaders });\n } catch (error) {\n return Promise.reject(error);\n }\n }\n\n private async _delete(\n path: string,\n { headers = {}, pathTemplateData, queryParams = {}, ...rest }: Omit<RequestOptions, \"method\">,\n ) {\n const endpoint = buildEndpoint(this._basePath, path, {\n optionalPathTemplateRegExp: this._optionalPathTemplateRegExp,\n pathTemplateCallback: this._pathTemplateCallback,\n pathTemplateData,\n pathTemplateRegExp: this._pathTemplateRegExp,\n queryParams: { ...this._queryParams, ...queryParams },\n });\n\n const requestHash = md5(endpoint);\n const cacheability = await this._cacheEntryHas(requestHash);\n\n if (cacheability) {\n this._cacheEntryDelete(requestHash);\n }\n\n return this._fetch(endpoint, {\n headers: { ...this._headers, ...headers },\n method: DELETE_METHOD,\n ...rest,\n });\n }\n\n private async _fetch(endpoint: string, { redirects, retries, ...rest }: FetchOptions): Promise<FetchResponse> {\n try {\n return new Promise(async (resolve: (value: FetchResponse) => void, reject) => {\n const fetchTimer = setTimeout(() => {\n reject(new Error(`${FETCH_TIMEOUT_ERROR} ${this._fetchTimeout}ms.`));\n }, this._fetchTimeout);\n\n this._rateLimit();\n\n if (!(this._rateLimitCount < this._rateLimitPerSecond)) {\n resolve(await this._addRequestToRateLimitedQueue(endpoint, { redirects, retries, ...rest }));\n return;\n }\n\n const res = await fetch(endpoint, rest);\n\n clearTimeout(fetchTimer);\n\n const { headers, status } = res;\n const responseGroup = getResponseGroup(status);\n\n if (responseGroup === REDIRECTION_REPSONSE && headers.get(LOCATION_HEADER)) {\n resolve(\n await this._fetchRedirectHandler(headers.get(LOCATION_HEADER) as string, {\n redirects,\n status,\n ...rest,\n }),\n );\n\n return;\n }\n\n if (responseGroup === SERVER_ERROR_REPSONSE) {\n resolve(\n (await this._fetchRetryHandler(endpoint, {\n retries,\n ...rest,\n })) as FetchResponse,\n );\n\n return;\n }\n\n const fetchRes = res as FetchResponse;\n\n try {\n fetchRes.data = res.body ? this._bodyParser(await res[this._streamReader]()) : undefined;\n resolve(fetchRes);\n } catch (e) {\n reject([e, new Error(`Unable to ${rest.method} ${endpoint} due to previous error`)]);\n }\n });\n } catch (error) {\n const errorRes = { errors: castArray(error) };\n return errorRes as FetchResponse;\n }\n }\n\n private async _fetchRedirectHandler(\n endpoint: string,\n { method, redirects = 1, status, ...rest }: FetchRedirectHandlerOptions,\n ): Promise<FetchResponse> {\n if (redirects === this._maxRedirects) {\n const errorRes = {\n errors: [new Error(`${MAX_REDIRECTS_EXCEEDED_ERROR} ${this._maxRedirects}.`)],\n };\n\n return errorRes as FetchResponse;\n }\n\n redirects += 1;\n const redirectMethod = status === 303 ? GET_METHOD : method;\n return this._fetch(endpoint, { method: redirectMethod, redirects, ...rest });\n }\n\n private async _fetchRetryHandler(endpoint: string, { retries = 1, ...rest }: FetchOptions) {\n if (retries === this._maxRetries) {\n return {\n errors: [new Error(`${MAX_RETRIES_EXCEEDED_ERROR} ${this._maxRetries}.`)],\n };\n }\n\n retries += 1;\n await delay(this._requestRetryWait);\n return this._fetch(endpoint, { retries, ...rest });\n }\n\n private async _get(\n path: string,\n { headers = {}, pathTemplateData, queryParams = {} }: Omit<RequestOptions, \"method\">,\n ) {\n const endpoint = buildEndpoint(this._basePath, path, {\n optionalPathTemplateRegExp: this._optionalPathTemplateRegExp,\n pathTemplateCallback: this._pathTemplateCallback,\n pathTemplateData,\n pathTemplateRegExp: this._pathTemplateRegExp,\n queryParams: { ...this._queryParams, ...queryParams },\n });\n\n const requestHash = md5(endpoint);\n const cacheability = await this._cacheEntryHas(requestHash);\n\n if (cacheability) {\n if (isCacheabilityValid(cacheability)) {\n return {\n data: await this._cacheEntryGet(requestHash),\n headers: new Headers({ \"cache-control\": cacheability.printCacheControl() }),\n };\n }\n\n if (this._conditionalRequestsEnabled) {\n const etag = cacheability?.metadata?.etag ?? null;\n if (etag) headers[IF_NONE_MATCH_HEADER] = etag;\n }\n }\n\n const pendingRequest = this._trackRequest(requestHash);\n if (pendingRequest) return pendingRequest;\n\n return this._getResolve(\n requestHash,\n await this._fetch(endpoint, { headers: { ...this._headers, ...headers }, method: GET_METHOD }),\n );\n }\n\n private async _getResolve(requestHash: string, res: FetchResponse) {\n const { data, headers, status } = res;\n\n if (status === NOT_FOUND_STATUS_CODE) {\n this._cacheEntryDelete(requestHash);\n\n if (!res.errors) {\n res.errors = [];\n }\n\n res.errors.push(new Error(RESOURCE_NOT_FOUND_ERROR));\n } else if (status === NOT_MODIFIED_STATUS_CODE && headers) {\n const cachedData = await this._cacheEntryGet(requestHash);\n\n if (cachedData) {\n this._cacheEntrySet(requestHash, cachedData, {\n cacheControl: headers.get(CACHE_CONTROL_HEADER) || undefined,\n etag: headers.get(ETAG_HEADER) || undefined,\n });\n\n res.data = cachedData;\n }\n } else if (data && headers) {\n this._cacheEntrySet(requestHash, data, {\n cacheControl: headers.get(CACHE_CONTROL_HEADER) || undefined,\n etag: headers.get(ETAG_HEADER) || undefined,\n });\n }\n\n this._resolvePendingRequests(requestHash, res);\n this._requestTracker.active = this._requestTracker.active.filter(value => value !== requestHash);\n return res;\n }\n\n private _rateLimit() {\n if (!this._rateLimitTimer) {\n this._rateLimitTimer = setTimeout(() => {\n this._rateLimitTimer = null;\n this._rateLimitCount = 0;\n\n if (this._rateLimitedRequestQueue.length) {\n this._releaseRateLimitedRequestQueue();\n }\n }, 1000);\n }\n\n this._rateLimitCount += 1;\n }\n\n private _releaseRateLimitedRequestQueue() {\n this._rateLimitedRequestQueue.forEach(async ([resolve, endpoint, options]) => {\n // @ts-ignore\n resolve(await this._fetch(endpoint, options));\n });\n\n this._rateLimitedRequestQueue = [];\n }\n\n private async _request(\n path: string,\n { body, headers, method, pathTemplateData, queryParams, ...rest }: Required<RequestOptions, \"method\">,\n ) {\n const endpoint = buildEndpoint(this._basePath, path, {\n optionalPathTemplateRegExp: this._optionalPathTemplateRegExp,\n pathTemplateCallback: this._pathTemplateCallback,\n pathTemplateData,\n pathTemplateRegExp: this._pathTemplateRegExp,\n queryParams: { ...this._queryParams, ...queryParams },\n });\n\n return this._fetch(endpoint, {\n body,\n headers: { ...this._headers, ...headers },\n method,\n ...rest,\n });\n }\n\n private _resolvePendingRequests(requestHash: string, responseData: FetchResponse) {\n const pendingRequests = this._requestTracker.pending.get(requestHash);\n if (!pendingRequests) return;\n\n pendingRequests.forEach(({ resolve }) => {\n resolve(responseData);\n });\n\n this._requestTracker.pending.delete(requestHash);\n }\n\n private _setPendingRequest(requestHash: string, resolver: PendingRequestResolvers) {\n let pending = this._requestTracker.pending.get(requestHash);\n if (!pending) pending = [];\n pending.push(resolver);\n this._requestTracker.pending.set(requestHash, pending);\n }\n\n private _trackRequest(requestHash: string): Promise<FetchResponse> | void {\n if (this._requestTracker.active.includes(requestHash)) {\n return new Promise((resolve: PendingRequestResolver) => {\n this._setPendingRequest(requestHash, { resolve });\n });\n }\n\n this._requestTracker.active.push(requestHash);\n }\n}\n\nexport default function createRestClient<N extends string>(options: ConstructorOptions, shortcuts?: Shortcuts) {\n const getta = new Getta(options) as Getta & ShortcutProperties<N>;\n if (!shortcuts) return getta;\n\n Object.keys(shortcuts).forEach(key => {\n getta.createShortcut(key, ...shortcuts[key]);\n });\n\n return getta;\n}\n","import {\n CLIENT_ERROR_REPSONSE,\n INFORMATION_REPSONSE,\n REDIRECTION_REPSONSE,\n SERVER_ERROR_REPSONSE,\n SUCCESSFUL_REPSONSE,\n} from \"../../constants\";\n\nexport default function getResponseGroup(status: number) {\n switch (true) {\n case status < 200:\n return INFORMATION_REPSONSE;\n case status < 300:\n return SUCCESSFUL_REPSONSE;\n case status < 400:\n return REDIRECTION_REPSONSE;\n case status < 500:\n return CLIENT_ERROR_REPSONSE;\n default:\n return SERVER_ERROR_REPSONSE;\n }\n}\n","export default function delay(ms: number) {\n return new Promise(resolve => setTimeout(resolve, ms));\n}\n","import Cacheability from \"cacheability\";\n\nexport default function isCacheabilityValid(cacheability: Cacheability) {\n const noCache = cacheability?.metadata?.cacheControl?.noCache ?? false;\n return !noCache && cacheability.checkTTL();\n}\n"],"names":["ARRAY_BUFFER_FORMAT","BLOB_FORMAT","FORM_DATA_FORMAT","JSON_FORMAT","TEXT_FORMAT","STREAM_READERS","DEFAULT_BODY_PARSER","body","DEFAULT_FETCH_TIMEOUT","DEFAULT_HEADERS","DEFAULT_MAX_REDIRECTS","DEFAULT_MAX_RETRIES","DEFAULT_PATH_TEMPLATE_REGEX","OPTIONAL_PATH_TEMPLATE_REGEX","DEFAULT_RATE_LIMIT","DEFAULT_REQUEST_RETRY_WAIT","MISSING_BASE_PATH_ERROR","MAX_REDIRECTS_EXCEEDED_ERROR","MAX_RETRIES_EXCEEDED_ERROR","INVALID_FETCH_METHOD_ERROR","RESOURCE_NOT_FOUND_ERROR","FETCH_TIMEOUT_ERROR","GET_METHOD","POST_METHOD","PUT_METHOD","DELETE_METHOD","FETCH_METHODS","INFORMATION_REPSONSE","SUCCESSFUL_REPSONSE","REDIRECTION_REPSONSE","CLIENT_ERROR_REPSONSE","SERVER_ERROR_REPSONSE","NOT_MODIFIED_STATUS_CODE","NOT_FOUND_STATUS_CODE","COOKIE_HEADER","ETAG_HEADER","LOCATION_HEADER","IF_NONE_MATCH_HEADER","CACHE_CONTROL_HEADER","defaultPathTemplateCallback","pathTemplate","data","pathTemplateRegExp","dataKeys","Object","keys","replace","match","reduce","value","key","includes","buildEndpoint","basePath","path","optionalPathTemplateRegExp","pathTemplateCallback","pathTemplateData","queryParams","pathJoiner","endsWith","startsWith","endpoint","substring","length","queryString","extract","stringify","Getta","constructor","options","active","pending","Map","bodyParser","cache","enableConditionalRequests","fetchTimeout","headers","maxRedirects","maxRetries","rateLimitPerSecond","requestRetryWait","streamReader","Error","_basePath","_bodyParser","_cache","_conditionalRequestsEnabled","_fetchTimeout","_headers","_maxRedirects","_maxRetries","_optionalPathTemplateRegExp","_pathTemplateCallback","_pathTemplateRegExp","_queryParams","_rateLimitPerSecond","_requestRetryWait","_streamReader","this","createShortcut","name","method","rest","async","requestMethod","requestRest","_merge","_delete","_get","_request","_addRequestToRateLimitedQueue","Promise","resolve","_rateLimitedRequestQueue","push","requestHash","delete","errors","reject","get","has","error","cacheHeaders","set","md5","_cacheEntryHas","_cacheEntryDelete","_fetch","redirects","retries","fetchTimer","setTimeout","_rateLimit","_rateLimitCount","res","fetch","clearTimeout","status","responseGroup","getResponseGroup","_fetchRedirectHandler","_fetchRetryHandler","fetchRes","undefined","e","_castArray","redirectMethod","ms","cacheability","metadata","_cacheability$metadat2","cacheControl","_cacheability$metadat3","noCache","checkTTL","isCacheabilityValid","_cacheEntryGet","Headers","printCacheControl","etag","pendingRequest","_trackRequest","_getResolve","cachedData","_cacheEntrySet","_resolvePendingRequests","_requestTracker","filter","_rateLimitTimer","_releaseRateLimitedRequestQueue","forEach","responseData","pendingRequests","_setPendingRequest","resolver","shortcuts","getta"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../getta/src/constants.ts","../getta/src/helpers/default-path-template-callback/index.ts","../getta/src/helpers/build-endpoint/index.ts","../getta/src/main.ts","../getta/src/helpers/get-response-group/index.ts","../getta/src/helpers/delay/index.ts","../getta/src/helpers/is-cacheability-valid/index.ts"],"sourcesContent":["import { PlainObject } from \"@repodog/types\";\n\nexport const ARRAY_BUFFER_FORMAT = \"arrayBuffer\" as const;\nexport const BLOB_FORMAT = \"blob\" as const;\nexport const FORM_DATA_FORMAT = \"formData\" as const;\nexport const JSON_FORMAT = \"json\" as const;\nexport const TEXT_FORMAT = \"text\" as const;\n\nexport const STREAM_READERS = {\n ARRAY_BUFFER_FORMAT,\n BLOB_FORMAT,\n FORM_DATA_FORMAT,\n JSON_FORMAT,\n TEXT_FORMAT,\n};\n\nexport const DEFAULT_BODY_PARSER = (body: PlainObject) => body;\nexport const DEFAULT_FETCH_TIMEOUT = 5000 as const;\nexport const DEFAULT_HEADERS = { \"content-type\": \"application/json\" };\nexport const DEFAULT_MAX_REDIRECTS = 5 as const;\nexport const DEFAULT_MAX_RETRIES = 3 as const;\nexport const DEFAULT_PATH_TEMPLATE_REGEX = /({type})|({id})|({id,\\+})|({brief\\|standard})/g;\nexport const OPTIONAL_PATH_TEMPLATE_REGEX = /({[a-zA-Z0-9_]+\\?})/g;\nexport const DEFAULT_RATE_LIMIT = 50;\nexport const DEFAULT_REQUEST_RETRY_WAIT = 100;\n\nexport const MISSING_BASE_PATH_ERROR = `Getta expected to receive 'basePath' in the constructor options,\n but recevied undefined.`;\n\nexport const MAX_REDIRECTS_EXCEEDED_ERROR = \"The request exceeded the maximum number of redirects, which is\";\n\nexport const MAX_RETRIES_EXCEEDED_ERROR = \"The request exceeded the maximum number of retries, which is\";\n\nexport const INVALID_FETCH_METHOD_ERROR = \"Getta expected to receive 'get', 'post', 'put' or 'delete', but received\";\n\nexport const RESOURCE_NOT_FOUND_ERROR = \"The requested resource could not been found.\";\n\nexport const FETCH_TIMEOUT_ERROR = \"The request timed out. Getta did not get a response within\";\n\nexport const GET_METHOD = \"get\" as const;\nexport const POST_METHOD = \"post\" as const;\nexport const PUT_METHOD = \"put\" as const;\nexport const DELETE_METHOD = \"delete\" as const;\n\nexport const FETCH_METHODS = [GET_METHOD, POST_METHOD, PUT_METHOD, DELETE_METHOD];\n\nexport const INFORMATION_REPSONSE = \"information\" as const;\nexport const SUCCESSFUL_REPSONSE = \"successful\" as const;\nexport const REDIRECTION_REPSONSE = \"redirection\" as const;\nexport const CLIENT_ERROR_REPSONSE = \"clientError\" as const;\nexport const SERVER_ERROR_REPSONSE = \"serverError\" as const;\n\nexport const NOT_MODIFIED_STATUS_CODE = 304 as const;\nexport const NOT_FOUND_STATUS_CODE = 404 as const;\n\nexport const COOKIE_HEADER = \"Cookie\" as const;\nexport const ETAG_HEADER = \"ETag\" as const;\nexport const LOCATION_HEADER = \"Location\" as const;\nexport const IF_NONE_MATCH_HEADER = \"If-None-Match\" as const;\nexport const CACHE_CONTROL_HEADER = \"Cache-Control\" as const;\n\nexport const REQUEST_SENT = \"request_sent\" as const;\nexport const RESPONSE_RECEIVED = \"response_received\" as const;\n","import { StringObject } from \"@repodog/types\";\n\nexport default function defaultPathTemplateCallback(\n pathTemplate: string,\n data: StringObject,\n pathTemplateRegExp: RegExp,\n) {\n const dataKeys = Object.keys(data);\n\n return pathTemplate.replace(pathTemplateRegExp, match => {\n return dataKeys.reduce((value, key) => {\n if (match.includes(key)) return data[key];\n return value;\n }, \"\");\n });\n}\n","import queryString from \"query-string\";\nimport { BuildEndpointOptions } from \"./types\";\n\nexport default function buildEndpoint(\n basePath: string,\n path: string,\n {\n optionalPathTemplateRegExp,\n pathTemplateCallback,\n pathTemplateData,\n pathTemplateRegExp,\n queryParams,\n }: BuildEndpointOptions,\n) {\n const pathJoiner = basePath.endsWith(\"/\") || path.startsWith(\"/\") ? \"\" : \"/\";\n let endpoint = `${basePath}${pathJoiner}${path}`;\n\n if (pathTemplateData) {\n endpoint = pathTemplateCallback(endpoint, pathTemplateData, pathTemplateRegExp);\n }\n\n endpoint = endpoint.replace(optionalPathTemplateRegExp, \"\");\n\n if (endpoint.endsWith(\"/\")) {\n endpoint = endpoint.substring(0, endpoint.length - 1);\n }\n\n if (queryParams && Object.keys(queryParams).length) {\n const queryJoin = queryString.extract(endpoint) ? \"&\" : \"?\";\n endpoint = `${endpoint}${queryJoin}${queryString.stringify(queryParams)}`;\n }\n\n return endpoint;\n}\n","import Cachemap, { CacheHeaders } from \"@cachemap/core\";\nimport { Func, PlainObject, StringObject } from \"@repodog/types\";\nimport Cacheability from \"cacheability\";\nimport { castArray, merge } from \"lodash\";\nimport md5 from \"md5\";\nimport { Required } from \"utility-types\";\nimport {\n CACHE_CONTROL_HEADER,\n DEFAULT_BODY_PARSER,\n DEFAULT_FETCH_TIMEOUT,\n DEFAULT_HEADERS,\n DEFAULT_MAX_REDIRECTS,\n DEFAULT_MAX_RETRIES,\n DEFAULT_PATH_TEMPLATE_REGEX,\n DEFAULT_RATE_LIMIT,\n DEFAULT_REQUEST_RETRY_WAIT,\n DELETE_METHOD,\n ETAG_HEADER,\n FETCH_METHODS,\n FETCH_TIMEOUT_ERROR,\n GET_METHOD,\n IF_NONE_MATCH_HEADER,\n INVALID_FETCH_METHOD_ERROR,\n JSON_FORMAT,\n LOCATION_HEADER,\n MAX_REDIRECTS_EXCEEDED_ERROR,\n MAX_RETRIES_EXCEEDED_ERROR,\n MISSING_BASE_PATH_ERROR,\n NOT_FOUND_STATUS_CODE,\n NOT_MODIFIED_STATUS_CODE,\n OPTIONAL_PATH_TEMPLATE_REGEX,\n POST_METHOD,\n PUT_METHOD,\n REDIRECTION_REPSONSE,\n REQUEST_SENT,\n RESOURCE_NOT_FOUND_ERROR,\n RESPONSE_RECEIVED,\n SERVER_ERROR_REPSONSE,\n} from \"./constants\";\nimport buildEndpoint from \"./helpers/build-endpoint\";\nimport defaultPathTemplateCallback from \"./helpers/default-path-template-callback\";\nimport delay from \"./helpers/delay\";\nimport getResponseGroup from \"./helpers/get-response-group\";\nimport isCacheabilityValid from \"./helpers/is-cacheability-valid\";\nimport {\n ConstructorOptions,\n FetchOptions,\n FetchRedirectHandlerOptions,\n FetchResponse,\n Log,\n PathTemplateCallback,\n PendingRequestResolver,\n PendingRequestResolvers,\n Performance,\n RequestOptions,\n RequestQueue,\n RequestTracker,\n ShortcutProperties,\n Shortcuts,\n StreamReader,\n} from \"./types\";\n\nexport class Getta {\n private _basePath: string;\n private _bodyParser: Func;\n private _cache?: Cachemap;\n private _conditionalRequestsEnabled: boolean;\n private _fetchTimeout: number;\n private _headers: StringObject;\n private _log: Log | undefined;\n private _maxRedirects: number;\n private _maxRetries: number;\n private _optionalPathTemplateRegExp: RegExp;\n private _pathTemplateCallback: PathTemplateCallback;\n private _pathTemplateRegExp: RegExp;\n private _performance: Performance;\n private _queryParams: PlainObject;\n private _rateLimitCount: number = 0;\n private _rateLimitedRequestQueue: RequestQueue = [];\n private _rateLimitPerSecond: number;\n private _rateLimitTimer: NodeJS.Timer | null = null;\n private _requestRetryWait: number;\n private _requestTracker: RequestTracker = { active: [], pending: new Map() };\n private _streamReader: StreamReader;\n\n constructor(options: ConstructorOptions) {\n const {\n basePath,\n bodyParser = DEFAULT_BODY_PARSER,\n cache,\n enableConditionalRequests = true,\n fetchTimeout = DEFAULT_FETCH_TIMEOUT,\n headers,\n log,\n maxRedirects = DEFAULT_MAX_REDIRECTS,\n maxRetries = DEFAULT_MAX_RETRIES,\n optionalPathTemplateRegExp = OPTIONAL_PATH_TEMPLATE_REGEX,\n pathTemplateCallback = defaultPathTemplateCallback,\n pathTemplateRegExp = DEFAULT_PATH_TEMPLATE_REGEX,\n performance,\n queryParams = {},\n rateLimitPerSecond = DEFAULT_RATE_LIMIT,\n requestRetryWait = DEFAULT_REQUEST_RETRY_WAIT,\n streamReader = JSON_FORMAT,\n } = options;\n\n if (!basePath) {\n throw new Error(MISSING_BASE_PATH_ERROR);\n }\n\n this._basePath = basePath;\n this._bodyParser = bodyParser;\n this._cache = cache;\n this._conditionalRequestsEnabled = enableConditionalRequests;\n this._fetchTimeout = fetchTimeout;\n this._headers = { ...DEFAULT_HEADERS, ...(headers || {}) };\n this._log = log;\n this._maxRedirects = maxRedirects;\n this._maxRetries = maxRetries;\n this._optionalPathTemplateRegExp = optionalPathTemplateRegExp;\n this._pathTemplateCallback = pathTemplateCallback;\n this._pathTemplateRegExp = pathTemplateRegExp;\n this._performance = performance;\n this._queryParams = queryParams;\n this._rateLimitPerSecond = rateLimitPerSecond;\n this._requestRetryWait = requestRetryWait;\n this._streamReader = streamReader;\n }\n\n get cache(): Cachemap | undefined {\n return this._cache;\n }\n\n public createShortcut(name: string, path: string, { method, ...rest }: Required<RequestOptions, \"method\">) {\n if (!FETCH_METHODS.includes(method)) {\n throw new Error(`${INVALID_FETCH_METHOD_ERROR} ${method}`);\n }\n\n // @ts-ignore\n this[name] = async <Resource extends PlainObject>({ method: requestMethod, ...requestRest }: RequestOptions = {}) =>\n // @ts-ignore\n this[requestMethod ?? method](path, merge({}, rest, requestRest)) as Promise<FetchResponse<Resource>>;\n }\n\n public async delete(path: string, options: Omit<RequestOptions, \"method\"> = {}, context?: PlainObject) {\n return this._delete(path, options, context);\n }\n\n public async get(path: string, options: Omit<RequestOptions, \"method\"> = {}, context?: PlainObject) {\n return this._get(path, options, context);\n }\n\n public async post(path: string, options: Omit<Required<RequestOptions, \"body\">, \"method\">, context?: PlainObject) {\n return this._request(path, { ...options, method: POST_METHOD }, context);\n }\n\n public async put(path: string, options: Omit<Required<RequestOptions, \"body\">, \"methood\">, context?: PlainObject) {\n return this._request(path, { ...options, method: PUT_METHOD }, context);\n }\n\n private _addRequestToRateLimitedQueue(endpoint: string, options: FetchOptions) {\n return new Promise((resolve: (value: FetchResponse) => void) => {\n this._rateLimitedRequestQueue.push([resolve, endpoint, options]);\n });\n }\n\n private async _cacheEntryDelete(requestHash: string): Promise<boolean> {\n if (!this._cache) return false;\n\n try {\n return await this._cache.delete(requestHash);\n } catch (errors) {\n return Promise.reject(errors);\n }\n }\n\n private async _cacheEntryGet(requestHash: string): Promise<PlainObject | undefined> {\n if (!this._cache) return undefined;\n\n try {\n return await this._cache.get(requestHash);\n } catch (errors) {\n return Promise.reject(errors);\n }\n }\n\n private async _cacheEntryHas(requestHash: string): Promise<Cacheability | false> {\n if (!this._cache) return false;\n\n try {\n return await this._cache.has(requestHash);\n } catch (error) {\n return false;\n }\n }\n\n private async _cacheEntrySet(requestHash: string, data: PlainObject, cacheHeaders: CacheHeaders): Promise<void> {\n if (!this._cache) return undefined;\n\n try {\n return await this._cache.set(requestHash, data, { cacheHeaders });\n } catch (error) {\n return Promise.reject(error);\n }\n }\n\n private async _delete(\n path: string,\n { headers = {}, pathTemplateData, queryParams = {}, ...rest }: Omit<RequestOptions, \"method\">,\n context?: PlainObject,\n ) {\n const endpoint = buildEndpoint(this._basePath, path, {\n optionalPathTemplateRegExp: this._optionalPathTemplateRegExp,\n pathTemplateCallback: this._pathTemplateCallback,\n pathTemplateData,\n pathTemplateRegExp: this._pathTemplateRegExp,\n queryParams: { ...this._queryParams, ...queryParams },\n });\n\n const requestHash = md5(endpoint);\n const cacheability = await this._cacheEntryHas(requestHash);\n\n if (cacheability) {\n this._cacheEntryDelete(requestHash);\n }\n\n return this._fetch(\n endpoint,\n {\n headers: { ...this._headers, ...headers },\n method: DELETE_METHOD,\n ...rest,\n },\n context,\n );\n }\n\n private async _fetch(\n endpoint: string,\n { redirects, retries, ...rest }: FetchOptions,\n context: PlainObject = {},\n ): Promise<FetchResponse> {\n try {\n return new Promise(async (resolve: (value: FetchResponse) => void, reject) => {\n const fetchTimer = setTimeout(() => {\n reject(new Error(`${FETCH_TIMEOUT_ERROR} ${this._fetchTimeout}ms.`));\n }, this._fetchTimeout);\n\n this._rateLimit();\n\n if (!(this._rateLimitCount < this._rateLimitPerSecond)) {\n resolve(await this._addRequestToRateLimitedQueue(endpoint, { redirects, retries, ...rest }));\n return;\n }\n\n const startTime = this._performance.now();\n\n this._log?.(REQUEST_SENT, {\n context: { redirects, retries, url: endpoint, ...rest, ...context },\n stats: { startTime },\n });\n\n const res = await fetch(endpoint, rest);\n\n const endTime = this._performance.now();\n const duration = endTime - startTime;\n\n this._log?.(RESPONSE_RECEIVED, {\n context: { redirects, retries, url: endpoint, ...rest, ...context },\n stats: { duration, endTime, startTime },\n });\n\n clearTimeout(fetchTimer);\n\n const { headers, status } = res;\n const responseGroup = getResponseGroup(status);\n\n if (responseGroup === REDIRECTION_REPSONSE && headers.get(LOCATION_HEADER)) {\n resolve(\n await this._fetchRedirectHandler(headers.get(LOCATION_HEADER) as string, {\n redirects,\n status,\n ...rest,\n }),\n );\n\n return;\n }\n\n if (responseGroup === SERVER_ERROR_REPSONSE) {\n resolve(\n (await this._fetchRetryHandler(endpoint, {\n retries,\n ...rest,\n })) as FetchResponse,\n );\n\n return;\n }\n\n const fetchRes = res as FetchResponse;\n\n try {\n fetchRes.data = res.body ? this._bodyParser(await res[this._streamReader]()) : undefined;\n resolve(fetchRes);\n } catch (e) {\n reject([e, new Error(`Unable to ${rest.method} ${endpoint} due to previous error`)]);\n }\n });\n } catch (error) {\n const errorRes = { errors: castArray(error) };\n return errorRes as FetchResponse;\n }\n }\n\n private async _fetchRedirectHandler(\n endpoint: string,\n { method, redirects = 1, status, ...rest }: FetchRedirectHandlerOptions,\n ): Promise<FetchResponse> {\n if (redirects === this._maxRedirects) {\n const errorRes = {\n errors: [new Error(`${MAX_REDIRECTS_EXCEEDED_ERROR} ${this._maxRedirects}.`)],\n };\n\n return errorRes as FetchResponse;\n }\n\n redirects += 1;\n const redirectMethod = status === 303 ? GET_METHOD : method;\n return this._fetch(endpoint, { method: redirectMethod, redirects, ...rest });\n }\n\n private async _fetchRetryHandler(endpoint: string, { retries = 1, ...rest }: FetchOptions) {\n if (retries === this._maxRetries) {\n return {\n errors: [new Error(`${MAX_RETRIES_EXCEEDED_ERROR} ${this._maxRetries}.`)],\n };\n }\n\n retries += 1;\n await delay(this._requestRetryWait);\n return this._fetch(endpoint, { retries, ...rest });\n }\n\n private async _get(\n path: string,\n { headers = {}, pathTemplateData, queryParams = {} }: Omit<RequestOptions, \"method\">,\n context?: PlainObject,\n ) {\n const endpoint = buildEndpoint(this._basePath, path, {\n optionalPathTemplateRegExp: this._optionalPathTemplateRegExp,\n pathTemplateCallback: this._pathTemplateCallback,\n pathTemplateData,\n pathTemplateRegExp: this._pathTemplateRegExp,\n queryParams: { ...this._queryParams, ...queryParams },\n });\n\n const requestHash = md5(endpoint);\n const cacheability = await this._cacheEntryHas(requestHash);\n\n if (cacheability) {\n if (isCacheabilityValid(cacheability)) {\n return {\n data: await this._cacheEntryGet(requestHash),\n headers: new Headers({ \"cache-control\": cacheability.printCacheControl() }),\n };\n }\n\n if (this._conditionalRequestsEnabled) {\n const etag = cacheability?.metadata?.etag ?? null;\n if (etag) headers[IF_NONE_MATCH_HEADER] = etag;\n }\n }\n\n const pendingRequest = this._trackRequest(requestHash);\n if (pendingRequest) return pendingRequest;\n\n return this._getResolve(\n requestHash,\n await this._fetch(endpoint, { headers: { ...this._headers, ...headers }, method: GET_METHOD }, context),\n );\n }\n\n private async _getResolve(requestHash: string, res: FetchResponse) {\n const { data, headers, status } = res;\n\n if (status === NOT_FOUND_STATUS_CODE) {\n this._cacheEntryDelete(requestHash);\n\n if (!res.errors) {\n res.errors = [];\n }\n\n res.errors.push(new Error(RESOURCE_NOT_FOUND_ERROR));\n } else if (status === NOT_MODIFIED_STATUS_CODE && headers) {\n const cachedData = await this._cacheEntryGet(requestHash);\n\n if (cachedData) {\n this._cacheEntrySet(requestHash, cachedData, {\n cacheControl: headers.get(CACHE_CONTROL_HEADER) || undefined,\n etag: headers.get(ETAG_HEADER) || undefined,\n });\n\n res.data = cachedData;\n }\n } else if (data && headers) {\n this._cacheEntrySet(requestHash, data, {\n cacheControl: headers.get(CACHE_CONTROL_HEADER) || undefined,\n etag: headers.get(ETAG_HEADER) || undefined,\n });\n }\n\n this._resolvePendingRequests(requestHash, res);\n this._requestTracker.active = this._requestTracker.active.filter(value => value !== requestHash);\n return res;\n }\n\n private _rateLimit() {\n if (!this._rateLimitTimer) {\n this._rateLimitTimer = setTimeout(() => {\n this._rateLimitTimer = null;\n this._rateLimitCount = 0;\n\n if (this._rateLimitedRequestQueue.length) {\n this._releaseRateLimitedRequestQueue();\n }\n }, 1000);\n }\n\n this._rateLimitCount += 1;\n }\n\n private _releaseRateLimitedRequestQueue() {\n this._rateLimitedRequestQueue.forEach(async ([resolve, endpoint, options]) => {\n // @ts-ignore\n resolve(await this._fetch(endpoint, options));\n });\n\n this._rateLimitedRequestQueue = [];\n }\n\n private async _request(\n path: string,\n { body, headers, method, pathTemplateData, queryParams, ...rest }: Required<RequestOptions, \"method\">,\n context?: PlainObject,\n ) {\n const endpoint = buildEndpoint(this._basePath, path, {\n optionalPathTemplateRegExp: this._optionalPathTemplateRegExp,\n pathTemplateCallback: this._pathTemplateCallback,\n pathTemplateData,\n pathTemplateRegExp: this._pathTemplateRegExp,\n queryParams: { ...this._queryParams, ...queryParams },\n });\n\n return this._fetch(\n endpoint,\n {\n body,\n headers: { ...this._headers, ...headers },\n method,\n ...rest,\n },\n context,\n );\n }\n\n private _resolvePendingRequests(requestHash: string, responseData: FetchResponse) {\n const pendingRequests = this._requestTracker.pending.get(requestHash);\n if (!pendingRequests) return;\n\n pendingRequests.forEach(({ resolve }) => {\n resolve(responseData);\n });\n\n this._requestTracker.pending.delete(requestHash);\n }\n\n private _setPendingRequest(requestHash: string, resolver: PendingRequestResolvers) {\n let pending = this._requestTracker.pending.get(requestHash);\n if (!pending) pending = [];\n pending.push(resolver);\n this._requestTracker.pending.set(requestHash, pending);\n }\n\n private _trackRequest(requestHash: string): Promise<FetchResponse> | void {\n if (this._requestTracker.active.includes(requestHash)) {\n return new Promise((resolve: PendingRequestResolver) => {\n this._setPendingRequest(requestHash, { resolve });\n });\n }\n\n this._requestTracker.active.push(requestHash);\n }\n}\n\nexport default function createRestClient<N extends string>(options: ConstructorOptions, shortcuts?: Shortcuts) {\n const getta = new Getta(options) as Getta & ShortcutProperties<N>;\n if (!shortcuts) return getta;\n\n Object.keys(shortcuts).forEach(key => {\n getta.createShortcut(key, ...shortcuts[key]);\n });\n\n return getta;\n}\n","import {\n CLIENT_ERROR_REPSONSE,\n INFORMATION_REPSONSE,\n REDIRECTION_REPSONSE,\n SERVER_ERROR_REPSONSE,\n SUCCESSFUL_REPSONSE,\n} from \"../../constants\";\n\nexport default function getResponseGroup(status: number) {\n switch (true) {\n case status < 200:\n return INFORMATION_REPSONSE;\n case status < 300:\n return SUCCESSFUL_REPSONSE;\n case status < 400:\n return REDIRECTION_REPSONSE;\n case status < 500:\n return CLIENT_ERROR_REPSONSE;\n default:\n return SERVER_ERROR_REPSONSE;\n }\n}\n","export default function delay(ms: number) {\n return new Promise(resolve => setTimeout(resolve, ms));\n}\n","import Cacheability from \"cacheability\";\n\nexport default function isCacheabilityValid(cacheability: Cacheability) {\n const noCache = cacheability?.metadata?.cacheControl?.noCache ?? false;\n return !noCache && cacheability.checkTTL();\n}\n"],"names":["ARRAY_BUFFER_FORMAT","BLOB_FORMAT","FORM_DATA_FORMAT","JSON_FORMAT","TEXT_FORMAT","STREAM_READERS","DEFAULT_BODY_PARSER","body","DEFAULT_FETCH_TIMEOUT","DEFAULT_HEADERS","DEFAULT_MAX_REDIRECTS","DEFAULT_MAX_RETRIES","DEFAULT_PATH_TEMPLATE_REGEX","OPTIONAL_PATH_TEMPLATE_REGEX","DEFAULT_RATE_LIMIT","DEFAULT_REQUEST_RETRY_WAIT","MISSING_BASE_PATH_ERROR","MAX_REDIRECTS_EXCEEDED_ERROR","MAX_RETRIES_EXCEEDED_ERROR","INVALID_FETCH_METHOD_ERROR","RESOURCE_NOT_FOUND_ERROR","FETCH_TIMEOUT_ERROR","GET_METHOD","POST_METHOD","PUT_METHOD","DELETE_METHOD","FETCH_METHODS","INFORMATION_REPSONSE","SUCCESSFUL_REPSONSE","REDIRECTION_REPSONSE","CLIENT_ERROR_REPSONSE","SERVER_ERROR_REPSONSE","NOT_MODIFIED_STATUS_CODE","NOT_FOUND_STATUS_CODE","COOKIE_HEADER","ETAG_HEADER","LOCATION_HEADER","IF_NONE_MATCH_HEADER","CACHE_CONTROL_HEADER","REQUEST_SENT","RESPONSE_RECEIVED","defaultPathTemplateCallback","pathTemplate","data","pathTemplateRegExp","dataKeys","Object","keys","replace","match","reduce","value","key","includes","buildEndpoint","basePath","path","optionalPathTemplateRegExp","pathTemplateCallback","pathTemplateData","queryParams","pathJoiner","endsWith","startsWith","endpoint","substring","length","queryString","extract","stringify","Getta","constructor","options","active","pending","Map","bodyParser","cache","enableConditionalRequests","fetchTimeout","headers","log","maxRedirects","maxRetries","performance","rateLimitPerSecond","requestRetryWait","streamReader","Error","_basePath","_bodyParser","_cache","_conditionalRequestsEnabled","_fetchTimeout","_headers","_log","_maxRedirects","_maxRetries","_optionalPathTemplateRegExp","_pathTemplateCallback","_pathTemplateRegExp","_performance","_queryParams","_rateLimitPerSecond","_requestRetryWait","_streamReader","this","createShortcut","name","method","rest","async","requestMethod","requestRest","_merge","context","_delete","_get","_request","_addRequestToRateLimitedQueue","Promise","resolve","_rateLimitedRequestQueue","push","requestHash","delete","errors","reject","get","has","error","cacheHeaders","set","md5","_cacheEntryHas","_cacheEntryDelete","_fetch","redirects","retries","fetchTimer","setTimeout","_rateLimit","_rateLimitCount","startTime","now","url","stats","res","fetch","endTime","duration","clearTimeout","status","responseGroup","getResponseGroup","_fetchRedirectHandler","_fetchRetryHandler","fetchRes","undefined","e","_castArray","redirectMethod","ms","cacheability","metadata","_cacheability$metadat2","cacheControl","_cacheability$metadat3","noCache","checkTTL","isCacheabilityValid","_cacheEntryGet","Headers","printCacheControl","etag","pendingRequest","_trackRequest","_getResolve","cachedData","_cacheEntrySet","_resolvePendingRequests","_requestTracker","filter","_rateLimitTimer","_releaseRateLimitedRequestQueue","forEach","responseData","pendingRequests","_setPendingRequest","resolver","shortcuts","getta"],"mappings":"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"}
|
|
@@ -1,26 +1,26 @@
|
|
|
1
1
|
-----------------------------
|
|
2
2
|
Rollup File Analysis
|
|
3
3
|
-----------------------------
|
|
4
|
-
bundle size:
|
|
5
|
-
original size:
|
|
6
|
-
code reduction: 22.
|
|
4
|
+
bundle size: 18.065 KB
|
|
5
|
+
original size: 23.189 KB
|
|
6
|
+
code reduction: 22.1 %
|
|
7
7
|
module count: 9
|
|
8
8
|
|
|
9
|
-
|
|
9
|
+
██████████████████████████████████████░░░░░░░░░░░░
|
|
10
10
|
file: /src/main.ts
|
|
11
|
-
bundle space: 75
|
|
12
|
-
rendered size:
|
|
13
|
-
original size:
|
|
14
|
-
code reduction:
|
|
11
|
+
bundle space: 76.75 %
|
|
12
|
+
rendered size: 13.864 KB
|
|
13
|
+
original size: 15.726 KB
|
|
14
|
+
code reduction: 11.84 %
|
|
15
15
|
dependents: 1
|
|
16
16
|
- /src/index.ts
|
|
17
17
|
|
|
18
18
|
█████░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
|
|
19
19
|
file: /src/constants.ts
|
|
20
|
-
bundle space: 11.
|
|
21
|
-
rendered size:
|
|
22
|
-
original size: 2.
|
|
23
|
-
code reduction: 21
|
|
20
|
+
bundle space: 11.44 %
|
|
21
|
+
rendered size: 2.067 KB
|
|
22
|
+
original size: 2.657 KB
|
|
23
|
+
code reduction: 22.21 %
|
|
24
24
|
dependents: 3
|
|
25
25
|
- /src/helpers/get-response-group/index.ts
|
|
26
26
|
- /src/main.ts
|
|
@@ -28,7 +28,7 @@ dependents: 3
|
|
|
28
28
|
|
|
29
29
|
██░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
|
|
30
30
|
file: /src/helpers/build-endpoint/index.ts
|
|
31
|
-
bundle space: 4.
|
|
31
|
+
bundle space: 4.37 %
|
|
32
32
|
rendered size: 790 Bytes
|
|
33
33
|
original size: 955 Bytes
|
|
34
34
|
code reduction: 17.28 %
|
|
@@ -37,16 +37,16 @@ dependents: 1
|
|
|
37
37
|
|
|
38
38
|
█░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
|
|
39
39
|
file: /src/helpers/is-cacheability-valid/index.ts
|
|
40
|
-
bundle space: 3.
|
|
40
|
+
bundle space: 3.37 %
|
|
41
41
|
rendered size: 609 Bytes
|
|
42
42
|
original size: 238 Bytes
|
|
43
43
|
code reduction: 0 %
|
|
44
44
|
dependents: 1
|
|
45
45
|
- /src/main.ts
|
|
46
46
|
|
|
47
|
-
|
|
47
|
+
░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
|
|
48
48
|
file: /src/helpers/get-response-group/index.ts
|
|
49
|
-
bundle space:
|
|
49
|
+
bundle space: 1.9 %
|
|
50
50
|
rendered size: 344 Bytes
|
|
51
51
|
original size: 521 Bytes
|
|
52
52
|
code reduction: 33.97 %
|
|
@@ -55,7 +55,7 @@ dependents: 1
|
|
|
55
55
|
|
|
56
56
|
░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
|
|
57
57
|
file: /src/helpers/default-path-template-callback/index.ts
|
|
58
|
-
bundle space: 1.
|
|
58
|
+
bundle space: 1.72 %
|
|
59
59
|
rendered size: 311 Bytes
|
|
60
60
|
original size: 415 Bytes
|
|
61
61
|
code reduction: 25.06 %
|
|
@@ -65,7 +65,7 @@ dependents: 2
|
|
|
65
65
|
|
|
66
66
|
░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
|
|
67
67
|
file: /src/helpers/delay/index.ts
|
|
68
|
-
bundle space: 0.
|
|
68
|
+
bundle space: 0.44 %
|
|
69
69
|
rendered size: 80 Bytes
|
|
70
70
|
original size: 104 Bytes
|
|
71
71
|
code reduction: 23.08 %
|
|
@@ -76,7 +76,7 @@ dependents: 1
|
|
|
76
76
|
file: /src/types.ts
|
|
77
77
|
bundle space: 0 %
|
|
78
78
|
rendered size: 0 Byte
|
|
79
|
-
original size: 2.
|
|
79
|
+
original size: 2.379 KB
|
|
80
80
|
code reduction: 100 %
|
|
81
81
|
dependents: 1
|
|
82
82
|
- /src/index.ts
|
package/lib/main/constants.js
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
Object.defineProperty(exports, "__esModule", {
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
|
-
exports.CACHE_CONTROL_HEADER = exports.IF_NONE_MATCH_HEADER = exports.LOCATION_HEADER = exports.ETAG_HEADER = exports.COOKIE_HEADER = exports.NOT_FOUND_STATUS_CODE = exports.NOT_MODIFIED_STATUS_CODE = exports.SERVER_ERROR_REPSONSE = exports.CLIENT_ERROR_REPSONSE = exports.REDIRECTION_REPSONSE = exports.SUCCESSFUL_REPSONSE = exports.INFORMATION_REPSONSE = exports.FETCH_METHODS = exports.DELETE_METHOD = exports.PUT_METHOD = exports.POST_METHOD = exports.GET_METHOD = exports.FETCH_TIMEOUT_ERROR = exports.RESOURCE_NOT_FOUND_ERROR = exports.INVALID_FETCH_METHOD_ERROR = exports.MAX_RETRIES_EXCEEDED_ERROR = exports.MAX_REDIRECTS_EXCEEDED_ERROR = exports.MISSING_BASE_PATH_ERROR = exports.DEFAULT_REQUEST_RETRY_WAIT = exports.DEFAULT_RATE_LIMIT = exports.OPTIONAL_PATH_TEMPLATE_REGEX = exports.DEFAULT_PATH_TEMPLATE_REGEX = exports.DEFAULT_MAX_RETRIES = exports.DEFAULT_MAX_REDIRECTS = exports.DEFAULT_HEADERS = exports.DEFAULT_FETCH_TIMEOUT = exports.DEFAULT_BODY_PARSER = exports.STREAM_READERS = exports.TEXT_FORMAT = exports.JSON_FORMAT = exports.FORM_DATA_FORMAT = exports.BLOB_FORMAT = exports.ARRAY_BUFFER_FORMAT = void 0;
|
|
6
|
+
exports.RESPONSE_RECEIVED = exports.REQUEST_SENT = exports.CACHE_CONTROL_HEADER = exports.IF_NONE_MATCH_HEADER = exports.LOCATION_HEADER = exports.ETAG_HEADER = exports.COOKIE_HEADER = exports.NOT_FOUND_STATUS_CODE = exports.NOT_MODIFIED_STATUS_CODE = exports.SERVER_ERROR_REPSONSE = exports.CLIENT_ERROR_REPSONSE = exports.REDIRECTION_REPSONSE = exports.SUCCESSFUL_REPSONSE = exports.INFORMATION_REPSONSE = exports.FETCH_METHODS = exports.DELETE_METHOD = exports.PUT_METHOD = exports.POST_METHOD = exports.GET_METHOD = exports.FETCH_TIMEOUT_ERROR = exports.RESOURCE_NOT_FOUND_ERROR = exports.INVALID_FETCH_METHOD_ERROR = exports.MAX_RETRIES_EXCEEDED_ERROR = exports.MAX_REDIRECTS_EXCEEDED_ERROR = exports.MISSING_BASE_PATH_ERROR = exports.DEFAULT_REQUEST_RETRY_WAIT = exports.DEFAULT_RATE_LIMIT = exports.OPTIONAL_PATH_TEMPLATE_REGEX = exports.DEFAULT_PATH_TEMPLATE_REGEX = exports.DEFAULT_MAX_RETRIES = exports.DEFAULT_MAX_REDIRECTS = exports.DEFAULT_HEADERS = exports.DEFAULT_FETCH_TIMEOUT = exports.DEFAULT_BODY_PARSER = exports.STREAM_READERS = exports.TEXT_FORMAT = exports.JSON_FORMAT = exports.FORM_DATA_FORMAT = exports.BLOB_FORMAT = exports.ARRAY_BUFFER_FORMAT = void 0;
|
|
7
7
|
const ARRAY_BUFFER_FORMAT = "arrayBuffer";
|
|
8
8
|
exports.ARRAY_BUFFER_FORMAT = ARRAY_BUFFER_FORMAT;
|
|
9
9
|
const BLOB_FORMAT = "blob";
|
|
@@ -90,4 +90,8 @@ exports.LOCATION_HEADER = LOCATION_HEADER;
|
|
|
90
90
|
const IF_NONE_MATCH_HEADER = "If-None-Match";
|
|
91
91
|
exports.IF_NONE_MATCH_HEADER = IF_NONE_MATCH_HEADER;
|
|
92
92
|
const CACHE_CONTROL_HEADER = "Cache-Control";
|
|
93
|
-
exports.CACHE_CONTROL_HEADER = CACHE_CONTROL_HEADER;
|
|
93
|
+
exports.CACHE_CONTROL_HEADER = CACHE_CONTROL_HEADER;
|
|
94
|
+
const REQUEST_SENT = "request_sent";
|
|
95
|
+
exports.REQUEST_SENT = REQUEST_SENT;
|
|
96
|
+
const RESPONSE_RECEIVED = "response_received";
|
|
97
|
+
exports.RESPONSE_RECEIVED = RESPONSE_RECEIVED;
|
package/lib/main/main.js
CHANGED
|
@@ -38,11 +38,13 @@ class Getta {
|
|
|
38
38
|
(0, _defineProperty2.default)(this, "_conditionalRequestsEnabled", void 0);
|
|
39
39
|
(0, _defineProperty2.default)(this, "_fetchTimeout", void 0);
|
|
40
40
|
(0, _defineProperty2.default)(this, "_headers", void 0);
|
|
41
|
+
(0, _defineProperty2.default)(this, "_log", void 0);
|
|
41
42
|
(0, _defineProperty2.default)(this, "_maxRedirects", void 0);
|
|
42
43
|
(0, _defineProperty2.default)(this, "_maxRetries", void 0);
|
|
43
44
|
(0, _defineProperty2.default)(this, "_optionalPathTemplateRegExp", void 0);
|
|
44
45
|
(0, _defineProperty2.default)(this, "_pathTemplateCallback", void 0);
|
|
45
46
|
(0, _defineProperty2.default)(this, "_pathTemplateRegExp", void 0);
|
|
47
|
+
(0, _defineProperty2.default)(this, "_performance", void 0);
|
|
46
48
|
(0, _defineProperty2.default)(this, "_queryParams", void 0);
|
|
47
49
|
(0, _defineProperty2.default)(this, "_rateLimitCount", 0);
|
|
48
50
|
(0, _defineProperty2.default)(this, "_rateLimitedRequestQueue", []);
|
|
@@ -61,11 +63,13 @@ class Getta {
|
|
|
61
63
|
enableConditionalRequests = true,
|
|
62
64
|
fetchTimeout = _constants.DEFAULT_FETCH_TIMEOUT,
|
|
63
65
|
headers,
|
|
66
|
+
log,
|
|
64
67
|
maxRedirects = _constants.DEFAULT_MAX_REDIRECTS,
|
|
65
68
|
maxRetries = _constants.DEFAULT_MAX_RETRIES,
|
|
66
69
|
optionalPathTemplateRegExp = _constants.OPTIONAL_PATH_TEMPLATE_REGEX,
|
|
67
70
|
pathTemplateCallback = _defaultPathTemplateCallback.default,
|
|
68
71
|
pathTemplateRegExp = _constants.DEFAULT_PATH_TEMPLATE_REGEX,
|
|
72
|
+
performance,
|
|
69
73
|
queryParams = {},
|
|
70
74
|
rateLimitPerSecond = _constants.DEFAULT_RATE_LIMIT,
|
|
71
75
|
requestRetryWait = _constants.DEFAULT_REQUEST_RETRY_WAIT,
|
|
@@ -84,11 +88,13 @@ class Getta {
|
|
|
84
88
|
this._headers = { ..._constants.DEFAULT_HEADERS,
|
|
85
89
|
...(headers || {})
|
|
86
90
|
};
|
|
91
|
+
this._log = log;
|
|
87
92
|
this._maxRedirects = maxRedirects;
|
|
88
93
|
this._maxRetries = maxRetries;
|
|
89
94
|
this._optionalPathTemplateRegExp = optionalPathTemplateRegExp;
|
|
90
95
|
this._pathTemplateCallback = pathTemplateCallback;
|
|
91
96
|
this._pathTemplateRegExp = pathTemplateRegExp;
|
|
97
|
+
this._performance = performance;
|
|
92
98
|
this._queryParams = queryParams;
|
|
93
99
|
this._rateLimitPerSecond = rateLimitPerSecond;
|
|
94
100
|
this._requestRetryWait = requestRetryWait;
|
|
@@ -113,24 +119,24 @@ class Getta {
|
|
|
113
119
|
} = {}) => this[requestMethod !== null && requestMethod !== void 0 ? requestMethod : method](path, (0, _merge2.default)({}, rest, requestRest));
|
|
114
120
|
}
|
|
115
121
|
|
|
116
|
-
async delete(path, options = {}) {
|
|
117
|
-
return this._delete(path, options);
|
|
122
|
+
async delete(path, options = {}, context) {
|
|
123
|
+
return this._delete(path, options, context);
|
|
118
124
|
}
|
|
119
125
|
|
|
120
|
-
async get(path, options = {}) {
|
|
121
|
-
return this._get(path, options);
|
|
126
|
+
async get(path, options = {}, context) {
|
|
127
|
+
return this._get(path, options, context);
|
|
122
128
|
}
|
|
123
129
|
|
|
124
|
-
async post(path, options) {
|
|
130
|
+
async post(path, options, context) {
|
|
125
131
|
return this._request(path, { ...options,
|
|
126
132
|
method: _constants.POST_METHOD
|
|
127
|
-
});
|
|
133
|
+
}, context);
|
|
128
134
|
}
|
|
129
135
|
|
|
130
|
-
async put(path, options) {
|
|
136
|
+
async put(path, options, context) {
|
|
131
137
|
return this._request(path, { ...options,
|
|
132
138
|
method: _constants.PUT_METHOD
|
|
133
|
-
});
|
|
139
|
+
}, context);
|
|
134
140
|
}
|
|
135
141
|
|
|
136
142
|
_addRequestToRateLimitedQueue(endpoint, options) {
|
|
@@ -186,7 +192,7 @@ class Getta {
|
|
|
186
192
|
pathTemplateData,
|
|
187
193
|
queryParams = {},
|
|
188
194
|
...rest
|
|
189
|
-
}) {
|
|
195
|
+
}, context) {
|
|
190
196
|
const endpoint = (0, _buildEndpoint.default)(this._basePath, path, {
|
|
191
197
|
optionalPathTemplateRegExp: this._optionalPathTemplateRegExp,
|
|
192
198
|
pathTemplateCallback: this._pathTemplateCallback,
|
|
@@ -209,16 +215,18 @@ class Getta {
|
|
|
209
215
|
},
|
|
210
216
|
method: _constants.DELETE_METHOD,
|
|
211
217
|
...rest
|
|
212
|
-
});
|
|
218
|
+
}, context);
|
|
213
219
|
}
|
|
214
220
|
|
|
215
221
|
async _fetch(endpoint, {
|
|
216
222
|
redirects,
|
|
217
223
|
retries,
|
|
218
224
|
...rest
|
|
219
|
-
}) {
|
|
225
|
+
}, context = {}) {
|
|
220
226
|
try {
|
|
221
227
|
return new Promise(async (resolve, reject) => {
|
|
228
|
+
var _this$_log, _this$_log2;
|
|
229
|
+
|
|
222
230
|
const fetchTimer = setTimeout(() => {
|
|
223
231
|
reject(new Error(`${_constants.FETCH_TIMEOUT_ERROR} ${this._fetchTimeout}ms.`));
|
|
224
232
|
}, this._fetchTimeout);
|
|
@@ -234,7 +242,39 @@ class Getta {
|
|
|
234
242
|
return;
|
|
235
243
|
}
|
|
236
244
|
|
|
245
|
+
const startTime = this._performance.now();
|
|
246
|
+
|
|
247
|
+
(_this$_log = this._log) === null || _this$_log === void 0 ? void 0 : _this$_log.call(this, _constants.REQUEST_SENT, {
|
|
248
|
+
context: {
|
|
249
|
+
redirects,
|
|
250
|
+
retries,
|
|
251
|
+
url: endpoint,
|
|
252
|
+
...rest,
|
|
253
|
+
...context
|
|
254
|
+
},
|
|
255
|
+
stats: {
|
|
256
|
+
startTime
|
|
257
|
+
}
|
|
258
|
+
});
|
|
237
259
|
const res = await fetch(endpoint, rest);
|
|
260
|
+
|
|
261
|
+
const endTime = this._performance.now();
|
|
262
|
+
|
|
263
|
+
const duration = endTime - startTime;
|
|
264
|
+
(_this$_log2 = this._log) === null || _this$_log2 === void 0 ? void 0 : _this$_log2.call(this, _constants.RESPONSE_RECEIVED, {
|
|
265
|
+
context: {
|
|
266
|
+
redirects,
|
|
267
|
+
retries,
|
|
268
|
+
url: endpoint,
|
|
269
|
+
...rest,
|
|
270
|
+
...context
|
|
271
|
+
},
|
|
272
|
+
stats: {
|
|
273
|
+
duration,
|
|
274
|
+
endTime,
|
|
275
|
+
startTime
|
|
276
|
+
}
|
|
277
|
+
});
|
|
238
278
|
clearTimeout(fetchTimer);
|
|
239
279
|
const {
|
|
240
280
|
headers,
|
|
@@ -320,7 +360,7 @@ class Getta {
|
|
|
320
360
|
headers = {},
|
|
321
361
|
pathTemplateData,
|
|
322
362
|
queryParams = {}
|
|
323
|
-
}) {
|
|
363
|
+
}, context) {
|
|
324
364
|
const endpoint = (0, _buildEndpoint.default)(this._basePath, path, {
|
|
325
365
|
optionalPathTemplateRegExp: this._optionalPathTemplateRegExp,
|
|
326
366
|
pathTemplateCallback: this._pathTemplateCallback,
|
|
@@ -359,7 +399,7 @@ class Getta {
|
|
|
359
399
|
...headers
|
|
360
400
|
},
|
|
361
401
|
method: _constants.GET_METHOD
|
|
362
|
-
}));
|
|
402
|
+
}, context));
|
|
363
403
|
}
|
|
364
404
|
|
|
365
405
|
async _getResolve(requestHash, res) {
|
|
@@ -431,7 +471,7 @@ class Getta {
|
|
|
431
471
|
pathTemplateData,
|
|
432
472
|
queryParams,
|
|
433
473
|
...rest
|
|
434
|
-
}) {
|
|
474
|
+
}, context) {
|
|
435
475
|
const endpoint = (0, _buildEndpoint.default)(this._basePath, path, {
|
|
436
476
|
optionalPathTemplateRegExp: this._optionalPathTemplateRegExp,
|
|
437
477
|
pathTemplateCallback: this._pathTemplateCallback,
|
|
@@ -448,7 +488,7 @@ class Getta {
|
|
|
448
488
|
},
|
|
449
489
|
method,
|
|
450
490
|
...rest
|
|
451
|
-
});
|
|
491
|
+
}, context);
|
|
452
492
|
}
|
|
453
493
|
|
|
454
494
|
_resolvePendingRequests(requestHash, responseData) {
|
package/lib/module/constants.js
CHANGED
|
@@ -44,4 +44,6 @@ export const COOKIE_HEADER = "Cookie";
|
|
|
44
44
|
export const ETAG_HEADER = "ETag";
|
|
45
45
|
export const LOCATION_HEADER = "Location";
|
|
46
46
|
export const IF_NONE_MATCH_HEADER = "If-None-Match";
|
|
47
|
-
export const CACHE_CONTROL_HEADER = "Cache-Control";
|
|
47
|
+
export const CACHE_CONTROL_HEADER = "Cache-Control";
|
|
48
|
+
export const REQUEST_SENT = "request_sent";
|
|
49
|
+
export const RESPONSE_RECEIVED = "response_received";
|
package/lib/module/main.js
CHANGED
|
@@ -3,7 +3,7 @@ import _merge from "lodash/merge";
|
|
|
3
3
|
import _castArray from "lodash/castArray";
|
|
4
4
|
import "core-js/modules/es.promise.js";
|
|
5
5
|
import md5 from "md5";
|
|
6
|
-
import { CACHE_CONTROL_HEADER, DEFAULT_BODY_PARSER, DEFAULT_FETCH_TIMEOUT, DEFAULT_HEADERS, DEFAULT_MAX_REDIRECTS, DEFAULT_MAX_RETRIES, DEFAULT_PATH_TEMPLATE_REGEX, DEFAULT_RATE_LIMIT, DEFAULT_REQUEST_RETRY_WAIT, DELETE_METHOD, ETAG_HEADER, FETCH_METHODS, FETCH_TIMEOUT_ERROR, GET_METHOD, IF_NONE_MATCH_HEADER, INVALID_FETCH_METHOD_ERROR, JSON_FORMAT, LOCATION_HEADER, MAX_REDIRECTS_EXCEEDED_ERROR, MAX_RETRIES_EXCEEDED_ERROR, MISSING_BASE_PATH_ERROR, NOT_FOUND_STATUS_CODE, NOT_MODIFIED_STATUS_CODE, OPTIONAL_PATH_TEMPLATE_REGEX, POST_METHOD, PUT_METHOD, REDIRECTION_REPSONSE, RESOURCE_NOT_FOUND_ERROR, SERVER_ERROR_REPSONSE } from "./constants";
|
|
6
|
+
import { CACHE_CONTROL_HEADER, DEFAULT_BODY_PARSER, DEFAULT_FETCH_TIMEOUT, DEFAULT_HEADERS, DEFAULT_MAX_REDIRECTS, DEFAULT_MAX_RETRIES, DEFAULT_PATH_TEMPLATE_REGEX, DEFAULT_RATE_LIMIT, DEFAULT_REQUEST_RETRY_WAIT, DELETE_METHOD, ETAG_HEADER, FETCH_METHODS, FETCH_TIMEOUT_ERROR, GET_METHOD, IF_NONE_MATCH_HEADER, INVALID_FETCH_METHOD_ERROR, JSON_FORMAT, LOCATION_HEADER, MAX_REDIRECTS_EXCEEDED_ERROR, MAX_RETRIES_EXCEEDED_ERROR, MISSING_BASE_PATH_ERROR, NOT_FOUND_STATUS_CODE, NOT_MODIFIED_STATUS_CODE, OPTIONAL_PATH_TEMPLATE_REGEX, POST_METHOD, PUT_METHOD, REDIRECTION_REPSONSE, REQUEST_SENT, RESOURCE_NOT_FOUND_ERROR, RESPONSE_RECEIVED, SERVER_ERROR_REPSONSE } from "./constants";
|
|
7
7
|
import buildEndpoint from "./helpers/build-endpoint";
|
|
8
8
|
import defaultPathTemplateCallback from "./helpers/default-path-template-callback";
|
|
9
9
|
import delay from "./helpers/delay";
|
|
@@ -23,6 +23,8 @@ export class Getta {
|
|
|
23
23
|
|
|
24
24
|
_defineProperty(this, "_headers", void 0);
|
|
25
25
|
|
|
26
|
+
_defineProperty(this, "_log", void 0);
|
|
27
|
+
|
|
26
28
|
_defineProperty(this, "_maxRedirects", void 0);
|
|
27
29
|
|
|
28
30
|
_defineProperty(this, "_maxRetries", void 0);
|
|
@@ -33,6 +35,8 @@ export class Getta {
|
|
|
33
35
|
|
|
34
36
|
_defineProperty(this, "_pathTemplateRegExp", void 0);
|
|
35
37
|
|
|
38
|
+
_defineProperty(this, "_performance", void 0);
|
|
39
|
+
|
|
36
40
|
_defineProperty(this, "_queryParams", void 0);
|
|
37
41
|
|
|
38
42
|
_defineProperty(this, "_rateLimitCount", 0);
|
|
@@ -59,11 +63,13 @@ export class Getta {
|
|
|
59
63
|
enableConditionalRequests = true,
|
|
60
64
|
fetchTimeout = DEFAULT_FETCH_TIMEOUT,
|
|
61
65
|
headers,
|
|
66
|
+
log,
|
|
62
67
|
maxRedirects = DEFAULT_MAX_REDIRECTS,
|
|
63
68
|
maxRetries = DEFAULT_MAX_RETRIES,
|
|
64
69
|
optionalPathTemplateRegExp = OPTIONAL_PATH_TEMPLATE_REGEX,
|
|
65
70
|
pathTemplateCallback = defaultPathTemplateCallback,
|
|
66
71
|
pathTemplateRegExp = DEFAULT_PATH_TEMPLATE_REGEX,
|
|
72
|
+
performance,
|
|
67
73
|
queryParams = {},
|
|
68
74
|
rateLimitPerSecond = DEFAULT_RATE_LIMIT,
|
|
69
75
|
requestRetryWait = DEFAULT_REQUEST_RETRY_WAIT,
|
|
@@ -82,11 +88,13 @@ export class Getta {
|
|
|
82
88
|
this._headers = { ...DEFAULT_HEADERS,
|
|
83
89
|
...(headers || {})
|
|
84
90
|
};
|
|
91
|
+
this._log = log;
|
|
85
92
|
this._maxRedirects = maxRedirects;
|
|
86
93
|
this._maxRetries = maxRetries;
|
|
87
94
|
this._optionalPathTemplateRegExp = optionalPathTemplateRegExp;
|
|
88
95
|
this._pathTemplateCallback = pathTemplateCallback;
|
|
89
96
|
this._pathTemplateRegExp = pathTemplateRegExp;
|
|
97
|
+
this._performance = performance;
|
|
90
98
|
this._queryParams = queryParams;
|
|
91
99
|
this._rateLimitPerSecond = rateLimitPerSecond;
|
|
92
100
|
this._requestRetryWait = requestRetryWait;
|
|
@@ -111,24 +119,24 @@ export class Getta {
|
|
|
111
119
|
} = {}) => this[requestMethod !== null && requestMethod !== void 0 ? requestMethod : method](path, _merge({}, rest, requestRest));
|
|
112
120
|
}
|
|
113
121
|
|
|
114
|
-
async delete(path, options = {}) {
|
|
115
|
-
return this._delete(path, options);
|
|
122
|
+
async delete(path, options = {}, context) {
|
|
123
|
+
return this._delete(path, options, context);
|
|
116
124
|
}
|
|
117
125
|
|
|
118
|
-
async get(path, options = {}) {
|
|
119
|
-
return this._get(path, options);
|
|
126
|
+
async get(path, options = {}, context) {
|
|
127
|
+
return this._get(path, options, context);
|
|
120
128
|
}
|
|
121
129
|
|
|
122
|
-
async post(path, options) {
|
|
130
|
+
async post(path, options, context) {
|
|
123
131
|
return this._request(path, { ...options,
|
|
124
132
|
method: POST_METHOD
|
|
125
|
-
});
|
|
133
|
+
}, context);
|
|
126
134
|
}
|
|
127
135
|
|
|
128
|
-
async put(path, options) {
|
|
136
|
+
async put(path, options, context) {
|
|
129
137
|
return this._request(path, { ...options,
|
|
130
138
|
method: PUT_METHOD
|
|
131
|
-
});
|
|
139
|
+
}, context);
|
|
132
140
|
}
|
|
133
141
|
|
|
134
142
|
_addRequestToRateLimitedQueue(endpoint, options) {
|
|
@@ -184,7 +192,7 @@ export class Getta {
|
|
|
184
192
|
pathTemplateData,
|
|
185
193
|
queryParams = {},
|
|
186
194
|
...rest
|
|
187
|
-
}) {
|
|
195
|
+
}, context) {
|
|
188
196
|
const endpoint = buildEndpoint(this._basePath, path, {
|
|
189
197
|
optionalPathTemplateRegExp: this._optionalPathTemplateRegExp,
|
|
190
198
|
pathTemplateCallback: this._pathTemplateCallback,
|
|
@@ -207,16 +215,18 @@ export class Getta {
|
|
|
207
215
|
},
|
|
208
216
|
method: DELETE_METHOD,
|
|
209
217
|
...rest
|
|
210
|
-
});
|
|
218
|
+
}, context);
|
|
211
219
|
}
|
|
212
220
|
|
|
213
221
|
async _fetch(endpoint, {
|
|
214
222
|
redirects,
|
|
215
223
|
retries,
|
|
216
224
|
...rest
|
|
217
|
-
}) {
|
|
225
|
+
}, context = {}) {
|
|
218
226
|
try {
|
|
219
227
|
return new Promise(async (resolve, reject) => {
|
|
228
|
+
var _this$_log, _this$_log2;
|
|
229
|
+
|
|
220
230
|
const fetchTimer = setTimeout(() => {
|
|
221
231
|
reject(new Error(`${FETCH_TIMEOUT_ERROR} ${this._fetchTimeout}ms.`));
|
|
222
232
|
}, this._fetchTimeout);
|
|
@@ -232,7 +242,39 @@ export class Getta {
|
|
|
232
242
|
return;
|
|
233
243
|
}
|
|
234
244
|
|
|
245
|
+
const startTime = this._performance.now();
|
|
246
|
+
|
|
247
|
+
(_this$_log = this._log) === null || _this$_log === void 0 ? void 0 : _this$_log.call(this, REQUEST_SENT, {
|
|
248
|
+
context: {
|
|
249
|
+
redirects,
|
|
250
|
+
retries,
|
|
251
|
+
url: endpoint,
|
|
252
|
+
...rest,
|
|
253
|
+
...context
|
|
254
|
+
},
|
|
255
|
+
stats: {
|
|
256
|
+
startTime
|
|
257
|
+
}
|
|
258
|
+
});
|
|
235
259
|
const res = await fetch(endpoint, rest);
|
|
260
|
+
|
|
261
|
+
const endTime = this._performance.now();
|
|
262
|
+
|
|
263
|
+
const duration = endTime - startTime;
|
|
264
|
+
(_this$_log2 = this._log) === null || _this$_log2 === void 0 ? void 0 : _this$_log2.call(this, RESPONSE_RECEIVED, {
|
|
265
|
+
context: {
|
|
266
|
+
redirects,
|
|
267
|
+
retries,
|
|
268
|
+
url: endpoint,
|
|
269
|
+
...rest,
|
|
270
|
+
...context
|
|
271
|
+
},
|
|
272
|
+
stats: {
|
|
273
|
+
duration,
|
|
274
|
+
endTime,
|
|
275
|
+
startTime
|
|
276
|
+
}
|
|
277
|
+
});
|
|
236
278
|
clearTimeout(fetchTimer);
|
|
237
279
|
const {
|
|
238
280
|
headers,
|
|
@@ -318,7 +360,7 @@ export class Getta {
|
|
|
318
360
|
headers = {},
|
|
319
361
|
pathTemplateData,
|
|
320
362
|
queryParams = {}
|
|
321
|
-
}) {
|
|
363
|
+
}, context) {
|
|
322
364
|
const endpoint = buildEndpoint(this._basePath, path, {
|
|
323
365
|
optionalPathTemplateRegExp: this._optionalPathTemplateRegExp,
|
|
324
366
|
pathTemplateCallback: this._pathTemplateCallback,
|
|
@@ -357,7 +399,7 @@ export class Getta {
|
|
|
357
399
|
...headers
|
|
358
400
|
},
|
|
359
401
|
method: GET_METHOD
|
|
360
|
-
}));
|
|
402
|
+
}, context));
|
|
361
403
|
}
|
|
362
404
|
|
|
363
405
|
async _getResolve(requestHash, res) {
|
|
@@ -429,7 +471,7 @@ export class Getta {
|
|
|
429
471
|
pathTemplateData,
|
|
430
472
|
queryParams,
|
|
431
473
|
...rest
|
|
432
|
-
}) {
|
|
474
|
+
}, context) {
|
|
433
475
|
const endpoint = buildEndpoint(this._basePath, path, {
|
|
434
476
|
optionalPathTemplateRegExp: this._optionalPathTemplateRegExp,
|
|
435
477
|
pathTemplateCallback: this._pathTemplateCallback,
|
|
@@ -446,7 +488,7 @@ export class Getta {
|
|
|
446
488
|
},
|
|
447
489
|
method,
|
|
448
490
|
...rest
|
|
449
|
-
});
|
|
491
|
+
}, context);
|
|
450
492
|
}
|
|
451
493
|
|
|
452
494
|
_resolvePendingRequests(requestHash, responseData) {
|
package/lib/types/constants.d.ts
CHANGED
|
@@ -45,4 +45,6 @@ export declare const ETAG_HEADER: "ETag";
|
|
|
45
45
|
export declare const LOCATION_HEADER: "Location";
|
|
46
46
|
export declare const IF_NONE_MATCH_HEADER: "If-None-Match";
|
|
47
47
|
export declare const CACHE_CONTROL_HEADER: "Cache-Control";
|
|
48
|
+
export declare const REQUEST_SENT: "request_sent";
|
|
49
|
+
export declare const RESPONSE_RECEIVED: "response_received";
|
|
48
50
|
//# sourceMappingURL=constants.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/constants.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAE7C,eAAO,MAAM,mBAAmB,eAAyB,CAAC;AAC1D,eAAO,MAAM,WAAW,QAAkB,CAAC;AAC3C,eAAO,MAAM,gBAAgB,YAAsB,CAAC;AACpD,eAAO,MAAM,WAAW,QAAkB,CAAC;AAC3C,eAAO,MAAM,WAAW,QAAkB,CAAC;AAE3C,eAAO,MAAM,cAAc;;;;;;CAM1B,CAAC;AAEF,eAAO,MAAM,mBAAmB,SAAU,WAAW,gBAAS,CAAC;AAC/D,eAAO,MAAM,qBAAqB,MAAgB,CAAC;AACnD,eAAO,MAAM,eAAe;;CAAyC,CAAC;AACtE,eAAO,MAAM,qBAAqB,GAAa,CAAC;AAChD,eAAO,MAAM,mBAAmB,GAAa,CAAC;AAC9C,eAAO,MAAM,2BAA2B,QAAmD,CAAC;AAC5F,eAAO,MAAM,4BAA4B,QAAyB,CAAC;AACnE,eAAO,MAAM,kBAAkB,KAAK,CAAC;AACrC,eAAO,MAAM,0BAA0B,MAAM,CAAC;AAE9C,eAAO,MAAM,uBAAuB,gGACV,CAAC;AAE3B,eAAO,MAAM,4BAA4B,mEAAmE,CAAC;AAE7G,eAAO,MAAM,0BAA0B,iEAAiE,CAAC;AAEzG,eAAO,MAAM,0BAA0B,6EAA6E,CAAC;AAErH,eAAO,MAAM,wBAAwB,iDAAiD,CAAC;AAEvF,eAAO,MAAM,mBAAmB,+DAA+D,CAAC;AAEhG,eAAO,MAAM,UAAU,OAAiB,CAAC;AACzC,eAAO,MAAM,WAAW,QAAkB,CAAC;AAC3C,eAAO,MAAM,UAAU,OAAiB,CAAC;AACzC,eAAO,MAAM,aAAa,UAAoB,CAAC;AAE/C,eAAO,MAAM,aAAa,uCAAuD,CAAC;AAElF,eAAO,MAAM,oBAAoB,eAAyB,CAAC;AAC3D,eAAO,MAAM,mBAAmB,cAAwB,CAAC;AACzD,eAAO,MAAM,oBAAoB,eAAyB,CAAC;AAC3D,eAAO,MAAM,qBAAqB,eAAyB,CAAC;AAC5D,eAAO,MAAM,qBAAqB,eAAyB,CAAC;AAE5D,eAAO,MAAM,wBAAwB,KAAe,CAAC;AACrD,eAAO,MAAM,qBAAqB,KAAe,CAAC;AAElD,eAAO,MAAM,aAAa,UAAoB,CAAC;AAC/C,eAAO,MAAM,WAAW,QAAkB,CAAC;AAC3C,eAAO,MAAM,eAAe,YAAsB,CAAC;AACnD,eAAO,MAAM,oBAAoB,iBAA2B,CAAC;AAC7D,eAAO,MAAM,oBAAoB,iBAA2B,CAAC"}
|
|
1
|
+
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/constants.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAE7C,eAAO,MAAM,mBAAmB,eAAyB,CAAC;AAC1D,eAAO,MAAM,WAAW,QAAkB,CAAC;AAC3C,eAAO,MAAM,gBAAgB,YAAsB,CAAC;AACpD,eAAO,MAAM,WAAW,QAAkB,CAAC;AAC3C,eAAO,MAAM,WAAW,QAAkB,CAAC;AAE3C,eAAO,MAAM,cAAc;;;;;;CAM1B,CAAC;AAEF,eAAO,MAAM,mBAAmB,SAAU,WAAW,gBAAS,CAAC;AAC/D,eAAO,MAAM,qBAAqB,MAAgB,CAAC;AACnD,eAAO,MAAM,eAAe;;CAAyC,CAAC;AACtE,eAAO,MAAM,qBAAqB,GAAa,CAAC;AAChD,eAAO,MAAM,mBAAmB,GAAa,CAAC;AAC9C,eAAO,MAAM,2BAA2B,QAAmD,CAAC;AAC5F,eAAO,MAAM,4BAA4B,QAAyB,CAAC;AACnE,eAAO,MAAM,kBAAkB,KAAK,CAAC;AACrC,eAAO,MAAM,0BAA0B,MAAM,CAAC;AAE9C,eAAO,MAAM,uBAAuB,gGACV,CAAC;AAE3B,eAAO,MAAM,4BAA4B,mEAAmE,CAAC;AAE7G,eAAO,MAAM,0BAA0B,iEAAiE,CAAC;AAEzG,eAAO,MAAM,0BAA0B,6EAA6E,CAAC;AAErH,eAAO,MAAM,wBAAwB,iDAAiD,CAAC;AAEvF,eAAO,MAAM,mBAAmB,+DAA+D,CAAC;AAEhG,eAAO,MAAM,UAAU,OAAiB,CAAC;AACzC,eAAO,MAAM,WAAW,QAAkB,CAAC;AAC3C,eAAO,MAAM,UAAU,OAAiB,CAAC;AACzC,eAAO,MAAM,aAAa,UAAoB,CAAC;AAE/C,eAAO,MAAM,aAAa,uCAAuD,CAAC;AAElF,eAAO,MAAM,oBAAoB,eAAyB,CAAC;AAC3D,eAAO,MAAM,mBAAmB,cAAwB,CAAC;AACzD,eAAO,MAAM,oBAAoB,eAAyB,CAAC;AAC3D,eAAO,MAAM,qBAAqB,eAAyB,CAAC;AAC5D,eAAO,MAAM,qBAAqB,eAAyB,CAAC;AAE5D,eAAO,MAAM,wBAAwB,KAAe,CAAC;AACrD,eAAO,MAAM,qBAAqB,KAAe,CAAC;AAElD,eAAO,MAAM,aAAa,UAAoB,CAAC;AAC/C,eAAO,MAAM,WAAW,QAAkB,CAAC;AAC3C,eAAO,MAAM,eAAe,YAAsB,CAAC;AACnD,eAAO,MAAM,oBAAoB,iBAA2B,CAAC;AAC7D,eAAO,MAAM,oBAAoB,iBAA2B,CAAC;AAE7D,eAAO,MAAM,YAAY,gBAA0B,CAAC;AACpD,eAAO,MAAM,iBAAiB,qBAA+B,CAAC"}
|
package/lib/types/main.d.ts
CHANGED
|
@@ -9,11 +9,13 @@ export declare class Getta {
|
|
|
9
9
|
private _conditionalRequestsEnabled;
|
|
10
10
|
private _fetchTimeout;
|
|
11
11
|
private _headers;
|
|
12
|
+
private _log;
|
|
12
13
|
private _maxRedirects;
|
|
13
14
|
private _maxRetries;
|
|
14
15
|
private _optionalPathTemplateRegExp;
|
|
15
16
|
private _pathTemplateCallback;
|
|
16
17
|
private _pathTemplateRegExp;
|
|
18
|
+
private _performance;
|
|
17
19
|
private _queryParams;
|
|
18
20
|
private _rateLimitCount;
|
|
19
21
|
private _rateLimitedRequestQueue;
|
|
@@ -25,13 +27,13 @@ export declare class Getta {
|
|
|
25
27
|
constructor(options: ConstructorOptions);
|
|
26
28
|
get cache(): Cachemap | undefined;
|
|
27
29
|
createShortcut(name: string, path: string, { method, ...rest }: Required<RequestOptions, "method">): void;
|
|
28
|
-
delete(path: string, options?: Omit<RequestOptions, "method"
|
|
29
|
-
get(path: string, options?: Omit<RequestOptions, "method"
|
|
30
|
+
delete(path: string, options?: Omit<RequestOptions, "method">, context?: PlainObject): Promise<FetchResponse<PlainObject>>;
|
|
31
|
+
get(path: string, options?: Omit<RequestOptions, "method">, context?: PlainObject): Promise<FetchResponse<PlainObject> | {
|
|
30
32
|
data: PlainObject | undefined;
|
|
31
33
|
headers: Headers;
|
|
32
34
|
}>;
|
|
33
|
-
post(path: string, options: Omit<Required<RequestOptions, "body">, "method"
|
|
34
|
-
put(path: string, options: Omit<Required<RequestOptions, "body">, "methood"
|
|
35
|
+
post(path: string, options: Omit<Required<RequestOptions, "body">, "method">, context?: PlainObject): Promise<FetchResponse<PlainObject>>;
|
|
36
|
+
put(path: string, options: Omit<Required<RequestOptions, "body">, "methood">, context?: PlainObject): Promise<FetchResponse<PlainObject>>;
|
|
35
37
|
private _addRequestToRateLimitedQueue;
|
|
36
38
|
private _cacheEntryDelete;
|
|
37
39
|
private _cacheEntryGet;
|
package/lib/types/main.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../../src/main.ts"],"names":[],"mappings":"AAAA,OAAO,QAA0B,MAAM,gBAAgB,CAAC;AACxD,OAAO,EAAQ,WAAW,EAAgB,MAAM,gBAAgB,CAAC;AAIjE,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../../src/main.ts"],"names":[],"mappings":"AAAA,OAAO,QAA0B,MAAM,gBAAgB,CAAC;AACxD,OAAO,EAAQ,WAAW,EAAgB,MAAM,gBAAgB,CAAC;AAIjE,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAuCzC,OAAO,EACL,kBAAkB,EAGlB,aAAa,EAMb,cAAc,EAGd,kBAAkB,EAClB,SAAS,EAEV,MAAM,SAAS,CAAC;AAEjB,qBAAa,KAAK;IAChB,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,WAAW,CAAO;IAC1B,OAAO,CAAC,MAAM,CAAC,CAAW;IAC1B,OAAO,CAAC,2BAA2B,CAAU;IAC7C,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,QAAQ,CAAe;IAC/B,OAAO,CAAC,IAAI,CAAkB;IAC9B,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,2BAA2B,CAAS;IAC5C,OAAO,CAAC,qBAAqB,CAAuB;IACpD,OAAO,CAAC,mBAAmB,CAAS;IACpC,OAAO,CAAC,YAAY,CAAc;IAClC,OAAO,CAAC,YAAY,CAAc;IAClC,OAAO,CAAC,eAAe,CAAa;IACpC,OAAO,CAAC,wBAAwB,CAAoB;IACpD,OAAO,CAAC,mBAAmB,CAAS;IACpC,OAAO,CAAC,eAAe,CAA6B;IACpD,OAAO,CAAC,iBAAiB,CAAS;IAClC,OAAO,CAAC,eAAe,CAAsD;IAC7E,OAAO,CAAC,aAAa,CAAe;gBAExB,OAAO,EAAE,kBAAkB;IA4CvC,IAAI,KAAK,IAAI,QAAQ,GAAG,SAAS,CAEhC;IAEM,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,EAAE,QAAQ,CAAC,cAAc,EAAE,QAAQ,CAAC;IAW5F,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,IAAI,CAAC,cAAc,EAAE,QAAQ,CAAM,EAAE,OAAO,CAAC,EAAE,WAAW;IAIxF,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,IAAI,CAAC,cAAc,EAAE,QAAQ,CAAM,EAAE,OAAO,CAAC,EAAE,WAAW;;;;IAIrF,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC,EAAE,QAAQ,CAAC,EAAE,OAAO,CAAC,EAAE,WAAW;IAInG,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC,EAAE,SAAS,CAAC,EAAE,OAAO,CAAC,EAAE,WAAW;IAIhH,OAAO,CAAC,6BAA6B;YAMvB,iBAAiB;YAUjB,cAAc;YAUd,cAAc;YAUd,cAAc;YAUd,OAAO;YA+BP,MAAM;YA8EN,qBAAqB;YAiBrB,kBAAkB;YAYlB,IAAI;YAuCJ,WAAW;IAkCzB,OAAO,CAAC,UAAU;IAelB,OAAO,CAAC,+BAA+B;YASzB,QAAQ;IAyBtB,OAAO,CAAC,uBAAuB;IAW/B,OAAO,CAAC,kBAAkB;IAO1B,OAAO,CAAC,aAAa;CAStB;AAED,MAAM,CAAC,OAAO,UAAU,gBAAgB,CAAC,CAAC,SAAS,MAAM,EAAE,OAAO,EAAE,kBAAkB,EAAE,SAAS,CAAC,EAAE,SAAS,iCAS5G"}
|
package/lib/types/types.d.ts
CHANGED
|
@@ -13,11 +13,13 @@ export interface ConstructorOptions {
|
|
|
13
13
|
enableConditionalRequests?: boolean;
|
|
14
14
|
fetchTimeout?: number;
|
|
15
15
|
headers?: StringObject;
|
|
16
|
+
log?: Log;
|
|
16
17
|
maxRedirects?: number;
|
|
17
18
|
maxRetries?: number;
|
|
18
19
|
optionalPathTemplateRegExp?: RegExp;
|
|
19
20
|
pathTemplateCallback?: PathTemplateCallback;
|
|
20
21
|
pathTemplateRegExp?: RegExp;
|
|
22
|
+
performance: Performance;
|
|
21
23
|
queryParams?: PlainObject;
|
|
22
24
|
rateLimitPerSecond?: number;
|
|
23
25
|
requestRetryWait?: number;
|
|
@@ -35,6 +37,11 @@ export interface FetchResponse<Resource = PlainObject> extends ResponseDataWithE
|
|
|
35
37
|
export interface FetchRedirectHandlerOptions extends FetchOptions {
|
|
36
38
|
status: number;
|
|
37
39
|
}
|
|
40
|
+
export declare type Log = (message: string, data: PlainObject, logLevel?: LogLevel) => void;
|
|
41
|
+
export declare type LogLevel = "error" | "warn" | "info" | "http" | "verbose" | "debug" | "silly";
|
|
42
|
+
export interface Performance {
|
|
43
|
+
now(): number;
|
|
44
|
+
}
|
|
38
45
|
export interface RequestOptions {
|
|
39
46
|
body?: BodyInit;
|
|
40
47
|
headers?: StringObject;
|
package/lib/types/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
package/src/constants.ts
CHANGED
|
@@ -58,3 +58,6 @@ export const ETAG_HEADER = "ETag" as const;
|
|
|
58
58
|
export const LOCATION_HEADER = "Location" as const;
|
|
59
59
|
export const IF_NONE_MATCH_HEADER = "If-None-Match" as const;
|
|
60
60
|
export const CACHE_CONTROL_HEADER = "Cache-Control" as const;
|
|
61
|
+
|
|
62
|
+
export const REQUEST_SENT = "request_sent" as const;
|
|
63
|
+
export const RESPONSE_RECEIVED = "response_received" as const;
|
package/src/main.test.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { StringObject } from "@repodog/types";
|
|
2
2
|
import fetchMock, { MockRequest } from "fetch-mock";
|
|
3
3
|
import md5 from "md5";
|
|
4
|
+
import { performance } from "perf_hooks";
|
|
4
5
|
import { PRD_136_7317 } from "./__tests__/data";
|
|
5
6
|
import {
|
|
6
7
|
basePath,
|
|
@@ -33,7 +34,7 @@ import { ResponseDataWithErrors, ShortcutProperties } from "./types";
|
|
|
33
34
|
describe("Getta", () => {
|
|
34
35
|
describe("constructor", () => {
|
|
35
36
|
it("SHOULD return an instance of the Getta class", () => {
|
|
36
|
-
const restClient = createRestClient({ basePath, cache: getCache() });
|
|
37
|
+
const restClient = createRestClient({ basePath, cache: getCache(), performance });
|
|
37
38
|
expect(restClient).toBeInstanceOf(Getta);
|
|
38
39
|
});
|
|
39
40
|
});
|
|
@@ -44,7 +45,7 @@ describe("Getta", () => {
|
|
|
44
45
|
|
|
45
46
|
beforeAll(() => {
|
|
46
47
|
restClient = createRestClient<"getProduct">(
|
|
47
|
-
{ basePath, cache: getCache() },
|
|
48
|
+
{ basePath, cache: getCache(), performance },
|
|
48
49
|
{
|
|
49
50
|
getProduct: [
|
|
50
51
|
defaultPath,
|
|
@@ -397,7 +398,7 @@ describe("Getta", () => {
|
|
|
397
398
|
|
|
398
399
|
beforeAll(() => {
|
|
399
400
|
restClient = createRestClient<"postProduct">(
|
|
400
|
-
{ basePath, cache: getCache() },
|
|
401
|
+
{ basePath, cache: getCache(), performance },
|
|
401
402
|
{
|
|
402
403
|
postProduct: [
|
|
403
404
|
defaultPath,
|
|
@@ -483,7 +484,7 @@ describe("Getta", () => {
|
|
|
483
484
|
|
|
484
485
|
beforeAll(() => {
|
|
485
486
|
restClient = createRestClient<"deleteProduct">(
|
|
486
|
-
{ basePath, cache: getCache() },
|
|
487
|
+
{ basePath, cache: getCache(), performance },
|
|
487
488
|
{
|
|
488
489
|
deleteProduct: [
|
|
489
490
|
defaultPath,
|
|
@@ -589,7 +590,7 @@ describe("Getta", () => {
|
|
|
589
590
|
|
|
590
591
|
beforeAll(() => {
|
|
591
592
|
restClient = createRestClient<"putProduct">(
|
|
592
|
-
{ basePath, cache: getCache() },
|
|
593
|
+
{ basePath, cache: getCache(), performance },
|
|
593
594
|
{
|
|
594
595
|
putProduct: [
|
|
595
596
|
defaultPath,
|
|
@@ -662,7 +663,7 @@ describe("Getta", () => {
|
|
|
662
663
|
let restClient: Getta;
|
|
663
664
|
|
|
664
665
|
beforeAll(() => {
|
|
665
|
-
restClient = createRestClient({ basePath });
|
|
666
|
+
restClient = createRestClient({ basePath, performance });
|
|
666
667
|
});
|
|
667
668
|
|
|
668
669
|
describe("WHEN the number of requests per second exceeds rateLimitPerSecond", () => {
|
package/src/main.ts
CHANGED
|
@@ -32,7 +32,9 @@ import {
|
|
|
32
32
|
POST_METHOD,
|
|
33
33
|
PUT_METHOD,
|
|
34
34
|
REDIRECTION_REPSONSE,
|
|
35
|
+
REQUEST_SENT,
|
|
35
36
|
RESOURCE_NOT_FOUND_ERROR,
|
|
37
|
+
RESPONSE_RECEIVED,
|
|
36
38
|
SERVER_ERROR_REPSONSE,
|
|
37
39
|
} from "./constants";
|
|
38
40
|
import buildEndpoint from "./helpers/build-endpoint";
|
|
@@ -45,9 +47,11 @@ import {
|
|
|
45
47
|
FetchOptions,
|
|
46
48
|
FetchRedirectHandlerOptions,
|
|
47
49
|
FetchResponse,
|
|
50
|
+
Log,
|
|
48
51
|
PathTemplateCallback,
|
|
49
52
|
PendingRequestResolver,
|
|
50
53
|
PendingRequestResolvers,
|
|
54
|
+
Performance,
|
|
51
55
|
RequestOptions,
|
|
52
56
|
RequestQueue,
|
|
53
57
|
RequestTracker,
|
|
@@ -63,11 +67,13 @@ export class Getta {
|
|
|
63
67
|
private _conditionalRequestsEnabled: boolean;
|
|
64
68
|
private _fetchTimeout: number;
|
|
65
69
|
private _headers: StringObject;
|
|
70
|
+
private _log: Log | undefined;
|
|
66
71
|
private _maxRedirects: number;
|
|
67
72
|
private _maxRetries: number;
|
|
68
73
|
private _optionalPathTemplateRegExp: RegExp;
|
|
69
74
|
private _pathTemplateCallback: PathTemplateCallback;
|
|
70
75
|
private _pathTemplateRegExp: RegExp;
|
|
76
|
+
private _performance: Performance;
|
|
71
77
|
private _queryParams: PlainObject;
|
|
72
78
|
private _rateLimitCount: number = 0;
|
|
73
79
|
private _rateLimitedRequestQueue: RequestQueue = [];
|
|
@@ -85,11 +91,13 @@ export class Getta {
|
|
|
85
91
|
enableConditionalRequests = true,
|
|
86
92
|
fetchTimeout = DEFAULT_FETCH_TIMEOUT,
|
|
87
93
|
headers,
|
|
94
|
+
log,
|
|
88
95
|
maxRedirects = DEFAULT_MAX_REDIRECTS,
|
|
89
96
|
maxRetries = DEFAULT_MAX_RETRIES,
|
|
90
97
|
optionalPathTemplateRegExp = OPTIONAL_PATH_TEMPLATE_REGEX,
|
|
91
98
|
pathTemplateCallback = defaultPathTemplateCallback,
|
|
92
99
|
pathTemplateRegExp = DEFAULT_PATH_TEMPLATE_REGEX,
|
|
100
|
+
performance,
|
|
93
101
|
queryParams = {},
|
|
94
102
|
rateLimitPerSecond = DEFAULT_RATE_LIMIT,
|
|
95
103
|
requestRetryWait = DEFAULT_REQUEST_RETRY_WAIT,
|
|
@@ -106,11 +114,13 @@ export class Getta {
|
|
|
106
114
|
this._conditionalRequestsEnabled = enableConditionalRequests;
|
|
107
115
|
this._fetchTimeout = fetchTimeout;
|
|
108
116
|
this._headers = { ...DEFAULT_HEADERS, ...(headers || {}) };
|
|
117
|
+
this._log = log;
|
|
109
118
|
this._maxRedirects = maxRedirects;
|
|
110
119
|
this._maxRetries = maxRetries;
|
|
111
120
|
this._optionalPathTemplateRegExp = optionalPathTemplateRegExp;
|
|
112
121
|
this._pathTemplateCallback = pathTemplateCallback;
|
|
113
122
|
this._pathTemplateRegExp = pathTemplateRegExp;
|
|
123
|
+
this._performance = performance;
|
|
114
124
|
this._queryParams = queryParams;
|
|
115
125
|
this._rateLimitPerSecond = rateLimitPerSecond;
|
|
116
126
|
this._requestRetryWait = requestRetryWait;
|
|
@@ -132,20 +142,20 @@ export class Getta {
|
|
|
132
142
|
this[requestMethod ?? method](path, merge({}, rest, requestRest)) as Promise<FetchResponse<Resource>>;
|
|
133
143
|
}
|
|
134
144
|
|
|
135
|
-
public async delete(path: string, options: Omit<RequestOptions, "method"> = {}) {
|
|
136
|
-
return this._delete(path, options);
|
|
145
|
+
public async delete(path: string, options: Omit<RequestOptions, "method"> = {}, context?: PlainObject) {
|
|
146
|
+
return this._delete(path, options, context);
|
|
137
147
|
}
|
|
138
148
|
|
|
139
|
-
public async get(path: string, options: Omit<RequestOptions, "method"> = {}) {
|
|
140
|
-
return this._get(path, options);
|
|
149
|
+
public async get(path: string, options: Omit<RequestOptions, "method"> = {}, context?: PlainObject) {
|
|
150
|
+
return this._get(path, options, context);
|
|
141
151
|
}
|
|
142
152
|
|
|
143
|
-
public async post(path: string, options: Omit<Required<RequestOptions, "body">, "method"
|
|
144
|
-
return this._request(path, { ...options, method: POST_METHOD });
|
|
153
|
+
public async post(path: string, options: Omit<Required<RequestOptions, "body">, "method">, context?: PlainObject) {
|
|
154
|
+
return this._request(path, { ...options, method: POST_METHOD }, context);
|
|
145
155
|
}
|
|
146
156
|
|
|
147
|
-
public async put(path: string, options: Omit<Required<RequestOptions, "body">, "methood"
|
|
148
|
-
return this._request(path, { ...options, method: PUT_METHOD });
|
|
157
|
+
public async put(path: string, options: Omit<Required<RequestOptions, "body">, "methood">, context?: PlainObject) {
|
|
158
|
+
return this._request(path, { ...options, method: PUT_METHOD }, context);
|
|
149
159
|
}
|
|
150
160
|
|
|
151
161
|
private _addRequestToRateLimitedQueue(endpoint: string, options: FetchOptions) {
|
|
@@ -197,6 +207,7 @@ export class Getta {
|
|
|
197
207
|
private async _delete(
|
|
198
208
|
path: string,
|
|
199
209
|
{ headers = {}, pathTemplateData, queryParams = {}, ...rest }: Omit<RequestOptions, "method">,
|
|
210
|
+
context?: PlainObject,
|
|
200
211
|
) {
|
|
201
212
|
const endpoint = buildEndpoint(this._basePath, path, {
|
|
202
213
|
optionalPathTemplateRegExp: this._optionalPathTemplateRegExp,
|
|
@@ -213,14 +224,22 @@ export class Getta {
|
|
|
213
224
|
this._cacheEntryDelete(requestHash);
|
|
214
225
|
}
|
|
215
226
|
|
|
216
|
-
return this._fetch(
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
227
|
+
return this._fetch(
|
|
228
|
+
endpoint,
|
|
229
|
+
{
|
|
230
|
+
headers: { ...this._headers, ...headers },
|
|
231
|
+
method: DELETE_METHOD,
|
|
232
|
+
...rest,
|
|
233
|
+
},
|
|
234
|
+
context,
|
|
235
|
+
);
|
|
221
236
|
}
|
|
222
237
|
|
|
223
|
-
private async _fetch(
|
|
238
|
+
private async _fetch(
|
|
239
|
+
endpoint: string,
|
|
240
|
+
{ redirects, retries, ...rest }: FetchOptions,
|
|
241
|
+
context: PlainObject = {},
|
|
242
|
+
): Promise<FetchResponse> {
|
|
224
243
|
try {
|
|
225
244
|
return new Promise(async (resolve: (value: FetchResponse) => void, reject) => {
|
|
226
245
|
const fetchTimer = setTimeout(() => {
|
|
@@ -234,8 +253,23 @@ export class Getta {
|
|
|
234
253
|
return;
|
|
235
254
|
}
|
|
236
255
|
|
|
256
|
+
const startTime = this._performance.now();
|
|
257
|
+
|
|
258
|
+
this._log?.(REQUEST_SENT, {
|
|
259
|
+
context: { redirects, retries, url: endpoint, ...rest, ...context },
|
|
260
|
+
stats: { startTime },
|
|
261
|
+
});
|
|
262
|
+
|
|
237
263
|
const res = await fetch(endpoint, rest);
|
|
238
264
|
|
|
265
|
+
const endTime = this._performance.now();
|
|
266
|
+
const duration = endTime - startTime;
|
|
267
|
+
|
|
268
|
+
this._log?.(RESPONSE_RECEIVED, {
|
|
269
|
+
context: { redirects, retries, url: endpoint, ...rest, ...context },
|
|
270
|
+
stats: { duration, endTime, startTime },
|
|
271
|
+
});
|
|
272
|
+
|
|
239
273
|
clearTimeout(fetchTimer);
|
|
240
274
|
|
|
241
275
|
const { headers, status } = res;
|
|
@@ -311,6 +345,7 @@ export class Getta {
|
|
|
311
345
|
private async _get(
|
|
312
346
|
path: string,
|
|
313
347
|
{ headers = {}, pathTemplateData, queryParams = {} }: Omit<RequestOptions, "method">,
|
|
348
|
+
context?: PlainObject,
|
|
314
349
|
) {
|
|
315
350
|
const endpoint = buildEndpoint(this._basePath, path, {
|
|
316
351
|
optionalPathTemplateRegExp: this._optionalPathTemplateRegExp,
|
|
@@ -342,7 +377,7 @@ export class Getta {
|
|
|
342
377
|
|
|
343
378
|
return this._getResolve(
|
|
344
379
|
requestHash,
|
|
345
|
-
await this._fetch(endpoint, { headers: { ...this._headers, ...headers }, method: GET_METHOD }),
|
|
380
|
+
await this._fetch(endpoint, { headers: { ...this._headers, ...headers }, method: GET_METHOD }, context),
|
|
346
381
|
);
|
|
347
382
|
}
|
|
348
383
|
|
|
@@ -407,6 +442,7 @@ export class Getta {
|
|
|
407
442
|
private async _request(
|
|
408
443
|
path: string,
|
|
409
444
|
{ body, headers, method, pathTemplateData, queryParams, ...rest }: Required<RequestOptions, "method">,
|
|
445
|
+
context?: PlainObject,
|
|
410
446
|
) {
|
|
411
447
|
const endpoint = buildEndpoint(this._basePath, path, {
|
|
412
448
|
optionalPathTemplateRegExp: this._optionalPathTemplateRegExp,
|
|
@@ -416,12 +452,16 @@ export class Getta {
|
|
|
416
452
|
queryParams: { ...this._queryParams, ...queryParams },
|
|
417
453
|
});
|
|
418
454
|
|
|
419
|
-
return this._fetch(
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
455
|
+
return this._fetch(
|
|
456
|
+
endpoint,
|
|
457
|
+
{
|
|
458
|
+
body,
|
|
459
|
+
headers: { ...this._headers, ...headers },
|
|
460
|
+
method,
|
|
461
|
+
...rest,
|
|
462
|
+
},
|
|
463
|
+
context,
|
|
464
|
+
);
|
|
425
465
|
}
|
|
426
466
|
|
|
427
467
|
private _resolvePendingRequests(requestHash: string, responseData: FetchResponse) {
|
package/src/types.ts
CHANGED
|
@@ -17,11 +17,13 @@ export interface ConstructorOptions {
|
|
|
17
17
|
enableConditionalRequests?: boolean;
|
|
18
18
|
fetchTimeout?: number;
|
|
19
19
|
headers?: StringObject;
|
|
20
|
+
log?: Log;
|
|
20
21
|
maxRedirects?: number;
|
|
21
22
|
maxRetries?: number;
|
|
22
23
|
optionalPathTemplateRegExp?: RegExp;
|
|
23
24
|
pathTemplateCallback?: PathTemplateCallback;
|
|
24
25
|
pathTemplateRegExp?: RegExp;
|
|
26
|
+
performance: Performance;
|
|
25
27
|
queryParams?: PlainObject;
|
|
26
28
|
rateLimitPerSecond?: number;
|
|
27
29
|
requestRetryWait?: number;
|
|
@@ -42,6 +44,14 @@ export interface FetchRedirectHandlerOptions extends FetchOptions {
|
|
|
42
44
|
status: number;
|
|
43
45
|
}
|
|
44
46
|
|
|
47
|
+
export type Log = (message: string, data: PlainObject, logLevel?: LogLevel) => void;
|
|
48
|
+
|
|
49
|
+
export type LogLevel = "error" | "warn" | "info" | "http" | "verbose" | "debug" | "silly";
|
|
50
|
+
|
|
51
|
+
export interface Performance {
|
|
52
|
+
now(): number;
|
|
53
|
+
}
|
|
54
|
+
|
|
45
55
|
export interface RequestOptions {
|
|
46
56
|
body?: BodyInit;
|
|
47
57
|
headers?: StringObject;
|