UNPKG

get-it

Version:

Generic HTTP request library for node, browsers and workers

2 lines (1 loc) 8.56 kB
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("http"),t=require("https"),s=require("./_chunks-cjs/node-request-error.cjs");function r(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var o=/* @__PURE__ */r(require("is-retry-allowed"));const n=/^https:/i;function i(s){const r=new e.Agent(s),o=new t.Agent(s),i={http:r,https:o};return{finalizeOptions:e=>{if(e.agent)return e;if(e.maxRedirects>0)return{...e,agents:i};const t=n.test(e.href||e.protocol);return{...e,agent:t?o:r}}}}const c=/^\//,a=/\/$/;var u=s.r(),p=/* @__PURE__ */s.g(u);const l=["cookie","authorization"],d=Object.prototype.hasOwnProperty;class f extends Error{response;request;constructor(e,t){super();const s=e.url.length>400?`${e.url.slice(0,399)}…`:e.url;let r=`${e.method}-request to ${s} resulted in `;r+=`HTTP ${e.statusCode} ${e.statusMessage}`,this.message=r.trim(),this.response=e,this.request=t.options}}const b=typeof Buffer>"u"?()=>!1:e=>Buffer.isBuffer(e);function h(e){return"[object Object]"===Object.prototype.toString.call(e)}function y(e){if(!1===h(e))return!1;const t=e.constructor;if(void 0===t)return!0;const s=t.prototype;return!(!1===h(s)||!1===s.hasOwnProperty("isPrototypeOf"))}const g=["boolean","string","number"];let m={};typeof globalThis<"u"?m=globalThis:typeof window<"u"?m=window:typeof global<"u"?m=global:typeof self<"u"&&(m=self);var O=m;function w(e){return t=>({stage:e,percent:t.percentage,total:t.length,loaded:t.transferred,lengthComputable:!(0===t.length&&0===t.percentage)})}const j=(e={})=>{const t=e.implementation||Promise;if(!t)throw new Error("`Promise` is not available in global scope, and no implementation was passed");return{onReturn:(s,r)=>new t((t,o)=>{const n=r.options.cancelToken;n&&n.promise.then(e=>{s.abort.publish(e),o(e)}),s.error.subscribe(o),s.response.subscribe(s=>{t(e.onlyBody?s.body:s)}),setTimeout(()=>{try{s.request.publish(r)}catch(e){o(e)}},0)})}};class x{__CANCEL__=!0;message;constructor(e){this.message=e}toString(){return"Cancel"+(this.message?`: ${this.message}`:"")}}class R{promise;reason;constructor(e){if("function"!=typeof e)throw new TypeError("executor must be a function.");let t=null;this.promise=new Promise(e=>{t=e}),e(e=>{this.reason||(this.reason=new x(e),t(this.reason))})}static source=()=>{let e;return{token:new R(t=>{e=t}),cancel:e}}}j.Cancel=x,j.CancelToken=R,j.isCancel=e=>!(!e||!e?.__CANCEL__);var q=(e,t,s)=>!("GET"!==s.method&&"HEAD"!==s.method||e.response&&e.response.statusCode)&&o.default(e);function E(e){return 100*Math.pow(2,e)+100*Math.random()}const v=(e={})=>(e=>{const t=e.maxRetries||5,s=e.retryDelay||E,r=e.shouldRetry;return{onError:(e,o)=>{const n=o.options,i=n.maxRetries||t,c=n.retryDelay||s,a=n.shouldRetry||r,u=n.attemptNumber||0;if(null!==(p=n.body)&&"object"==typeof p&&"function"==typeof p.pipe||!a(e,u,n)||u>=i)return e;var p;const l=Object.assign({},o,{options:Object.assign({},n,{attemptNumber:u+1})});return setTimeout(()=>o.channels.request.publish(l),c(u)),null}}})({shouldRetry:q,...e});function C(e){const t=new URLSearchParams,s=(e,r)=>{const o=r instanceof Set?Array.from(r):r;if(Array.isArray(o))if(o.length)for(const t in o)s(`${e}[${t}]`,o[t]);else t.append(`${e}[]`,"");else if("object"==typeof o&&null!==o)for(const[t,r]of Object.entries(o))s(`${e}[${t}]`,r);else t.append(e,o)};for(const[t,r]of Object.entries(e))s(t,r);return t.toString()}v.shouldRetry=q;const T=(k=i,function(e={}){const{maxRetries:t=3,ms:r=1e3,maxFree:o=256}=e,{finalizeOptions:n}=k({keepAlive:!0,keepAliveMsecs:r,maxFreeSockets:o});return{finalizeOptions:n,onError:(e,r)=>{if(("GET"===r.options.method||"POST"===r.options.method)&&e instanceof s.N&&"ECONNRESET"===e.code&&e.request.reusedSocket){const e=r.options.attemptNumber||0;if(e<t){const t=Object.assign({},r,{options:Object.assign({},r.options,{attemptNumber:e+1})});return setImmediate(()=>r.channels.request.publish(t)),null}}return e}}});var k;exports.processOptions=s.p,exports.validateOptions=s.v,exports.Cancel=x,exports.CancelToken=R,exports.agent=i,exports.base=function(e){const t=e.replace(a,"");return{processOptions:e=>{if(/^https?:\/\//i.test(e.url))return e;const s=[t,e.url.replace(c,"")].join("/");return Object.assign({},e,{url:s})}}},exports.debug=function(e={}){const t=e.verbose,s=e.namespace||"get-it",r=p(s),o=e.log||r,n=o===r&&!p.enabled(s);let i=0;return{processOptions:e=>(e.debug=o,e.requestId=e.requestId||++i,e),onRequest:s=>{if(n||!s)return s;const r=s.options;if(o("[%s] HTTP %s %s",r.requestId,r.method,r.url),t&&r.body&&"string"==typeof r.body&&o("[%s] Request body: %s",r.requestId,r.body),t&&r.headers){const t=!1===e.redactSensitiveHeaders?r.headers:((e,t)=>{const s={};for(const r in e)d.call(e,r)&&(s[r]=t.indexOf(r.toLowerCase())>-1?"<redacted>":e[r]);return s})(r.headers,l);o("[%s] Request headers: %s",r.requestId,JSON.stringify(t,null,2))}return s},onResponse:(e,s)=>{if(n||!e)return e;const r=s.options.requestId;return o("[%s] Response code: %s %s",r,e.statusCode,e.statusMessage),t&&e.body&&o("[%s] Response body: %s",r,function(e){return-1!==(e.headers["content-type"]||"").toLowerCase().indexOf("application/json")?function(e){try{const t="string"==typeof e?JSON.parse(e):e;return JSON.stringify(t,null,2)}catch{return e}}(e.body):e.body}(e)),e},onError:(e,t)=>{const s=t.options.requestId;return e?(o("[%s] ERROR: %s",s,e.message),e):(o("[%s] Error encountered, but handled by an earlier middleware",s),e)}}},exports.headers=function(e,t={}){return{processOptions:s=>{const r=s.headers||{};return s.headers=t.override?Object.assign({},r,e):Object.assign({},e,r),s}}},exports.httpErrors=function(){return{onResponse:(e,t)=>{if(!(e.statusCode>=400))return e;throw new f(e,t)}}},exports.injectResponse=function(e={}){if("function"!=typeof e.inject)throw new Error("`injectResponse` middleware requires a `inject` function");return{interceptRequest:function(t,s){const r=e.inject(s,t);if(!r)return t;const o=s.context.options;return{body:"",url:o.url,method:o.method,headers:{},statusCode:200,statusMessage:"OK",...r}}}},exports.jsonRequest=function(){return{processOptions:e=>{const t=e.body;return!t||"function"==typeof t.pipe||b(t)||-1===g.indexOf(typeof t)&&!Array.isArray(t)&&!y(t)?e:Object.assign({},e,{body:JSON.stringify(e.body),headers:Object.assign({},e.headers,{"Content-Type":"application/json"})})}}},exports.jsonResponse=function(e){return{onResponse:s=>{const r=s.headers["content-type"]||"",o=e&&e.force||-1!==r.indexOf("application/json");return s.body&&r&&o?Object.assign({},s,{body:t(s.body)}):s},processOptions:e=>Object.assign({},e,{headers:Object.assign({Accept:"application/json"},e.headers)})};function t(e){try{return JSON.parse(e)}catch(e){throw e.message=`Failed to parsed response body as JSON: ${e.message}`,e}}},exports.keepAlive=T,exports.mtls=function(e={}){if(!e.ca)throw new Error('Required mtls option "ca" is missing');if(!e.cert)throw new Error('Required mtls option "cert" is missing');if(!e.key)throw new Error('Required mtls option "key" is missing');return{finalizeOptions:t=>{if(function(e){return"object"==typeof e&&null!==e&&!("protocol"in e)}(t))return t;const s={cert:e.cert,key:e.key,ca:e.ca};return Object.assign({},t,s)}}},exports.observable=function(e={}){const t=e.implementation||O.Observable;if(!t)throw new Error("`Observable` is not available in global scope, and no implementation was passed");return{onReturn:(e,s)=>new t(t=>(e.error.subscribe(e=>t.error(e)),e.progress.subscribe(e=>t.next(Object.assign({type:"progress"},e))),e.response.subscribe(e=>{t.next(Object.assign({type:"response"},e)),t.complete()}),e.request.publish(s),()=>e.abort.publish()))}},exports.progress=function(){let e=!1;const t=w("download"),r=w("upload");return{onHeaders:(e,r)=>{const o=s.a({time:32});return o.on("progress",e=>r.context.channels.progress.publish(t(e))),e.pipe(o)},onRequest:t=>{t.progress&&t.progress.on("progress",s=>{e=!0,t.context.channels.progress.publish(r(s))})},onResponse:(t,s)=>(!e&&typeof s.options.body<"u"&&s.channels.progress.publish(r({length:0,transferred:0,percentage:100})),t)}},exports.promise=j,exports.proxy=function(e){if(!(!1===e||e&&e.host))throw new Error("Proxy middleware takes an object of host, port and auth properties");return{processOptions:t=>Object.assign({proxy:e},t)}},exports.retry=v,exports.urlEncoded=function(){return{processOptions:e=>{const t=e.body;return t&&"function"!=typeof t.pipe&&!b(t)&&y(t)?{...e,body:C(e.body),headers:{...e.headers,"Content-Type":"application/x-www-form-urlencoded"}}:e}}};//# sourceMappingURL=middleware.cjs.map