reverse-proxy-middleware 0.0.16 → 0.0.17
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 -0
- package/index.js +1 -1
- package/package.json +19 -12
- package/readme.md +5 -1
- package/type.d.ts +76 -38
package/helper.d.ts
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/// <reference types="node" />
|
|
2
|
+
import { Forwarders, HTTPServerResponse, HTTPServerRequest, ResolvedForwarder, ResolvedForwarders, ResolvedStateAPI, Socket } from './type';
|
|
3
|
+
export declare const EVALUATION_SCOPE_NAMES: Array<string>;
|
|
4
|
+
export declare const applyStateAPIs: (request: HTTPServerRequest, response: HTTPServerResponse, forwarder: ResolvedForwarder) => Promise<boolean>;
|
|
5
|
+
export declare const determineForwarder: (request: HTTPServerRequest, response: HTTPServerResponse, forwarders: ResolvedForwarders) => ResolvedForwarder | null;
|
|
6
|
+
export declare const resolveForwarders: (forwarders: Forwarders) => ResolvedForwarders;
|
|
7
|
+
export declare const hasSkipSecret: (request: HTTPServerRequest, stateAPI: ResolvedStateAPI) => boolean;
|
|
8
|
+
export declare const reverseProxyBufferedRequest: (clientSocket: Socket, buffers: Array<Buffer>, forwarder: ResolvedForwarder) => void;
|
|
9
|
+
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__=[(module,__webpack_exports__,__webpack_require__)=>{__webpack_require__.r(__webpack_exports__),__webpack_require__.d(__webpack_exports__,{default:()=>__WEBPACK_DEFAULT_EXPORT__});var _babel_runtime_helpers_extends__WEBPACK_IMPORTED_MODULE_0__=__webpack_require__(1),_babel_runtime_helpers_extends__WEBPACK_IMPORTED_MODULE_0___default=__webpack_require__.n(_babel_runtime_helpers_extends__WEBPACK_IMPORTED_MODULE_0__),_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1__=__webpack_require__(2),_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1___default=__webpack_require__.n(_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1__),_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_2__=__webpack_require__(3),_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_2___default=__webpack_require__.n(_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_2__),clientnode__WEBPACK_IMPORTED_MODULE_3__=__webpack_require__(4),clientnode__WEBPACK_IMPORTED_MODULE_3___default=__webpack_require__.n(clientnode__WEBPACK_IMPORTED_MODULE_3__),http__WEBPACK_IMPORTED_MODULE_4__=__webpack_require__(5),http__WEBPACK_IMPORTED_MODULE_4___default=__webpack_require__.n(http__WEBPACK_IMPORTED_MODULE_4__),http2__WEBPACK_IMPORTED_MODULE_5__=__webpack_require__(6),http2__WEBPACK_IMPORTED_MODULE_5___default=__webpack_require__.n(http2__WEBPACK_IMPORTED_MODULE_5__),net__WEBPACK_IMPORTED_MODULE_6__=__webpack_require__(7),net__WEBPACK_IMPORTED_MODULE_6___default=__webpack_require__.n(net__WEBPACK_IMPORTED_MODULE_6__),path__WEBPACK_IMPORTED_MODULE_7__=__webpack_require__(8),path__WEBPACK_IMPORTED_MODULE_7___default=__webpack_require__.n(path__WEBPACK_IMPORTED_MODULE_7__),tls__WEBPACK_IMPORTED_MODULE_8__=__webpack_require__(9),tls__WEBPACK_IMPORTED_MODULE_8___default=__webpack_require__.n(tls__WEBPACK_IMPORTED_MODULE_8__),_package_json__WEBPACK_IMPORTED_MODULE_9__=__webpack_require__(10);function _createForOfIteratorHelperLoose(e,r){var _="undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(_)return(_=_.call(e)).next.bind(_);if(Array.isArray(e)||(_=_unsupportedIterableToArray(e))||r&&e&&"number"==typeof e.length){_&&(e=_);var t=0;return function(){return t>=e.length?{done:!0}:{done:!1,value:e[t++]}}}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 _=Object.prototype.toString.call(e).slice(8,-1);return"Object"===_&&e.constructor&&(_=e.constructor.name),"Map"===_||"Set"===_?Array.from(e):"Arguments"===_||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(_)?_arrayLikeToArray(e,r):void 0}}function _arrayLikeToArray(e,r){(null==r||r>e.length)&&(r=e.length);for(var _=0,t=Array(r);_<r;_++)t[_]=e[_];return t}module=__webpack_require__.hmd(module);for(var CONFIGURATION=_package_json__WEBPACK_IMPORTED_MODULE_9__.DN,_i=0,_arr=["configuration.json","secure-configuration.json"];_i<_arr.length;_i++){var path=_arr[_i],configurationPath=(0,path__WEBPACK_IMPORTED_MODULE_7__.resolve)(process.cwd(),path);clientnode__WEBPACK_IMPORTED_MODULE_3___default().isFileSync(configurationPath)&&clientnode__WEBPACK_IMPORTED_MODULE_3___default().extend(!0,CONFIGURATION,clientnode__WEBPACK_IMPORTED_MODULE_3___default().evaluateDynamicData(eval("require('"+configurationPath+"')"),{configuration:CONFIGURATION,environment:process.env,Tools:clientnode__WEBPACK_IMPORTED_MODULE_3___default()}))}for(var APPLICATION_INTERFACES={},_i2=0,_Object$entries=Object.entries(CONFIGURATION.humanChecker.applicationInterfaces);_i2<_Object$entries.length;_i2++){var _Object$entries$_i=_Object$entries[_i2],name=_Object$entries$_i[0],checker=_Object$entries$_i[1];"base"!==name&&(APPLICATION_INTERFACES[name]=clientnode__WEBPACK_IMPORTED_MODULE_3___default().extend(!0,{},CONFIGURATION.humanChecker.applicationInterfaces.base,checker))}for(var FORWARDER={},_i3=0,_Object$entries2=Object.entries(CONFIGURATION.forwarder);_i3<_Object$entries2.length;_i3++){var _Object$entries2$_i=_Object$entries2[_i3],_name=_Object$entries2$_i[0],forwarder=_Object$entries2$_i[1];"base"!==_name&&(FORWARDER[_name]=clientnode__WEBPACK_IMPORTED_MODULE_3___default().extend(!0,{},CONFIGURATION.forwarder.base,forwarder))}var determineForwarder=function(e){for(var r=0,_=Object.entries(FORWARDER);r<_.length;r++){var t=_[r],n=t[0],o=t[1];if(o.identifier&&"string"==typeof o.identifier&&e.url===o.identifier||o.identifier instanceof RegExp&&o.identifier.test(e.url))return console.info('Determined forwarder "'+n+'."'),o}return null},hasSkipSecret=function(e){return"true"===e.headers["reverse-proxy-middleware-skip"]&&!!e.headers["reverse-proxy-middleware-skip-secret"]&&CONFIGURATION.humanChecker.skipSecrets.includes([].concat(e.headers["reverse-proxy-middleware-skip-secret"])[0])},isValid=function(){var e=_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1___default()(_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_2___default().mark((function e(r){var _,t,n,o,a,i,s,c,u;return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_2___default().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(!hasSkipSecret(r)){e.next=2;break}return e.abrupt("return",!0);case 2:_=0,t=Object.entries(APPLICATION_INTERFACES);case 3:if(!(_<t.length)){e.next=35;break}if(n=t[_],o=n[0],a=n[1],!(i=[].concat(r.headers[a.headerName])[0])){e.next=32;break}if(!(s=clientnode__WEBPACK_IMPORTED_MODULE_3___default().stringEvaluate("`"+a.url+"`",{clientToken:i.substring(i.indexOf(" ")+1),secret:a.secret})).error){e.next=11;break}return console.error("Error while evaluation checker url:",s.error),e.abrupt("continue",32);case 11:return c=s.result,e.prev=12,e.next=15,fetch(c,a.options);case 15:return e.next=17,e.sent.json();case 17:if(!((u=e.sent).success||"number"==typeof u.score&&u.score>=a.score)){e.next=21;break}return console.info('Request "'+c+'" ('+o+") identified as human triggered."),e.abrupt("return",!0);case 21:return console.info('Request "'+c+'" ('+o+") identified as robot triggered:",u),e.abrupt("return",!1);case 25:if(e.prev=25,e.t0=e.catch(12),console.warn('Request to "'+c+'" ('+o+") couldn't be identified asrobot or human because the recaptcha service produces the following error:",e.t0),!a.identifiyAsHumanIfServiceThrowsException){e.next=31;break}return console.info("Request will be interpret as human triggered causedby fallback configuration."),e.abrupt("return",!0);case 31:return e.abrupt("return",null);case 32:_++,e.next=3;break;case 35:return e.abrupt("return",0===Object.keys(APPLICATION_INTERFACES).length);case 36:case"end":return e.stop()}}),e,null,[[12,25]])})));return function(){return e.apply(this,arguments)}}(),reverseProxyBufferedRequest=function(e,r,_){var t=_.tls?tls__WEBPACK_IMPORTED_MODULE_8__.connect:net__WEBPACK_IMPORTED_MODULE_6__.createConnection,n=_.tls&&443!==_.port||!_.tls&&80!==_.port?":"+_.port:"",o=t(_babel_runtime_helpers_extends__WEBPACK_IMPORTED_MODULE_0___default()({host:CONFIGURATION.forward.host,port:CONFIGURATION.forward.port},CONFIGURATION.forward.tls?{servername:CONFIGURATION.forward.host,rejectUnauthorized:!1}:{}),(function(){console.info("Proxy to: http"+(CONFIGURATION.forward.tls?"s":"")+"://"+CONFIGURATION.forward.host+n)}));if(o.on("error",(function(e){console.error("Proxy to server error",e)})),CONFIGURATION.forward.headerTransformation.retrieve.length){var a=!1;o.on("data",(function(r){if(a)e.write(r);else{for(var _,t,n=r.toString(),o=_createForOfIteratorHelperLoose(CONFIGURATION.forward.headerTransformation.retrieve);!(_=o()).done;)t=_.value,n=n.replace(t.source,t.target);e.write(n),a=!0}}))}else o.pipe(e);o.on("connect",(function(){for(var e,_,t=!1,a=_createForOfIteratorHelperLoose(r);!(e=a()).done;)if(_=e.value,t)o.write(_);else{var i=_.toString();CONFIGURATION.forward.tls&&(i=i.replace(/HTTP\/1\.0/i,"HTTP/1.1")),i=i.replace(/(($|\n)host: )[^\n]+/i,"$1"+CONFIGURATION.forward.host+n);for(var s,c,u=_createForOfIteratorHelperLoose(CONFIGURATION.forward.headerTransformation.send);!(s=u()).done;)c=s.value,i=i.replace(c.source,c.target);console.info("Send:\n\n"+i),o.write(i),t=!0}}))},onIncomingMessage=function(e,r){_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1___default()(_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_2___default().mark((function _(){var t,n;return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_2___default().wrap((function(_){for(;;)switch(_.prev=_.next){case 0:return _.next=2,isValid(e);case 2:if(null!==(t=_.sent)){_.next=7;break}return r.statusCode=502,r.end(),_.abrupt("return");case 7:if(!t){_.next=13;break}return _.next=10,clientnode__WEBPACK_IMPORTED_MODULE_3___default().timeout();case 10:return(n=determineForwarder(e))?reverseProxyBufferedRequest(r.socket,e.socket.buffers,n):(console.error("No forwarder found for given request:",e),r.statusCode=502,r.end()),_.abrupt("return");case 13:r.statusCode=CONFIGURATION.humanChecker.botDetectionStatusCode,r.end();case 15:case"end":return _.stop()}}),_)})))()},onIncomingStream=function(e,r){console.info("Got stream",e,r)},server={instance:CONFIGURATION.publicKeyPath&&CONFIGURATION.privateKeyPath?(0,http2__WEBPACK_IMPORTED_MODULE_5__.createSecureServer)(CONFIGURATION.nodeServerOptions,onIncomingMessage):(0,http__WEBPACK_IMPORTED_MODULE_4__.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,_=[server.sockets,server.streams];r<_.length;r++)if(e=_[r],Array.isArray(e))for(var t,n=_createForOfIteratorHelperLoose(e);!(t=n()).done;)t.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]){console.info("Start server with configuration:",clientnode__WEBPACK_IMPORTED_MODULE_3___default().represent(CONFIGURATION)),server.start();for(var _step5,_loop=function(){var e=_step5.value;process.on(e,(function(){console.info('\nGot "'+e+'" signal: stopping server.'),server.stop()}))},_iterator5=_createForOfIteratorHelperLoose(clientnode__WEBPACK_IMPORTED_MODULE_3__.CloseEventNames);!(_step5=_iterator5()).done;)_loop()}const __WEBPACK_DEFAULT_EXPORT__=server},e=>{e.exports=require("@babel/runtime/helpers/extends")},e=>{e.exports=require("@babel/runtime/helpers/asyncToGenerator")},e=>{e.exports=require("@babel/runtime/regenerator")},e=>{e.exports=require("clientnode")},e=>{e.exports=require("http")},e=>{e.exports=require("http2")},e=>{e.exports=require("net")},e=>{e.exports=require("path")},e=>{e.exports=require("tls")},e=>{e.exports=JSON.parse('{"DN":{"publicKeyPath":"","privateKeyPath":"","nodeServerOptions":{"allowHTTP1":true},"host":"localhost","port":8080,"forward":{"base":{"headerTransformation":{"retrieve":[],"send":[]},"host":"localhost","identifier":"","port":443,"stateAPIs":[{"name":"base","data":{},"options":{},"preExpression":"false","postExpression":"true","resultExpression":"","skipSecret":[],"url":""}],"tls":true}}}}')}],__webpack_module_cache__={};function __webpack_require__(e){var r=__webpack_module_cache__[e];if(void 0!==r)return r.exports;var _=__webpack_module_cache__[e]={id:e,loaded:!1,exports:{}};return __webpack_modules__[e](_,_.exports,__webpack_require__),_.loaded=!0,_.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 _ in r)__webpack_require__.o(r,_)&&!__webpack_require__.o(e,_)&&Object.defineProperty(e,_,{enumerable:!0,get:r[_]})},__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=0);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,{applyStateAPIs:()=>E,default:()=>h,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),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 _=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 o,a,s,c,p,l,d,b,E,O,v,h,P,w;return i().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:o={},a=f(_.stateAPIs);case 2:if((s=a()).done){e.next=54;break}c=s.value,o[c.name]=n()({},c),p=!1,l=f(c.expressions.pre);case 7:if((d=l()).done){e.next=22;break}if(b=d.value,"number"!=typeof(E=b(c.data,null,r,t,o,u()))){e.next=15;break}return console.info('Break request caused by state api "'+c.name+'" with status code '+E+"."),t.statusCode=E,t.end(),e.abrupt("return",!1);case 15:if(!E){e.next=19;break}p=!0,e.next=20;break;case 19:return e.abrupt("break",22);case 20:e.next=7;break;case 22:if(!p){e.next=52;break}if(console.info('Use state api "'+c.name+'".'),!m(r,c)){e.next=27;break}return console.info('Skip state api "'+c.name+'" causes by determined skip secret.'),e.abrupt("break",54);case 27:return O=null,e.prev=28,e.next=31,fetch(c.url,c.options);case 31:return o[c.name].response=e.sent,e.next=34,o[c.name].response.json();case 34:o[c.name].response.data=e.sent,e.next=41;break;case 37:e.prev=37,e.t0=e.catch(28),O=e.t0,console.warn('State api "'+c.name+'" throws error:',O);case 41:v=f(c.expressions.post);case 42:if((h=v()).done){e.next=52;break}if(P=h.value,"number"!=typeof(w=P(c.data,O,r,t,o,u()))){e.next=50;break}return console.info('Break request caused by state api "'+c.name+'" with status code '+w+"."),t.statusCode=w,t.end(),e.abrupt("return",!1);case 50:e.next=42;break;case 52:e.next=2;break;case 54:return e.abrupt("return",!0);case 55:case"end":return e.stop()}}),e,null,[[28,37]])})));return function(){return e.apply(this,arguments)}}(),O=function(e,r,t){for(var _=0,n=Object.entries(t);_<n.length;_++){var o=n[_],a=o[0],s=o[1];if(s.useExpression(s,null,e,r,s.stateAPIs,u()))return console.info('Determined forwarder "'+a+'."'),s}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,c=u().extend(!0,{},e.base,a),p={retrieve:[],send:[]},l=f(["retrieve","send"]);!(s=l()).done;){p[i=s.value]=[];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{var t=u().stringCompile(e.source,b);if(t.error)throw new Error(t.error);r.source=t.templateFunction}if(Object.prototype.hasOwnProperty.call(e,"target"))if("function"==typeof e.target)r.target=function(){return e.target};else{var _=u().stringCompile(e.target,b);if(_.error)throw new Error(_.error);r.target=_.templateFunction}},O=f([].concat(c.headerTransformations[i]));!(d=O()).done;)E()}c.headerTransformations=p;for(var v,m,h=[],P=[].concat(a.stateAPIs),w=P.filter((function(e){return"base"===e.name}))[0],M=[],I=f(P);!(v=I()).done;)"base"!==(m=v.value).name&&M.push(u().extend(!0,{},w,m));for(var k,D=0,A=M;D<A.length;D++){(k=A[D]).skipSecrets=[].concat(k.skipSecrets);for(var y,T={pre:[],post:[]},g=f([].concat(k.expressions.pre));!(y=g()).done;){var x=y.value,C=u().stringCompile(x,b);if(C.error)throw new Error(C.error);T.pre.push(C.templateFunction)}for(var R,U=f([].concat(k.expressions.post));!(R=U()).done;){var q=R.value,L=u().stringCompile(q,b);if(L.error)throw new Error(L.error);T.pre.push(L.templateFunction)}k.expressions=T,h.push(k)}c.stateAPIs=h;var K=u().stringCompile(a.useExpression,b);if(K.error)throw new Error(K.error);c.useExpression=K.templateFunction,r[o]=c}}return r},m=function(e,r){return"true"===e.headers["reverse-proxy-middleware-skip"]&&!!e.headers["reverse-proxy-middleware-skip-secret"]&&r.skipSecrets.includes([].concat(e.headers["reverse-proxy-middleware-skip-secret"])[0])};const h=function(e,r,t){var _=t.tls?l.connect:p.createConnection,o=t.tls&&443!==t.port||!t.tls&&80!==t.port?":"+t.port:"",a=_(n()({host:t.host,port:t.port},t.tls?{servername:t.host,rejectUnauthorized:!1}:{}),(function(){console.info("Proxy to: http"+(t.tls?"s":"")+"://"+t.host+o)}));if(a.on("error",(function(e){console.error("Proxy to server error",e)})),t.headerTransformations.retrieve.length){var s=!1;a.on("data",(function(r){if(s)e.write(r);else{for(var _,n=r.toString(),o=f(t.headerTransformations.retrieve);!(_=o()).done;){var a=_.value,i=a.source(),c=a.target();n=n.replace(i,c)}e.write(n),s=!0}}))}else a.pipe(e);a.on("connect",(function(){for(var e,_,n=!1,s=f(r);!(e=s()).done;)if(_=e.value,n)a.write(_);else{var i=_.toString();t.tls&&(i=i.replace(/HTTP\/1\.0/i,"HTTP/1.1")),i=i.replace(/(($|\n)host: )[^\n]+/i,"$1"+t.host+o);for(var c,u=f(t.headerTransformations.send);!(c=u()).done;){var p=c.value,l=p.source(),d=p.target();i=i.replace(l,d)}console.info("Send:\n\n"+i),a.write(i),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)(r.socket,e.socket.buffers,_);case 8:case"end":return t.stop()}}),t)})))()},onIncomingStream=function(e,r){console.info("Got stream",e,r)},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);clientnode__WEBPACK_IMPORTED_MODULE_2___default().isFileSync(configurationPath)&&clientnode__WEBPACK_IMPORTED_MODULE_2___default().extend(!0,CONFIGURATION,clientnode__WEBPACK_IMPORTED_MODULE_2___default().evaluateDynamicData(eval("require('"+configurationPath+"')"),{configuration:CONFIGURATION,environment:process.env,Tools:clientnode__WEBPACK_IMPORTED_MODULE_2___default()}))}var 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)),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","useExpression":"true","port":443,"stateAPIs":[{"data":{},"name":"base","options":{},"expressions":{"pre":"false","post":"true"},"skipSecrets":[],"url":""}],"tls":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.17",
|
|
4
4
|
"description": "A reverse proxy blocking bot requests.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"api",
|
|
@@ -23,6 +23,7 @@
|
|
|
23
23
|
"url": "https://torben.website"
|
|
24
24
|
},
|
|
25
25
|
"files": [
|
|
26
|
+
"helper.d.ts",
|
|
26
27
|
"index.d.ts",
|
|
27
28
|
"index.js",
|
|
28
29
|
"type.d.ts"
|
|
@@ -47,13 +48,17 @@
|
|
|
47
48
|
"prepare": "yarn build",
|
|
48
49
|
"serve": "weboptimizer build && yarn start",
|
|
49
50
|
"start": "./index.js",
|
|
51
|
+
"test": "weboptimizer test",
|
|
52
|
+
"test:coverage": "weboptimizer test:coverage",
|
|
53
|
+
"test:coverage:report": "weboptimizer test:coverage:report",
|
|
50
54
|
"update": "yarn version --patch",
|
|
51
55
|
"update:documentation": "documentation-website",
|
|
52
56
|
"watch": "weboptimizer build --watch"
|
|
53
57
|
},
|
|
54
58
|
"runkitExample": "require('@babel/runtime/package.json')\n",
|
|
55
59
|
"dependencies": {
|
|
56
|
-
"@babel/runtime": "*"
|
|
60
|
+
"@babel/runtime": "*",
|
|
61
|
+
"@types/webpack": "https://registry.yarnpkg.com/@favware/skip-dependency/-/skip-dependency-1.1.1.tgz"
|
|
57
62
|
},
|
|
58
63
|
"devDependencies": {
|
|
59
64
|
"@babel/cli": "*",
|
|
@@ -66,12 +71,13 @@
|
|
|
66
71
|
"eslint": "*",
|
|
67
72
|
"eslint-config-google": "*",
|
|
68
73
|
"eslint-plugin-jsdoc": "*",
|
|
74
|
+
"jest": "*",
|
|
69
75
|
"jsdoc": "*",
|
|
70
76
|
"weboptimizer": "*"
|
|
71
77
|
},
|
|
72
78
|
"engines": {
|
|
73
|
-
"node": ">=
|
|
74
|
-
"npm": ">=
|
|
79
|
+
"node": ">=19",
|
|
80
|
+
"npm": ">=8"
|
|
75
81
|
},
|
|
76
82
|
"resolutions": {
|
|
77
83
|
"@types/webpack": "https://registry.yarnpkg.com/@favware/skip-dependency/-/skip-dependency-1.1.1.tgz",
|
|
@@ -90,24 +96,25 @@
|
|
|
90
96
|
},
|
|
91
97
|
"host": "localhost",
|
|
92
98
|
"port": 8080,
|
|
93
|
-
"
|
|
99
|
+
"forwarders": {
|
|
94
100
|
"base": {
|
|
95
|
-
"
|
|
101
|
+
"headerTransformations": {
|
|
96
102
|
"retrieve": [],
|
|
97
103
|
"send": []
|
|
98
104
|
},
|
|
99
105
|
"host": "localhost",
|
|
100
|
-
"
|
|
106
|
+
"useExpression": "true",
|
|
101
107
|
"port": 443,
|
|
102
108
|
"stateAPIs": [
|
|
103
109
|
{
|
|
104
|
-
"name": "base",
|
|
105
110
|
"data": {},
|
|
111
|
+
"name": "base",
|
|
106
112
|
"options": {},
|
|
107
|
-
"
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
113
|
+
"expressions": {
|
|
114
|
+
"pre": "false",
|
|
115
|
+
"post": "true"
|
|
116
|
+
},
|
|
117
|
+
"skipSecrets": [],
|
|
111
118
|
"url": ""
|
|
112
119
|
}
|
|
113
120
|
],
|
package/readme.md
CHANGED
|
@@ -17,10 +17,14 @@ Project status
|
|
|
17
17
|
[](https://www.npmjs.com/package/reverse-proxy-middleware)
|
|
18
18
|
|
|
19
19
|
[](https://github.com/thaibault/reverse-proxy-middleware/actions/workflows/build.yaml)
|
|
20
|
+
[](https://github.com/thaibault/reverse-proxy-middleware/actions/workflows/test.yaml)
|
|
21
|
+
[](https://github.com/thaibault/reverse-proxy-middleware/actions/workflows/test-coverage-report.yaml)
|
|
20
22
|
[](https://github.com/thaibault/reverse-proxy-middleware/actions/workflows/check-types.yaml)
|
|
21
|
-
[](https://github.com/thaibault/reverse-proxy-middleware/actions/workflows/lint.yaml)
|
|
22
24
|
[](https://github.com/thaibault/reverse-proxy-middleware/actions/workflows/build-image-periodically-2-branches.yaml)
|
|
23
25
|
|
|
26
|
+
[](https://coveralls.io/github/thaibault/reverse-proxy-middleware)
|
|
27
|
+
|
|
24
28
|
[](http://torben.website/reverse-proxy-middleware)
|
|
25
29
|
|
|
26
30
|
Use case
|
package/type.d.ts
CHANGED
|
@@ -2,24 +2,17 @@
|
|
|
2
2
|
/// <reference types="node" />
|
|
3
3
|
/// <reference types="node" />
|
|
4
4
|
/// <reference types="node" />
|
|
5
|
-
|
|
5
|
+
/// <reference types="node" />
|
|
6
|
+
import Tools from 'clientnode';
|
|
7
|
+
import { Mapping, TemplateFunction } from 'clientnode/type';
|
|
8
|
+
import { Http2SecureServer as HTTPSecureServer, Http2Server as HttpServer, Http2ServerRequest, Http2ServerResponse, Http2Stream, OutgoingHttpHeaders, SecureServerOptions } from 'http2';
|
|
6
9
|
import { Socket as PlainSocket } from 'net';
|
|
7
10
|
import { TLSSocket } from 'tls';
|
|
8
|
-
export
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
options: RequestInit;
|
|
14
|
-
url: string;
|
|
15
|
-
}
|
|
16
|
-
export type APIConfigurations = {
|
|
17
|
-
base: APIConfiguration;
|
|
18
|
-
[key: string]: Partial<APIConfiguration>;
|
|
19
|
-
};
|
|
20
|
-
export type ResolvedAPIConfigurations = {
|
|
21
|
-
[key: string]: APIConfiguration;
|
|
22
|
-
};
|
|
11
|
+
export type HTTPServer = HttpServer | HTTPSecureServer;
|
|
12
|
+
export type HTTPServerRequest = Http2ServerRequest;
|
|
13
|
+
export type HTTPServerResponse = Http2ServerResponse;
|
|
14
|
+
export type HTTPStream = Http2Stream;
|
|
15
|
+
export type OutgoingHTTPHeaders = OutgoingHttpHeaders;
|
|
23
16
|
export type Socket = PlainSocket | TLSSocket;
|
|
24
17
|
export type BufferedSocket = Socket & {
|
|
25
18
|
buffers: Array<Buffer>;
|
|
@@ -27,40 +20,85 @@ export type BufferedSocket = Socket & {
|
|
|
27
20
|
export interface BufferedHTTPServerRequest extends HTTPServerRequest {
|
|
28
21
|
socket: BufferedSocket;
|
|
29
22
|
}
|
|
23
|
+
export type StringReplacer = (substring: string, ...parameters: Array<unknown>) => string;
|
|
24
|
+
export interface EvaluationScope {
|
|
25
|
+
error?: Error;
|
|
26
|
+
request?: HTTPServerRequest;
|
|
27
|
+
response?: HTTPServerResponse;
|
|
28
|
+
stateAPIs?: Mapping<{
|
|
29
|
+
error?: Error;
|
|
30
|
+
configuration: StateAPI;
|
|
31
|
+
response?: HTTPServerResponse;
|
|
32
|
+
}>;
|
|
33
|
+
Tools: typeof Tools;
|
|
34
|
+
}
|
|
35
|
+
export interface APIExpressions {
|
|
36
|
+
post?: Array<string> | string;
|
|
37
|
+
pre?: Array<string> | string;
|
|
38
|
+
}
|
|
39
|
+
export interface StateAPI {
|
|
40
|
+
data?: Mapping<unknown>;
|
|
41
|
+
name: string;
|
|
42
|
+
options?: RequestInit;
|
|
43
|
+
expressions?: APIExpressions;
|
|
44
|
+
skipSecrets?: Array<string> | string;
|
|
45
|
+
url: string;
|
|
46
|
+
}
|
|
47
|
+
export interface ResolvedAPIExpressions {
|
|
48
|
+
pre: Array<TemplateFunction<boolean | number>>;
|
|
49
|
+
post: Array<TemplateFunction<number | true>>;
|
|
50
|
+
}
|
|
51
|
+
export type ResolvedStateAPI = NonNullable<Omit<StateAPI, 'expressions' | 'skipSecrets'>> & {
|
|
52
|
+
expressions: ResolvedAPIExpressions;
|
|
53
|
+
skipSecrets: Array<string>;
|
|
54
|
+
};
|
|
30
55
|
export interface HeaderTransformation {
|
|
31
|
-
source
|
|
32
|
-
target
|
|
56
|
+
source?: string | RegExp;
|
|
57
|
+
target?: string | ((substring: string, ...parameters: Array<unknown>) => string);
|
|
58
|
+
}
|
|
59
|
+
export interface ResolvedHeaderTransformation {
|
|
60
|
+
source: TemplateFunction<RegExp | string>;
|
|
61
|
+
target: TemplateFunction<string | StringReplacer>;
|
|
62
|
+
}
|
|
63
|
+
export interface HeaderTransformations {
|
|
64
|
+
retrieve?: Array<HeaderTransformation> | HeaderTransformation;
|
|
65
|
+
send?: Array<HeaderTransformation> | HeaderTransformation;
|
|
66
|
+
}
|
|
67
|
+
export interface ResolvedHeaderTransformations {
|
|
68
|
+
retrieve: Array<ResolvedHeaderTransformation>;
|
|
69
|
+
send: Array<ResolvedHeaderTransformation>;
|
|
33
70
|
}
|
|
34
71
|
export interface Forwarder {
|
|
35
|
-
|
|
36
|
-
retrieve: Array<HeaderTransformation>;
|
|
37
|
-
send: Array<HeaderTransformation>;
|
|
38
|
-
};
|
|
72
|
+
headerTransformations?: HeaderTransformations;
|
|
39
73
|
host: string;
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
tls
|
|
74
|
+
port?: number;
|
|
75
|
+
stateAPIs?: StateAPI | Array<StateAPI>;
|
|
76
|
+
tls?: boolean;
|
|
77
|
+
useExpression?: string;
|
|
78
|
+
}
|
|
79
|
+
export interface Forwarders {
|
|
80
|
+
base: Forwarder;
|
|
81
|
+
[key: string]: Partial<Forwarder>;
|
|
43
82
|
}
|
|
44
|
-
export type ResolvedForwarder = {
|
|
45
|
-
|
|
83
|
+
export type ResolvedForwarder = NonNullable<Omit<Forwarder, 'headerTransformations' | 'stateAPIs' | 'useExpression'>> & {
|
|
84
|
+
headerTransformations: ResolvedHeaderTransformations;
|
|
85
|
+
stateAPIs: Array<ResolvedStateAPI>;
|
|
86
|
+
useExpression: TemplateFunction<boolean>;
|
|
87
|
+
};
|
|
88
|
+
export type ResolvedForwarders = {
|
|
89
|
+
[key: string]: ResolvedForwarder;
|
|
46
90
|
};
|
|
47
91
|
export interface Configuration {
|
|
48
|
-
publicKeyPath: string;
|
|
49
92
|
privateKeyPath: string;
|
|
93
|
+
publicKeyPath: string;
|
|
50
94
|
nodeServerOptions: SecureServerOptions;
|
|
51
95
|
host: string;
|
|
52
96
|
port: number;
|
|
53
|
-
|
|
54
|
-
base: Forwarder;
|
|
55
|
-
[key: string]: Partial<Forwarder>;
|
|
56
|
-
};
|
|
57
|
-
humanChecker: {
|
|
58
|
-
applicationInterfaces: APIConfigurations;
|
|
59
|
-
botDetectionStatusCode: number;
|
|
60
|
-
skipSecrets: Array<string>;
|
|
61
|
-
};
|
|
97
|
+
forwarders: Forwarders;
|
|
62
98
|
}
|
|
63
|
-
export type
|
|
99
|
+
export type ResolvedConfiguration = Omit<Configuration, 'forwarders'> & {
|
|
100
|
+
forwarders: ResolvedForwarders;
|
|
101
|
+
};
|
|
64
102
|
export interface Server {
|
|
65
103
|
instance: HTTPServer;
|
|
66
104
|
streams: Array<HTTPStream>;
|