reverse-proxy-middleware 0.0.53 → 0.0.55

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/helper.d.ts CHANGED
@@ -1,5 +1,12 @@
1
1
  import { BufferedHTTPServerRequest, EvaluationParameters, EvaluationScopeStateAPIs, Forwarders, HTTPServerResponse, ResolvedHeaderTransformation, ResolvedForwarder, ResolvedForwarders } from './type';
2
2
  export declare const EVALUATION_SCOPE_NAMES: Array<string>;
3
+ export declare const logging: {
4
+ log: (...parameters: Array<unknown>) => Promise<void>;
5
+ debug: (...parameters: Array<unknown>) => Promise<void>;
6
+ info: (...parameters: Array<unknown>) => Promise<void>;
7
+ error: (...parameters: Array<unknown>) => Promise<void>;
8
+ warn: (...parameters: Array<unknown>) => Promise<void>;
9
+ };
3
10
  export declare const applyStateAPIs: (request: BufferedHTTPServerRequest, response: HTTPServerResponse, forwarder: ResolvedForwarder) => Promise<{
4
11
  result: boolean;
5
12
  scope: EvaluationScopeStateAPIs;
@@ -8,5 +15,5 @@ export declare const determineForwarder: (request: BufferedHTTPServerRequest, re
8
15
  export declare const resolveForwarders: (forwarders: Forwarders) => ResolvedForwarders;
9
16
  export declare const addParsedContentToRequest: (bufferedRequest: BufferedHTTPServerRequest) => void;
10
17
  export declare const transformHeaders: (content: string, headerTransformations: Array<ResolvedHeaderTransformation>, parameters: EvaluationParameters) => string;
11
- export declare const reverseProxyBufferedRequest: (request: BufferedHTTPServerRequest, response: HTTPServerResponse, forwarder: ResolvedForwarder, stateAPIScope: EvaluationScopeStateAPIs) => void;
18
+ export declare const reverseProxyBufferedRequest: (request: BufferedHTTPServerRequest, response: HTTPServerResponse, forwarder: ResolvedForwarder, stateAPIScope: EvaluationScopeStateAPIs) => Promise<void>;
12
19
  export default reverseProxyBufferedRequest;
package/index.js CHANGED
@@ -1,3 +1,3 @@
1
1
  #!/usr/bin/env node
2
2
  // -*- coding: utf-8 -*-
3
- 'use strict';if(typeof module!=='undefined'&&module!==null&&eval('typeof require')!=='undefined'&&eval('require')!==null&&'main'in eval('require')&&eval('typeof require.main')!=='undefined'&&eval('require.main')!==null){var ORIGINAL_MAIN_MODULE=module;if(module!==eval('require.main')&&'paths'in module&&'paths'in eval('require.main')&&typeof __dirname!=='undefined'&&__dirname!==null)module.paths=eval('require.main.paths').concat(module.paths.filter(function(path){return eval('require.main.paths').includes(path)}))};if(module===eval('require.main'))module.paths.unshift('/application/node_modules');(()=>{"use strict";var __webpack_modules__=[(e,r,t)=>{t.d(r,{addParsedContentToRequest:()=>h,applyStateAPIs:()=>E,default:()=>P,determineForwarder:()=>O,resolveForwarders:()=>v});const n=require("@babel/runtime/helpers/extends");var o=t.n(n),_=t(1),a=t.n(_),s=t(2),i=t.n(s),c=t(3),u=t.n(c);const p=require("net"),l=require("tls");function f(e,r){var t="undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(t)return(t=t.call(e)).next.bind(t);if(Array.isArray(e)||(t=function(e,r){if(e){if("string"==typeof e)return d(e,r);var t=Object.prototype.toString.call(e).slice(8,-1);return"Object"===t&&e.constructor&&(t=e.constructor.name),"Map"===t||"Set"===t?Array.from(e):"Arguments"===t||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t)?d(e,r):void 0}}(e))||r&&e&&"number"==typeof e.length){t&&(e=t);var n=0;return function(){return n>=e.length?{done:!0}:{done:!1,value:e[n++]}}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function d(e,r){(null==r||r>e.length)&&(r=e.length);for(var t=0,n=Array(r);t<r;t++)n[t]=e[t];return n}var b=["data","error","request","response","stateAPIs","Tools"],E=function(){var e=a()(i().mark((function e(r,t,n){var o,_,a,s,c,p,l,d,b,E,O,v,h,m,P;return i().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:o={},_=f(n.stateAPIs);case 2:if((a=_()).done){e.next=71;break}s=a.value,o[s.name]={configuration:s,error:null,response:null},c=!1,p=1,l=f(s.expressions.pre);case 8:if((d=l()).done){e.next=28;break}b=d.value,E=void 0;try{E=b(s.data,null,r,t,o,u())}catch(e){console.warn("Failed running pre "+p+". expression of state api:",e)}if("number"!=typeof E){e.next=17;break}return console.info('Break request caused by state api "'+s.name+'" with status code '+E+"."),t.statusCode=E,t.end(),e.abrupt("return",{result:!1,scope:o});case 17:if("break"!==E){e.next=19;break}return e.abrupt("break",28);case 19:if(p+=1,"boolean"!=typeof E){e.next=26;break}if(!E){e.next=25;break}c=!0,e.next=26;break;case 25:return e.abrupt("break",28);case 26:e.next=8;break;case 28:if(!c){e.next=69;break}return console.info("Use state api:",u().represent(s)),O=null,e.prev=31,e.next=34,fetch(s.url,s.options);case 34:o[s.name].response=e.sent,e.next=41;break;case 37:e.prev=37,e.t0=e.catch(31),O=e.t0,console.warn('Running state api request for "'+s.name+'" throws',"error:",O);case 41:if(!o[s.name].response||!o[s.name].response.headers.has("content-type")||"application/json"!==o[s.name].response.headers.get("content-type")[0]){e.next=52;break}return e.prev=42,e.next=45,o[s.name].response.json();case 45:o[s.name].response.data=e.sent,e.next=52;break;case 48:e.prev=48,e.t1=e.catch(42),O=e.t1,console.warn("Parsing state api json response for",'"'+s.name+'" throws error:',O);case 52:console.info("State api response is:",u().represent(o[s.name].response)),p=1,v=f(s.expressions.post);case 55:if((h=v()).done){e.next=69;break}m=h.value,P=void 0;try{P=m(s.data,O,r,t,o,u())}catch(e){console.warn("Failed running "+p+". post expression of state api:",e)}if("number"!=typeof P){e.next=64;break}return console.info('Break request caused by state api "'+s.name+'" with status code '+P+"."),t.statusCode=P,t.end(),e.abrupt("return",{result:!1,scope:o});case 64:if("break"!==P){e.next=66;break}return e.abrupt("break",69);case 66:p+=1;case 67:e.next=55;break;case 69:e.next=2;break;case 71:return e.abrupt("return",{result:!0,scope:o});case 72:case"end":return e.stop()}}),e,null,[[31,37],[42,48]])})));return function(){return e.apply(this,arguments)}}(),O=function(e,r,t){for(var n,o=f(Object.entries(t).sort((function(e,r){var t=e[0],n=r[0];return t.localeCompare(n)})));!(n=o()).done;){var _,a=n.value,s=a[0],i=a[1];if(i.useExpression(i,null,e,r,((_={})[s]={configuration:i,error:null,response:null},_),u()))return console.info('Determined forwarder "'+s+'".'),i}return null},v=function(e){for(var r={},t=0,n=Object.entries(e);t<n.length;t++){var _=n[t],a=_[0],s=_[1];if("base"!==a){for(var i,c=u().extend(!0,{name:a},u().modifyObject(u().copy(e.base),s),s),p={retrieve:[],send:[]},l=f(["retrieve","send"]);!(i=l()).done;)for(var d,E=i.value,O=function(){var e=d.value,r=o()({},e,{sourceRun:function(){return""},targetRun:function(){return""}});if(Object.prototype.hasOwnProperty.call(r,"source"))if(r.source instanceof RegExp)r.sourceRun=function(){return r.source};else if("string"==typeof r.source){var t=u().stringCompile(r.source,b);if(t.error)throw new Error(t.error);r.sourceRun=t.templateFunction}else r.sourceRun=r.source;if(Object.prototype.hasOwnProperty.call(r,"target"))if("string"==typeof r.target){var n=u().stringCompile(r.target,b);if(n.error)throw new Error(n.error);r.targetRun=n.templateFunction}else r.targetRun=r.target;p[E].push(r)},v=f([].concat(c.headerTransformations[E]));!(d=v()).done;)O();c.headerTransformations=p;for(var h,m,P=[],y=[].concat(c.stateAPIs||[]),w=y.filter((function(e){return"base"===e.name}))[0],A=[],I=f(y);!(h=I()).done;)"base"!==(m=h.value).name&&A.push(u().extend(!0,{},u().modifyObject(u().copy(w),m),m));for(var M=0,k=A;M<k.length;M++){for(var D,g=k[M],T={pre:[],post:[]},R=f([].concat((null==(C=g.expressions)?void 0:C.pre)||[]));!(D=R()).done;){var C,x=D.value;if("string"==typeof x){var U=u().stringCompile(x,b);if(U.error)throw new Error(U.error);T.pre.push(U.templateFunction)}else T.pre.push(x)}for(var q,L=f([].concat((null==(B=g.expressions)?void 0:B.post)||[]));!(q=L()).done;){var B,S=q.value;if("string"==typeof S){var K=u().stringCompile(S,b);if(K.error)throw new Error(K.error);T.post.push(K.templateFunction)}else T.post.push(S)}g.expressions=T,P.push(g)}if(c.stateAPIs=P,"string"==typeof c.useExpression){var W=u().stringCompile(c.useExpression,b);if(W.error)throw new Error(W.error);c.useExpression=W.templateFunction}r[a]=c}}return r},h=function(e){if("application/json"===e.headers["content-type"])try{var r=Buffer.concat(e.socket.buffer.data).toString();e.socket.buffer.body=r.replace(/^[\s\S]+\s*\n\s*\n\s*([\s\S]+)$/m,"$1"),e.socket.buffer.content=JSON.parse(e.socket.buffer.body)}catch(r){console.warn("Error parsing given request.",e)}},m=function(e,r,t){for(var n,o=function(){var r=n.value;try{var o=r.sourceRun.apply(r,t),_=r.targetRun.apply(r,t);if([null,void 0].includes(o)||"string"==typeof o&&""===o.trim()){if([null,void 0].includes(_)||"string"==typeof _&&""===_.trim())return"continue";e=e.replace(/(\s*\n)\s*\n\s*/,(function(e,r){for(var t=arguments.length,n=Array(2<t?t-2:0),o=2;o<t;o++)n[o-2]=arguments[o];var a="string"==typeof _?_:_.apply(void 0,[e,r].concat(n));return""+r+a+e}))}else console.debug('Search for "'+o+'" and replace with',u().represent(_)+"."),e=e.replace(o,_)}catch(e){console.warn("Could not apply header transformation with source "+(r.source?u().represent(r.source):'"add"')+" and replacement "+(r.target?u().represent(r.target):'"remove"')+":",e)}},_=f(r);!(n=_()).done;)o();return e};const P=function(e,r,t,n){var _=r.socket,a=t.tls?l.connect:p.createConnection,s=t.tls&&443!==t.port||!t.tls&&80!==t.port?":"+t.port:"",i=a(o()({host:t.host,port:t.port},t.tls?{servername:t.host,rejectUnauthorized:!1}:{}),(function(){console.info("Proxy to: http"+(t.tls?"s":"")+"://"+t.host+s)}));i.on("error",(function(e){console.error("Proxy to server error",e)}));var c=[{clientSocket:_,serverSocket:i},null,e,r,n,u()];if(t.headerTransformations.retrieve.length){var d=!1;i.on("data",(function(e){if(d)_.write(e);else{var r=e.toString();console.info("Got response header from backend:\n"+r),r=m(r,t.headerTransformations.retrieve,c),console.info("Send response header to client:\n"+r),_.write(r),d=!0}}))}else i.pipe(_);i.on("connect",(function(){for(var r,n,o=!1,_=f(e.socket.buffer.data);!(r=_()).done;)if(n=r.value,o)i.write(n);else{var a=n.toString();console.info("Got request header from client:\n"+a),t.tls&&(a=a.replace(/HTTP\/1\.0/i,"HTTP/1.1")),a=a.replace(/(($|\n)host: )[^\n]+/i,"$1"+t.host+s),a=m(a,t.headerTransformations.send,c),console.info("Send request header to backend:\n"+a),i.write(a),o=!0}}))}},e=>{e.exports=require("@babel/runtime/helpers/asyncToGenerator")},e=>{e.exports=require("@babel/runtime/regenerator")},e=>{e.exports=require("clientnode")},(module,__webpack_exports__,__webpack_require__)=>{__webpack_require__.r(__webpack_exports__),__webpack_require__.d(__webpack_exports__,{default:()=>__WEBPACK_DEFAULT_EXPORT__});var _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0__=__webpack_require__(1),_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0___default=__webpack_require__.n(_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0__),_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1__=__webpack_require__(2),_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default=__webpack_require__.n(_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1__),clientnode__WEBPACK_IMPORTED_MODULE_2__=__webpack_require__(3),clientnode__WEBPACK_IMPORTED_MODULE_2___default=__webpack_require__.n(clientnode__WEBPACK_IMPORTED_MODULE_2__),http__WEBPACK_IMPORTED_MODULE_3__=__webpack_require__(5),http__WEBPACK_IMPORTED_MODULE_3___default=__webpack_require__.n(http__WEBPACK_IMPORTED_MODULE_3__),http2__WEBPACK_IMPORTED_MODULE_4__=__webpack_require__(6),http2__WEBPACK_IMPORTED_MODULE_4___default=__webpack_require__.n(http2__WEBPACK_IMPORTED_MODULE_4__),path__WEBPACK_IMPORTED_MODULE_5__=__webpack_require__(7),path__WEBPACK_IMPORTED_MODULE_5___default=__webpack_require__.n(path__WEBPACK_IMPORTED_MODULE_5__),_helper__WEBPACK_IMPORTED_MODULE_6__=__webpack_require__(0),_package_json__WEBPACK_IMPORTED_MODULE_7__=__webpack_require__(8);function _createForOfIteratorHelperLoose(e,r){var t="undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(t)return(t=t.call(e)).next.bind(t);if(Array.isArray(e)||(t=_unsupportedIterableToArray(e))||r&&e&&"number"==typeof e.length){t&&(e=t);var n=0;return function(){return n>=e.length?{done:!0}:{done:!1,value:e[n++]}}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function _unsupportedIterableToArray(e,r){if(e){if("string"==typeof e)return _arrayLikeToArray(e,r);var t=Object.prototype.toString.call(e).slice(8,-1);return"Object"===t&&e.constructor&&(t=e.constructor.name),"Map"===t||"Set"===t?Array.from(e):"Arguments"===t||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t)?_arrayLikeToArray(e,r):void 0}}function _arrayLikeToArray(e,r){(null==r||r>e.length)&&(r=e.length);for(var t=0,n=Array(r);t<r;t++)n[t]=e[t];return n}module=__webpack_require__.hmd(module);for(var _step,onIncomingMessage=function(e,r){var t=e;_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0___default()(_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default().mark((function e(){var n,o,_,a;return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=3,clientnode__WEBPACK_IMPORTED_MODULE_2___default().timeout();case 3:if(!t.socket.buffer.finished){e.next=5;break}return e.abrupt("break",7);case 5:e.next=0;break;case 7:if(CONFIGURATION.parseBody&&(0,_helper__WEBPACK_IMPORTED_MODULE_6__.addParsedContentToRequest)(t),null!==(n=(0,_helper__WEBPACK_IMPORTED_MODULE_6__.determineForwarder)(t,r,FORWARDERS))){e.next=14;break}return console.error("No forwarder found for given request:",t),r.statusCode=502,r.end(),e.abrupt("return");case 14:return e.next=16,(0,_helper__WEBPACK_IMPORTED_MODULE_6__.applyStateAPIs)(t,r,n);case 16:o=e.sent,_=o.result,a=o.scope,_&&(0,_helper__WEBPACK_IMPORTED_MODULE_6__.default)(t,r,n,a);case 20:case"end":return e.stop()}}),e)})))()},onIncomingStream=function(e,r){console.info("Got stream",e,r)},BASE_CONFIGURATION=_package_json__WEBPACK_IMPORTED_MODULE_7__.DN,_iterator=_createForOfIteratorHelperLoose(["configuration.json","secure-configuration.json"]);!(_step=_iterator()).done;){var path=_step.value,configurationPath=(0,path__WEBPACK_IMPORTED_MODULE_5__.resolve)(process.cwd(),path);if(clientnode__WEBPACK_IMPORTED_MODULE_2___default().isFileSync(configurationPath)){var configuration=eval("require('"+configurationPath+"')");clientnode__WEBPACK_IMPORTED_MODULE_2___default().extend(!0,clientnode__WEBPACK_IMPORTED_MODULE_2___default().modifyObject(BASE_CONFIGURATION,configuration),configuration)}}var CONFIGURATION=clientnode__WEBPACK_IMPORTED_MODULE_2___default().evaluateDynamicData(BASE_CONFIGURATION,{configuration:BASE_CONFIGURATION,environment:process.env,Tools:clientnode__WEBPACK_IMPORTED_MODULE_2___default()}),FORWARDERS=(0,_helper__WEBPACK_IMPORTED_MODULE_6__.resolveForwarders)(CONFIGURATION.forwarders),server={instance:CONFIGURATION.publicKeyPath&&CONFIGURATION.privateKeyPath?(0,http2__WEBPACK_IMPORTED_MODULE_4__.createSecureServer)(CONFIGURATION.nodeServerOptions,onIncomingMessage):(0,http__WEBPACK_IMPORTED_MODULE_3__.createServer)(onIncomingMessage),streams:[],sockets:[],start:function(){server.instance.listen(CONFIGURATION.port,(function(){return console.info("Listen on port "+CONFIGURATION.port+" for incoming requests.")}))},stop:function(){server.instance.close((function(){console.info("Shut server down.")}));for(var e,r=0,t=[server.sockets,server.streams];r<t.length;r++)if(e=t[r],Array.isArray(e))for(var n,o=_createForOfIteratorHelperLoose(e);!(n=o()).done;)n.value.destroy()}};if(server.instance.on("connection",(function(e){server.sockets.push(e),e.buffer={data:[],finished:!1},e.on("data",(function(r){e.buffer.data.push(r)}));for(var r,t=0,n=["done","finish","writableEnded","writableFinished"];t<n.length;t++)r=n[t],e.on(r,(function(){e.buffer.finished=!0}));clientnode__WEBPACK_IMPORTED_MODULE_2___default().timeout((function(){e.buffer.finished=!0})),e.on("close",(function(){e.buffer.finished=!0,server.sockets.splice(server.sockets.indexOf(e),1)}))})),server.instance.on("stream",(function(e,r){server.streams.push(e),onIncomingStream(e,r),e.on("close",(function(){server.streams.splice(server.streams.indexOf(e),1)}))})),__webpack_require__.c[__webpack_require__.s]===module||eval("require.main")!==__webpack_require__.c[__webpack_require__.s]&&"undefined"!=typeof ORIGINAL_MAIN_MODULE&&ORIGINAL_MAIN_MODULE===eval("require.main")){console.info("Start server with configuration:",clientnode__WEBPACK_IMPORTED_MODULE_2___default().represent(CONFIGURATION)),console.debug("Apply resolved forwarder:",clientnode__WEBPACK_IMPORTED_MODULE_2___default().represent(FORWARDERS)),server.start();for(var _step3,_loop=function(){var e=_step3.value;process.on(e,(function(){console.info('\nGot "'+e+'" signal: stopping server.'),server.stop()}))},_iterator3=_createForOfIteratorHelperLoose(clientnode__WEBPACK_IMPORTED_MODULE_2__.CloseEventNames);!(_step3=_iterator3()).done;)_loop()}const __WEBPACK_DEFAULT_EXPORT__=server},e=>{e.exports=require("http")},e=>{e.exports=require("http2")},e=>{e.exports=require("path")},e=>{e.exports=JSON.parse('{"DN":{"publicKeyPath":"","privateKeyPath":"","nodeServerOptions":{"allowHTTP1":true},"host":"localhost","port":8080,"parseBody":false,"forwarders":{"base":{"headerTransformations":{"retrieve":[],"send":[]},"host":"localhost","port":443,"stateAPIs":[{"data":{},"expressions":{"pre":"false","post":"true"},"name":"base","options":{},"url":""}],"tls":true,"useExpression":"true"}}}}')}],__webpack_module_cache__={};function __webpack_require__(e){var r=__webpack_module_cache__[e];if(void 0!==r)return r.exports;var t=__webpack_module_cache__[e]={id:e,loaded:!1,exports:{}};return __webpack_modules__[e](t,t.exports,__webpack_require__),t.loaded=!0,t.exports}__webpack_require__.c=__webpack_module_cache__,__webpack_require__.n=e=>{var r=e&&e.__esModule?()=>e.default:()=>e;return __webpack_require__.d(r,{a:r}),r},__webpack_require__.d=(e,r)=>{for(var t in r)__webpack_require__.o(r,t)&&!__webpack_require__.o(e,t)&&Object.defineProperty(e,t,{enumerable:!0,get:r[t]})},__webpack_require__.hmd=e=>((e=Object.create(e)).children||(e.children=[]),Object.defineProperty(e,"exports",{enumerable:!0,set:()=>{throw new Error("ES Modules may not assign module.exports or exports.*, Use ESM export syntax, instead: "+e.id)}}),e),__webpack_require__.o=(e,r)=>Object.prototype.hasOwnProperty.call(e,r),__webpack_require__.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})};var __webpack_exports__=__webpack_require__(__webpack_require__.s=4);module.exports=__webpack_exports__})();
3
+ 'use strict';if(typeof module!=='undefined'&&module!==null&&eval('typeof require')!=='undefined'&&eval('require')!==null&&'main'in eval('require')&&eval('typeof require.main')!=='undefined'&&eval('require.main')!==null){var ORIGINAL_MAIN_MODULE=module;if(module!==eval('require.main')&&'paths'in module&&'paths'in eval('require.main')&&typeof __dirname!=='undefined'&&__dirname!==null)module.paths=eval('require.main.paths').concat(module.paths.filter(function(path){return eval('require.main.paths').includes(path)}))};if(module===eval('require.main'))module.paths.unshift('/application/node_modules');(()=>{"use strict";var __webpack_modules__=[(e,r,t)=>{t.d(r,{addParsedContentToRequest:()=>P,applyStateAPIs:()=>h,default:()=>M,determineForwarder:()=>v,logging:()=>O,resolveForwarders:()=>g});const n=require("@babel/runtime/helpers/extends");var _=t.n(n),o=t(1),a=t.n(o),s=t(2),i=t.n(s),u=t(3),c=t.n(u);const p=require("net"),l=require("tls");function f(e,r){var t="undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(t)return(t=t.call(e)).next.bind(t);if(Array.isArray(e)||(t=function(e,r){if(e){if("string"==typeof e)return d(e,r);var t=Object.prototype.toString.call(e).slice(8,-1);return"Object"===t&&e.constructor&&(t=e.constructor.name),"Map"===t||"Set"===t?Array.from(e):"Arguments"===t||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t)?d(e,r):void 0}}(e))||r&&e&&"number"==typeof e.length){t&&(e=t);var n=0;return function(){return n>=e.length?{done:!0}:{done:!1,value:e[n++]}}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function d(e,r){(null==r||r>e.length)&&(r=e.length);for(var t=0,n=Array(r);t<r;t++)n[t]=e[t];return n}var E=["data","error","request","response","stateAPIs","Tools"],b=function(){var e=a()(i().mark((function e(){var r,t,n,_=arguments;return i().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:for(r=_.length,t=Array(r),n=0;n<r;n++)t[n]=_[n];return e.abrupt("return",new Promise((function(e,r){process.stdout.write(t.join(" ")+"\n",(function(t){return t?r(t):e()}))})));case 2:case"end":return e.stop()}}),e)})));return function(){return e.apply(this,arguments)}}(),O={log:b,debug:b,info:b,error:b,warn:b},h=function(){var e=a()(i().mark((function e(r,t,n){var _,o,a,s,u,p,l,d,E,b,h,v,g,P,m;return i().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:_={},o=f(n.stateAPIs);case 2:if((a=o()).done){e.next=72;break}s=a.value,_[s.name]={configuration:s,error:null,response:null},u=!1,p=1,l=f(s.expressions.pre);case 8:if((d=l()).done){e.next=28;break}E=d.value,b=void 0;try{b=E(s.data,null,r,t,_,c())}catch(e){O.warn("Failed running pre "+p+". expression of state api:",e)}if("number"!=typeof b){e.next=17;break}return O.info('Break request caused by state api "'+s.name+'" with status code '+b+"."),t.statusCode=b,t.end(),e.abrupt("return",{result:!1,scope:_});case 17:if("break"!==b){e.next=19;break}return e.abrupt("break",28);case 19:if(p+=1,"boolean"!=typeof b){e.next=26;break}if(!b){e.next=25;break}u=!0,e.next=26;break;case 25:return e.abrupt("break",28);case 26:e.next=8;break;case 28:if(!u){e.next=70;break}return O.info('Use state api: "'+s.name+'"'),O.debug("\nState api configuration is: "+c().represent(s)),h=null,e.prev=32,e.next=35,fetch(s.url,s.options);case 35:_[s.name].response=e.sent,e.next=42;break;case 38:e.prev=38,e.t0=e.catch(32),h=e.t0,O.warn('Running state api request for "'+s.name+'" throws',"error:",h);case 42:if(!(_[s.name].response&&_[s.name].response.headers.has("content-type")&&/application\/json(;.*)?$/.test(_[s.name].response.headers.get("content-type")))){e.next=53;break}return e.prev=43,e.next=46,_[s.name].response.json();case 46:_[s.name].response.data=e.sent,e.next=53;break;case 49:e.prev=49,e.t1=e.catch(43),h=e.t1,O.warn("Parsing state api json response for",'"'+s.name+'" throws error:',h);case 53:O.debug("\nState api response is:",c().represent(_[s.name].response)),p=1,v=f(s.expressions.post);case 56:if((g=v()).done){e.next=70;break}P=g.value,m=void 0;try{m=P(s.data,h,r,t,_,c())}catch(e){O.warn("Failed running "+p+". post expression of state api:",e)}if("number"!=typeof m){e.next=65;break}return O.info('Break request caused by state api "'+s.name+'" with status code '+m+"."),t.statusCode=m,t.end(),e.abrupt("return",{result:!1,scope:_});case 65:if("break"!==m){e.next=67;break}return e.abrupt("break",70);case 67:p+=1;case 68:e.next=56;break;case 70:e.next=2;break;case 72:return e.abrupt("return",{result:!0,scope:_});case 73:case"end":return e.stop()}}),e,null,[[32,38],[43,49]])})));return function(){return e.apply(this,arguments)}}(),v=function(e,r,t){for(var n,_=f(Object.entries(t).sort((function(e,r){var t=e[0],n=r[0];return t.localeCompare(n)})));!(n=_()).done;){var o,a=n.value,s=a[0],i=a[1];if(i.useExpression(i,null,e,r,((o={})[s]={configuration:i,error:null,response:null},o),c()))return O.info('Determined forwarder is: "'+s+'".'),i}return null},g=function(e){for(var r={},t=0,n=Object.entries(e);t<n.length;t++){var o=n[t],a=o[0],s=o[1];if("base"!==a){for(var i,u=c().extend(!0,{name:a},c().modifyObject(c().copy(e.base),s),s),p={retrieve:[],send:[]},l=f(["retrieve","send"]);!(i=l()).done;)for(var d,b=i.value,O=function(){var e=d.value,r=_()({},e,{sourceRun:function(){return""},targetRun:function(){return""}});if(Object.prototype.hasOwnProperty.call(r,"source"))if(r.source instanceof RegExp)r.sourceRun=function(){return r.source};else if("string"==typeof r.source){var t=c().stringCompile(r.source,E);if(t.error)throw new Error(t.error);r.sourceRun=t.templateFunction}else r.sourceRun=r.source;if(Object.prototype.hasOwnProperty.call(r,"target"))if("string"==typeof r.target){var n=c().stringCompile(r.target,E);if(n.error)throw new Error(n.error);r.targetRun=n.templateFunction}else r.targetRun=r.target;p[b].push(r)},h=f([].concat(u.headerTransformations[b]));!(d=h()).done;)O();u.headerTransformations=p;for(var v,g,P=[],m=[].concat(u.stateAPIs||[]),M=m.filter((function(e){return"base"===e.name}))[0],D=[],y=f(m);!(v=y()).done;)"base"!==(g=v.value).name&&D.push(c().extend(!0,{},c().modifyObject(c().copy(M),g),g));for(var A=0,w=D;A<w.length;A++){for(var I,k=w[A],T={pre:[],post:[]},R=f([].concat((null==(C=k.expressions)?void 0:C.pre)||[]));!(I=R()).done;){var C,x=I.value;if("string"==typeof x){var U=c().stringCompile(x,E);if(U.error)throw new Error(U.error);T.pre.push(U.templateFunction)}else T.pre.push(x)}for(var L,B=f([].concat((null==(q=k.expressions)?void 0:q.post)||[]));!(L=B()).done;){var q,K=L.value;if("string"==typeof K){var W=c().stringCompile(K,E);if(W.error)throw new Error(W.error);T.post.push(W.templateFunction)}else T.post.push(K)}k.expressions=T,P.push(k)}if(u.stateAPIs=P,"string"==typeof u.useExpression){var S=c().stringCompile(u.useExpression,E);if(S.error)throw new Error(S.error);u.useExpression=S.templateFunction}r[a]=u}}return r},P=function(e){if(e.headers["content-type"]&&/application\/json(;.*)?$/.test(e.headers["content-type"]))try{var r=Buffer.concat(e.socket.buffer.data).toString();e.socket.buffer.body=r.replace(/^[\s\S]+\s*\n\s*\n\s*([\s\S]+)$/m,"$1"),e.socket.buffer.content=JSON.parse(e.socket.buffer.body)}catch(r){O.warn("Error parsing given request.",e)}},m=function(e,r,t){for(var n,_=!1,o=function(){var r=n.value;try{var o=r.sourceRun.apply(r,t),a=r.targetRun.apply(r,t);if([null,void 0].includes(o)||"string"==typeof o&&""===o.trim()){if([null,void 0].includes(a)||"string"==typeof a&&""===a.trim())return"continue";e=e.replace(/(\s*\n)\s*\n\s*/,(function(e,r){for(var t=arguments.length,n=Array(2<t?t-2:0),_=2;_<t;_++)n[_-2]=arguments[_];var o="string"==typeof a?a:a.apply(void 0,[e,r].concat(n));return""+r+o+e}))}else _||(O.debug(),_=!0),O.debug('Search for "'+o+'" and replace with',c().represent(a)+"."),e=e.replace(o,a)}catch(e){O.warn("\nCould not apply header transformation with source "+(r.source?c().represent(r.source):'"add"')+" and replacement "+(r.target?c().represent(r.target):'"remove"')+":",e)}},a=f(r);!(n=a()).done;)o();return e};const M=function(){var e=a()(i().mark((function e(r,t,n,o){return i().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.abrupt("return",new Promise((function(e,a){var s=t.socket,i=n.tls?l.connect:p.createConnection,u=n.tls&&443!==n.port||!n.tls&&80!==n.port?":"+n.port:"",d=i(_()({host:n.host,port:n.port},n.tls?{servername:n.host,rejectUnauthorized:!1}:{}),(function(){O.info("\nConnection to: http"+(n.tls?"s":"")+"://"+n.host+u+" established.")}));d.on("error",(function(e){O.error("Proxy to server error",e),a(e)}));var E=[{clientSocket:s,serverSocket:d},null,r,t,o,c()];if(n.headerTransformations.retrieve.length){var b=!1;d.on("data",(function(r){if(b)s.write(r);else{var t=r.toString();O.info("\n <=== Got response header from backend:\n\n"+t),t=m(t,n.headerTransformations.retrieve,E),O.info("\n <<<< Send response header to client:\n\n"+t),s.write(t),b=!0,e()}}))}else d.pipe(s);d.on("connect",(function(){for(var e,t,_=!1,o=f(r.socket.buffer.data);!(e=o()).done;)if(t=e.value,_)d.write(t);else{var a=t.toString();O.debug("\n ===> Got request header from client:\n\n"+a),n.tls&&(a=a.replace(/HTTP\/1\.0/i,"HTTP/1.1")),a=a.replace(/(($|\n)host: )[^\n]+/i,"$1"+n.host+u),a=m(a,n.headerTransformations.send,E),O.debug("\n >>>> Send request header to backend:\n\n"+a),d.write(a),_=!0}}))})));case 1:case"end":return e.stop()}}),e)})));return function(r,t,n,_){return e.apply(this,arguments)}}()},e=>{e.exports=require("@babel/runtime/helpers/asyncToGenerator")},e=>{e.exports=require("@babel/runtime/regenerator")},e=>{e.exports=require("clientnode")},(module,__webpack_exports__,__webpack_require__)=>{__webpack_require__.r(__webpack_exports__),__webpack_require__.d(__webpack_exports__,{default:()=>__WEBPACK_DEFAULT_EXPORT__});var _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0__=__webpack_require__(1),_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0___default=__webpack_require__.n(_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0__),_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1__=__webpack_require__(2),_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default=__webpack_require__.n(_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1__),clientnode__WEBPACK_IMPORTED_MODULE_2__=__webpack_require__(3),clientnode__WEBPACK_IMPORTED_MODULE_2___default=__webpack_require__.n(clientnode__WEBPACK_IMPORTED_MODULE_2__),http__WEBPACK_IMPORTED_MODULE_3__=__webpack_require__(5),http__WEBPACK_IMPORTED_MODULE_3___default=__webpack_require__.n(http__WEBPACK_IMPORTED_MODULE_3__),http2__WEBPACK_IMPORTED_MODULE_4__=__webpack_require__(6),http2__WEBPACK_IMPORTED_MODULE_4___default=__webpack_require__.n(http2__WEBPACK_IMPORTED_MODULE_4__),path__WEBPACK_IMPORTED_MODULE_5__=__webpack_require__(7),path__WEBPACK_IMPORTED_MODULE_5___default=__webpack_require__.n(path__WEBPACK_IMPORTED_MODULE_5__),_helper__WEBPACK_IMPORTED_MODULE_6__=__webpack_require__(0),_package_json__WEBPACK_IMPORTED_MODULE_7__=__webpack_require__(8);function _createForOfIteratorHelperLoose(e,r){var t="undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(t)return(t=t.call(e)).next.bind(t);if(Array.isArray(e)||(t=_unsupportedIterableToArray(e))||r&&e&&"number"==typeof e.length){t&&(e=t);var n=0;return function(){return n>=e.length?{done:!0}:{done:!1,value:e[n++]}}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function _unsupportedIterableToArray(e,r){if(e){if("string"==typeof e)return _arrayLikeToArray(e,r);var t=Object.prototype.toString.call(e).slice(8,-1);return"Object"===t&&e.constructor&&(t=e.constructor.name),"Map"===t||"Set"===t?Array.from(e):"Arguments"===t||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t)?_arrayLikeToArray(e,r):void 0}}function _arrayLikeToArray(e,r){(null==r||r>e.length)&&(r=e.length);for(var t=0,n=Array(r);t<r;t++)n[t]=e[t];return n}module=__webpack_require__.hmd(module);for(var _step,onIncomingMessage=function(e,r){var t=e;_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0___default()(_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default().mark((function e(){var n,_,o,a;return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:_helper__WEBPACK_IMPORTED_MODULE_6__.logging.info("|"+"-".repeat(78)+"|\nStart processing",t.method+" request: "+t.url+"\n");case 1:return e.next=4,clientnode__WEBPACK_IMPORTED_MODULE_2___default().timeout();case 4:if(!t.socket.buffer.finished){e.next=6;break}return e.abrupt("break",8);case 6:e.next=1;break;case 8:if(CONFIGURATION.parseBody&&(0,_helper__WEBPACK_IMPORTED_MODULE_6__.addParsedContentToRequest)(t),null!==(n=(0,_helper__WEBPACK_IMPORTED_MODULE_6__.determineForwarder)(t,r,FORWARDERS))){e.next=15;break}return _helper__WEBPACK_IMPORTED_MODULE_6__.logging.error("No forwarder found for given request:",t),r.statusCode=502,r.end(),e.abrupt("return");case 15:return e.prev=15,e.next=18,(0,_helper__WEBPACK_IMPORTED_MODULE_6__.applyStateAPIs)(t,r,n);case 18:if(_=e.sent,o=_.result,a=_.scope,!o){e.next=24;break}return e.next=24,(0,_helper__WEBPACK_IMPORTED_MODULE_6__.default)(t,r,n,a);case 24:e.next=29;break;case 26:e.prev=26,e.t0=e.catch(15),_helper__WEBPACK_IMPORTED_MODULE_6__.logging.error(e.t0);case 29:_helper__WEBPACK_IMPORTED_MODULE_6__.logging.info("\nEnd processing",t.method+" request: "+t.url+"\n|"+"-".repeat(78)+"|");case 30:case"end":return e.stop()}}),e,null,[[15,26]])})))()},onIncomingStream=function(e,r){_helper__WEBPACK_IMPORTED_MODULE_6__.logging.info("Got stream",e,r)},BASE_CONFIGURATION=_package_json__WEBPACK_IMPORTED_MODULE_7__.DN,_iterator=_createForOfIteratorHelperLoose(["configuration.json","secure-configuration.json"]);!(_step=_iterator()).done;){var path=_step.value,configurationPath=(0,path__WEBPACK_IMPORTED_MODULE_5__.resolve)(process.cwd(),path);if(clientnode__WEBPACK_IMPORTED_MODULE_2___default().isFileSync(configurationPath)){var configuration=eval("require('"+configurationPath+"')");clientnode__WEBPACK_IMPORTED_MODULE_2___default().extend(!0,clientnode__WEBPACK_IMPORTED_MODULE_2___default().modifyObject(BASE_CONFIGURATION,configuration),configuration)}}var CONFIGURATION=clientnode__WEBPACK_IMPORTED_MODULE_2___default().evaluateDynamicData(BASE_CONFIGURATION,{configuration:BASE_CONFIGURATION,environment:process.env,Tools:clientnode__WEBPACK_IMPORTED_MODULE_2___default()}),FORWARDERS=(0,_helper__WEBPACK_IMPORTED_MODULE_6__.resolveForwarders)(CONFIGURATION.forwarders),server={instance:CONFIGURATION.publicKeyPath&&CONFIGURATION.privateKeyPath?(0,http2__WEBPACK_IMPORTED_MODULE_4__.createSecureServer)(CONFIGURATION.nodeServerOptions,onIncomingMessage):(0,http__WEBPACK_IMPORTED_MODULE_3__.createServer)(onIncomingMessage),streams:[],sockets:[],start:function(){server.instance.listen(CONFIGURATION.port,(function(){_helper__WEBPACK_IMPORTED_MODULE_6__.logging.info("Listen on port "+CONFIGURATION.port+" for incoming requests.")}))},stop:function(){server.instance.close((function(){_helper__WEBPACK_IMPORTED_MODULE_6__.logging.info("Shut server down.")}));for(var e,r=0,t=[server.sockets,server.streams];r<t.length;r++)if(e=t[r],Array.isArray(e))for(var n,_=_createForOfIteratorHelperLoose(e);!(n=_()).done;)n.value.destroy()}};if(server.instance.on("connection",(function(e){server.sockets.push(e),e.buffer={data:[],finished:!1},e.on("data",(function(r){e.buffer.data.push(r)}));for(var r,t=0,n=["done","finish","writableEnded","writableFinished"];t<n.length;t++)r=n[t],e.on(r,(function(){e.buffer.finished=!0}));clientnode__WEBPACK_IMPORTED_MODULE_2___default().timeout((function(){e.buffer.finished=!0})),e.on("close",(function(){e.buffer.finished=!0,server.sockets.splice(server.sockets.indexOf(e),1)}))})),server.instance.on("stream",(function(e,r){server.streams.push(e),onIncomingStream(e,r),e.on("close",(function(){server.streams.splice(server.streams.indexOf(e),1)}))})),__webpack_require__.c[__webpack_require__.s]===module||eval("require.main")!==__webpack_require__.c[__webpack_require__.s]&&"undefined"!=typeof ORIGINAL_MAIN_MODULE&&ORIGINAL_MAIN_MODULE===eval("require.main")){_helper__WEBPACK_IMPORTED_MODULE_6__.logging.info("Start server with configuration:",clientnode__WEBPACK_IMPORTED_MODULE_2___default().represent(CONFIGURATION)),_helper__WEBPACK_IMPORTED_MODULE_6__.logging.debug("Apply resolved forwarder:",clientnode__WEBPACK_IMPORTED_MODULE_2___default().represent(FORWARDERS)),server.start();for(var _step3,_loop=function(){var e=_step3.value;process.on(e,(function(){_helper__WEBPACK_IMPORTED_MODULE_6__.logging.info('\nGot "'+e+'" signal: stopping server.'),server.stop()}))},_iterator3=_createForOfIteratorHelperLoose(clientnode__WEBPACK_IMPORTED_MODULE_2__.CloseEventNames);!(_step3=_iterator3()).done;)_loop()}const __WEBPACK_DEFAULT_EXPORT__=server},e=>{e.exports=require("http")},e=>{e.exports=require("http2")},e=>{e.exports=require("path")},e=>{e.exports=JSON.parse('{"DN":{"publicKeyPath":"","privateKeyPath":"","nodeServerOptions":{"allowHTTP1":true},"host":"localhost","port":8080,"parseBody":false,"forwarders":{"base":{"headerTransformations":{"retrieve":[],"send":[]},"host":"localhost","port":443,"stateAPIs":[{"data":{},"expressions":{"pre":"false","post":"true"},"name":"base","options":{},"url":""}],"tls":true,"useExpression":"true"}}}}')}],__webpack_module_cache__={};function __webpack_require__(e){var r=__webpack_module_cache__[e];if(void 0!==r)return r.exports;var t=__webpack_module_cache__[e]={id:e,loaded:!1,exports:{}};return __webpack_modules__[e](t,t.exports,__webpack_require__),t.loaded=!0,t.exports}__webpack_require__.c=__webpack_module_cache__,__webpack_require__.n=e=>{var r=e&&e.__esModule?()=>e.default:()=>e;return __webpack_require__.d(r,{a:r}),r},__webpack_require__.d=(e,r)=>{for(var t in r)__webpack_require__.o(r,t)&&!__webpack_require__.o(e,t)&&Object.defineProperty(e,t,{enumerable:!0,get:r[t]})},__webpack_require__.hmd=e=>((e=Object.create(e)).children||(e.children=[]),Object.defineProperty(e,"exports",{enumerable:!0,set:()=>{throw new Error("ES Modules may not assign module.exports or exports.*, Use ESM export syntax, instead: "+e.id)}}),e),__webpack_require__.o=(e,r)=>Object.prototype.hasOwnProperty.call(e,r),__webpack_require__.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})};var __webpack_exports__=__webpack_require__(__webpack_require__.s=4);module.exports=__webpack_exports__})();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "reverse-proxy-middleware",
3
- "version": "0.0.53",
3
+ "version": "0.0.55",
4
4
  "description": "A reverse proxy blocking bot requests.",
5
5
  "keywords": [
6
6
  "api",
@@ -47,6 +47,7 @@
47
47
  "postversion": "yarn publish --non-interactive; git push --tags && git push",
48
48
  "prepare": "yarn build",
49
49
  "serve": "yarn build:plain && yarn start",
50
+ "serve:custom": "ln --force --symbolic examples/custom.json configuration.json && yarn serve",
50
51
  "serve:headers": "ln --force --symbolic examples/headers.json configuration.json && yarn serve",
51
52
  "serve:random": "ln --force --symbolic examples/random.json configuration.json && yarn serve",
52
53
  "serve:simple": "ln --force --symbolic examples/simple.json configuration.json && yarn serve",
package/readme.md CHANGED
@@ -132,11 +132,17 @@ retrieved headers printed via secondary error output.
132
132
 
133
133
  ### State-APIs
134
134
 
135
- State-APIs enables you to trigger requests conditionally to third party
136
- endpoints and use responses for further expressions.
137
- Expression which transform subsequent api requests, decide which backend to use
135
+ State-APIs enables you to conditionally trigger requests to third party
136
+ endpoints and use responses for further decisions how to proceed.
137
+ When a state api is used for a specified request that response can be used via
138
+ expressions to transform subsequent api requests, decide which backend to use
138
139
  or transform the final backend request.
139
140
 
141
+ In the following example you can see how a state api is configured to catch
142
+ specific request to deal with. The last running pre expressions which results
143
+ in a boolean value will trigger if the referenced state api should be used for
144
+ given request.
145
+
140
146
  Here is an example:
141
147
 
142
148
  ```