@keload/node-red-contrib-happy-http-client
Version:
Fresh way to manage HTTP requests
2 lines (1 loc) • 11.7 kB
JavaScript
var O=Object.defineProperty;var ne=Object.getOwnPropertyDescriptor;var oe=Object.getOwnPropertyNames;var se=Object.prototype.hasOwnProperty;var ie=(e,t)=>{for(var n in t)O(e,n,{get:t[n],enumerable:!0})},ue=(e,t,n,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of oe(t))!se.call(e,o)&&o!==n&&O(e,o,{get:()=>t[o],enumerable:!(r=ne(t,o))||r.enumerable});return e};var ae=e=>ue(O({},"__esModule",{value:!0}),e);var Re={};ie(Re,{default:()=>Ne});module.exports=ae(Re);var S={requestAuthPasswordSecret:{type:"text"}};function k(e){RED.nodes.createNode(this,e),this.name=e.name,this.baseUrl=e.baseUrl,this.defaultArgsHeaders=e.defaultArgsHeaders,this.defaultArgsHeadersType=e.defaultArgsHeadersType,this.defaultArgsQueryParams=e.defaultArgsQueryParams,this.defaultArgsQueryParamsType=e.defaultArgsQueryParamsType,this.connectionKeepAlive=e.connectionKeepAlive,this.connectionKeepAliveType=e.connectionKeepAliveType,this.connectionTimeout=e.connectionTimeout,this.connectionTimeoutType=e.connectionTimeoutType,this.caRejectUnauthorized=e.caRejectUnauthorized,this.caRejectUnauthorizedType=e.caRejectUnauthorizedType,this.requestAuthBearerToken=e.requestAuthBearerToken,this.requestAuthBearerTokenType=e.requestAuthBearerTokenType,this.requestAuthKind=e.requestAuthKind,this.requestAuthUsername=e.requestAuthUsername,this.requestAuthUsernameType=e.requestAuthUsernameType}var _=e=>!!(e&&e.constructor&&e.call&&e.apply),le=e=>!(!e||!e.then||!_(e.then)),ce=(e,t,n=!1)=>e?e.slice().sort(n===!0?(r,o)=>t(o)-t(r):(r,o)=>t(r)-t(o)):[];function*K(e,t,n=o=>o,r=1){let o=_(n)?n:()=>n,s=t?e:0,u=t==null?e:t;for(let i=s;i<=u&&(yield o(i),!(i+r>u));i+=r);}var de=(e,t,n,r)=>Array.from(K(e,t,n,r)),pe=(e,t)=>e?e.reduce((n,r)=>{let[o,s]=n;return t(r)?[[...o,r],s]:[o,[...s,r]]},[[],[]]):[[],[]];function B(e,t,n,r,o,s,u){try{var i=e[s](u),a=i.value}catch(l){n(l);return}i.done?t(a):Promise.resolve(a).then(r,o)}function y(e){return function(){var t=this,n=arguments;return new Promise(function(r,o){var s=e.apply(t,n);function u(a){B(s,r,o,u,i,"next",a)}function i(a){B(s,r,o,u,i,"throw",a)}u(void 0)})}}(function(){var e=y(function*(t,n,r){let o=r!==void 0;if(!o&&(t==null?void 0:t.length)<1)throw Error("Cannot reduce empty array with no init value");let s=o?t:t.slice(1),u=o?r:t[0];for(let[i,a]of s.entries())u=yield n(u,a,i);return u});return function(t,n,r){return e.apply(this,arguments)}})(),(function(){var e=y(function*(t,n){if(!t)return[];let r=[],o=0;for(let s of t){let u=yield n(s,o++);r.push(u)}return r});return function(t,n){return e.apply(this,arguments)}})(),(function(){var e=y(function*(t){let n=[],[r,o]=yield E(t)((s,u)=>{var i;return n.push({fn:s,rethrow:(i=u==null?void 0:u.rethrow)==null?!1:i})});for(let{fn:s,rethrow:u}of n){let[i]=yield E(s)(r);if(i&&u)throw i}if(r)throw r;return o});return function(t){return e.apply(this,arguments)}})();var fe=class extends Error{constructor(e=[]){var t,n,r,o;super(),this.name=`AggregateError(${(t=(n=e.find(s=>s.name))==null?void 0:n.name)==null?"":t}...)`,this.message=`AggregateError with ${e.length} errors`,this.stack=(r=(o=e.find(s=>s.stack))==null?void 0:o.stack)==null?this.stack:r,this.errors=e}};(function(){var e=y(function*(t,n,r){let o=n.map((l,c)=>({index:c,item:l})),s=(function(){var l=y(function*(c){let d=[];for(;;){let m=o.pop();if(!m)return c(d);let[g,h]=yield E(r)(m.item);d.push({error:g,result:h,index:m.index})}});return function(c){return l.apply(this,arguments)}})(),u=de(1,t).map(()=>new Promise(s)),[i,a]=pe(ce((yield Promise.all(u)).flat(),l=>l.index),l=>!!l.error);if(i.length>0)throw new fe(i.map(l=>l.error));return a.map(l=>l.result)});return function(t,n,r){return e.apply(this,arguments)}})(),(function(){var e=y(function*(t,n){var r,o;let s=(r=t==null?void 0:t.times)==null?3:r,u=t==null?void 0:t.delay,i=(o=t==null?void 0:t.backoff)==null?null:o;for(let a of K(1,s)){let[l,c]=yield E(n)(d=>{throw{_exited:d}});if(!l)return c;if(l._exited)throw l._exited;if(a===s)throw l;u&&(yield F(u)),i&&(yield F(i(a)))}});return function(t,n){return e.apply(this,arguments)}})();var F=e=>new Promise(t=>setTimeout(t,e)),E=e=>(...t)=>{try{let n=e(...t);return le(n)?n.then(r=>[void 0,r]).catch(r=>[r,void 0]):[void 0,n]}catch(n){return[n,void 0]}};function U(e,{lenient:t=!1}={}){if(typeof e!="string")throw TypeError("isUrl: Expected a string");let n=e.trim();if(n.includes(" "))return!1;try{return new URL(n),!0}catch(r){return t?U(`https://${n}`):!1}}function D(e,t,n,r,o,s,u){try{var i=e[s](u),a=i.value}catch(l){n(l);return}i.done?t(a):Promise.resolve(a).then(r,o)}function me(e){return function(){var t=this,n=arguments;return new Promise(function(r,o){var s=e.apply(t,n);function u(a){D(s,r,o,u,i,"next",a)}function i(a){D(s,r,o,u,i,"throw",a)}u(void 0)})}}function M(e,t){return typeof e=="boolean"?e?[t,null]:[null,t]:(console.warn("Payload must be a boolean (true or false)."),[null,null])}function $(e){return RED.nodes.getNode(e)}function he(e){return new Promise(t=>{try{RED.util.evaluateNodeProperty(e.value,e.type,e.node,e.msg,(n,r)=>{t([n,r])})}catch(n){t([n,void 0])}})}function v(e,t,n={typedSuffix:"Type"}){function r(i,a){return he({value:i,type:a,node:e,msg:t})}function o(i){return typeof i!="boolean"&&i===""}function s(i,a){return u.apply(this,arguments)}function u(){return u=me(function*(i,a,l={strictDefaultValue:void 0}){let[,c]=yield r(i==null?void 0:i[a],i==null?void 0:i[`${String(a)}${n.typedSuffix}`]);return(l==null?void 0:l.strictDefaultValue)===void 0?c:o(c)?l.strictDefaultValue:c}),u.apply(this,arguments)}return{evaluateNodeProperty:r,quickNodePropertyEval:s}}var X=require("urllib");var z=e=>!!e&&e.constructor===Symbol;var x=e=>!!e&&e.constructor===Object;var V=e=>!!(e&&e.constructor&&e.call&&e.apply);var P=e=>{try{return Number(e)===e}catch(t){return!1}},j=e=>Object.prototype.toString.call(e)==="[object Date]";var H=e=>{if(e===!0||e===!1||e==null)return!0;if(P(e))return e===0;if(j(e))return isNaN(e.getTime());if(V(e)||z(e))return!1;let t=e.length;if(P(t))return t===0;let n=e.size;return P(n)?n===0:Object.keys(e).length===0};var q=(e,t)=>{var n;return!e||!t?(n=e!=null?e:t)!=null?n:{}:Object.entries({...e,...t}).reduce((r,[o,s])=>({...r,[o]:x(e[o])?q(e[o],s):s}),{})};var w={CONNECTION_TIMEOUT:5e3,CONNECTION_KEEP_ALIVE:4e3,CA_REJECT_UNAUTHORIZED:!0};var L=["GET","POST","PUT","DELETE","CONNECT","OPTIONS","TRACE","PATCH"];async function Q(e){let t=new URL(e.url),n=new URLSearchParams({...Object.fromEntries(t.searchParams),...e==null?void 0:e.queryParams});t.search=n.toString();let r=t.toString(),o=(e==null?void 0:e.reqOptions)||{};try{let s=await e.client.request(r,{...o}),u=s.status>=200&&s.status<300,i={ok:u,request:{url:r,reqOptions:o},response:s};return u?[void 0,s.data,i]:[new Error(`Request failed with status ${s.status} (${s.url})`),void 0,i]}catch(s){return[s,void 0,{ok:!1,...s.res}]}}function W(e,t){let n=t.startsWith("/")?t.substring(1):t;return`${e.endsWith("/")?e.slice(0,-1):e}/${n}`}async function Y(e){let{clientInstance:t}=e;return{clientInstanceBaseUrl:t==null?void 0:t.baseUrl,credentials:t==null?void 0:t.credentials,currentClientInstance:t}}var Z={INHERIT_CLIENT_TERM:"from_client"};var A=e=>e===Z.INHERIT_CLIENT_TERM;async function G(e){let{node:t,msg:n,currentNode:r}=e,{quickNodePropertyEval:o}=v(t,n),s=await o(r,"endpoint"),u=await o(r,"body"),i=await o(r,"bodyContentType"),a=L.includes(r.methodType)?r.methodType:await o(r,"method"),l={connectionKeepAlive:A(r==null?void 0:r.connectionKeepAliveType),connectionTimeout:A(r==null?void 0:r.connectionTimeoutType),caRejectUnauthorized:A(r==null?void 0:r.caRejectUnauthorizedType),requestAuthBearerToken:A(r==null?void 0:r.requestAuthBearerTokenType),requestAuthKind:A(r==null?void 0:r.requestAuthKind),requestAuthUsername:A(r==null?void 0:r.requestAuthUsernameType)};return{nodeInstanceMethod:a,nodeInstanceBody:u||{},nodeInstanceBodyContentType:i,resolvedNodeEndpoint:s,isFromClient:l,currentNodeInstance:r,credentials:r.credentials}}function ge(e,t,n){return n&&e!==void 0?e:t}async function Te(e){let[t,n]=await Promise.all([Y({node:e.node,msg:e.msg,clientInstance:e.clientInstance}),G({node:e.node,msg:e.msg,currentNode:e.currentNode})]),{quickNodePropertyEval:r}=v(e.node,e.msg);async function o(s,u){let{defaultValue:i,withInherit:a=!1}=u||{},[l,c]=await Promise.all([r(n.currentNodeInstance,s,{strictDefaultValue:i}),r(t.currentClientInstance,s,{strictDefaultValue:i})]),d=ge(c,l,a);return[c,l,d]}return{configInstance:t,nodeInstance:n,resolveEachNodes:o}}async function J(e){let{configInstance:t,nodeInstance:n,resolveEachNodes:r}=await Te(e),{isFromClient:o}=n,[,,s]=await r("connectionTimeout",{defaultValue:w.CONNECTION_TIMEOUT,withInherit:o.connectionTimeout}),[,,u]=await r("connectionKeepAlive",{defaultValue:w.CONNECTION_KEEP_ALIVE,withInherit:o.connectionKeepAlive}),[,,i]=await r("caRejectUnauthorized",{defaultValue:w.CA_REJECT_UNAUTHORIZED,withInherit:o.caRejectUnauthorized}),[,,a]=await r("requestAuthBearerToken",{defaultValue:"",withInherit:o.requestAuthBearerToken}),[l,c]=await r("requestAuthKind",{defaultValue:""}),d=c==="from_client_or_none"?l:c,m=d!==void 0&&d!=="none",[,,g]=await r("requestAuthUsername",{defaultValue:"",withInherit:o.requestAuthUsername&&l!=="none"}),h=()=>{var f,R;return(f=n==null?void 0:n.credentials)!=null&&f.requestAuthPasswordSecret?n.credentials.requestAuthPasswordSecret:(R=t==null?void 0:t.credentials)!=null&&R.requestAuthPasswordSecret?t.credentials.requestAuthPasswordSecret:""},[p,T]=await r("defaultArgsHeaders"),[b,C]=await r("defaultArgsQueryParams"),N={...q(p,T),...a&&{authorization:`Bearer ${a}`}},I=H(t==null?void 0:t.clientInstanceBaseUrl)?n.resolvedNodeEndpoint:W(t.clientInstanceBaseUrl,n.resolvedNodeEndpoint);return{resolvedRequestHeaders:N,resolvedRequestQueryParams:q(b,C),resolvedRequestMethod:n.nodeInstanceMethod,resolvedRequestBody:n.nodeInstanceBody,resolvedRequestBodyContentType:n.nodeInstanceBodyContentType,urlToFetch:I,resolvedConnectionTimeout:s,resolvedConnectionKeepAlive:u,resolvedCaRejectUnauthorized:i,resolvedRequestAuthBearerToken:a,resolvedRequestAuth:{hasAuth:m,authKind:d,username:g,password:h()}}}var ee={requestAuthPasswordSecret:{type:"text"}};function te(e){RED.nodes.createNode(this,e),this.status({});let t={},n=$(e.clientInstance),{throwErrorOnError:r,splitBooleanOutputs:o}=e;this.on("input",async s=>{this.status({});let{resolvedRequestHeaders:u,resolvedRequestQueryParams:i,resolvedRequestMethod:a,resolvedRequestBody:l,resolvedRequestBodyContentType:c,resolvedConnectionTimeout:d,resolvedConnectionKeepAlive:m,resolvedCaRejectUnauthorized:g,urlToFetch:h,resolvedRequestAuth:p}=await J({node:this,msg:s,currentNode:{...e,credentials:this.credentials},clientInstance:n}),T=new Date().toLocaleString();if(!U(h)){this.error(`Invalid URL: ${h}`),this.status({fill:"red",text:`Invalid URL at ${T}`});return}let C=new X.HttpClient({...t,connect:{timeout:Number(d),rejectUnauthorized:!!g}}),[N,I,f]=await Q({url:h,client:C,queryParams:i,reqOptions:{method:a,headers:u,...a!=="GET"&&{data:l,contentType:c},dataType:e.responseFormat,keepAliveTimeout:Number(m),...p.hasAuth&&p.authKind==="basic"&&{auth:`${p.username}:${p.password}`},...p.hasAuth&&p.authKind==="digest"&&{digestAuth:`${p.username}:${p.password}`}}});r&&N&&(this.error({message:N.message,response:f==null?void 0:f.response}),this.status({fill:"red",text:`Error ${f.response.status} at ${T}`}));let R={...s,happyRequest:f,payload:I};if(f.ok&&this.status({fill:"green",text:`Success at ${T}`}),o){let re=M(N===void 0,R);this.send(re)}else this.send(R)})}var Ne=async e=>{global.RED=e,global.RED.nodes.registerType("happy-config",k,{credentials:S}),global.RED.nodes.registerType("happy-request",te,{credentials:ee})};