reverse-proxy-middleware 0.0.48 → 0.0.51

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.
Files changed (3) hide show
  1. package/index.js +1 -1
  2. package/package.json +4 -1
  3. package/readme.md +90 -0
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),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 b=["data","error","request","response","stateAPIs","Tools"],E=function(){var e=a()(i().mark((function e(r,t,n){var o,_,a,s,u,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=66;break}s=a.value,o[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=29;break}b=d.value,E="break";try{E=b(s.data,null,r,t,o,c())}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",29);case 19:if("continue"!==E){e.next=21;break}return e.abrupt("continue",27);case 21:if(!E){e.next=25;break}u=!0,e.next=26;break;case 25:return e.abrupt("break",29);case 26:p+=1;case 27:e.next=8;break;case 29:if(!u){e.next=64;break}return console.info("Use state api:",c().represent(s)),O=null,e.prev=32,e.next=35,fetch(s.url,s.options);case 35:return o[s.name].response=e.sent,e.next=38,o[s.name].response.json();case 38:o[s.name].response.data=e.sent,e.next=45;break;case 41:e.prev=41,e.t0=e.catch(32),O=e.t0,console.warn('State api "'+s.name+'" throws error:',O);case 45:console.info("State api response is:",c().represent(o[s.name].response)),p=1,v=f(s.expressions.post);case 48:if((h=v()).done){e.next=64;break}m=h.value,P="break";try{P=m(s.data,O,r,t,o,c())}catch(e){console.warn("Failed running "+p+". post expression of state api:",e)}if("number"!=typeof P){e.next=57;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 57:if("break"!==P){e.next=59;break}return e.abrupt("break",64);case 59:if("continue"!==P){e.next=61;break}return e.abrupt("continue",62);case 61:p+=1;case 62:e.next=48;break;case 64:e.next=2;break;case 66:return e.abrupt("return",{result:!0,scope:o});case 67:case"end":return e.stop()}}),e,null,[[32,41]])})));return function(){return e.apply(this,arguments)}}(),O=function(e,r,t){for(var n=0,o=Object.entries(t);n<o.length;n++){var _,a=o[n],s=a[0],i=a[1];if(i.useExpression(i,null,e,r,((_={})[s]={configuration:i,error:null,response:null},_),c()))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,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,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=c().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=c().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(u.headerTransformations[E]));!(d=v()).done;)O();u.headerTransformations=p;for(var h,m,P=[],y=[].concat(u.stateAPIs||[]),k=y.filter((function(e){return"base"===e.name}))[0],w=[],A=f(y);!(h=A()).done;)"base"!==(m=h.value).name&&w.push(c().extend(!0,{},c().modifyObject(c().copy(k),m),m));for(var I=0,M=w;I<M.length;I++){for(var D,g=M[I],T={pre:[],post:[]},R=f([].concat((null==(x=g.expressions)?void 0:x.pre)||[]));!(D=R()).done;){var x,C=D.value;if("string"==typeof C){var U=c().stringCompile(C,b);if(U.error)throw new Error(U.error);T.pre.push(U.templateFunction)}else T.pre.push(C)}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=c().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(u.stateAPIs=P,"string"==typeof s.useExpression){var W=c().stringCompile(s.useExpression,b);if(W.error)throw new Error(W.error);u.useExpression=W.templateFunction}else u.useExpression=s.useExpression;r[a]=u}}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',c().represent(_)+"."),e=e.replace(o,_)}catch(e){console.warn("Could not apply header transformation with source "+(r.source?c().represent(r.source):'"add"')+" and replacement "+(r.target?c().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 u=[{clientSocket:_,serverSocket:i},null,e,r,n,c()];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,u),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,u),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:()=>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),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 b=["data","error","request","response","stateAPIs","Tools"],E=function(){var e=a()(i().mark((function e(r,t,n){var o,_,a,s,u,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=66;break}s=a.value,o[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=29;break}b=d.value,E="break";try{E=b(s.data,null,r,t,o,c())}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",29);case 19:if("continue"!==E){e.next=21;break}return e.abrupt("continue",27);case 21:if(!E){e.next=25;break}u=!0,e.next=26;break;case 25:return e.abrupt("break",29);case 26:p+=1;case 27:e.next=8;break;case 29:if(!u){e.next=64;break}return console.info("Use state api:",c().represent(s)),O=null,e.prev=32,e.next=35,fetch(s.url,s.options);case 35:return o[s.name].response=e.sent,e.next=38,o[s.name].response.json();case 38:o[s.name].response.data=e.sent,e.next=45;break;case 41:e.prev=41,e.t0=e.catch(32),O=e.t0,console.warn('State api "'+s.name+'" throws error:',O);case 45:console.info("State api response is:",c().represent(o[s.name].response)),p=1,v=f(s.expressions.post);case 48:if((h=v()).done){e.next=64;break}m=h.value,P="break";try{P=m(s.data,O,r,t,o,c())}catch(e){console.warn("Failed running "+p+". post expression of state api:",e)}if("number"!=typeof P){e.next=57;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 57:if("break"!==P){e.next=59;break}return e.abrupt("break",64);case 59:if("continue"!==P){e.next=61;break}return e.abrupt("continue",62);case 61:p+=1;case 62:e.next=48;break;case 64:e.next=2;break;case 66:return e.abrupt("return",{result:!0,scope:o});case 67:case"end":return e.stop()}}),e,null,[[32,41]])})));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},_),c()))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,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,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=c().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=c().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(u.headerTransformations[E]));!(d=v()).done;)O();u.headerTransformations=p;for(var h,m,P=[],y=[].concat(u.stateAPIs||[]),k=y.filter((function(e){return"base"===e.name}))[0],w=[],A=f(y);!(h=A()).done;)"base"!==(m=h.value).name&&w.push(c().extend(!0,{},c().modifyObject(c().copy(k),m),m));for(var I=0,M=w;I<M.length;I++){for(var D,g=M[I],T={pre:[],post:[]},R=f([].concat((null==(x=g.expressions)?void 0:x.pre)||[]));!(D=R()).done;){var x,C=D.value;if("string"==typeof C){var U=c().stringCompile(C,b);if(U.error)throw new Error(U.error);T.pre.push(U.templateFunction)}else T.pre.push(C)}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=c().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(u.stateAPIs=P,"string"==typeof u.useExpression){var W=c().stringCompile(u.useExpression,b);if(W.error)throw new Error(W.error);u.useExpression=W.templateFunction}else u.useExpression=u.useExpression;r[a]=u}}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',c().represent(_)+"."),e=e.replace(o,_)}catch(e){console.warn("Could not apply header transformation with source "+(r.source?c().represent(r.source):'"add"')+" and replacement "+(r.target?c().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 u=[{clientSocket:_,serverSocket:i},null,e,r,n,c()];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,u),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,u),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__})();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "reverse-proxy-middleware",
3
- "version": "0.0.48",
3
+ "version": "0.0.51",
4
4
  "description": "A reverse proxy blocking bot requests.",
5
5
  "keywords": [
6
6
  "api",
@@ -47,6 +47,9 @@
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:headers": "ln --force --symbolic examples/headers.json configuration.json && yarn serve",
51
+ "serve:random": "ln --force --symbolic examples/random.json configuration.json && yarn serve",
52
+ "serve:simple": "ln --force --symbolic examples/simple.json configuration.json && yarn serve",
50
53
  "start": "./index.js",
51
54
  "test": "weboptimizer test",
52
55
  "test:coverage": "weboptimizer test:coverage",
package/readme.md CHANGED
@@ -39,6 +39,96 @@ forwarded requests.
39
39
 
40
40
  ### Quick start
41
41
 
42
+ #### Simple forwarding
43
+
44
+ Simple reverse proxy request from `http://localhost:8080` to
45
+ `https://www.google.com` without modifying the entire request.
46
+
47
+ ```
48
+ {
49
+ "forwarders": {
50
+ "google": {
51
+ "host": "www.google.com"
52
+ }
53
+ }
54
+ }
55
+ ```
56
+
57
+ Since the proxy starts at localhost on port 8080 as a default configuration you
58
+ can check the configuration via a simple curl command:
59
+
60
+ ```curl --verbose http://localhost:8080```
61
+
62
+ Behind there are a some commonly use defaults configured under key
63
+ "configuration" in [package.json](package.json). Please have a look.
64
+
65
+ #### Distributing requests to different backends
66
+
67
+ Here is how to distribute incoming requests randomly between google and bing:
68
+
69
+ ```
70
+ {
71
+ "forwarders": {
72
+ "bing": {
73
+ "host": "www.bing.com",
74
+ "useExpression": "Math.random() < 0.5"
75
+ },
76
+ "google": {
77
+ "host": "www.google.com"
78
+ }
79
+ }
80
+ }
81
+ ```
82
+
83
+ Forwarders are iterated in alphabetical order of their name and `useExpression`
84
+ are getting evaluated. Since "google" is always "used" it depends on the random
85
+ outcome of bing's expression if it is beeing used or not.
86
+
87
+ Since this proxy just streams the whole request through it could be used as
88
+ basic load balancer with this configuration.
89
+
90
+ #### Rewriting headers for underlying backend
91
+
92
+ Headers can be replaced in both directions. Client-Request to forward or
93
+ retrieved responses given from configured backend:
94
+
95
+ # TODO test
96
+
97
+ ```
98
+ {
99
+ "forwarders": {
100
+ "bing": {
101
+ "host": "www.bing.com",
102
+ "headerTransformations": {
103
+ "send": [
104
+ {
105
+ "source": "/X-Special-Client-Header-Name: (.+)/",
106
+ "target": "'New-Header-Name: $1'"
107
+ }
108
+ ],
109
+
110
+ "retrieve": [
111
+ {
112
+ "source": "/set-cookie: (.+)/",
113
+ "target": "'X-Prevented-Cookie: $1'"
114
+ }
115
+ ]
116
+ }
117
+ }
118
+ }
119
+ }
120
+ ```
121
+
122
+ ```
123
+ curl \
124
+ --header 'X-Special-Client-Header-Name: value' \
125
+ --verbose \
126
+ http://localhost:8080 \
127
+ 1>/dev/null
128
+ ```
129
+
130
+ #### Validating request via external service
131
+
42
132
  To configure the middleware for providing a bot-filtering mechanism add a
43
133
  `configure.json` file and mount them into a docker container.
44
134