reverse-proxy-middleware 0.0.143 → 0.0.144-1
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/dist/helper.d.ts +40 -0
- package/dist/helper.js +148 -0
- package/{index.js → dist/index.js} +57 -86
- package/dist/test.d.ts +1 -0
- package/{type.d.ts → dist/type.d.ts} +2 -2
- package/package.json +19 -14
- package/helper.d.ts +0 -14
- /package/{index.d.ts → dist/index.d.ts} +0 -0
package/dist/helper.d.ts
ADDED
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import type { BufferedHTTPServerRequest, Configuration, EvaluationParameters, EvaluationScopeStateAPIs, Forwarders, HTTPServerResponse, ResolvedHeaderTransformation, ResolvedForwarder, ResolvedForwarders, Server } from './type';
|
|
2
|
+
import { Logger } from 'clientnode';
|
|
3
|
+
export declare const EVALUATION_SCOPE_NAMES: readonly ["array", "datetime", "filesystem", "functions", "indicators", "logger", "module", "number", "object", "string", "utility", "data", "error", "request", "response", "stateAPI", "stateAPIs"];
|
|
4
|
+
export declare const log: Logger;
|
|
5
|
+
export declare const applyStateAPIs: (request: BufferedHTTPServerRequest, response: HTTPServerResponse, forwarder: ResolvedForwarder) => Promise<{
|
|
6
|
+
result: boolean;
|
|
7
|
+
scope: EvaluationScopeStateAPIs;
|
|
8
|
+
}>;
|
|
9
|
+
export declare const determineForwarder: (request: BufferedHTTPServerRequest, response: HTTPServerResponse, forwarders: ResolvedForwarders) => null | ResolvedForwarder;
|
|
10
|
+
export declare const resolveForwarders: (forwarders: Forwarders) => ResolvedForwarders;
|
|
11
|
+
export declare const addParsedContentToRequest: (bufferedRequest: BufferedHTTPServerRequest) => void;
|
|
12
|
+
export declare const transformHeaders: (content: string, headerTransformations: Array<ResolvedHeaderTransformation>, parameters: EvaluationParameters) => string;
|
|
13
|
+
export declare const reverseProxyBufferedRequest: (request: BufferedHTTPServerRequest, response: HTTPServerResponse, forwarder: ResolvedForwarder, stateAPIScope: EvaluationScopeStateAPIs) => Promise<void>;
|
|
14
|
+
/**
|
|
15
|
+
* Loads the package configuration extended by "configuration.json" and
|
|
16
|
+
* "secure-configuration.json" files found in given directory and evaluates
|
|
17
|
+
* all dynamic values.
|
|
18
|
+
* @param directoryPath - Directory to search configuration files in.
|
|
19
|
+
* @param baseConfiguration - Configuration to extend.
|
|
20
|
+
* @returns A promise resolving to the evaluated configuration.
|
|
21
|
+
*/
|
|
22
|
+
export declare const loadConfiguration: (directoryPath?: string, baseConfiguration?: Configuration) => Promise<Configuration>;
|
|
23
|
+
/**
|
|
24
|
+
* Waits until given request is fully buffered, determines its forwarder,
|
|
25
|
+
* applies the forwarder's state apis and forwards the request.
|
|
26
|
+
* @param request - Buffered client request.
|
|
27
|
+
* @param response - Response to the client.
|
|
28
|
+
* @param forwarders - Forwarders to choose from.
|
|
29
|
+
* @param parseBody - Indicates whether to parse a json request body.
|
|
30
|
+
* @returns A promise resolving when the request has been processed.
|
|
31
|
+
*/
|
|
32
|
+
export declare const handleRequest: (request: BufferedHTTPServerRequest, response: HTTPServerResponse, forwarders: ResolvedForwarders, parseBody?: boolean) => Promise<void>;
|
|
33
|
+
/**
|
|
34
|
+
* Creates a (not yet listening) server forwarding incoming requests.
|
|
35
|
+
* @param configuration - Server configuration.
|
|
36
|
+
* @param forwarders - Forwarders to use for incoming requests.
|
|
37
|
+
* @returns The created server.
|
|
38
|
+
*/
|
|
39
|
+
export declare const createServer: (configuration: Configuration, forwarders?: ResolvedForwarders) => Server;
|
|
40
|
+
export default reverseProxyBufferedRequest;
|
package/dist/helper.js
ADDED
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
import * as __WEBPACK_EXTERNAL_MODULE_clientnode__ from "clientnode";
|
|
2
|
+
import { readFile as __WEBPACK_EXTERNAL_MODULE_fs_promises_cc1b69f3_readFile__ } from "fs/promises";
|
|
3
|
+
import { createServer as __WEBPACK_EXTERNAL_MODULE_http_createServer__ } from "http";
|
|
4
|
+
import { createSecureServer as __WEBPACK_EXTERNAL_MODULE_http2_createSecureServer__ } from "http2";
|
|
5
|
+
import { createConnection as __WEBPACK_EXTERNAL_MODULE_net_createConnection__ } from "net";
|
|
6
|
+
import { resolve as __WEBPACK_EXTERNAL_MODULE_path_resolve__ } from "path";
|
|
7
|
+
import { connect as __WEBPACK_EXTERNAL_MODULE_tls_connect__ } from "tls";
|
|
8
|
+
/******/ var __webpack_modules__ = ([
|
|
9
|
+
/* 0 */,
|
|
10
|
+
/* 1 */
|
|
11
|
+
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
|
|
12
|
+
|
|
13
|
+
const x = (y) => {
|
|
14
|
+
const x = {}; __webpack_require__.d(x, y); return x
|
|
15
|
+
}
|
|
16
|
+
const y = (x) => (() => (x))
|
|
17
|
+
module.exports = x({ ["Logger"]: () => (__WEBPACK_EXTERNAL_MODULE_clientnode__.Logger), ["MAXIMAL_NUMBER_OF_ITERATIONS"]: () => (__WEBPACK_EXTERNAL_MODULE_clientnode__.MAXIMAL_NUMBER_OF_ITERATIONS), ["UTILITY_SCOPE"]: () => (__WEBPACK_EXTERNAL_MODULE_clientnode__.UTILITY_SCOPE), ["UTILITY_SCOPE_NAMES"]: () => (__WEBPACK_EXTERNAL_MODULE_clientnode__.UTILITY_SCOPE_NAMES), ["UTILITY_SCOPE_VALUES"]: () => (__WEBPACK_EXTERNAL_MODULE_clientnode__.UTILITY_SCOPE_VALUES), ["compile"]: () => (__WEBPACK_EXTERNAL_MODULE_clientnode__.compile), ["copy"]: () => (__WEBPACK_EXTERNAL_MODULE_clientnode__.copy), ["evaluateAsyncDynamicData"]: () => (__WEBPACK_EXTERNAL_MODULE_clientnode__.evaluateAsyncDynamicData), ["evaluateDynamicData"]: () => (__WEBPACK_EXTERNAL_MODULE_clientnode__.evaluateDynamicData), ["extend"]: () => (__WEBPACK_EXTERNAL_MODULE_clientnode__.extend), ["isFile"]: () => (__WEBPACK_EXTERNAL_MODULE_clientnode__.isFile), ["modifyObject"]: () => (__WEBPACK_EXTERNAL_MODULE_clientnode__.modifyObject), ["represent"]: () => (__WEBPACK_EXTERNAL_MODULE_clientnode__.represent), ["timeout"]: () => (__WEBPACK_EXTERNAL_MODULE_clientnode__.timeout) });
|
|
18
|
+
|
|
19
|
+
/***/ })
|
|
20
|
+
/******/ ]);
|
|
21
|
+
/************************************************************************/
|
|
22
|
+
/******/ // The module cache
|
|
23
|
+
/******/ const __webpack_module_cache__ = {};
|
|
24
|
+
/******/
|
|
25
|
+
/******/ // The require function
|
|
26
|
+
/******/ function __webpack_require__(moduleId) {
|
|
27
|
+
/******/ // Check if module is in cache
|
|
28
|
+
/******/ const cachedModule = __webpack_module_cache__[moduleId];
|
|
29
|
+
/******/ if (cachedModule !== undefined) {
|
|
30
|
+
/******/ return cachedModule.exports;
|
|
31
|
+
/******/ }
|
|
32
|
+
/******/ // Create a new module (and put it into the cache)
|
|
33
|
+
/******/ const module = __webpack_module_cache__[moduleId] = {
|
|
34
|
+
/******/ // no module.id needed
|
|
35
|
+
/******/ // no module.loaded needed
|
|
36
|
+
/******/ exports: {}
|
|
37
|
+
/******/ };
|
|
38
|
+
/******/
|
|
39
|
+
/******/ // Execute the module function
|
|
40
|
+
/******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__);
|
|
41
|
+
/******/
|
|
42
|
+
/******/ // Return the exports of the module
|
|
43
|
+
/******/ return module.exports;
|
|
44
|
+
/******/ }
|
|
45
|
+
/******/
|
|
46
|
+
/************************************************************************/
|
|
47
|
+
/******/ /* webpack/runtime/define property getters */
|
|
48
|
+
/******/ // define getter/value functions for harmony exports
|
|
49
|
+
/******/ __webpack_require__.d = (exports, definition) => {
|
|
50
|
+
/******/ for(var key in definition) {
|
|
51
|
+
/******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {
|
|
52
|
+
/******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });
|
|
53
|
+
/******/ }
|
|
54
|
+
/******/ }
|
|
55
|
+
/******/ };
|
|
56
|
+
/******/
|
|
57
|
+
/******/ /* webpack/runtime/hasOwnProperty shorthand */
|
|
58
|
+
/******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop));
|
|
59
|
+
/******/
|
|
60
|
+
/************************************************************************/
|
|
61
|
+
|
|
62
|
+
// EXTERNAL MODULE: external "clientnode"
|
|
63
|
+
var external_clientnode_ = __webpack_require__(1);
|
|
64
|
+
;// external "fs/promises"
|
|
65
|
+
|
|
66
|
+
;// external "http"
|
|
67
|
+
|
|
68
|
+
;// external "http2"
|
|
69
|
+
|
|
70
|
+
;// external "net"
|
|
71
|
+
|
|
72
|
+
;// external "path"
|
|
73
|
+
|
|
74
|
+
;// external "tls"
|
|
75
|
+
|
|
76
|
+
;// ./package.json
|
|
77
|
+
const package_namespaceObject = /*#__PURE__*/JSON.parse('{"HF":{"forwarders":{"base":{"headerTransformations":{"retrieve":[],"send":[]},"host":"localhost","port":443,"stateAPIs":[{"data":{},"expressions":{"post":"true","pre":"false"},"name":"base","options":{},"url":""}],"tls":true,"useExpression":"true"}},"host":"localhost","nodeServerOptions":{"allowHTTP1":true},"parseBody":false,"port":8080,"privateKeyPath":"","publicKeyPath":""}}');
|
|
78
|
+
;// ./src/helper.ts
|
|
79
|
+
// #!/usr/bin/env babel-node
|
|
80
|
+
// -*- coding: utf-8 -*-
|
|
81
|
+
/** @module web-node *//* !
|
|
82
|
+
region header
|
|
83
|
+
[Project page](https://tsickert.com/webNode)
|
|
84
|
+
|
|
85
|
+
Copyright Torben Sickert (info["~at~"]tsickert.com) 16.12.2012
|
|
86
|
+
|
|
87
|
+
License
|
|
88
|
+
-------
|
|
89
|
+
|
|
90
|
+
This library written by Torben Sickert stands under a creative commons
|
|
91
|
+
naming 3.0 unported license.
|
|
92
|
+
See https://creativecommons.org/licenses/by/3.0/deed.de
|
|
93
|
+
endregion
|
|
94
|
+
*/// region imports
|
|
95
|
+
// NOTE: http2 compatibility mode does work for unencrypted connections yet.
|
|
96
|
+
function _typeof(o){"@babel/helpers - typeof";return _typeof="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(o){return typeof o}:function(o){return o&&"function"==typeof Symbol&&o.constructor===Symbol&&o!==Symbol.prototype?"symbol":typeof o},_typeof(o)}function ownKeys(e,r){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);r&&(o=o.filter(function(r){return Object.getOwnPropertyDescriptor(e,r).enumerable})),t.push.apply(t,o)}return t}function _objectSpread(r){for(var t=1;t<arguments.length;t++){var o=null!=arguments[t]?arguments[t]:{};t%2?ownKeys(Object(o),!0).forEach(function(t){_defineProperty(r,t,o[t])}):Object.getOwnPropertyDescriptors?Object.defineProperties(r,Object.getOwnPropertyDescriptors(o)):ownKeys(Object(o)).forEach(function(e){Object.defineProperty(r,e,Object.getOwnPropertyDescriptor(o,e))})}return r}function _defineProperty(r,t,o){return(t=_toPropertyKey(t))in r?Object.defineProperty(r,t,{value:o,enumerable:!0,configurable:!0,writable:!0}):r[t]=o,r}function _toPropertyKey(r){var o=_toPrimitive(r,"string");return"symbol"==_typeof(o)?o:o+""}function _toPrimitive(t,e){if("object"!=_typeof(t)||!t)return t;var r;if("undefined"!=typeof Symbol&&void 0!==(r=t[Symbol.toPrimitive])){var i=r.call(t,e||"default");if("object"!=_typeof(i))return i;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===e?String:Number)(t)}function _slicedToArray(e,i){return _iterableToArrayLimit(e,i)||_unsupportedIterableToArray(e,i)||_nonIterableRest()}function _nonIterableRest(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function _iterableToArrayLimit(r,t){var e=null==r?null:"undefined"!=typeof Symbol&&r[Symbol.iterator]||r["@@iterator"];if(Array.isArray(r)&&(null==e||e===("undefined"!=typeof Symbol&&[][Symbol.iterator])||e===[]["@@iterator"]))return r;if(null!=e){var l,n,i,a,u=[],o=!0,f=!1;try{if(i=(e=e.call(r)).next,0===t){if(Object(e)!==e)return;o=!1}else for(;!(o=(l=i.call(e)).done)&&(u.push(l.value),u.length!==t);o=!0);}catch(r){f=!0,n=r}finally{try{if(!o&&null!=e.return&&(a=e.return(),Object(a)!==a))return}finally{if(f)throw n}}return u}}function _regenerator(){/*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/babel/babel/blob/main/packages/babel-helpers/LICENSE */var r,e,o="function"==typeof Symbol?Symbol:{},n=o.iterator||"@@iterator",a=o.toStringTag||"@@toStringTag";function i(o,n,a,i){var u=n&&n.prototype instanceof Generator?n:Generator,f=Object.create(u.prototype);return _regeneratorDefine2(f,"_invoke",function(t,o,n){var a,i,u,f=0,p=n||[],y=!1,G={p:0,n:0,v:r,a:l,f:l.bind(r,4),d:function d(t,e){return a=t,i=0,u=r,G.n=e,c}};function l(t,o){for(i=t,u=o,e=0;!y&&f&&!n&&e<p.length;e++){var n,a=p[e],l=G.p,F=a[2];t>3?(n=F===o)&&(u=a[(i=a[4])?5:(i=3,3)],a[4]=a[5]=r):a[0]<=l&&((n=t<2&&l<a[1])?(i=0,G.v=o,G.n=a[1]):l<F&&(n=t<3||a[0]>o||o>F)&&(a[4]=t,a[5]=o,G.n=F,i=0))}if(n||t>1)return c;throw y=!0,o}return function(n,p,F){if(f>1)throw TypeError("Generator is already running");for(y&&1===p&&l(p,F),i=p,u=F;(e=i<2?r:u)||!y;){a||(i?i<3?(i>1&&(G.n=-1),l(i,u)):G.n=u:G.v=u);try{if(f=2,a){if(i||(n="next"),e=a[n]){if(!(e=e.call(a,u)))throw TypeError("iterator result is not an object");if(!e.done)return e;u=e.value,i<2&&(i=0)}else 1===i&&(e=a.return)&&e.call(a),i<2&&(u=TypeError("The iterator does not provide a '"+n+"' method"),i=1);a=r}else if((e=(y=G.n<0)?u:t.call(o,G))!==c)break}catch(t){a=r,i=1,u=t}finally{f=1}}return{value:e,done:y}}}(o,a,i),!0),f}var c={};function Generator(){}function GeneratorFunction(){}function GeneratorFunctionPrototype(){}e=Object.getPrototypeOf;var u=[][n]?e(e([][n]())):(_regeneratorDefine2(e={},n,function(){return this}),e),f=GeneratorFunctionPrototype.prototype=Generator.prototype=Object.create(u);function p(r){return Object.setPrototypeOf?Object.setPrototypeOf(r,GeneratorFunctionPrototype):(r.__proto__=GeneratorFunctionPrototype,_regeneratorDefine2(r,a,"GeneratorFunction")),r.prototype=Object.create(f),r}return GeneratorFunction.prototype=GeneratorFunctionPrototype,_regeneratorDefine2(f,"constructor",GeneratorFunctionPrototype),_regeneratorDefine2(GeneratorFunctionPrototype,"constructor",GeneratorFunction),GeneratorFunction.displayName="GeneratorFunction",_regeneratorDefine2(GeneratorFunctionPrototype,a,"GeneratorFunction"),_regeneratorDefine2(f),_regeneratorDefine2(f,a,"Generator"),_regeneratorDefine2(f,n,function(){return this}),_regeneratorDefine2(f,"toString",function(){return"[object Generator]"}),(_regenerator=function _regenerator(){return{w:i,m:p}})()}function _regeneratorDefine2(e,r,n,t){var i=Object.defineProperty;try{i({},"",{})}catch(e){i=0}_regeneratorDefine2=function _regeneratorDefine(e,r,n,t){function o(r,n){_regeneratorDefine2(e,r,function(e){return this._invoke(r,n,e)})}r?i?i(e,r,{value:n,enumerable:!t,configurable:!t,writable:!t}):e[r]=n:(o("next",0),o("throw",1),o("return",2))},_regeneratorDefine2(e,r,n,t)}function _createForOfIteratorHelper(e,t){var _n="undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(!_n){if(Array.isArray(e)||(_n=_unsupportedIterableToArray(e))||t&&e&&"number"==typeof e.length){_n&&(e=_n);var o=0,F=function F(){};return{s:F,n:function n(){return o>=e.length?{done:!0}:{done:!1,value:e[o++]}},e:function e(r){throw r},f:F}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var a,u,i=!0;return{s:function s(){_n=_n.call(e)},n:function n(){i=!0;var r=_n.next();return r.done?{done:!0}:{value:r.value,done:i=!1}},e:function e(r){a=!0,u=r},f:function f(){try{i||null==_n.return||_n.return()}finally{if(a)throw u}}}}function asyncGeneratorStep(n,t,e,r,o,a,c){try{var i=n[a](c),u=i.value}catch(n){return void e(n)}i.done?t(u):Promise.resolve(u).then(r,o)}function _asyncToGenerator(n){return function(){var t=this,e=arguments;return new Promise(function(r,o){var a=n.apply(t,e);function _next(n){asyncGeneratorStep(a,r,o,_next,_throw,"next",n)}function _throw(n){asyncGeneratorStep(a,r,o,_next,_throw,"throw",n)}_next(void 0)})}}function _toConsumableArray(a){return _arrayWithoutHoles(a)||_iterableToArray(a)||_unsupportedIterableToArray(a)||_nonIterableSpread()}function _nonIterableSpread(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function _unsupportedIterableToArray(t,e){if(t){if("string"==typeof t)return _arrayLikeToArray(t,e);var o={}.toString.call(t).slice(8,-1);return"Object"===o&&t.constructor&&(o=t.constructor.name),"Map"===o||"Set"===o?Array.from(t):"Arguments"===o||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(o)?_arrayLikeToArray(t,e):void 0}}function _iterableToArray(r){var e="undefined"!=typeof Symbol&&r[Symbol.iterator]||r["@@iterator"];if(Array.isArray(r)&&(null==e||e===("undefined"!=typeof Symbol&&[][Symbol.iterator])||e===[]["@@iterator"]))return r;if(null!=e){for(var t,o=[],a=e.call(r);!(t=a.next()).done;)o.push(t.value);return o}}function _arrayWithoutHoles(a){if(Array.isArray(a))return _arrayLikeToArray(a)}function _arrayLikeToArray(r,a){(null==a||a>r.length)&&(a=r.length);for(var e=0,n=Array(a);e<a;e++)n[e]=r[e];return n};// endregion
|
|
97
|
+
var EVALUATION_SCOPE_NAMES=[].concat(_toConsumableArray(external_clientnode_.UTILITY_SCOPE_NAMES),["data","error","request","response","stateAPI","stateAPIs"]);var log=new external_clientnode_.Logger({name:"reverse-proxy-middleware"});// region forwarder
|
|
98
|
+
var applyStateAPIs=/*#__PURE__*/function(){var _applyStateAPIs=_asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee(request,response,forwarder){var stateAPIScope,state,_iterator,_step,stateAPI,useStateAPI,index,_iterator2,_step2,_expression,_result,error,_iterator3,_step3,expression,result,_t,_t2,_t3,_t4,_t5;return _regenerator().w(function(_context){while(1)switch(_context.p=_context.n){case 0:stateAPIScope={};_iterator=_createForOfIteratorHelper(forwarder.stateAPIs);_context.p=1;_iterator.s();case 2:if((_step=_iterator.n()).done){_context.n=30;break}stateAPI=_step.value;state=stateAPIScope[stateAPI.name]={configuration:stateAPI,error:null,response:null};useStateAPI=false;index=1;_iterator2=_createForOfIteratorHelper(stateAPI.expressions.pre);_context.p=3;_iterator2.s();case 4:if((_step2=_iterator2.n()).done){_context.n=9;break}_expression=_step2.value;_result=void 0;try{_result=_expression.apply(void 0,_toConsumableArray(external_clientnode_.UTILITY_SCOPE_VALUES).concat([stateAPI.data,null,request,response,state,stateAPIScope]))}catch(error){void log.warn("Failed running pre ".concat(String(index),". expression of ")+"state api:",error)}if(!(typeof _result==="number")){_context.n=5;break}void log.info("Break request caused by state api","\"".concat(stateAPI.name,"\" with status code ").concat(String(_result),"."));response.statusCode=_result;response.end();return _context.a(2,{result:false,scope:stateAPIScope});case 5:if(!(_result==="break")){_context.n=6;break}return _context.a(3,9);case 6:index+=1;if(!(typeof _result==="boolean")){_context.n=8;break}if(!_result){_context.n=7;break}useStateAPI=true;_context.n=8;break;case 7:return _context.a(3,9);case 8:_context.n=4;break;case 9:_context.n=11;break;case 10:_context.p=10;_t=_context.v;_iterator2.e(_t);case 11:_context.p=11;_iterator2.f();return _context.f(11);case 12:if(!useStateAPI){_context.n=29;break}void log.info("Use state api: \"".concat(stateAPI.name,"\""));error=null;if(stateAPI.urlExpression)try{stateAPI.url=stateAPI.urlExpression.apply(stateAPI,_toConsumableArray(external_clientnode_.UTILITY_SCOPE_VALUES).concat([stateAPI.data,null,request,response,state,stateAPIScope]))}catch(error){void log.warn("Failed running url expression:",error)}void log.debug("\nState api configuration is: ".concat((0,external_clientnode_.represent)(stateAPI)));_context.p=13;_context.n=14;return fetch(stateAPI.url,stateAPI.options);case 14:state.response=_context.v;_context.n=16;break;case 15:_context.p=15;_t2=_context.v;error=_t2;void log.warn("Running state api request for \"".concat(stateAPI.name,"\" throws"),"error:",error);case 16:if(!(state.response&&state.response.headers.has("content-type")&&/application\/json(;.*)?$/.test(state.response.headers.get("content-type")))){_context.n=20;break}_context.p=17;_context.n=18;return state.response.json();case 18:state.response.data=_context.v;_context.n=20;break;case 19:_context.p=19;_t3=_context.v;error=_t3;void log.warn("Parsing state api json response for","\"".concat(stateAPI.name,"\" throws error:"),error);case 20:void log.debug("\nState api response is:",(0,external_clientnode_.represent)(state.response));index=1;_iterator3=_createForOfIteratorHelper(stateAPI.expressions.post);_context.p=21;_iterator3.s();case 22:if((_step3=_iterator3.n()).done){_context.n=26;break}expression=_step3.value;result=null;try{result=expression.apply(void 0,_toConsumableArray(external_clientnode_.UTILITY_SCOPE_VALUES).concat([stateAPI.data,error,request,response,state,stateAPIScope]))}catch(error){void log.warn("Failed running ".concat(String(index),". post ")+"expression of state api:",error)}if(!(typeof result==="number")){_context.n=23;break}void log.info("Break request caused by state api","\"".concat(stateAPI.name,"\" with status code ")+"".concat(String(result),"."));response.statusCode=result;response.end();return _context.a(2,{result:false,scope:stateAPIScope});case 23:if(!(result==="break")){_context.n=24;break}return _context.a(3,26);case 24:index+=1;case 25:_context.n=22;break;case 26:_context.n=28;break;case 27:_context.p=27;_t4=_context.v;_iterator3.e(_t4);case 28:_context.p=28;_iterator3.f();return _context.f(28);case 29:_context.n=2;break;case 30:_context.n=32;break;case 31:_context.p=31;_t5=_context.v;_iterator.e(_t5);case 32:_context.p=32;_iterator.f();return _context.f(32);case 33:return _context.a(2,{result:true,scope:stateAPIScope})}},_callee,null,[[21,27,28,29],[17,19],[13,15],[3,10,11,12],[1,31,32,33]])}));function applyStateAPIs(_x,_x2,_x3){return _applyStateAPIs.apply(this,arguments)}return applyStateAPIs}();var determineForwarder=function determineForwarder(request,response,forwarders){var _iterator4=_createForOfIteratorHelper(Object.entries(forwarders).sort(function(_ref,_ref2){var _ref3=_slicedToArray(_ref,1),firstName=_ref3[0];var _ref4=_slicedToArray(_ref2,1),secondName=_ref4[0];return firstName.localeCompare(secondName)})),_step4;try{for(_iterator4.s();!(_step4=_iterator4.n()).done;){var _step4$value=_slicedToArray(_step4.value,2),name=_step4$value[0],forwarder=_step4$value[1];var state={configuration:forwarder,error:null,response:null};if(forwarder.useExpression.apply(forwarder,_toConsumableArray(external_clientnode_.UTILITY_SCOPE_VALUES).concat([forwarder,null,request,response,state,_defineProperty({},name,state)]))){void log.info("Determined forwarder is: \"".concat(name,"\"."));return forwarder}}}catch(err){_iterator4.e(err)}finally{_iterator4.f()}return null};var resolveForwarders=function resolveForwarders(forwarders){var resolvedForwarders={};for(var _i=0,_Object$entries=Object.entries(forwarders);_i<_Object$entries.length;_i++){var _Object$entries$_i=_slicedToArray(_Object$entries[_i],2),name=_Object$entries$_i[0],givenForwarder=_Object$entries$_i[1];if(name!=="base"){var forwarder=(0,external_clientnode_.extend)(true,{name:name},(0,external_clientnode_.modifyObject)((0,external_clientnode_.copy)(forwarders.base),givenForwarder),givenForwarder);// region normalize header transformations
|
|
99
|
+
var headerTransformations={retrieve:[],send:[]};var _iterator5=_createForOfIteratorHelper(["retrieve","send"]),_step5;try{for(_iterator5.s();!(_step5=_iterator5.n()).done;){var type=_step5.value;var _iterator9=_createForOfIteratorHelper([].concat(forwarder.headerTransformations[type])),_step9;try{var _loop=function _loop(){var givenTransformation=_step9.value;var transformation=_objectSpread(_objectSpread({},givenTransformation),{},{sourceRun:function sourceRun(){return""},targetRun:function targetRun(){return""}});if(Object.prototype.hasOwnProperty.call(transformation,"source"))if(transformation.source instanceof RegExp)transformation.sourceRun=function(){return transformation.source};else if(typeof transformation.source==="string"){var _result5=(0,external_clientnode_.compile)(transformation.source,{scope:EVALUATION_SCOPE_NAMES});if(_result5.error)throw new Error(_result5.error);transformation.sourceRun=_result5.templateFunction}else if(transformation.source)transformation.sourceRun=transformation.source;if(Object.prototype.hasOwnProperty.call(transformation,"target"))if(typeof transformation.target==="string"){var _result6=(0,external_clientnode_.compile)(transformation.target,{scope:EVALUATION_SCOPE_NAMES});if(_result6.error)throw new Error(_result6.error);transformation.targetRun=_result6.templateFunction}else if(transformation.target)transformation.targetRun=transformation.target;headerTransformations[type].push(transformation)};for(_iterator9.s();!(_step9=_iterator9.n()).done;){_loop()}}catch(err){_iterator9.e(err)}finally{_iterator9.f()}}}catch(err){_iterator5.e(err)}finally{_iterator5.f()}forwarder.headerTransformations=headerTransformations;// endregion
|
|
100
|
+
// region state apis
|
|
101
|
+
var stateAPIs=[];var givenStateAPIs=[].concat(forwarder.stateAPIs||[]);var baseAPI=givenStateAPIs.filter(function(api){return api.name==="base"})[0];var extendedGivenStateAPIs=[];var _iterator6=_createForOfIteratorHelper(givenStateAPIs),_step6;try{for(_iterator6.s();!(_step6=_iterator6.n()).done;){var _api=_step6.value;if(_api.name!=="base")extendedGivenStateAPIs.push((0,external_clientnode_.extend)(true,{},(0,external_clientnode_.modifyObject)((0,external_clientnode_.copy)(baseAPI),_api),_api))}}catch(err){_iterator6.e(err)}finally{_iterator6.f()}for(var _i2=0,_extendedGivenStateAP=extendedGivenStateAPIs;_i2<_extendedGivenStateAP.length;_i2++){var _api$expressions,_api$expressions2;var api=_extendedGivenStateAP[_i2];// region normalize url expression
|
|
102
|
+
if(typeof api.urlExpression==="string"){var result=(0,external_clientnode_.compile)(api.urlExpression,{scope:EVALUATION_SCOPE_NAMES});if(result.error)throw new Error(result.error);api.urlExpression=result.templateFunction}// endregion
|
|
103
|
+
// region normalize pre / post expressions
|
|
104
|
+
var expressions={pre:[],post:[]};var _iterator7=_createForOfIteratorHelper([].concat(((_api$expressions=api.expressions)===null||_api$expressions===void 0?void 0:_api$expressions.pre)||[])),_step7;try{for(_iterator7.s();!(_step7=_iterator7.n()).done;){var expression=_step7.value;if(typeof expression==="string"){var _result2=(0,external_clientnode_.compile)(expression,{scope:EVALUATION_SCOPE_NAMES});if(_result2.error)throw new Error(_result2.error);expressions.pre.push(_result2.templateFunction)}else expressions.pre.push(expression)}}catch(err){_iterator7.e(err)}finally{_iterator7.f()}var _iterator8=_createForOfIteratorHelper([].concat(((_api$expressions2=api.expressions)===null||_api$expressions2===void 0?void 0:_api$expressions2.post)||[])),_step8;try{for(_iterator8.s();!(_step8=_iterator8.n()).done;){var _expression2=_step8.value;if(typeof _expression2==="string"){var _result3=(0,external_clientnode_.compile)(_expression2,{scope:EVALUATION_SCOPE_NAMES});if(_result3.error)throw new Error(_result3.error);expressions.post.push(_result3.templateFunction)}else expressions.post.push(_expression2)}}catch(err){_iterator8.e(err)}finally{_iterator8.f()}api.expressions=expressions;// endregion
|
|
105
|
+
stateAPIs.push(api)}forwarder.stateAPIs=stateAPIs;// endregion
|
|
106
|
+
// region normalize use expression
|
|
107
|
+
if(typeof forwarder.useExpression==="string"){var _result4=(0,external_clientnode_.compile)(forwarder.useExpression,{scope:EVALUATION_SCOPE_NAMES});if(_result4.error)throw new Error(_result4.error);forwarder.useExpression=_result4.templateFunction}// endregion
|
|
108
|
+
resolvedForwarders[name]=forwarder}}return resolvedForwarders};// endregion
|
|
109
|
+
var addParsedContentToRequest=function addParsedContentToRequest(bufferedRequest){if(bufferedRequest.headers["content-type"]&&/application\/json(;.*)?$/.test(bufferedRequest.headers["content-type"]))try{var data=Buffer.concat(bufferedRequest.socket.buffer.data).toString();bufferedRequest.socket.buffer.body=data.replace(/^[\s\S]+\s*\n\s*\n\s*([\s\S]+)$/m,"$1");bufferedRequest.socket.buffer.content=JSON.parse(bufferedRequest.socket.buffer.body)}catch(_unused){void log.warn("Error parsing given request.",bufferedRequest)}};var transformHeaders=function transformHeaders(content,headerTransformations,parameters){var newLinePrinted=false;var _iterator0=_createForOfIteratorHelper(headerTransformations),_step0;try{var _loop2=function _loop2(){var transformation=_step0.value;try{var source=transformation.sourceRun.apply(transformation,_toConsumableArray(parameters));var target=transformation.targetRun.apply(transformation,_toConsumableArray(parameters));if([null,undefined].includes(source)||typeof source==="string"&&source.trim()===""){if([null,undefined].includes(target)||typeof target==="string"&&target.trim()==="")return 1;// continue
|
|
110
|
+
// Add new header.
|
|
111
|
+
content=content.replace(/(\s*\n)\s*\n\s*/,function(substring,delimiter){for(var _len=arguments.length,parameters=new Array(_len>2?_len-2:0),_key=2;_key<_len;_key++){parameters[_key-2]=arguments[_key]}var result=typeof target==="string"?target:target?target.apply(void 0,[substring,delimiter].concat(parameters)):"";return"".concat(delimiter).concat(result).concat(substring)})}else{if(!newLinePrinted){void log.debug();newLinePrinted=true}// Search and replace (or remove) header.
|
|
112
|
+
void log.debug("Search for \"".concat(source,"\" and replace with"),"".concat((0,external_clientnode_.represent)(target),"."));if(source)content=content.replace(source,target)}}catch(error){void log.warn("\nCould not apply header transformation with source "+(transformation.source?(0,external_clientnode_.represent)(transformation.source):"\"add\"")+" and replacement "+(transformation.target?(0,external_clientnode_.represent)(transformation.target):"\"remove\"")+":",error)}};for(_iterator0.s();!(_step0=_iterator0.n()).done;){if(_loop2())continue}}catch(err){_iterator0.e(err)}finally{_iterator0.f()}return content};var reverseProxyBufferedRequest=/*#__PURE__*/function(){var _reverseProxyBufferedRequest=_asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee2(request,response,forwarder,stateAPIScope){return _regenerator().w(function(_context2){while(1)switch(_context2.n){case 0:return _context2.a(2,new Promise(function(resolve,reject){var clientSocket=response.socket;var createConnection=forwarder.tls?__WEBPACK_EXTERNAL_MODULE_tls_connect__:__WEBPACK_EXTERNAL_MODULE_net_createConnection__;var portSuffix=forwarder.tls&&forwarder.port!==443||!forwarder.tls&&forwarder.port!==80?":".concat(String(forwarder.port)):"";var serverSocket=createConnection(_objectSpread({host:forwarder.host,port:forwarder.port},forwarder.tls?{servername:forwarder.host,rejectUnauthorized:false}:{}),function(){void log.info("\nConnection to: http".concat(forwarder.tls?"s":"","://")+"".concat(forwarder.host).concat(portSuffix," established."))});serverSocket.on("error",function(error){void log.error("Proxy to server error",error);reject(error)});var parameters=[].concat(_toConsumableArray(external_clientnode_.UTILITY_SCOPE_VALUES),[{clientSocket:clientSocket,serverSocket:serverSocket},null,request,response,null,stateAPIScope]);// Send data from server back to client.
|
|
113
|
+
if(forwarder.headerTransformations.retrieve.length){var headerProcessed=false;serverSocket.on("data",function(buffer){if(headerProcessed){clientSocket.write(buffer);return}var content=buffer.toString();void log.info("\n <=== Got response header from backend:\n\n".concat(content));content=transformHeaders(content,forwarder.headerTransformations.retrieve,parameters);void log.info("\n <<<< Send response header to client:\n\n".concat(content));clientSocket.write(content);headerProcessed=true;resolve()})}else serverSocket.pipe(clientSocket);/*
|
|
114
|
+
NOTE: A closed client connection makes the backend connection
|
|
115
|
+
obsolete. Without header transformations the request is finished
|
|
116
|
+
when the backend connection has been closed.
|
|
117
|
+
*/var onClientClose=function onClientClose(){serverSocket.destroy()};clientSocket.once("close",onClientClose);serverSocket.on("close",function(){clientSocket.off("close",onClientClose);resolve()});serverSocket.on("connect",function(){var headerProcessed=false;var _iterator1=_createForOfIteratorHelper(request.socket.buffer.data),_step1;try{for(_iterator1.s();!(_step1=_iterator1.n()).done;){var buffer=_step1.value;if(!headerProcessed){var content=buffer.toString();void log.debug("\n ===> Got request header from client:\n\n".concat(content));if(forwarder.tls)// NOTE: TLS support was introduced in version 1.1.
|
|
118
|
+
content=content.replace(/HTTP\/1\.0/i,"HTTP/1.1");// Overwrite proxy host with destination one.
|
|
119
|
+
content=content.replace(/(($|\n)host: )[^\r\n]+/i,"$1".concat(forwarder.host).concat(portSuffix));content=transformHeaders(content,forwarder.headerTransformations.send,parameters);void log.debug("\n >>>> Send request header to backend:\n\n".concat(content));serverSocket.write(content);headerProcessed=true;continue}serverSocket.write(buffer)}}catch(err){_iterator1.e(err)}finally{_iterator1.f()}})}))}},_callee2)}));function reverseProxyBufferedRequest(_x4,_x5,_x6,_x7){return _reverseProxyBufferedRequest.apply(this,arguments)}return reverseProxyBufferedRequest}();// region server
|
|
120
|
+
/**
|
|
121
|
+
* Loads the package configuration extended by "configuration.json" and
|
|
122
|
+
* "secure-configuration.json" files found in given directory and evaluates
|
|
123
|
+
* all dynamic values.
|
|
124
|
+
* @param directoryPath - Directory to search configuration files in.
|
|
125
|
+
* @param baseConfiguration - Configuration to extend.
|
|
126
|
+
* @returns A promise resolving to the evaluated configuration.
|
|
127
|
+
*/var loadConfiguration=/*#__PURE__*/function(){var _loadConfiguration=_asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee3(directoryPath,baseConfiguration){var configuration,_iterator10,_step10,path,configurationPath,givenConfiguration,evaluationOptions,_t6,_t7;return _regenerator().w(function(_context3){while(1)switch(_context3.p=_context3.n){case 0:if(directoryPath===void 0){directoryPath=process.cwd()}if(baseConfiguration===void 0){baseConfiguration=package_namespaceObject.HF}configuration=(0,external_clientnode_.copy)(baseConfiguration);_iterator10=_createForOfIteratorHelper(["configuration.json","secure-configuration.json"]);_context3.p=1;_iterator10.s();case 2:if((_step10=_iterator10.n()).done){_context3.n=6;break}path=_step10.value;configurationPath=__WEBPACK_EXTERNAL_MODULE_path_resolve__(directoryPath,path);_context3.n=3;return (0,external_clientnode_.isFile)(configurationPath);case 3:if(!_context3.v){_context3.n=5;break}_t6=JSON;_context3.n=4;return __WEBPACK_EXTERNAL_MODULE_fs_promises_cc1b69f3_readFile__(configurationPath,{encoding:"utf-8"});case 4:givenConfiguration=_t6.parse.call(_t6,_context3.v);(0,external_clientnode_.extend)(true,(0,external_clientnode_.modifyObject)(configuration,givenConfiguration),givenConfiguration);case 5:_context3.n=2;break;case 6:_context3.n=8;break;case 7:_context3.p=7;_t7=_context3.v;_iterator10.e(_t7);case 8:_context3.p=8;_iterator10.f();return _context3.f(8);case 9:evaluationOptions={scope:_objectSpread(_objectSpread({},external_clientnode_.UTILITY_SCOPE),{},{configuration:configuration,environment:process.env})};return _context3.a(2,(0,external_clientnode_.evaluateAsyncDynamicData)((0,external_clientnode_.evaluateDynamicData)(configuration,evaluationOptions),evaluationOptions))}},_callee3,null,[[1,7,8,9]])}));function loadConfiguration(_x8,_x9){return _loadConfiguration.apply(this,arguments)}return loadConfiguration}();/**
|
|
128
|
+
* Waits until given request is fully buffered, determines its forwarder,
|
|
129
|
+
* applies the forwarder's state apis and forwards the request.
|
|
130
|
+
* @param request - Buffered client request.
|
|
131
|
+
* @param response - Response to the client.
|
|
132
|
+
* @param forwarders - Forwarders to choose from.
|
|
133
|
+
* @param parseBody - Indicates whether to parse a json request body.
|
|
134
|
+
* @returns A promise resolving when the request has been processed.
|
|
135
|
+
*/var handleRequest=/*#__PURE__*/function(){var _handleRequest=_asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee4(request,response,forwarders,parseBody){var iteration,forwarder,_yield$applyStateAPIs,result,scope,_t8;return _regenerator().w(function(_context4){while(1)switch(_context4.p=_context4.n){case 0:if(parseBody===void 0){parseBody=false}void log.info("|".concat("-".repeat(80-2),"|\nStart processing"),"".concat(request.method," request: ").concat(request.url,"\n")+request);// NOTE: We have to wait until client request is fully buffered.
|
|
136
|
+
iteration=0;case 1:if(!(iteration<external_clientnode_.MAXIMAL_NUMBER_OF_ITERATIONS.value*1000)){_context4.n=4;break}_context4.n=2;return (0,external_clientnode_.timeout)();case 2:if(!request.socket.buffer.finished){_context4.n=3;break}return _context4.a(3,4);case 3:iteration++;_context4.n=1;break;case 4:if(parseBody)addParsedContentToRequest(request);forwarder=determineForwarder(request,response,forwarders);if(!(forwarder===null)){_context4.n=5;break}void log.error("No forwarder found for given request:",request);response.statusCode=502;response.end();return _context4.a(2);case 5:_context4.p=5;_context4.n=6;return applyStateAPIs(request,response,forwarder);case 6:_yield$applyStateAPIs=_context4.v;result=_yield$applyStateAPIs.result;scope=_yield$applyStateAPIs.scope;if(!result){_context4.n=7;break}_context4.n=7;return reverseProxyBufferedRequest(request,response,forwarder,scope);case 7:_context4.n=9;break;case 8:_context4.p=8;_t8=_context4.v;void log.error(_t8);case 9:void log.info("\nEnd processing","".concat(request.method," request: ").concat(request.url,"\n")+"".concat(request,"|").concat("-".repeat(80-2),"|"));case 10:return _context4.a(2)}},_callee4,null,[[5,8]])}));function handleRequest(_x0,_x1,_x10,_x11){return _handleRequest.apply(this,arguments)}return handleRequest}();/**
|
|
137
|
+
* Creates a (not yet listening) server forwarding incoming requests.
|
|
138
|
+
* @param configuration - Server configuration.
|
|
139
|
+
* @param forwarders - Forwarders to use for incoming requests.
|
|
140
|
+
* @returns The created server.
|
|
141
|
+
*/var createServer=function createServer(configuration,forwarders){if(forwarders===void 0){forwarders=resolveForwarders(configuration.forwarders)}var onIncomingMessage=function onIncomingMessage(request,response){void handleRequest(request,response,forwarders,configuration.parseBody)};var server={instance:configuration.publicKeyPath&&configuration.privateKeyPath?__WEBPACK_EXTERNAL_MODULE_http2_createSecureServer__(configuration.nodeServerOptions,onIncomingMessage):// NOTE: http2 compatibility mode does not work for
|
|
142
|
+
// unencrypted connections yet.
|
|
143
|
+
__WEBPACK_EXTERNAL_MODULE_http_createServer__(onIncomingMessage),streams:[],sockets:[],start:function start(){return new Promise(function(resolve,reject){server.instance.once("error",reject);server.instance.listen(configuration.port,function(){server.instance.off("error",reject);void log.info("Listen on port ".concat(String(configuration.port)," for ")+"incoming requests.");resolve()})})},stop:function stop(){return new Promise(function(resolve){server.instance.close(function(){void log.info("Shut server down.");resolve()});for(var _i3=0,_arr=[server.sockets,server.streams];_i3<_arr.length;_i3++){var connections=_arr[_i3];for(var _i4=0,_arr2=_toConsumableArray(connections);_i4<_arr2.length;_i4++){var connection=_arr2[_i4];connection.destroy()}}})}};server.instance.on("connection",function(socket){server.sockets.push(socket);socket.buffer={data:[],finished:false};socket.on("data",function(data){socket.buffer.data.push(data)});for(var _i5=0,_arr3=["done","finish","writableEnded","writableFinished"];_i5<_arr3.length;_i5++){var name=_arr3[_i5];socket.on(name,function(){socket.buffer.finished=true})}/*
|
|
144
|
+
NOTE: Workaround since none of the events above trigger before
|
|
145
|
+
responding to client occurred.
|
|
146
|
+
*/void (0,external_clientnode_.timeout)(function(){socket.buffer.finished=true});socket.on("close",function(){socket.buffer.finished=true;server.sockets.splice(server.sockets.indexOf(socket),1)})});server.instance.on("stream",function(stream,headers){server.streams.push(stream);void log.info("Got stream",stream,headers);stream.on("close",function(){server.streams.splice(server.streams.indexOf(stream),1)})});return server};// endregion
|
|
147
|
+
/* harmony default export */ const helper = (reverseProxyBufferedRequest);
|
|
148
|
+
export { EVALUATION_SCOPE_NAMES, addParsedContentToRequest, applyStateAPIs, createServer, helper as default, determineForwarder, handleRequest, loadConfiguration, log, resolveForwarders, reverseProxyBufferedRequest, transformHeaders };
|
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
// -*- coding: utf-8 -*-
|
|
3
3
|
|
|
4
|
+
import { readFile as __WEBPACK_EXTERNAL_MODULE_fs_promises_cc1b69f3_readFile__ } from "fs/promises";
|
|
5
|
+
import { createServer as __WEBPACK_EXTERNAL_MODULE_http_createServer__ } from "http";
|
|
6
|
+
import { createSecureServer as __WEBPACK_EXTERNAL_MODULE_http2_createSecureServer__ } from "http2";
|
|
4
7
|
import { createConnection as __WEBPACK_EXTERNAL_MODULE_net_createConnection__ } from "net";
|
|
8
|
+
import { resolve as __WEBPACK_EXTERNAL_MODULE_path_resolve__ } from "path";
|
|
5
9
|
import { connect as __WEBPACK_EXTERNAL_MODULE_tls_connect__ } from "tls";
|
|
6
10
|
import * as __WEBPACK_EXTERNAL_MODULE_clientnode__ from "clientnode";
|
|
7
|
-
import * as __WEBPACK_EXTERNAL_MODULE_http__ from "http";
|
|
8
|
-
import * as __WEBPACK_EXTERNAL_MODULE_http2__ from "http2";
|
|
9
|
-
import * as __WEBPACK_EXTERNAL_MODULE_path__ from "path";
|
|
10
11
|
/******/ var __webpack_modules__ = ([
|
|
11
12
|
/* 0 */
|
|
12
13
|
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
@@ -14,23 +15,31 @@ import * as __WEBPACK_EXTERNAL_MODULE_path__ from "path";
|
|
|
14
15
|
|
|
15
16
|
// EXPORTS
|
|
16
17
|
__webpack_require__.d(__webpack_exports__, {
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
Ay: () => (/* binding */ helper),
|
|
20
|
-
cP: () => (/* binding */ determineForwarder),
|
|
18
|
+
sA: () => (/* binding */ createServer),
|
|
19
|
+
vF: () => (/* binding */ loadConfiguration),
|
|
21
20
|
Rm: () => (/* binding */ log),
|
|
22
21
|
cx: () => (/* binding */ resolveForwarders)
|
|
23
22
|
});
|
|
24
23
|
|
|
25
|
-
// UNUSED EXPORTS: EVALUATION_SCOPE_NAMES, reverseProxyBufferedRequest, transformHeaders
|
|
24
|
+
// UNUSED EXPORTS: EVALUATION_SCOPE_NAMES, addParsedContentToRequest, applyStateAPIs, default, determineForwarder, handleRequest, reverseProxyBufferedRequest, transformHeaders
|
|
26
25
|
|
|
27
26
|
// EXTERNAL MODULE: external "clientnode"
|
|
28
27
|
var external_clientnode_ = __webpack_require__(1);
|
|
28
|
+
;// external "fs/promises"
|
|
29
|
+
|
|
30
|
+
;// external "http"
|
|
31
|
+
|
|
32
|
+
;// external "http2"
|
|
33
|
+
|
|
29
34
|
;// external "net"
|
|
30
35
|
|
|
36
|
+
;// external "path"
|
|
37
|
+
|
|
31
38
|
;// external "tls"
|
|
32
39
|
|
|
33
|
-
;// ./
|
|
40
|
+
;// ./package.json
|
|
41
|
+
const package_namespaceObject = /*#__PURE__*/JSON.parse('{"HF":{"forwarders":{"base":{"headerTransformations":{"retrieve":[],"send":[]},"host":"localhost","port":443,"stateAPIs":[{"data":{},"expressions":{"post":"true","pre":"false"},"name":"base","options":{},"url":""}],"tls":true,"useExpression":"true"}},"host":"localhost","nodeServerOptions":{"allowHTTP1":true},"parseBody":false,"port":8080,"privateKeyPath":"","publicKeyPath":""}}');
|
|
42
|
+
;// ./src/helper.ts
|
|
34
43
|
// #!/usr/bin/env babel-node
|
|
35
44
|
// -*- coding: utf-8 -*-
|
|
36
45
|
/** @module web-node *//* !
|
|
@@ -48,7 +57,7 @@ var external_clientnode_ = __webpack_require__(1);
|
|
|
48
57
|
endregion
|
|
49
58
|
*/// region imports
|
|
50
59
|
// NOTE: http2 compatibility mode does work for unencrypted connections yet.
|
|
51
|
-
function _typeof(o){"@babel/helpers - typeof";return _typeof="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(o){return typeof o}:function(o){return o&&"function"==typeof Symbol&&o.constructor===Symbol&&o!==Symbol.prototype?"symbol":typeof o},_typeof(o)}function ownKeys(e,r){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);r&&(o=o.filter(function(r){return Object.getOwnPropertyDescriptor(e,r).enumerable})),t.push.apply(t,o)}return t}function _objectSpread(
|
|
60
|
+
function _typeof(o){"@babel/helpers - typeof";return _typeof="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(o){return typeof o}:function(o){return o&&"function"==typeof Symbol&&o.constructor===Symbol&&o!==Symbol.prototype?"symbol":typeof o},_typeof(o)}function ownKeys(e,r){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);r&&(o=o.filter(function(r){return Object.getOwnPropertyDescriptor(e,r).enumerable})),t.push.apply(t,o)}return t}function _objectSpread(r){for(var t=1;t<arguments.length;t++){var o=null!=arguments[t]?arguments[t]:{};t%2?ownKeys(Object(o),!0).forEach(function(t){_defineProperty(r,t,o[t])}):Object.getOwnPropertyDescriptors?Object.defineProperties(r,Object.getOwnPropertyDescriptors(o)):ownKeys(Object(o)).forEach(function(e){Object.defineProperty(r,e,Object.getOwnPropertyDescriptor(o,e))})}return r}function _defineProperty(r,t,o){return(t=_toPropertyKey(t))in r?Object.defineProperty(r,t,{value:o,enumerable:!0,configurable:!0,writable:!0}):r[t]=o,r}function _toPropertyKey(r){var o=_toPrimitive(r,"string");return"symbol"==_typeof(o)?o:o+""}function _toPrimitive(t,e){if("object"!=_typeof(t)||!t)return t;var r;if("undefined"!=typeof Symbol&&void 0!==(r=t[Symbol.toPrimitive])){var i=r.call(t,e||"default");if("object"!=_typeof(i))return i;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===e?String:Number)(t)}function _slicedToArray(e,i){return _iterableToArrayLimit(e,i)||_unsupportedIterableToArray(e,i)||_nonIterableRest()}function _nonIterableRest(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function _iterableToArrayLimit(r,t){var e=null==r?null:"undefined"!=typeof Symbol&&r[Symbol.iterator]||r["@@iterator"];if(Array.isArray(r)&&(null==e||e===("undefined"!=typeof Symbol&&[][Symbol.iterator])||e===[]["@@iterator"]))return r;if(null!=e){var l,n,i,a,u=[],o=!0,f=!1;try{if(i=(e=e.call(r)).next,0===t){if(Object(e)!==e)return;o=!1}else for(;!(o=(l=i.call(e)).done)&&(u.push(l.value),u.length!==t);o=!0);}catch(r){f=!0,n=r}finally{try{if(!o&&null!=e.return&&(a=e.return(),Object(a)!==a))return}finally{if(f)throw n}}return u}}function _regenerator(){/*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/babel/babel/blob/main/packages/babel-helpers/LICENSE */var r,e,o="function"==typeof Symbol?Symbol:{},n=o.iterator||"@@iterator",a=o.toStringTag||"@@toStringTag";function i(o,n,a,i){var u=n&&n.prototype instanceof Generator?n:Generator,f=Object.create(u.prototype);return _regeneratorDefine2(f,"_invoke",function(t,o,n){var a,i,u,f=0,p=n||[],y=!1,G={p:0,n:0,v:r,a:l,f:l.bind(r,4),d:function d(t,e){return a=t,i=0,u=r,G.n=e,c}};function l(t,o){for(i=t,u=o,e=0;!y&&f&&!n&&e<p.length;e++){var n,a=p[e],l=G.p,F=a[2];t>3?(n=F===o)&&(u=a[(i=a[4])?5:(i=3,3)],a[4]=a[5]=r):a[0]<=l&&((n=t<2&&l<a[1])?(i=0,G.v=o,G.n=a[1]):l<F&&(n=t<3||a[0]>o||o>F)&&(a[4]=t,a[5]=o,G.n=F,i=0))}if(n||t>1)return c;throw y=!0,o}return function(n,p,F){if(f>1)throw TypeError("Generator is already running");for(y&&1===p&&l(p,F),i=p,u=F;(e=i<2?r:u)||!y;){a||(i?i<3?(i>1&&(G.n=-1),l(i,u)):G.n=u:G.v=u);try{if(f=2,a){if(i||(n="next"),e=a[n]){if(!(e=e.call(a,u)))throw TypeError("iterator result is not an object");if(!e.done)return e;u=e.value,i<2&&(i=0)}else 1===i&&(e=a.return)&&e.call(a),i<2&&(u=TypeError("The iterator does not provide a '"+n+"' method"),i=1);a=r}else if((e=(y=G.n<0)?u:t.call(o,G))!==c)break}catch(t){a=r,i=1,u=t}finally{f=1}}return{value:e,done:y}}}(o,a,i),!0),f}var c={};function Generator(){}function GeneratorFunction(){}function GeneratorFunctionPrototype(){}e=Object.getPrototypeOf;var u=[][n]?e(e([][n]())):(_regeneratorDefine2(e={},n,function(){return this}),e),f=GeneratorFunctionPrototype.prototype=Generator.prototype=Object.create(u);function p(r){return Object.setPrototypeOf?Object.setPrototypeOf(r,GeneratorFunctionPrototype):(r.__proto__=GeneratorFunctionPrototype,_regeneratorDefine2(r,a,"GeneratorFunction")),r.prototype=Object.create(f),r}return GeneratorFunction.prototype=GeneratorFunctionPrototype,_regeneratorDefine2(f,"constructor",GeneratorFunctionPrototype),_regeneratorDefine2(GeneratorFunctionPrototype,"constructor",GeneratorFunction),GeneratorFunction.displayName="GeneratorFunction",_regeneratorDefine2(GeneratorFunctionPrototype,a,"GeneratorFunction"),_regeneratorDefine2(f),_regeneratorDefine2(f,a,"Generator"),_regeneratorDefine2(f,n,function(){return this}),_regeneratorDefine2(f,"toString",function(){return"[object Generator]"}),(_regenerator=function _regenerator(){return{w:i,m:p}})()}function _regeneratorDefine2(e,r,n,t){var i=Object.defineProperty;try{i({},"",{})}catch(e){i=0}_regeneratorDefine2=function _regeneratorDefine(e,r,n,t){function o(r,n){_regeneratorDefine2(e,r,function(e){return this._invoke(r,n,e)})}r?i?i(e,r,{value:n,enumerable:!t,configurable:!t,writable:!t}):e[r]=n:(o("next",0),o("throw",1),o("return",2))},_regeneratorDefine2(e,r,n,t)}function _createForOfIteratorHelper(e,t){var _n="undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(!_n){if(Array.isArray(e)||(_n=_unsupportedIterableToArray(e))||t&&e&&"number"==typeof e.length){_n&&(e=_n);var o=0,F=function F(){};return{s:F,n:function n(){return o>=e.length?{done:!0}:{done:!1,value:e[o++]}},e:function e(r){throw r},f:F}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var a,u,i=!0;return{s:function s(){_n=_n.call(e)},n:function n(){i=!0;var r=_n.next();return r.done?{done:!0}:{value:r.value,done:i=!1}},e:function e(r){a=!0,u=r},f:function f(){try{i||null==_n.return||_n.return()}finally{if(a)throw u}}}}function asyncGeneratorStep(n,t,e,r,o,a,c){try{var i=n[a](c),u=i.value}catch(n){return void e(n)}i.done?t(u):Promise.resolve(u).then(r,o)}function _asyncToGenerator(n){return function(){var t=this,e=arguments;return new Promise(function(r,o){var a=n.apply(t,e);function _next(n){asyncGeneratorStep(a,r,o,_next,_throw,"next",n)}function _throw(n){asyncGeneratorStep(a,r,o,_next,_throw,"throw",n)}_next(void 0)})}}function _toConsumableArray(a){return _arrayWithoutHoles(a)||_iterableToArray(a)||_unsupportedIterableToArray(a)||_nonIterableSpread()}function _nonIterableSpread(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function _unsupportedIterableToArray(t,e){if(t){if("string"==typeof t)return _arrayLikeToArray(t,e);var o={}.toString.call(t).slice(8,-1);return"Object"===o&&t.constructor&&(o=t.constructor.name),"Map"===o||"Set"===o?Array.from(t):"Arguments"===o||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(o)?_arrayLikeToArray(t,e):void 0}}function _iterableToArray(r){var e="undefined"!=typeof Symbol&&r[Symbol.iterator]||r["@@iterator"];if(Array.isArray(r)&&(null==e||e===("undefined"!=typeof Symbol&&[][Symbol.iterator])||e===[]["@@iterator"]))return r;if(null!=e){for(var t,o=[],a=e.call(r);!(t=a.next()).done;)o.push(t.value);return o}}function _arrayWithoutHoles(a){if(Array.isArray(a))return _arrayLikeToArray(a)}function _arrayLikeToArray(r,a){(null==a||a>r.length)&&(a=r.length);for(var e=0,n=Array(a);e<a;e++)n[e]=r[e];return n};// endregion
|
|
52
61
|
var EVALUATION_SCOPE_NAMES=[].concat(_toConsumableArray(external_clientnode_.UTILITY_SCOPE_NAMES),["data","error","request","response","stateAPI","stateAPIs"]);var log=new external_clientnode_.Logger({name:"reverse-proxy-middleware"});// region forwarder
|
|
53
62
|
var applyStateAPIs=/*#__PURE__*/function(){var _applyStateAPIs=_asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee(request,response,forwarder){var stateAPIScope,state,_iterator,_step,stateAPI,useStateAPI,index,_iterator2,_step2,_expression,_result,error,_iterator3,_step3,expression,result,_t,_t2,_t3,_t4,_t5;return _regenerator().w(function(_context){while(1)switch(_context.p=_context.n){case 0:stateAPIScope={};_iterator=_createForOfIteratorHelper(forwarder.stateAPIs);_context.p=1;_iterator.s();case 2:if((_step=_iterator.n()).done){_context.n=30;break}stateAPI=_step.value;state=stateAPIScope[stateAPI.name]={configuration:stateAPI,error:null,response:null};useStateAPI=false;index=1;_iterator2=_createForOfIteratorHelper(stateAPI.expressions.pre);_context.p=3;_iterator2.s();case 4:if((_step2=_iterator2.n()).done){_context.n=9;break}_expression=_step2.value;_result=void 0;try{_result=_expression.apply(void 0,_toConsumableArray(external_clientnode_.UTILITY_SCOPE_VALUES).concat([stateAPI.data,null,request,response,state,stateAPIScope]))}catch(error){void log.warn("Failed running pre ".concat(String(index),". expression of ")+"state api:",error)}if(!(typeof _result==="number")){_context.n=5;break}void log.info("Break request caused by state api","\"".concat(stateAPI.name,"\" with status code ").concat(String(_result),"."));response.statusCode=_result;response.end();return _context.a(2,{result:false,scope:stateAPIScope});case 5:if(!(_result==="break")){_context.n=6;break}return _context.a(3,9);case 6:index+=1;if(!(typeof _result==="boolean")){_context.n=8;break}if(!_result){_context.n=7;break}useStateAPI=true;_context.n=8;break;case 7:return _context.a(3,9);case 8:_context.n=4;break;case 9:_context.n=11;break;case 10:_context.p=10;_t=_context.v;_iterator2.e(_t);case 11:_context.p=11;_iterator2.f();return _context.f(11);case 12:if(!useStateAPI){_context.n=29;break}void log.info("Use state api: \"".concat(stateAPI.name,"\""));error=null;if(stateAPI.urlExpression)try{stateAPI.url=stateAPI.urlExpression.apply(stateAPI,_toConsumableArray(external_clientnode_.UTILITY_SCOPE_VALUES).concat([stateAPI.data,null,request,response,state,stateAPIScope]))}catch(error){void log.warn("Failed running url expression:",error)}void log.debug("\nState api configuration is: ".concat((0,external_clientnode_.represent)(stateAPI)));_context.p=13;_context.n=14;return fetch(stateAPI.url,stateAPI.options);case 14:state.response=_context.v;_context.n=16;break;case 15:_context.p=15;_t2=_context.v;error=_t2;void log.warn("Running state api request for \"".concat(stateAPI.name,"\" throws"),"error:",error);case 16:if(!(state.response&&state.response.headers.has("content-type")&&/application\/json(;.*)?$/.test(state.response.headers.get("content-type")))){_context.n=20;break}_context.p=17;_context.n=18;return state.response.json();case 18:state.response.data=_context.v;_context.n=20;break;case 19:_context.p=19;_t3=_context.v;error=_t3;void log.warn("Parsing state api json response for","\"".concat(stateAPI.name,"\" throws error:"),error);case 20:void log.debug("\nState api response is:",(0,external_clientnode_.represent)(state.response));index=1;_iterator3=_createForOfIteratorHelper(stateAPI.expressions.post);_context.p=21;_iterator3.s();case 22:if((_step3=_iterator3.n()).done){_context.n=26;break}expression=_step3.value;result=null;try{result=expression.apply(void 0,_toConsumableArray(external_clientnode_.UTILITY_SCOPE_VALUES).concat([stateAPI.data,error,request,response,state,stateAPIScope]))}catch(error){void log.warn("Failed running ".concat(String(index),". post ")+"expression of state api:",error)}if(!(typeof result==="number")){_context.n=23;break}void log.info("Break request caused by state api","\"".concat(stateAPI.name,"\" with status code ")+"".concat(String(result),"."));response.statusCode=result;response.end();return _context.a(2,{result:false,scope:stateAPIScope});case 23:if(!(result==="break")){_context.n=24;break}return _context.a(3,26);case 24:index+=1;case 25:_context.n=22;break;case 26:_context.n=28;break;case 27:_context.p=27;_t4=_context.v;_iterator3.e(_t4);case 28:_context.p=28;_iterator3.f();return _context.f(28);case 29:_context.n=2;break;case 30:_context.n=32;break;case 31:_context.p=31;_t5=_context.v;_iterator.e(_t5);case 32:_context.p=32;_iterator.f();return _context.f(32);case 33:return _context.a(2,{result:true,scope:stateAPIScope})}},_callee,null,[[21,27,28,29],[17,19],[13,15],[3,10,11,12],[1,31,32,33]])}));function applyStateAPIs(_x,_x2,_x3){return _applyStateAPIs.apply(this,arguments)}return applyStateAPIs}();var determineForwarder=function determineForwarder(request,response,forwarders){var _iterator4=_createForOfIteratorHelper(Object.entries(forwarders).sort(function(_ref,_ref2){var _ref3=_slicedToArray(_ref,1),firstName=_ref3[0];var _ref4=_slicedToArray(_ref2,1),secondName=_ref4[0];return firstName.localeCompare(secondName)})),_step4;try{for(_iterator4.s();!(_step4=_iterator4.n()).done;){var _step4$value=_slicedToArray(_step4.value,2),name=_step4$value[0],forwarder=_step4$value[1];var state={configuration:forwarder,error:null,response:null};if(forwarder.useExpression.apply(forwarder,_toConsumableArray(external_clientnode_.UTILITY_SCOPE_VALUES).concat([forwarder,null,request,response,state,_defineProperty({},name,state)]))){void log.info("Determined forwarder is: \"".concat(name,"\"."));return forwarder}}}catch(err){_iterator4.e(err)}finally{_iterator4.f()}return null};var resolveForwarders=function resolveForwarders(forwarders){var resolvedForwarders={};for(var _i=0,_Object$entries=Object.entries(forwarders);_i<_Object$entries.length;_i++){var _Object$entries$_i=_slicedToArray(_Object$entries[_i],2),name=_Object$entries$_i[0],givenForwarder=_Object$entries$_i[1];if(name!=="base"){var forwarder=(0,external_clientnode_.extend)(true,{name:name},(0,external_clientnode_.modifyObject)((0,external_clientnode_.copy)(forwarders.base),givenForwarder),givenForwarder);// region normalize header transformations
|
|
54
63
|
var headerTransformations={retrieve:[],send:[]};var _iterator5=_createForOfIteratorHelper(["retrieve","send"]),_step5;try{for(_iterator5.s();!(_step5=_iterator5.n()).done;){var type=_step5.value;var _iterator9=_createForOfIteratorHelper([].concat(forwarder.headerTransformations[type])),_step9;try{var _loop=function _loop(){var givenTransformation=_step9.value;var transformation=_objectSpread(_objectSpread({},givenTransformation),{},{sourceRun:function sourceRun(){return""},targetRun:function targetRun(){return""}});if(Object.prototype.hasOwnProperty.call(transformation,"source"))if(transformation.source instanceof RegExp)transformation.sourceRun=function(){return transformation.source};else if(typeof transformation.source==="string"){var _result5=(0,external_clientnode_.compile)(transformation.source,{scope:EVALUATION_SCOPE_NAMES});if(_result5.error)throw new Error(_result5.error);transformation.sourceRun=_result5.templateFunction}else if(transformation.source)transformation.sourceRun=transformation.source;if(Object.prototype.hasOwnProperty.call(transformation,"target"))if(typeof transformation.target==="string"){var _result6=(0,external_clientnode_.compile)(transformation.target,{scope:EVALUATION_SCOPE_NAMES});if(_result6.error)throw new Error(_result6.error);transformation.targetRun=_result6.templateFunction}else if(transformation.target)transformation.targetRun=transformation.target;headerTransformations[type].push(transformation)};for(_iterator9.s();!(_step9=_iterator9.n()).done;){_loop()}}catch(err){_iterator9.e(err)}finally{_iterator9.f()}}}catch(err){_iterator5.e(err)}finally{_iterator5.f()}forwarder.headerTransformations=headerTransformations;// endregion
|
|
@@ -65,9 +74,41 @@ var addParsedContentToRequest=function addParsedContentToRequest(bufferedRequest
|
|
|
65
74
|
// Add new header.
|
|
66
75
|
content=content.replace(/(\s*\n)\s*\n\s*/,function(substring,delimiter){for(var _len=arguments.length,parameters=new Array(_len>2?_len-2:0),_key=2;_key<_len;_key++){parameters[_key-2]=arguments[_key]}var result=typeof target==="string"?target:target?target.apply(void 0,[substring,delimiter].concat(parameters)):"";return"".concat(delimiter).concat(result).concat(substring)})}else{if(!newLinePrinted){void log.debug();newLinePrinted=true}// Search and replace (or remove) header.
|
|
67
76
|
void log.debug("Search for \"".concat(source,"\" and replace with"),"".concat((0,external_clientnode_.represent)(target),"."));if(source)content=content.replace(source,target)}}catch(error){void log.warn("\nCould not apply header transformation with source "+(transformation.source?(0,external_clientnode_.represent)(transformation.source):"\"add\"")+" and replacement "+(transformation.target?(0,external_clientnode_.represent)(transformation.target):"\"remove\"")+":",error)}};for(_iterator0.s();!(_step0=_iterator0.n()).done;){if(_loop2())continue}}catch(err){_iterator0.e(err)}finally{_iterator0.f()}return content};var reverseProxyBufferedRequest=/*#__PURE__*/function(){var _reverseProxyBufferedRequest=_asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee2(request,response,forwarder,stateAPIScope){return _regenerator().w(function(_context2){while(1)switch(_context2.n){case 0:return _context2.a(2,new Promise(function(resolve,reject){var clientSocket=response.socket;var createConnection=forwarder.tls?__WEBPACK_EXTERNAL_MODULE_tls_connect__:__WEBPACK_EXTERNAL_MODULE_net_createConnection__;var portSuffix=forwarder.tls&&forwarder.port!==443||!forwarder.tls&&forwarder.port!==80?":".concat(String(forwarder.port)):"";var serverSocket=createConnection(_objectSpread({host:forwarder.host,port:forwarder.port},forwarder.tls?{servername:forwarder.host,rejectUnauthorized:false}:{}),function(){void log.info("\nConnection to: http".concat(forwarder.tls?"s":"","://")+"".concat(forwarder.host).concat(portSuffix," established."))});serverSocket.on("error",function(error){void log.error("Proxy to server error",error);reject(error)});var parameters=[].concat(_toConsumableArray(external_clientnode_.UTILITY_SCOPE_VALUES),[{clientSocket:clientSocket,serverSocket:serverSocket},null,request,response,null,stateAPIScope]);// Send data from server back to client.
|
|
68
|
-
if(forwarder.headerTransformations.retrieve.length){var headerProcessed=false;serverSocket.on("data",function(buffer){if(headerProcessed){clientSocket.write(buffer);return}var content=buffer.toString();void log.info("\n <=== Got response header from backend:\n\n".concat(content));content=transformHeaders(content,forwarder.headerTransformations.retrieve,parameters);void log.info("\n <<<< Send response header to client:\n\n".concat(content));clientSocket.write(content);headerProcessed=true;resolve()})}else serverSocket.pipe(clientSocket)
|
|
77
|
+
if(forwarder.headerTransformations.retrieve.length){var headerProcessed=false;serverSocket.on("data",function(buffer){if(headerProcessed){clientSocket.write(buffer);return}var content=buffer.toString();void log.info("\n <=== Got response header from backend:\n\n".concat(content));content=transformHeaders(content,forwarder.headerTransformations.retrieve,parameters);void log.info("\n <<<< Send response header to client:\n\n".concat(content));clientSocket.write(content);headerProcessed=true;resolve()})}else serverSocket.pipe(clientSocket);/*
|
|
78
|
+
NOTE: A closed client connection makes the backend connection
|
|
79
|
+
obsolete. Without header transformations the request is finished
|
|
80
|
+
when the backend connection has been closed.
|
|
81
|
+
*/var onClientClose=function onClientClose(){serverSocket.destroy()};clientSocket.once("close",onClientClose);serverSocket.on("close",function(){clientSocket.off("close",onClientClose);resolve()});serverSocket.on("connect",function(){var headerProcessed=false;var _iterator1=_createForOfIteratorHelper(request.socket.buffer.data),_step1;try{for(_iterator1.s();!(_step1=_iterator1.n()).done;){var buffer=_step1.value;if(!headerProcessed){var content=buffer.toString();void log.debug("\n ===> Got request header from client:\n\n".concat(content));if(forwarder.tls)// NOTE: TLS support was introduced in version 1.1.
|
|
69
82
|
content=content.replace(/HTTP\/1\.0/i,"HTTP/1.1");// Overwrite proxy host with destination one.
|
|
70
|
-
content=content.replace(/(($|\n)host: )[^\n]+/i,"$1".concat(forwarder.host).concat(portSuffix));content=transformHeaders(content,forwarder.headerTransformations.send,parameters);void log.debug("\n >>>> Send request header to backend:\n\n".concat(content));serverSocket.write(content);headerProcessed=true;continue}serverSocket.write(buffer)}}catch(err){_iterator1.e(err)}finally{_iterator1.f()}})}))}},_callee2)}));function reverseProxyBufferedRequest(_x4,_x5,_x6,_x7){return _reverseProxyBufferedRequest.apply(this,arguments)}return reverseProxyBufferedRequest}()
|
|
83
|
+
content=content.replace(/(($|\n)host: )[^\r\n]+/i,"$1".concat(forwarder.host).concat(portSuffix));content=transformHeaders(content,forwarder.headerTransformations.send,parameters);void log.debug("\n >>>> Send request header to backend:\n\n".concat(content));serverSocket.write(content);headerProcessed=true;continue}serverSocket.write(buffer)}}catch(err){_iterator1.e(err)}finally{_iterator1.f()}})}))}},_callee2)}));function reverseProxyBufferedRequest(_x4,_x5,_x6,_x7){return _reverseProxyBufferedRequest.apply(this,arguments)}return reverseProxyBufferedRequest}();// region server
|
|
84
|
+
/**
|
|
85
|
+
* Loads the package configuration extended by "configuration.json" and
|
|
86
|
+
* "secure-configuration.json" files found in given directory and evaluates
|
|
87
|
+
* all dynamic values.
|
|
88
|
+
* @param directoryPath - Directory to search configuration files in.
|
|
89
|
+
* @param baseConfiguration - Configuration to extend.
|
|
90
|
+
* @returns A promise resolving to the evaluated configuration.
|
|
91
|
+
*/var loadConfiguration=/*#__PURE__*/function(){var _loadConfiguration=_asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee3(directoryPath,baseConfiguration){var configuration,_iterator10,_step10,path,configurationPath,givenConfiguration,evaluationOptions,_t6,_t7;return _regenerator().w(function(_context3){while(1)switch(_context3.p=_context3.n){case 0:if(directoryPath===void 0){directoryPath=process.cwd()}if(baseConfiguration===void 0){baseConfiguration=package_namespaceObject.HF}configuration=(0,external_clientnode_.copy)(baseConfiguration);_iterator10=_createForOfIteratorHelper(["configuration.json","secure-configuration.json"]);_context3.p=1;_iterator10.s();case 2:if((_step10=_iterator10.n()).done){_context3.n=6;break}path=_step10.value;configurationPath=__WEBPACK_EXTERNAL_MODULE_path_resolve__(directoryPath,path);_context3.n=3;return (0,external_clientnode_.isFile)(configurationPath);case 3:if(!_context3.v){_context3.n=5;break}_t6=JSON;_context3.n=4;return __WEBPACK_EXTERNAL_MODULE_fs_promises_cc1b69f3_readFile__(configurationPath,{encoding:"utf-8"});case 4:givenConfiguration=_t6.parse.call(_t6,_context3.v);(0,external_clientnode_.extend)(true,(0,external_clientnode_.modifyObject)(configuration,givenConfiguration),givenConfiguration);case 5:_context3.n=2;break;case 6:_context3.n=8;break;case 7:_context3.p=7;_t7=_context3.v;_iterator10.e(_t7);case 8:_context3.p=8;_iterator10.f();return _context3.f(8);case 9:evaluationOptions={scope:_objectSpread(_objectSpread({},external_clientnode_.UTILITY_SCOPE),{},{configuration:configuration,environment:process.env})};return _context3.a(2,(0,external_clientnode_.evaluateAsyncDynamicData)((0,external_clientnode_.evaluateDynamicData)(configuration,evaluationOptions),evaluationOptions))}},_callee3,null,[[1,7,8,9]])}));function loadConfiguration(_x8,_x9){return _loadConfiguration.apply(this,arguments)}return loadConfiguration}();/**
|
|
92
|
+
* Waits until given request is fully buffered, determines its forwarder,
|
|
93
|
+
* applies the forwarder's state apis and forwards the request.
|
|
94
|
+
* @param request - Buffered client request.
|
|
95
|
+
* @param response - Response to the client.
|
|
96
|
+
* @param forwarders - Forwarders to choose from.
|
|
97
|
+
* @param parseBody - Indicates whether to parse a json request body.
|
|
98
|
+
* @returns A promise resolving when the request has been processed.
|
|
99
|
+
*/var handleRequest=/*#__PURE__*/function(){var _handleRequest=_asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee4(request,response,forwarders,parseBody){var iteration,forwarder,_yield$applyStateAPIs,result,scope,_t8;return _regenerator().w(function(_context4){while(1)switch(_context4.p=_context4.n){case 0:if(parseBody===void 0){parseBody=false}void log.info("|".concat("-".repeat(80-2),"|\nStart processing"),"".concat(request.method," request: ").concat(request.url,"\n")+request);// NOTE: We have to wait until client request is fully buffered.
|
|
100
|
+
iteration=0;case 1:if(!(iteration<external_clientnode_.MAXIMAL_NUMBER_OF_ITERATIONS.value*1000)){_context4.n=4;break}_context4.n=2;return (0,external_clientnode_.timeout)();case 2:if(!request.socket.buffer.finished){_context4.n=3;break}return _context4.a(3,4);case 3:iteration++;_context4.n=1;break;case 4:if(parseBody)addParsedContentToRequest(request);forwarder=determineForwarder(request,response,forwarders);if(!(forwarder===null)){_context4.n=5;break}void log.error("No forwarder found for given request:",request);response.statusCode=502;response.end();return _context4.a(2);case 5:_context4.p=5;_context4.n=6;return applyStateAPIs(request,response,forwarder);case 6:_yield$applyStateAPIs=_context4.v;result=_yield$applyStateAPIs.result;scope=_yield$applyStateAPIs.scope;if(!result){_context4.n=7;break}_context4.n=7;return reverseProxyBufferedRequest(request,response,forwarder,scope);case 7:_context4.n=9;break;case 8:_context4.p=8;_t8=_context4.v;void log.error(_t8);case 9:void log.info("\nEnd processing","".concat(request.method," request: ").concat(request.url,"\n")+"".concat(request,"|").concat("-".repeat(80-2),"|"));case 10:return _context4.a(2)}},_callee4,null,[[5,8]])}));function handleRequest(_x0,_x1,_x10,_x11){return _handleRequest.apply(this,arguments)}return handleRequest}();/**
|
|
101
|
+
* Creates a (not yet listening) server forwarding incoming requests.
|
|
102
|
+
* @param configuration - Server configuration.
|
|
103
|
+
* @param forwarders - Forwarders to use for incoming requests.
|
|
104
|
+
* @returns The created server.
|
|
105
|
+
*/var createServer=function createServer(configuration,forwarders){if(forwarders===void 0){forwarders=resolveForwarders(configuration.forwarders)}var onIncomingMessage=function onIncomingMessage(request,response){void handleRequest(request,response,forwarders,configuration.parseBody)};var server={instance:configuration.publicKeyPath&&configuration.privateKeyPath?__WEBPACK_EXTERNAL_MODULE_http2_createSecureServer__(configuration.nodeServerOptions,onIncomingMessage):// NOTE: http2 compatibility mode does not work for
|
|
106
|
+
// unencrypted connections yet.
|
|
107
|
+
__WEBPACK_EXTERNAL_MODULE_http_createServer__(onIncomingMessage),streams:[],sockets:[],start:function start(){return new Promise(function(resolve,reject){server.instance.once("error",reject);server.instance.listen(configuration.port,function(){server.instance.off("error",reject);void log.info("Listen on port ".concat(String(configuration.port)," for ")+"incoming requests.");resolve()})})},stop:function stop(){return new Promise(function(resolve){server.instance.close(function(){void log.info("Shut server down.");resolve()});for(var _i3=0,_arr=[server.sockets,server.streams];_i3<_arr.length;_i3++){var connections=_arr[_i3];for(var _i4=0,_arr2=_toConsumableArray(connections);_i4<_arr2.length;_i4++){var connection=_arr2[_i4];connection.destroy()}}})}};server.instance.on("connection",function(socket){server.sockets.push(socket);socket.buffer={data:[],finished:false};socket.on("data",function(data){socket.buffer.data.push(data)});for(var _i5=0,_arr3=["done","finish","writableEnded","writableFinished"];_i5<_arr3.length;_i5++){var name=_arr3[_i5];socket.on(name,function(){socket.buffer.finished=true})}/*
|
|
108
|
+
NOTE: Workaround since none of the events above trigger before
|
|
109
|
+
responding to client occurred.
|
|
110
|
+
*/void (0,external_clientnode_.timeout)(function(){socket.buffer.finished=true});socket.on("close",function(){socket.buffer.finished=true;server.sockets.splice(server.sockets.indexOf(socket),1)})});server.instance.on("stream",function(stream,headers){server.streams.push(stream);void log.info("Got stream",stream,headers);stream.on("close",function(){server.streams.splice(server.streams.indexOf(stream),1)})});return server};// endregion
|
|
111
|
+
/* harmony default export */ const helper = ((/* unused pure expression or super */ null && (reverseProxyBufferedRequest)));
|
|
71
112
|
|
|
72
113
|
/***/ }),
|
|
73
114
|
/* 1 */
|
|
@@ -85,11 +126,7 @@ module.exports = x({ ["CLOSE_EVENT_NAMES"]: () => (__WEBPACK_EXTERNAL_MODULE_cli
|
|
|
85
126
|
|
|
86
127
|
__webpack_require__.a(module, async (__webpack_handle_async_dependencies__, __webpack_async_result__) => { try {
|
|
87
128
|
/* harmony import */ var clientnode__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(1);
|
|
88
|
-
/* harmony import */ var
|
|
89
|
-
/* harmony import */ var http2__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(4);
|
|
90
|
-
/* harmony import */ var path__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(5);
|
|
91
|
-
/* harmony import */ var _helper_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(0);
|
|
92
|
-
/* harmony import */ var _package_json__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(7);
|
|
129
|
+
/* harmony import */ var _helper_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(0);
|
|
93
130
|
// #!/usr/bin/env babel-node
|
|
94
131
|
// -*- coding: utf-8 -*-
|
|
95
132
|
/** @module web-node *//* !
|
|
@@ -106,21 +143,9 @@ __webpack_require__.a(module, async (__webpack_handle_async_dependencies__, __we
|
|
|
106
143
|
See https://creativecommons.org/licenses/by/3.0/deed.de
|
|
107
144
|
endregion
|
|
108
145
|
*/// region imports
|
|
109
|
-
function
|
|
110
|
-
;//
|
|
111
|
-
|
|
112
|
-
var onIncomingMessage=function onIncomingMessage(request,response){var bufferedRequest=request;void _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee(){var iteration,forwarder,_yield$applyStateAPIs,result,scope,_t;return _regenerator().w(function(_context){while(1)switch(_context.p=_context.n){case 0:void _helper_js__WEBPACK_IMPORTED_MODULE_4__/* .log */ .Rm.info("|".concat("-".repeat(80-2),"|\nStart processing"),"".concat(bufferedRequest.method," request: ").concat(bufferedRequest.url,"\n")+bufferedRequest);// NOTE: We have to wait until client request is fully buffered.
|
|
113
|
-
iteration=0;case 1:if(!(iteration<clientnode__WEBPACK_IMPORTED_MODULE_0__.MAXIMAL_NUMBER_OF_ITERATIONS.value*1000)){_context.n=4;break}_context.n=2;return (0,clientnode__WEBPACK_IMPORTED_MODULE_0__.timeout)();case 2:if(!bufferedRequest.socket.buffer.finished){_context.n=3;break}return _context.a(3,4);case 3:iteration++;_context.n=1;break;case 4:if(CONFIGURATION.parseBody)(0,_helper_js__WEBPACK_IMPORTED_MODULE_4__/* .addParsedContentToRequest */ .Ko)(bufferedRequest);forwarder=(0,_helper_js__WEBPACK_IMPORTED_MODULE_4__/* .determineForwarder */ .cP)(bufferedRequest,response,FORWARDERS);if(!(forwarder===null)){_context.n=5;break}void _helper_js__WEBPACK_IMPORTED_MODULE_4__/* .log */ .Rm.error("No forwarder found for given request:",bufferedRequest);response.statusCode=502;response.end();return _context.a(2);case 5:_context.p=5;_context.n=6;return (0,_helper_js__WEBPACK_IMPORTED_MODULE_4__/* .applyStateAPIs */ .BE)(bufferedRequest,response,forwarder);case 6:_yield$applyStateAPIs=_context.v;result=_yield$applyStateAPIs.result;scope=_yield$applyStateAPIs.scope;if(!result){_context.n=7;break}_context.n=7;return (0,_helper_js__WEBPACK_IMPORTED_MODULE_4__/* ["default"] */ .Ay)(bufferedRequest,response,forwarder,scope);case 7:_context.n=9;break;case 8:_context.p=8;_t=_context.v;void _helper_js__WEBPACK_IMPORTED_MODULE_4__/* .log */ .Rm.error(_t);case 9:void _helper_js__WEBPACK_IMPORTED_MODULE_4__/* .log */ .Rm.info("\nEnd processing","".concat(bufferedRequest.method," request: ").concat(bufferedRequest.url,"\n")+"".concat(bufferedRequest,"|").concat("-".repeat(80-2),"|"));case 10:return _context.a(2)}},_callee,null,[[5,8]])}))()};var onIncomingStream=function onIncomingStream(stream,headers){void _helper_js__WEBPACK_IMPORTED_MODULE_4__/* .log */ .Rm.info("Got stream",stream,headers)};// endregion
|
|
114
|
-
// region configuration
|
|
115
|
-
var BASE_CONFIGURATION=_package_json__WEBPACK_IMPORTED_MODULE_5__/* .configuration */ .HF;var _iterator=_createForOfIteratorHelper(["configuration.json","secure-configuration.json"]),_step;try{for(_iterator.s();!(_step=_iterator.n()).done;){var path=_step.value;var configurationPath=(0,path__WEBPACK_IMPORTED_MODULE_3__.resolve)(process.cwd(),path);if(await (0,clientnode__WEBPACK_IMPORTED_MODULE_0__.isFile)(configurationPath)){var configuration=await __webpack_require__(6)(configurationPath);(0,clientnode__WEBPACK_IMPORTED_MODULE_0__.extend)(true,(0,clientnode__WEBPACK_IMPORTED_MODULE_0__.modifyObject)(BASE_CONFIGURATION,configuration),configuration)}}}catch(err){_iterator.e(err)}finally{_iterator.f()}var evaluationOptions={scope:_objectSpread(_objectSpread({},clientnode__WEBPACK_IMPORTED_MODULE_0__.UTILITY_SCOPE),{},{configuration:BASE_CONFIGURATION,environment:process.env})};var CONFIGURATION=await (0,clientnode__WEBPACK_IMPORTED_MODULE_0__.evaluateAsyncDynamicData)((0,clientnode__WEBPACK_IMPORTED_MODULE_0__.evaluateDynamicData)(BASE_CONFIGURATION,evaluationOptions),evaluationOptions);var FORWARDERS=(0,_helper_js__WEBPACK_IMPORTED_MODULE_4__/* .resolveForwarders */ .cx)(CONFIGURATION.forwarders);// endregion
|
|
116
|
-
// region initialize server
|
|
117
|
-
var server={instance:CONFIGURATION.publicKeyPath&&CONFIGURATION.privateKeyPath?(0,http2__WEBPACK_IMPORTED_MODULE_2__.createSecureServer)(CONFIGURATION.nodeServerOptions,onIncomingMessage):// NOTE: See import notice.
|
|
118
|
-
(0,http__WEBPACK_IMPORTED_MODULE_1__.createServer)(onIncomingMessage),streams:[],sockets:[],start:function start(){server.instance.listen(CONFIGURATION.port,function(){void _helper_js__WEBPACK_IMPORTED_MODULE_4__/* .log */ .Rm.info("Listen on port ".concat(String(CONFIGURATION.port)," for ")+"incoming requests.")})},stop:function stop(){server.instance.close(function(){void _helper_js__WEBPACK_IMPORTED_MODULE_4__/* .log */ .Rm.info("Shut server down.")});for(var _i=0,_arr=[server.sockets,server.streams];_i<_arr.length;_i++){var connections=_arr[_i];if(Array.isArray(connections)){var _iterator2=_createForOfIteratorHelper(connections),_step2;try{for(_iterator2.s();!(_step2=_iterator2.n()).done;){var connection=_step2.value;connection.destroy()}}catch(err){_iterator2.e(err)}finally{_iterator2.f()}}}}};server.instance.on("connection",function(socket){server.sockets.push(socket);socket.buffer={data:[],finished:false};socket.on("data",function(data){socket.buffer.data.push(data)});for(var _i2=0,_arr2=["done","finish","writableEnded","writableFinished"];_i2<_arr2.length;_i2++){var name=_arr2[_i2];socket.on(name,function(){socket.buffer.finished=true})}/*
|
|
119
|
-
NOTE: Workaround since none of the events above trigger before
|
|
120
|
-
responding to client occurred.
|
|
121
|
-
*/void (0,clientnode__WEBPACK_IMPORTED_MODULE_0__.timeout)(function(){socket.buffer.finished=true});socket.on("close",function(){socket.buffer.finished=true;server.sockets.splice(server.sockets.indexOf(socket),1)})});server.instance.on("stream",function(stream,headers){server.streams.push(stream);onIncomingStream(stream,headers);stream.on("close",function(){server.streams.splice(server.streams.indexOf(stream),1)})});// endregion
|
|
122
|
-
// region start / stop
|
|
123
|
-
if(import.meta.main){void _helper_js__WEBPACK_IMPORTED_MODULE_4__/* .log */ .Rm.info("Start server with configuration:",(0,clientnode__WEBPACK_IMPORTED_MODULE_0__.represent)(CONFIGURATION));void _helper_js__WEBPACK_IMPORTED_MODULE_4__/* .log */ .Rm.debug("Apply resolved forwarder:",(0,clientnode__WEBPACK_IMPORTED_MODULE_0__.represent)(FORWARDERS));server.start();var _iterator3=_createForOfIteratorHelper(clientnode__WEBPACK_IMPORTED_MODULE_0__.CLOSE_EVENT_NAMES),_step3;try{var _loop=function _loop(){var name=_step3.value;process.on(name,function(){void _helper_js__WEBPACK_IMPORTED_MODULE_4__/* .log */ .Rm.info("\nGot \"".concat(name,"\" signal: stopping server."));server.stop()})};for(_iterator3.s();!(_step3=_iterator3.n()).done;){_loop()}}catch(err){_iterator3.e(err)}finally{_iterator3.f()}}// endregion
|
|
146
|
+
function _createForOfIteratorHelper(e,t){var _n="undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(!_n){if(Array.isArray(e)||(_n=_unsupportedIterableToArray(e))||t&&e&&"number"==typeof e.length){_n&&(e=_n);var o=0,F=function F(){};return{s:F,n:function n(){return o>=e.length?{done:!0}:{done:!1,value:e[o++]}},e:function e(r){throw r},f:F}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var a,u,i=!0;return{s:function s(){_n=_n.call(e)},n:function n(){i=!0;var r=_n.next();return r.done?{done:!0}:{value:r.value,done:i=!1}},e:function e(r){a=!0,u=r},f:function f(){try{i||null==_n.return||_n.return()}finally{if(a)throw u}}}}function _unsupportedIterableToArray(t,e){if(t){if("string"==typeof t)return _arrayLikeToArray(t,e);var o={}.toString.call(t).slice(8,-1);return"Object"===o&&t.constructor&&(o=t.constructor.name),"Map"===o||"Set"===o?Array.from(t):"Arguments"===o||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(o)?_arrayLikeToArray(t,e):void 0}}function _arrayLikeToArray(r,a){(null==a||a>r.length)&&(a=r.length);for(var e=0,n=Array(a);e<a;e++)n[e]=r[e];return n};// endregion
|
|
147
|
+
await (0,clientnode__WEBPACK_IMPORTED_MODULE_0__.importFilesystemAPI)();var CONFIGURATION=await (0,_helper_js__WEBPACK_IMPORTED_MODULE_1__/* .loadConfiguration */ .vF)();var FORWARDERS=(0,_helper_js__WEBPACK_IMPORTED_MODULE_1__/* .resolveForwarders */ .cx)(CONFIGURATION.forwarders);var server=(0,_helper_js__WEBPACK_IMPORTED_MODULE_1__/* .createServer */ .sA)(CONFIGURATION,FORWARDERS);// region start / stop
|
|
148
|
+
if(import.meta.main){void _helper_js__WEBPACK_IMPORTED_MODULE_1__/* .log */ .Rm.info("Start server with configuration:",(0,clientnode__WEBPACK_IMPORTED_MODULE_0__.represent)(CONFIGURATION));void _helper_js__WEBPACK_IMPORTED_MODULE_1__/* .log */ .Rm.debug("Apply resolved forwarder:",(0,clientnode__WEBPACK_IMPORTED_MODULE_0__.represent)(FORWARDERS));void server.start();var _iterator=_createForOfIteratorHelper(clientnode__WEBPACK_IMPORTED_MODULE_0__.CLOSE_EVENT_NAMES),_step;try{var _loop=function _loop(){var name=_step.value;process.on(name,function(){void _helper_js__WEBPACK_IMPORTED_MODULE_1__/* .log */ .Rm.info("\nGot \"".concat(name,"\" signal: stopping server."));void server.stop()})};for(_iterator.s();!(_step=_iterator.n()).done;){_loop()}}catch(err){_iterator.e(err)}finally{_iterator.f()}}// endregion
|
|
124
149
|
/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (server);
|
|
125
150
|
/* harmony export */ __webpack_require__.d(__webpack_exports__, [
|
|
126
151
|
/* harmony export */ "A", 0, __WEBPACK_DEFAULT_EXPORT__
|
|
@@ -129,60 +154,6 @@ if(import.meta.main){void _helper_js__WEBPACK_IMPORTED_MODULE_4__/* .log */ .Rm.
|
|
|
129
154
|
__webpack_async_result__();
|
|
130
155
|
} catch(e) { __webpack_async_result__(e); } }, 1);
|
|
131
156
|
|
|
132
|
-
/***/ }),
|
|
133
|
-
/* 3 */
|
|
134
|
-
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
|
|
135
|
-
|
|
136
|
-
const x = (y) => {
|
|
137
|
-
const x = {}; __webpack_require__.d(x, y); return x
|
|
138
|
-
}
|
|
139
|
-
const y = (x) => (() => (x))
|
|
140
|
-
module.exports = x({ ["createServer"]: () => (__WEBPACK_EXTERNAL_MODULE_http__.createServer) });
|
|
141
|
-
|
|
142
|
-
/***/ }),
|
|
143
|
-
/* 4 */
|
|
144
|
-
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
|
|
145
|
-
|
|
146
|
-
const x = (y) => {
|
|
147
|
-
const x = {}; __webpack_require__.d(x, y); return x
|
|
148
|
-
}
|
|
149
|
-
const y = (x) => (() => (x))
|
|
150
|
-
module.exports = x({ ["createSecureServer"]: () => (__WEBPACK_EXTERNAL_MODULE_http2__.createSecureServer) });
|
|
151
|
-
|
|
152
|
-
/***/ }),
|
|
153
|
-
/* 5 */
|
|
154
|
-
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
|
|
155
|
-
|
|
156
|
-
const x = (y) => {
|
|
157
|
-
const x = {}; __webpack_require__.d(x, y); return x
|
|
158
|
-
}
|
|
159
|
-
const y = (x) => (() => (x))
|
|
160
|
-
module.exports = x({ ["resolve"]: () => (__WEBPACK_EXTERNAL_MODULE_path__.resolve) });
|
|
161
|
-
|
|
162
|
-
/***/ }),
|
|
163
|
-
/* 6 */
|
|
164
|
-
/***/ ((module) => {
|
|
165
|
-
|
|
166
|
-
function webpackEmptyAsyncContext(req) {
|
|
167
|
-
// Here Promise.resolve().then() is used instead of new Promise() to prevent
|
|
168
|
-
// uncaught exception popping up in devtools
|
|
169
|
-
return Promise.resolve().then(() => {
|
|
170
|
-
const e = new Error("Cannot find module '" + req + "'");
|
|
171
|
-
e.code = 'MODULE_NOT_FOUND';
|
|
172
|
-
throw e;
|
|
173
|
-
});
|
|
174
|
-
}
|
|
175
|
-
webpackEmptyAsyncContext.keys = () => ([]);
|
|
176
|
-
webpackEmptyAsyncContext.resolve = webpackEmptyAsyncContext;
|
|
177
|
-
webpackEmptyAsyncContext.id = 6;
|
|
178
|
-
module.exports = webpackEmptyAsyncContext;
|
|
179
|
-
|
|
180
|
-
/***/ }),
|
|
181
|
-
/* 7 */
|
|
182
|
-
/***/ ((module) => {
|
|
183
|
-
|
|
184
|
-
module.exports = /*#__PURE__*/JSON.parse('{"HF":{"forwarders":{"base":{"headerTransformations":{"retrieve":[],"send":[]},"host":"localhost","port":443,"stateAPIs":[{"data":{},"expressions":{"post":"true","pre":"false"},"name":"base","options":{},"url":""}],"tls":true,"useExpression":"true"}},"host":"localhost","nodeServerOptions":{"allowHTTP1":true},"parseBody":false,"port":8080,"privateKeyPath":"","publicKeyPath":""}}');
|
|
185
|
-
|
|
186
157
|
/***/ })
|
|
187
158
|
/******/ ]);
|
|
188
159
|
/************************************************************************/
|
package/dist/test.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "reverse-proxy-middleware",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.144-1",
|
|
4
4
|
"description": "A reverse proxy blocking bot requests.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"api",
|
|
@@ -30,15 +30,12 @@
|
|
|
30
30
|
"imports": {
|
|
31
31
|
"*": "/application/node_modules/*"
|
|
32
32
|
},
|
|
33
|
-
"main": "index.js",
|
|
33
|
+
"main": "dist/index.js",
|
|
34
34
|
"bin": {
|
|
35
|
-
"reverse-proxy-middleware": "index.js"
|
|
35
|
+
"reverse-proxy-middleware": "dist/index.js"
|
|
36
36
|
},
|
|
37
37
|
"files": [
|
|
38
|
-
"
|
|
39
|
-
"index.d.ts",
|
|
40
|
-
"index.js",
|
|
41
|
-
"type.d.ts"
|
|
38
|
+
"dist"
|
|
42
39
|
],
|
|
43
40
|
"sideEffects": true,
|
|
44
41
|
"scripts": {
|
|
@@ -57,7 +54,7 @@
|
|
|
57
54
|
"serve:random": "ln --force --symbolic examples/random.json configuration.json && yarn serve",
|
|
58
55
|
"serve:simple": "ln --force --symbolic examples/simple.json configuration.json && yarn serve",
|
|
59
56
|
"serve:state-apis": "ln --force --symbolic examples/state-apis.json configuration.json && yarn serve",
|
|
60
|
-
"start": "./index.js",
|
|
57
|
+
"start": "./dist/index.js",
|
|
61
58
|
"test": "weboptimizer test",
|
|
62
59
|
"test:coverage": "weboptimizer test:coverage",
|
|
63
60
|
"test:coverage:report": "weboptimizer test:coverage:report",
|
|
@@ -65,25 +62,25 @@
|
|
|
65
62
|
"watch": "weboptimizer build --watch"
|
|
66
63
|
},
|
|
67
64
|
"dependencies": {
|
|
68
|
-
"clientnode": "^4.0.
|
|
65
|
+
"clientnode": "^4.0.1530"
|
|
69
66
|
},
|
|
70
67
|
"devDependencies": {
|
|
71
|
-
"@babel/cli": "^8.0
|
|
68
|
+
"@babel/cli": "^8.1.0",
|
|
72
69
|
"@babel/eslint-parser": "^8.0.7",
|
|
73
70
|
"@eslint/js": "^10.0.1",
|
|
74
71
|
"@stylistic/eslint-plugin": "^5.10.0",
|
|
75
|
-
"@types/node": "^26.6.
|
|
72
|
+
"@types/node": "^26.6.6",
|
|
76
73
|
"@types/webpack-env": "^1.18.8",
|
|
77
74
|
"@typescript-eslint/eslint-plugin": "^8.72.1",
|
|
78
75
|
"@typescript-eslint/parser": "^8.72.1",
|
|
79
|
-
"eslint": "^10.
|
|
76
|
+
"eslint": "^10.14.0",
|
|
80
77
|
"eslint-config-google": "^0.14.0",
|
|
81
78
|
"eslint-plugin-jsdoc": "^65.4.2",
|
|
82
79
|
"jest": "^30.5.2",
|
|
83
80
|
"jsdoc": "^4.0.5",
|
|
84
81
|
"typescript-eslint": "^8.72.1",
|
|
85
|
-
"web-documentation": "^1.0.
|
|
86
|
-
"weboptimizer": "^4.0.
|
|
82
|
+
"web-documentation": "^1.0.72",
|
|
83
|
+
"weboptimizer": "^4.0.103"
|
|
87
84
|
},
|
|
88
85
|
"resolutions": {
|
|
89
86
|
"colors": "1.4.0",
|
|
@@ -160,6 +157,14 @@
|
|
|
160
157
|
}
|
|
161
158
|
}
|
|
162
159
|
},
|
|
160
|
+
"path": {
|
|
161
|
+
"source": {
|
|
162
|
+
"base": "src/"
|
|
163
|
+
},
|
|
164
|
+
"target": {
|
|
165
|
+
"base": "dist/"
|
|
166
|
+
}
|
|
167
|
+
},
|
|
163
168
|
"targetTechnology": {
|
|
164
169
|
"boilerplate": "node",
|
|
165
170
|
"payload": "node"
|
package/helper.d.ts
DELETED
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
import type { BufferedHTTPServerRequest, EvaluationParameters, EvaluationScopeStateAPIs, Forwarders, HTTPServerResponse, ResolvedHeaderTransformation, ResolvedForwarder, ResolvedForwarders } from './type';
|
|
2
|
-
import { Logger } from 'clientnode';
|
|
3
|
-
export declare const EVALUATION_SCOPE_NAMES: readonly ["array", "datetime", "filesystem", "functions", "indicators", "logger", "module", "number", "object", "string", "utility", "data", "error", "request", "response", "stateAPI", "stateAPIs"];
|
|
4
|
-
export declare const log: Logger;
|
|
5
|
-
export declare const applyStateAPIs: (request: BufferedHTTPServerRequest, response: HTTPServerResponse, forwarder: ResolvedForwarder) => Promise<{
|
|
6
|
-
result: boolean;
|
|
7
|
-
scope: EvaluationScopeStateAPIs;
|
|
8
|
-
}>;
|
|
9
|
-
export declare const determineForwarder: (request: BufferedHTTPServerRequest, response: HTTPServerResponse, forwarders: ResolvedForwarders) => null | ResolvedForwarder;
|
|
10
|
-
export declare const resolveForwarders: (forwarders: Forwarders) => ResolvedForwarders;
|
|
11
|
-
export declare const addParsedContentToRequest: (bufferedRequest: BufferedHTTPServerRequest) => void;
|
|
12
|
-
export declare const transformHeaders: (content: string, headerTransformations: Array<ResolvedHeaderTransformation>, parameters: EvaluationParameters) => string;
|
|
13
|
-
export declare const reverseProxyBufferedRequest: (request: BufferedHTTPServerRequest, response: HTTPServerResponse, forwarder: ResolvedForwarder, stateAPIScope: EvaluationScopeStateAPIs) => Promise<void>;
|
|
14
|
-
export default reverseProxyBufferedRequest;
|
|
File without changes
|