reverse-proxy-middleware 0.0.22 → 0.0.23
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 +9 -5
- package/index.js +1 -1
- package/package.json +2 -1
- package/readme.md +12 -0
- package/type.d.ts +10 -3
package/helper.d.ts
CHANGED
|
@@ -1,8 +1,12 @@
|
|
|
1
|
-
|
|
2
|
-
import { Forwarders, HTTPServerResponse, HTTPServerRequest, ResolvedForwarder, ResolvedForwarders } from './type';
|
|
1
|
+
import { BufferedHTTPServerRequest, EvaluationParameters, EvaluationScopeStateAPIs, Forwarders, HTTPServerResponse, ResolvedHeaderTransformation, ResolvedForwarder, ResolvedForwarders } from './type';
|
|
3
2
|
export declare const EVALUATION_SCOPE_NAMES: Array<string>;
|
|
4
|
-
export declare const applyStateAPIs: (request:
|
|
5
|
-
|
|
3
|
+
export declare const applyStateAPIs: (request: BufferedHTTPServerRequest, response: HTTPServerResponse, forwarder: ResolvedForwarder) => Promise<{
|
|
4
|
+
result: boolean;
|
|
5
|
+
scope: EvaluationScopeStateAPIs;
|
|
6
|
+
}>;
|
|
7
|
+
export declare const determineForwarder: (request: BufferedHTTPServerRequest, response: HTTPServerResponse, forwarders: ResolvedForwarders) => ResolvedForwarder | null;
|
|
6
8
|
export declare const resolveForwarders: (forwarders: Forwarders) => ResolvedForwarders;
|
|
7
|
-
export declare const
|
|
9
|
+
export declare const addParsedContentToRequest: (bufferedRequest: BufferedHTTPServerRequest) => void;
|
|
10
|
+
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;
|
|
8
12
|
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,{applyStateAPIs:()=>E,default:()=>m,determineForwarder:()=>O,resolveForwarders:()=>v});const _=require("@babel/runtime/helpers/extends");var n=t.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 _=0;return function(){return _>=e.length?{done:!0}:{done:!1,value:e[_++]}}}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,_=Array(r);t<r;t++)_[t]=e[t];return _}var b=["data","error","request","response","stateAPIs","Tools"],E=function(){var e=a()(i().mark((function e(r,t,_){var n,o,a,s,u,p,l,d,b,E,O,v,m,h,P;return i().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:n={},o=f(_.stateAPIs);case 2:if((a=o()).done){e.next=65;break}s=a.value,n[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,n,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",!1);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=63;break}return console.info('Use state api "'+s.name+'".'),O=null,e.prev=32,e.next=35,fetch(s.url,s.options);case 35:return n[s.name].response=e.sent,e.next=38,n[s.name].response.json();case 38:n[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:p=1,v=f(s.expressions.post);case 47:if((m=v()).done){e.next=63;break}h=m.value,P="break";try{P=h(s.data,O,r,t,n,c())}catch(e){console.warn("Failed running "+p+". post expression of state api:",e)}if("number"!=typeof P){e.next=56;break}return console.info('Break request caused by state api "'+s.name+'" with status code '+P+"."),t.statusCode=P,t.end(),e.abrupt("return",!1);case 56:if("break"!==P){e.next=58;break}return e.abrupt("break",63);case 58:if("continue"!==P){e.next=60;break}return e.abrupt("continue",61);case 60:p+=1;case 61:e.next=47;break;case 63:e.next=2;break;case 65:return e.abrupt("return",!0);case 66:case"end":return e.stop()}}),e,null,[[32,41]])})));return function(){return e.apply(this,arguments)}}(),O=function(e,r,t){for(var _=0,n=Object.entries(t);_<n.length;_++){var o,a=n[_],s=a[0],i=a[1];if(i.useExpression(i,null,e,r,((o={})[s]={configuration:t,error:null,response:null},o),c()))return console.info('Determined forwarder "'+s+'."'),i}return null},v=function(e){for(var r={},t=0,_=Object.entries(e);t<_.length;t++){var n=_[t],o=n[0],a=n[1];if("base"!==o){for(var s,i,u=c().extend(!0,{name:o},c().modifyObject(c().copy(e.base),a),a),p={retrieve:[],send:[]},l=f(["retrieve","send"]);!(s=l()).done;){i=s.value,p[i]=[];for(var d,E=function(){var e=d.value,r={source:function(){return""},target:function(){return""}};if(Object.prototype.hasOwnProperty.call(e,"source"))if(e.source instanceof RegExp)r.source=function(){return e.source};else if("string"==typeof e.source){var t=c().stringCompile(e.source,b);if(t.error)throw new Error(t.error);r.source=t.templateFunction}else r.source=e.source;if(Object.prototype.hasOwnProperty.call(e,"target"))if("string"==typeof e.target){var _=c().stringCompile(e.target,b);if(_.error)throw new Error(_.error);r.target=_.templateFunction}else r.target=e.target;p[i].push(r)},O=f([].concat(u.headerTransformations[i]));!(d=O()).done;)E()}u.headerTransformations=p;for(var v,m,h=[],P=[].concat(u.stateAPIs||[]),y=P.filter((function(e){return"base"===e.name}))[0],w=[],A=f(P);!(v=A()).done;)"base"!==(m=v.value).name&&w.push(c().extend(!0,{},c().modifyObject(c().copy(y),m),m));for(var I=0,M=w;I<M.length;I++){for(var D,k=M[I],T={pre:[],post:[]},g=f([].concat((null==(x=k.expressions)?void 0:x.pre)||[]));!(D=g()).done;){var x,C=D.value;if("string"==typeof C){var R=c().stringCompile(C,b);if(R.error)throw new Error(R.error);T.pre.push(R.templateFunction)}else T.pre.push(C)}for(var U,L=f([].concat((null==(q=k.expressions)?void 0:q.post)||[]));!(U=L()).done;){var q,B=U.value;if("string"==typeof B){var K=c().stringCompile(B,b);if(K.error)throw new Error(K.error);T.post.push(K.templateFunction)}else T.post.push(B)}k.expressions=T,h.push(k)}if(u.stateAPIs=h,"string"==typeof a.useExpression){var W=c().stringCompile(a.useExpression,b);if(W.error)throw new Error(W.error);u.useExpression=W.templateFunction}else u.useExpression=a.useExpression;r[o]=u}}return r};const m=function(e,r,t,_){var o,a,s=r.socket,i=_.tls?l.connect:p.createConnection,u=_.tls&&443!==_.port||!_.tls&&80!==_.port?":"+_.port:"",d=i(n()({host:_.host,port:_.port},_.tls?{servername:_.host,rejectUnauthorized:!1}:{}),(function(){console.info("Proxy to: http"+(_.tls?"s":"")+"://"+_.host+u)}));d.on("error",(function(e){console.error("Proxy to server error",e)}));var b=[{clientSocket:s,serverSocket:d},null,e,r,(a={},a[_.name]={configuration:(o={},o[_.name]=_,o),error:null,response:null},a),c()];if(_.headerTransformations.retrieve.length){var E=!1;d.on("data",(function(e){if(E)s.write(e);else{for(var r,t,n=e.toString(),o=f(_.headerTransformations.retrieve);!(r=o()).done;){t=r.value;try{var a=t.source.apply(t,b),i=t.target.apply(t,b);n=n.replace(a,i)}catch(e){console.warn("Could not apply header transformation:",e)}}s.write(n),E=!0}}))}else d.pipe(s);d.on("connect",(function(){for(var e,r,n=!1,o=f(t);!(e=o()).done;)if(r=e.value,n)d.write(r);else{var a=r.toString();_.tls&&(a=a.replace(/HTTP\/1\.0/i,"HTTP/1.1")),a=a.replace(/(($|\n)host: )[^\n]+/i,"$1"+_.host+u);for(var s,i,c=f(_.headerTransformations.send);!(s=c()).done;){i=s.value;try{var p=i.source.apply(i,b),l=i.target.apply(i,b);a=a.replace(p,l)}catch(e){console.warn("Could not apply header transformation:",e)}}console.info("Send:\n\n"+a),d.write(a),n=!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 _=0;return function(){return _>=e.length?{done:!0}:{done:!1,value:e[_++]}}}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,_=Array(r);t<r;t++)_[t]=e[t];return _}module=__webpack_require__.hmd(module);for(var _step,onIncomingMessage=function(e,r){_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0___default()(_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default().mark((function t(){var _;return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.next=2,clientnode__WEBPACK_IMPORTED_MODULE_2___default().timeout();case 2:return null===(_=(0,_helper__WEBPACK_IMPORTED_MODULE_6__.determineForwarder)(e,r,FORWARDERS))&&(console.error("No forwarder found for given request:",e),r.statusCode=502,r.end()),t.next=6,(0,_helper__WEBPACK_IMPORTED_MODULE_6__.applyStateAPIs)(e,r,_);case 6:if(!t.sent){t.next=8;break}(0,_helper__WEBPACK_IMPORTED_MODULE_6__.default)(e,r,e.socket.buffers,_);case 8:case"end":return t.stop()}}),t)})))()},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=_createForOfIteratorHelperLoose(e);!(_=n()).done;)_.value.destroy()}};if(server.instance.on("connection",(function(e){var r=[];e.on("data",(function(e){r.push(e)})),e.buffers=r,server.sockets.push(e),e.on("close",(function(){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,"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 _=t.n(n),o=t(1),a=t.n(o),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=o()).done){e.next=66;break}s=a.value,_[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=29;break}b=d.value,E="break";try{E=b(s.data,null,r,t,_,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:_});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}c=!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(!c){e.next=64;break}return console.info("Use state api:",u().represent(s)),O=null,e.prev=32,e.next=35,fetch(s.url,s.options);case 35:return _[s.name].response=e.sent,e.next=38,_[s.name].response.json();case 38:_[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:",u().represent(_[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,_,u())}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:_});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:_});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,_=Object.entries(t);n<_.length;n++){var o,a=_[n],s=a[0],i=a[1];if(i.useExpression(i,null,e,r,((o={})[s]={configuration:i,error:null,response:null},o),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],o=_[0],a=_[1];if("base"!==o){for(var s,i,c=u().extend(!0,{name:o},u().modifyObject(u().copy(e.base),a),a),p={retrieve:[],send:[]},l=f(["retrieve","send"]);!(s=l()).done;){i=s.value,p[i]=[];for(var d,E=function(){var e=d.value,r={source:function(){return""},target:function(){return""}};if(Object.prototype.hasOwnProperty.call(e,"source"))if(e.source instanceof RegExp)r.source=function(){return e.source};else if("string"==typeof e.source){var t=u().stringCompile(e.source,b);if(t.error)throw new Error(t.error);r.source=t.templateFunction}else r.source=e.source;if(Object.prototype.hasOwnProperty.call(e,"target"))if("string"==typeof e.target){var n=u().stringCompile(e.target,b);if(n.error)throw new Error(n.error);r.target=n.templateFunction}else r.target=e.target;p[i].push(r)},O=f([].concat(c.headerTransformations[i]));!(d=O()).done;)E()}c.headerTransformations=p;for(var v,h,m=[],P=[].concat(c.stateAPIs||[]),y=P.filter((function(e){return"base"===e.name}))[0],A=[],I=f(P);!(v=I()).done;)"base"!==(h=v.value).name&&A.push(u().extend(!0,{},u().modifyObject(u().copy(y),h),h));for(var M=0,w=A;M<w.length;M++){for(var D,k=w[M],T={pre:[],post:[]},g=f([].concat((null==(x=k.expressions)?void 0:x.pre)||[]));!(D=g()).done;){var x,C=D.value;if("string"==typeof C){var R=u().stringCompile(C,b);if(R.error)throw new Error(R.error);T.pre.push(R.templateFunction)}else T.pre.push(C)}for(var U,L=f([].concat((null==(q=k.expressions)?void 0:q.post)||[]));!(U=L()).done;){var q,B=U.value;if("string"==typeof B){var K=u().stringCompile(B,b);if(K.error)throw new Error(K.error);T.post.push(K.templateFunction)}else T.post.push(B)}k.expressions=T,m.push(k)}if(c.stateAPIs=m,"string"==typeof a.useExpression){var S=u().stringCompile(a.useExpression,b);if(S.error)throw new Error(S.error);c.useExpression=S.templateFunction}else c.useExpression=a.useExpression;r[o]=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=f(r);!(n=o()).done;){_=n.value;try{!function(){var r=_.source.apply(_,t),n=_.target.apply(_,t);e=r instanceof RegExp||""!==r.trim()?e.replace(r,n):e.replace(/(\s*\n)\s*\n\s*/,(function(e,r){for(var t=arguments.length,_=Array(2<t?t-2:0),o=2;o<t;o++)_[o-2]=arguments[o];var a="string"==typeof n?n:n.apply(void 0,[e,r].concat(_));return""+r+a+e}))}()}catch(e){console.warn("Could not apply header transformation:",e)}}return e};const P=function(e,r,t,n){var o=r.socket,a=t.tls?l.connect:p.createConnection,s=t.tls&&443!==t.port||!t.tls&&80!==t.port?":"+t.port:"",i=a(_()({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:o,serverSocket:i},null,e,r,n,u()];if(t.headerTransformations.retrieve.length){var d=!1;i.on("data",(function(e){return d?void o.write(e):(o.write(m(e.toString(),t.headerTransformations.retrieve,c)),void(d=!0))}))}else i.pipe(o);i.on("connect",(function(){for(var r,n,_=!1,o=f(e.socket.buffer.data);!(r=o()).done;)if(n=r.value,_)i.write(n);else{var a=n.toString();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:\n\n"+a),i.write(a),_=!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:return CONFIGURATION.parseBody&&(0,_helper__WEBPACK_IMPORTED_MODULE_6__.addParsedContentToRequest)(t),null===(n=(0,_helper__WEBPACK_IMPORTED_MODULE_6__.determineForwarder)(t,r,FORWARDERS))&&(console.error("No forwarder found for given request:",t),r.statusCode=502,r.end()),e.next=12,(0,_helper__WEBPACK_IMPORTED_MODULE_6__.applyStateAPIs)(t,r,n);case 12:_=e.sent,o=_.result,a=_.scope,o&&(0,_helper__WEBPACK_IMPORTED_MODULE_6__.default)(t,r,n,a);case 16: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,_=_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")){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.
|
|
3
|
+
"version": "0.0.23",
|
|
4
4
|
"description": "A reverse proxy blocking bot requests.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"api",
|
|
@@ -96,6 +96,7 @@
|
|
|
96
96
|
},
|
|
97
97
|
"host": "localhost",
|
|
98
98
|
"port": 8080,
|
|
99
|
+
"parseBody": false,
|
|
99
100
|
"forwarders": {
|
|
100
101
|
"base": {
|
|
101
102
|
"headerTransformations": {
|
package/readme.md
CHANGED
|
@@ -30,6 +30,18 @@ Project status
|
|
|
30
30
|
Use case
|
|
31
31
|
--------
|
|
32
32
|
|
|
33
|
+
Easy and dynamically configurable reverse proxy. This tool can act as a
|
|
34
|
+
middleware to check incoming requests via external bot filtering services such
|
|
35
|
+
as ReCaptcha or friendlycaptcha.
|
|
36
|
+
Adding state via session token with external authentication apis is possible as
|
|
37
|
+
applying any external api given data to the incoming and conditionally
|
|
38
|
+
forwarded requests.
|
|
39
|
+
|
|
40
|
+
### Quick start
|
|
41
|
+
|
|
42
|
+
To configure the middleware for providing a bot-filtering mechanism add a
|
|
43
|
+
`configure.json` file and mount them into a docker container.
|
|
44
|
+
|
|
33
45
|
```JavaScript
|
|
34
46
|
TODO
|
|
35
47
|
```
|
package/type.d.ts
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
/// <reference types="node" />
|
|
5
5
|
/// <reference types="node" />
|
|
6
6
|
import Tools from 'clientnode';
|
|
7
|
-
import { Mapping } from 'clientnode/type';
|
|
7
|
+
import { Mapping, PlainObject, Primitive } from 'clientnode/type';
|
|
8
8
|
import { Http2SecureServer as HTTPSecureServer, Http2Server as HttpServer, Http2ServerRequest, Http2ServerResponse, Http2Stream, OutgoingHttpHeaders, SecureServerOptions } from 'http2';
|
|
9
9
|
import { Socket as PlainSocket } from 'net';
|
|
10
10
|
import { TLSSocket } from 'tls';
|
|
@@ -14,15 +14,21 @@ export type HTTPServerResponse = Http2ServerResponse;
|
|
|
14
14
|
export type HTTPStream = Http2Stream;
|
|
15
15
|
export type OutgoingHTTPHeaders = OutgoingHttpHeaders;
|
|
16
16
|
export type Socket = PlainSocket | TLSSocket;
|
|
17
|
+
export type ParsedContent = Array<PlainObject | Primitive> | PlainObject;
|
|
17
18
|
export type BufferedSocket = Socket & {
|
|
18
|
-
|
|
19
|
+
buffer: {
|
|
20
|
+
body?: string;
|
|
21
|
+
content?: ParsedContent;
|
|
22
|
+
data: Array<Buffer>;
|
|
23
|
+
finished: boolean;
|
|
24
|
+
};
|
|
19
25
|
};
|
|
20
26
|
export interface BufferedHTTPServerRequest extends HTTPServerRequest {
|
|
21
27
|
socket: BufferedSocket;
|
|
22
28
|
}
|
|
23
29
|
export type StringReplacer = (substring: string, ...parameters: Array<unknown>) => string;
|
|
24
30
|
export type EvaluationScopeStateAPIs = Mapping<{
|
|
25
|
-
configuration:
|
|
31
|
+
configuration: ResolvedForwarder | ResolvedStateAPI;
|
|
26
32
|
error: Error | null;
|
|
27
33
|
response: (Response & {
|
|
28
34
|
data: Mapping<unknown>;
|
|
@@ -105,6 +111,7 @@ export interface Configuration {
|
|
|
105
111
|
nodeServerOptions: SecureServerOptions;
|
|
106
112
|
host: string;
|
|
107
113
|
port: number;
|
|
114
|
+
parseBody: boolean;
|
|
108
115
|
forwarders: Forwarders;
|
|
109
116
|
}
|
|
110
117
|
export type ResolvedConfiguration = Omit<Configuration, 'forwarders'> & {
|