@zerooneit/expressive-tea 1.3.0-beta.1 → 1.3.0-beta.2

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/classes/Boot.js CHANGED
@@ -71,7 +71,7 @@ class Boot {
71
71
  }, this.server);
72
72
  // Injectables
73
73
  localContainer.bind('server').toConstantValue(server);
74
- localContainer.bind('secureServer').toConstantValue(secureServer);
74
+ localContainer.bind('secureServer').toConstantValue(secureServer || undefined);
75
75
  localContainer.bind('context').toConstantValue(this);
76
76
  localContainer.bind('settings').toConstantValue(this.settings);
77
77
  const httpEngine = localContainer.resolve(index_1.default);
@@ -80,6 +80,7 @@ class Boot {
80
80
  const teacupEngine = localContainer.resolve(teacup_1.default);
81
81
  await websocketEngine.init();
82
82
  await httpEngine.init();
83
+ await httpEngine.resolveProxyContainers();
83
84
  await httpEngine.resolveStages(constants_1.BOOT_ORDER);
84
85
  await httpEngine.resolveStages([constants_1.BOOT_STAGES.AFTER_APPLICATION_MIDDLEWARES, constants_1.BOOT_STAGES.ON_HTTP_CREATION], server, secureServer);
85
86
  const listenerServers = await httpEngine.start();
@@ -32,8 +32,8 @@ class Metadata {
32
32
  return Reflect.hasMetadata(key, (0, object_helper_1.getClass)(target), propertyKey);
33
33
  }
34
34
  catch (er) {
35
+ return false;
35
36
  }
36
- return false;
37
37
  }
38
38
  static hasOwn(key, target, propertyKey) {
39
39
  return Reflect.hasOwnMetadata(key, (0, object_helper_1.getClass)(target), propertyKey);
@@ -112,8 +112,8 @@ let Settings = Settings_1 = class Settings {
112
112
  }
113
113
  };
114
114
  Settings.isolatedContext = new Map();
115
- Settings = Settings_1 = (0, tslib_1.__decorate)([
115
+ Settings = Settings_1 = tslib_1.__decorate([
116
116
  (0, inversify_1.injectable)(),
117
- (0, tslib_1.__metadata)("design:paramtypes", [Object, Boolean])
117
+ tslib_1.__metadata("design:paramtypes", [Object, Boolean])
118
118
  ], Settings);
119
119
  exports.default = Settings;
@@ -0,0 +1,13 @@
1
+ import { ExpressiveTeaProxyOptions, ExpressiveTeaProxyProperty, MethodDecorator } from '../libs/types';
2
+ import { Express, RequestHandler } from 'express';
3
+ export declare function ProxyContainer(source: string, targetUrl: string): <T extends new (...args: any[]) => any>(ProxyContainerClass: T) => {
4
+ new (...args: any[]): {
5
+ [x: string]: any;
6
+ readonly source: string;
7
+ readonly target: string;
8
+ readonly proxyHandler: RequestHandler;
9
+ __register(server: Express): void;
10
+ };
11
+ } & T;
12
+ export declare function ProxyOption(option: ExpressiveTeaProxyOptions): MethodDecorator;
13
+ export declare function ProxyProperty(option: ExpressiveTeaProxyProperty, value: any): PropertyDecorator;
@@ -0,0 +1,70 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ProxyProperty = exports.ProxyOption = exports.ProxyContainer = void 0;
4
+ const MetaData_1 = require("../classes/MetaData");
5
+ const httpProxy = require("express-http-proxy");
6
+ const object_helper_1 = require("../helpers/object-helper");
7
+ const lodash_1 = require("lodash");
8
+ const RequestExceptions_1 = require("../exceptions/RequestExceptions");
9
+ const constants_1 = require("../libs/constants");
10
+ const NON_ASYNC_METHODS = ['host'];
11
+ function ProxyContainer(source, targetUrl) {
12
+ return (ProxyContainerClass) => {
13
+ class ExpressiveTeaProxy extends ProxyContainerClass {
14
+ constructor(...args) {
15
+ super(...args);
16
+ this.source = source;
17
+ this.target = targetUrl;
18
+ const options = {};
19
+ const host = MetaData_1.default.get(constants_1.PROXY_SETTING_KEY, this, constants_1.PROXY_METHODS.HOST);
20
+ for (const value of Object.values(constants_1.PROXY_METHODS)) {
21
+ if (value !== constants_1.PROXY_METHODS.HOST) {
22
+ options[value] = MetaData_1.default.get(constants_1.PROXY_SETTING_KEY, this, value);
23
+ }
24
+ }
25
+ for (const value of Object.values(constants_1.PROXY_PROPERTIES)) {
26
+ const key = MetaData_1.default.get(constants_1.PROXY_SETTING_KEY, this, value);
27
+ if (!(0, lodash_1.isUndefined)(key)) {
28
+ // @ts-ignore:next-line
29
+ options[value] = this[key];
30
+ }
31
+ }
32
+ this.proxyHandler = httpProxy(host ? host.value.bind(this) : this.target);
33
+ }
34
+ __register(server) {
35
+ const proxyMetadata = MetaData_1.default.get(constants_1.PROXY_SETTING_KEY, (0, object_helper_1.getClass)(this));
36
+ console.info(`[PROXY - ${proxyMetadata.name}] ${this.source} -> ${this.target}`);
37
+ server.use(this.source, this.proxyHandler);
38
+ }
39
+ }
40
+ ;
41
+ const settings = {
42
+ source,
43
+ targetUrl,
44
+ name: ProxyContainerClass.name
45
+ };
46
+ MetaData_1.default.set(constants_1.PROXY_SETTING_KEY, settings, ProxyContainerClass);
47
+ return ExpressiveTeaProxy;
48
+ };
49
+ }
50
+ exports.ProxyContainer = ProxyContainer;
51
+ function ProxyOption(option) {
52
+ return (target, propertyKey, descriptor) => {
53
+ if (NON_ASYNC_METHODS.includes(option) && (0, object_helper_1.isAsyncFunction)(descriptor.value)) {
54
+ throw new RequestExceptions_1.GenericRequestException(`${String(propertyKey)} must not be declared as Async Function.`);
55
+ }
56
+ MetaData_1.default.set(constants_1.PROXY_SETTING_KEY, descriptor, target, option);
57
+ };
58
+ }
59
+ exports.ProxyOption = ProxyOption;
60
+ function ProxyProperty(option, value) {
61
+ return (target, propertyKey) => {
62
+ MetaData_1.default.set(constants_1.PROXY_SETTING_KEY, propertyKey, target, option);
63
+ let currentValue = target[propertyKey];
64
+ Object.defineProperty(target, propertyKey, {
65
+ get: () => value,
66
+ set: () => { currentValue = value; }
67
+ });
68
+ };
69
+ }
70
+ exports.ProxyProperty = ProxyProperty;
@@ -1,6 +1,6 @@
1
1
  import { Router } from 'express';
2
2
  import { ExpressiveTeaHandlerOptions } from '../libs/interfaces';
3
- import { ExpressMiddlewareHandler, MethodDecorator } from '../libs/types';
3
+ import { ClassDecorator, ExpressMiddlewareHandler, MethodDecorator } from '../libs/types';
4
4
  /**
5
5
  * @module Decorators/Router
6
6
  */
@@ -17,8 +17,9 @@ import { ExpressMiddlewareHandler, MethodDecorator } from '../libs/types';
17
17
  * {REPLACE-AT}Route('/)
18
18
  * class Example {}
19
19
  */
20
- export declare function Route(mountpoint?: string): <T extends new (...args: any[]) => {}>(Route: T) => {
20
+ export declare function Route(mountpoint?: string): <T extends new (...args: any[]) => any>(RouterClass: T) => {
21
21
  new (...args: any[]): {
22
+ [x: string]: any;
22
23
  readonly router: Router;
23
24
  readonly mountpoint: string;
24
25
  __mount(parent: Router): any;
@@ -24,8 +24,8 @@ const constants_1 = require("../libs/constants");
24
24
  * class Example {}
25
25
  */
26
26
  function Route(mountpoint = '/') {
27
- return (Route) => {
28
- return class ExpressiveTeaRoute extends Route {
27
+ return (RouterClass) => {
28
+ return class ExpressiveTeaRoute extends RouterClass {
29
29
  constructor(...args) {
30
30
  super(...args);
31
31
  const handlers = MetaData_1.default.get(constants_1.ROUTER_HANDLERS_KEY, this) || [];
@@ -78,6 +78,7 @@ export declare function Setting(settingName: string): (target: any, propertyName
78
78
  * @param Modules
79
79
  */
80
80
  export declare function Modules(Modules: any[]): (target: any) => void;
81
+ export declare function Proxies(proxyContainers: any[]): (target: any) => void;
81
82
  /**
82
83
  * Register Module Method Decorator this Method Decorator is used at bootstrap level and should decorate the start
83
84
  * method with a Module Class.
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.Teacup = exports.Teapot = exports.RegisterModule = exports.Modules = exports.Setting = exports.ExpressDirective = exports.Static = exports.ServerSettings = exports.Pour = exports.Plug = void 0;
3
+ exports.Teacup = exports.Teapot = exports.RegisterModule = exports.Proxies = exports.Modules = exports.Setting = exports.ExpressDirective = exports.Static = exports.ServerSettings = exports.Pour = exports.Plug = void 0;
4
4
  const lodash_1 = require("lodash");
5
5
  const MetaData_1 = require("../classes/MetaData");
6
6
  const Settings_1 = require("../classes/Settings");
@@ -204,6 +204,16 @@ function Modules(Modules) {
204
204
  };
205
205
  }
206
206
  exports.Modules = Modules;
207
+ function Proxies(proxyContainers) {
208
+ return target => {
209
+ for (const proxyContainer of proxyContainers) {
210
+ const registeredProxyContainers = MetaData_1.default.get(constants_1.ROUTER_PROXIES_KEY, target) || [];
211
+ registeredProxyContainers.unshift(proxyContainer);
212
+ MetaData_1.default.set(constants_1.ROUTER_PROXIES_KEY, registeredProxyContainers, target);
213
+ }
214
+ };
215
+ }
216
+ exports.Proxies = Proxies;
207
217
  /**
208
218
  * Register Module Method Decorator this Method Decorator is used at bootstrap level and should decorate the start
209
219
  * method with a Module Class.
@@ -1,4 +1,5 @@
1
1
  /// <reference types="node" />
2
+ /// <reference types="node" />
2
3
  import * as http from 'http';
3
4
  import * as https from 'https';
4
5
  import { BOOT_STAGES } from '../../libs/constants';
@@ -12,4 +13,5 @@ export default class HTTPEngine {
12
13
  start(): Promise<(http.Server | https.Server)[]>;
13
14
  init(): Promise<void>;
14
15
  resolveStages(stages: BOOT_STAGES[], ...extraArgs: any[]): Promise<void[]>;
16
+ resolveProxyContainers(): Promise<void>;
15
17
  }
@@ -4,6 +4,9 @@ const tslib_1 = require("tslib");
4
4
  const $P = require("bluebird");
5
5
  const inversify_1 = require("inversify");
6
6
  const boot_helper_1 = require("../../helpers/boot-helper");
7
+ const constants_1 = require("../../libs/constants");
8
+ const object_helper_1 = require("../../helpers/object-helper");
9
+ const MetaData_1 = require("../../classes/MetaData");
7
10
  let HTTPEngine = class HTTPEngine {
8
11
  constructor(ctx, server, serverSecure, settings) {
9
12
  this.context = ctx;
@@ -38,13 +41,20 @@ let HTTPEngine = class HTTPEngine {
38
41
  return (0, boot_helper_1.resolveStage)(s, this.context, this.context.getApplication(), ...extraArgs);
39
42
  });
40
43
  }
44
+ async resolveProxyContainers() {
45
+ const ProxyContainers = MetaData_1.default.get(constants_1.ROUTER_PROXIES_KEY, (0, object_helper_1.getClass)(this.context)) || [];
46
+ for (const Container of ProxyContainers) {
47
+ (0, boot_helper_1.resolveProxy)(Container, this.context.getApplication());
48
+ }
49
+ }
41
50
  };
42
- HTTPEngine = (0, tslib_1.__decorate)([
51
+ HTTPEngine = tslib_1.__decorate([
43
52
  (0, inversify_1.injectable)(),
44
- (0, tslib_1.__param)(0, (0, inversify_1.inject)('context')),
45
- (0, tslib_1.__param)(1, (0, inversify_1.inject)('server')),
46
- (0, tslib_1.__param)(2, (0, inversify_1.inject)('secureServer')),
47
- (0, tslib_1.__param)(3, (0, inversify_1.inject)('settings')),
48
- (0, tslib_1.__metadata)("design:paramtypes", [Object, Object, Object, Object])
53
+ tslib_1.__param(0, (0, inversify_1.inject)('context')),
54
+ tslib_1.__param(1, (0, inversify_1.inject)('server')),
55
+ tslib_1.__param(2, (0, inversify_1.inject)('secureServer')),
56
+ tslib_1.__param(2, (0, inversify_1.optional)()),
57
+ tslib_1.__param(3, (0, inversify_1.inject)('settings')),
58
+ tslib_1.__metadata("design:paramtypes", [Object, Object, Object, Object])
49
59
  ], HTTPEngine);
50
60
  exports.default = HTTPEngine;
@@ -95,12 +95,13 @@ All Communication are encrypted to ensure intruder can not connected, however, p
95
95
  this.client.connect();
96
96
  }
97
97
  };
98
- TeacupEngine = (0, tslib_1.__decorate)([
98
+ TeacupEngine = tslib_1.__decorate([
99
99
  (0, inversify_1.injectable)(),
100
- (0, tslib_1.__param)(0, (0, inversify_1.inject)('context')),
101
- (0, tslib_1.__param)(1, (0, inversify_1.inject)('settings')),
102
- (0, tslib_1.__param)(2, (0, inversify_1.inject)('server')),
103
- (0, tslib_1.__param)(3, (0, inversify_1.inject)('secureServer')),
104
- (0, tslib_1.__metadata)("design:paramtypes", [Object, Object, Object, Object])
100
+ tslib_1.__param(0, (0, inversify_1.inject)('context')),
101
+ tslib_1.__param(1, (0, inversify_1.inject)('settings')),
102
+ tslib_1.__param(2, (0, inversify_1.inject)('server')),
103
+ tslib_1.__param(3, (0, inversify_1.inject)('secureServer')),
104
+ tslib_1.__param(3, (0, inversify_1.optional)()),
105
+ tslib_1.__metadata("design:paramtypes", [Object, Object, Object, Object])
105
106
  ], TeacupEngine);
106
107
  exports.default = TeacupEngine;
@@ -145,12 +145,13 @@ All Communication are encrypted to ensure intruder can not connected, however, p
145
145
  this.socketServer.listen(this.server);
146
146
  }
147
147
  };
148
- TeapotEngine = TeapotEngine_1 = (0, tslib_1.__decorate)([
148
+ TeapotEngine = TeapotEngine_1 = tslib_1.__decorate([
149
149
  (0, inversify_1.injectable)(),
150
- (0, tslib_1.__param)(0, (0, inversify_1.inject)('context')),
151
- (0, tslib_1.__param)(1, (0, inversify_1.inject)('server')),
152
- (0, tslib_1.__param)(2, (0, inversify_1.inject)('secureServer')),
153
- (0, tslib_1.__param)(3, (0, inversify_1.inject)('settings')),
154
- (0, tslib_1.__metadata)("design:paramtypes", [Object, Object, Object, Object])
150
+ tslib_1.__param(0, (0, inversify_1.inject)('context')),
151
+ tslib_1.__param(1, (0, inversify_1.inject)('server')),
152
+ tslib_1.__param(2, (0, inversify_1.inject)('secureServer')),
153
+ tslib_1.__param(2, (0, inversify_1.optional)()),
154
+ tslib_1.__param(3, (0, inversify_1.inject)('settings')),
155
+ tslib_1.__metadata("design:paramtypes", [Object, Object, Object, Object])
155
156
  ], TeapotEngine);
156
157
  exports.default = TeapotEngine;
@@ -26,11 +26,12 @@ let WebsocketEngine = class WebsocketEngine {
26
26
  }
27
27
  }
28
28
  };
29
- WebsocketEngine = (0, tslib_1.__decorate)([
29
+ WebsocketEngine = tslib_1.__decorate([
30
30
  (0, inversify_1.injectable)(),
31
- (0, tslib_1.__param)(0, (0, inversify_1.inject)('server')),
32
- (0, tslib_1.__param)(1, (0, inversify_1.inject)('secureServer')),
33
- (0, tslib_1.__param)(2, (0, inversify_1.inject)('settings')),
34
- (0, tslib_1.__metadata)("design:paramtypes", [Object, Object, Object])
31
+ tslib_1.__param(0, (0, inversify_1.inject)('server')),
32
+ tslib_1.__param(1, (0, inversify_1.inject)('secureServer')),
33
+ tslib_1.__param(1, (0, inversify_1.optional)()),
34
+ tslib_1.__param(2, (0, inversify_1.inject)('settings')),
35
+ tslib_1.__metadata("design:paramtypes", [Object, Object, Object])
35
36
  ], WebsocketEngine);
36
37
  exports.default = WebsocketEngine;
@@ -4,3 +4,4 @@ import Boot from '../classes/Boot';
4
4
  export declare function resolveStage(stage: BOOT_STAGES, ctx: Boot, server: Express, ...extraArgs: unknown[]): Promise<void>;
5
5
  export declare function resolveDirectives(instance: typeof Boot | Boot, server: Express): Promise<void>;
6
6
  export declare function resolveStatic(instance: typeof Boot | Boot, server: Express): Promise<void>;
7
+ export declare function resolveProxy(ProxyContainer: any, server: Express): Promise<void>;
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
2
  // tslint:disable:no-duplicate-imports
3
3
  Object.defineProperty(exports, "__esModule", { value: true });
4
- exports.resolveStatic = exports.resolveDirectives = exports.resolveStage = void 0;
4
+ exports.resolveProxy = exports.resolveStatic = exports.resolveDirectives = exports.resolveStage = void 0;
5
5
  const constants_1 = require("../libs/constants");
6
6
  const express = require("express");
7
7
  const MetaData_1 = require("../classes/MetaData");
@@ -40,6 +40,11 @@ async function resolveStatic(instance, server) {
40
40
  });
41
41
  }
42
42
  exports.resolveStatic = resolveStatic;
43
+ async function resolveProxy(ProxyContainer, server) {
44
+ const proxyContainer = new ProxyContainer();
45
+ proxyContainer.__register(server);
46
+ }
47
+ exports.resolveProxy = resolveProxy;
43
48
  async function resolveModules(instance, server) {
44
49
  const registeredModules = MetaData_1.default.get(constants_1.REGISTERED_MODULE_KEY, instance, 'start') || [];
45
50
  registeredModules.forEach(Module => {
@@ -164,3 +164,4 @@ export declare function descriptorOf(target: any, propertyKey: string): Property
164
164
  */
165
165
  export declare function prototypeOf(target: any): any;
166
166
  export declare function getOwnArgumentNames(fn: Function): string[];
167
+ export declare function isAsyncFunction(fn: () => any): boolean;
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.getOwnArgumentNames = exports.prototypeOf = exports.descriptorOf = exports.nameOfSymbol = exports.nameOfClass = exports.nameOf = exports.ancestorsOf = exports.getInheritedClass = exports.isPromise = exports.isEmpty = exports.isClass = exports.isObject = exports.isDate = exports.isCollection = exports.isArrayOrArrayClass = exports.isArray = exports.isBoolean = exports.isNumber = exports.isString = exports.primitiveOf = exports.isPrimitiveOrPrimitiveClass = exports.getClassOrSymbol = exports.classOf = exports.getClass = exports.getConstructor = void 0;
3
+ exports.isAsyncFunction = exports.getOwnArgumentNames = exports.prototypeOf = exports.descriptorOf = exports.nameOfSymbol = exports.nameOfClass = exports.nameOf = exports.ancestorsOf = exports.getInheritedClass = exports.isPromise = exports.isEmpty = exports.isClass = exports.isObject = exports.isDate = exports.isCollection = exports.isArrayOrArrayClass = exports.isArray = exports.isBoolean = exports.isNumber = exports.isString = exports.primitiveOf = exports.isPrimitiveOrPrimitiveClass = exports.getClassOrSymbol = exports.classOf = exports.getClass = exports.getConstructor = void 0;
4
4
  /* istanbul ignore file */
5
5
  /**
6
6
  * Get the provide constructor.
@@ -286,3 +286,7 @@ function getOwnArgumentNames(fn) {
286
286
  return fnArguments && fnArguments.length ? fnArguments.split(replaceRegExp) : [];
287
287
  }
288
288
  exports.getOwnArgumentNames = getOwnArgumentNames;
289
+ function isAsyncFunction(fn) {
290
+ return fn.constructor.name === 'AsyncFunction' || fn.constructor.name.includes('__awaiter');
291
+ }
292
+ exports.isAsyncFunction = isAsyncFunction;
@@ -4,6 +4,6 @@ export declare function autoResponse(request: Request, response: Response, annot
4
4
  export declare function executeRequest(request: Request, response: Response, next: NextFunction): Promise<void>;
5
5
  export declare function mapArguments(decoratedArguments: ExpressiveTeaArgumentOptions[], request: Request, response: Response, next: NextFunction, introspectedArgs?: string[]): unknown[];
6
6
  export declare function extractParameters(target: unknown, args?: string | string[], propertyName?: string | symbol): any;
7
- export declare function generateRoute(route: string, verb: string): (target: object, propertyKey: string | symbol, descriptor: PropertyDescriptor) => void;
8
- export declare function router(verb: string, route: string, target: any, handler: (...args: any[]) => void | any | Promise<any>, propertyKey: string | symbol): void;
7
+ export declare function generateRoute(route: string, verb: string, ...settings: any): (target: object, propertyKey: string | symbol, descriptor: PropertyDescriptor) => void;
8
+ export declare function router(verb: string, route: string, target: any, handler: (...args: any[]) => void | any | Promise<any>, propertyKey: string | symbol, settings?: any): void;
9
9
  export declare function fileSettings(): any;
package/helpers/server.js CHANGED
@@ -77,13 +77,13 @@ function extractParameters(target, args, propertyName) {
77
77
  return target;
78
78
  }
79
79
  exports.extractParameters = extractParameters;
80
- function generateRoute(route, verb) {
81
- return (target, propertyKey, descriptor) => router(verb, route, target, descriptor.value, propertyKey);
80
+ function generateRoute(route, verb, ...settings) {
81
+ return (target, propertyKey, descriptor) => router(verb, route, target, descriptor.value, propertyKey, settings);
82
82
  }
83
83
  exports.generateRoute = generateRoute;
84
- function router(verb, route, target, handler, propertyKey) {
84
+ function router(verb, route, target, handler, propertyKey, settings) {
85
85
  const existedRoutesHandlers = MetaData_1.default.get(constants_1.ROUTER_HANDLERS_KEY, target) || [];
86
- existedRoutesHandlers.unshift({ verb, route, handler, target, propertyKey });
86
+ existedRoutesHandlers.unshift({ verb, route, handler, target, propertyKey, settings });
87
87
  MetaData_1.default.set(constants_1.ROUTER_HANDLERS_KEY, existedRoutesHandlers, target);
88
88
  }
89
89
  exports.router = router;
@@ -1,4 +1,5 @@
1
1
  /// <reference types="node" />
2
+ /// <reference types="node" />
2
3
  import { KeyPairSyncResult } from 'crypto';
3
4
  export interface EncryptedMessage {
4
5
  iv: string;
@@ -1,4 +1,5 @@
1
1
  /// <reference types="node" />
2
+ /// <reference types="node" />
2
3
  import * as http from 'http';
3
4
  import * as https from 'https';
4
5
  export declare function initWebsocket(server: http.Server, secureServer: https.Server): Promise<void>;
@@ -0,0 +1 @@
1
+ export declare const EXPRESSIVE_TEA_PROXY_CLASS = "ExpressiveTeaProxy";
@@ -0,0 +1,4 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.EXPRESSIVE_TEA_PROXY_CLASS = void 0;
4
+ exports.EXPRESSIVE_TEA_PROXY_CLASS = 'ExpressiveTeaProxy';
@@ -50,6 +50,8 @@ export declare const EXPRESS_DIRECTIVES: string[];
50
50
  export declare const BOOT_STAGES_KEY = "boot:stage-settings";
51
51
  export declare const ROUTER_HANDLERS_KEY = "app:routes:handlers";
52
52
  export declare const ROUTER_MIDDLEWARES_KEY = "app:routes:middlewares";
53
+ export declare const ROUTER_PROXIES_KEY = "app:routes:proxies";
54
+ export declare const PROXY_SETTING_KEY = "app:proxy:settings";
53
55
  export declare const REGISTERED_MODEL_KEY = "app:models:registered";
54
56
  export declare const REGISTERED_MODULE_KEY = "app:modules:registered";
55
57
  export declare const PLUGINS_KEY = "boot:app-plugins";
@@ -67,3 +69,24 @@ export declare const ARGUMENT_TYPES: {
67
69
  REQUEST: symbol;
68
70
  RESPONSE: symbol;
69
71
  };
72
+ export declare enum PROXY_METHODS {
73
+ HOST = "host",
74
+ PROXY_REQ_PATH_RESOLVER = "proxyReqPathResolver",
75
+ FILTER = "filter",
76
+ USER_RES_DECORATOR = "userResDecorator",
77
+ USER_RES_HEADER_DECORATOR = "userResHeaderDecorator",
78
+ SKIP_TO_NEXT_HANDLER_FILTER = "skipToNextHandlerFilter",
79
+ PROXY_ERROR_HANDLER = "proxyErrorHandler",
80
+ PROXY_REQ_OPT_DECORATOR = "proxyReqOptDecorator",
81
+ PROXY_REQ_BODY_DECORATOR = "proxyReqBodyDecorator"
82
+ }
83
+ export declare enum PROXY_PROPERTIES {
84
+ LIMIT = "limit",
85
+ MEMOIZE_HOST = "memoizeHost",
86
+ HTTPS = "https",
87
+ PRESERVE_HOST_HDR = "preserveHostHdr",
88
+ PARSE_REQ_BODY = "parseReqBody",
89
+ REQ_AS_BUFFER = "reqAsBuffer",
90
+ REQ_BODY_ENCODING = "reqBodyEncoding",
91
+ TIMEOUT = "timeout"
92
+ }
package/libs/constants.js CHANGED
@@ -21,7 +21,7 @@
21
21
  * @summary Available Boot Stages
22
22
  */
23
23
  Object.defineProperty(exports, "__esModule", { value: true });
24
- exports.ARGUMENT_TYPES = exports.ASSIGN_TEACUP_KEY = exports.ASSIGN_TEAPOT_KEY = exports.ROUTER_ANNOTATIONS_KEY = exports.ARGUMENTS_KEY = exports.REGISTERED_DIRECTIVES_KEY = exports.REGISTERED_STATIC_KEY = exports.PLUGINS_KEY = exports.REGISTERED_MODULE_KEY = exports.REGISTERED_MODEL_KEY = exports.ROUTER_MIDDLEWARES_KEY = exports.ROUTER_HANDLERS_KEY = exports.BOOT_STAGES_KEY = exports.EXPRESS_DIRECTIVES = exports.STAGES_INIT = exports.BOOT_STAGES_LIST = exports.BOOT_ORDER = exports.BOOT_STAGES = void 0;
24
+ exports.PROXY_PROPERTIES = exports.PROXY_METHODS = exports.ARGUMENT_TYPES = exports.ASSIGN_TEACUP_KEY = exports.ASSIGN_TEAPOT_KEY = exports.ROUTER_ANNOTATIONS_KEY = exports.ARGUMENTS_KEY = exports.REGISTERED_DIRECTIVES_KEY = exports.REGISTERED_STATIC_KEY = exports.PLUGINS_KEY = exports.REGISTERED_MODULE_KEY = exports.REGISTERED_MODEL_KEY = exports.PROXY_SETTING_KEY = exports.ROUTER_PROXIES_KEY = exports.ROUTER_MIDDLEWARES_KEY = exports.ROUTER_HANDLERS_KEY = exports.BOOT_STAGES_KEY = exports.EXPRESS_DIRECTIVES = exports.STAGES_INIT = exports.BOOT_STAGES_LIST = exports.BOOT_ORDER = exports.BOOT_STAGES = void 0;
25
25
  // tslint:enable:max-line-length
26
26
  var BOOT_STAGES;
27
27
  (function (BOOT_STAGES) {
@@ -82,6 +82,8 @@ exports.EXPRESS_DIRECTIVES = [
82
82
  exports.BOOT_STAGES_KEY = 'boot:stage-settings';
83
83
  exports.ROUTER_HANDLERS_KEY = 'app:routes:handlers';
84
84
  exports.ROUTER_MIDDLEWARES_KEY = 'app:routes:middlewares';
85
+ exports.ROUTER_PROXIES_KEY = 'app:routes:proxies';
86
+ exports.PROXY_SETTING_KEY = 'app:proxy:settings';
85
87
  exports.REGISTERED_MODEL_KEY = 'app:models:registered';
86
88
  exports.REGISTERED_MODULE_KEY = 'app:modules:registered';
87
89
  exports.PLUGINS_KEY = 'boot:app-plugins';
@@ -99,3 +101,28 @@ exports.ARGUMENT_TYPES = {
99
101
  REQUEST: Symbol('REQUEST'),
100
102
  RESPONSE: Symbol('RESPONSE')
101
103
  };
104
+ var PROXY_METHODS;
105
+ (function (PROXY_METHODS) {
106
+ PROXY_METHODS["HOST"] = "host";
107
+ PROXY_METHODS["PROXY_REQ_PATH_RESOLVER"] = "proxyReqPathResolver";
108
+ PROXY_METHODS["FILTER"] = "filter";
109
+ PROXY_METHODS["USER_RES_DECORATOR"] = "userResDecorator";
110
+ PROXY_METHODS["USER_RES_HEADER_DECORATOR"] = "userResHeaderDecorator";
111
+ PROXY_METHODS["SKIP_TO_NEXT_HANDLER_FILTER"] = "skipToNextHandlerFilter";
112
+ PROXY_METHODS["PROXY_ERROR_HANDLER"] = "proxyErrorHandler";
113
+ PROXY_METHODS["PROXY_REQ_OPT_DECORATOR"] = "proxyReqOptDecorator";
114
+ PROXY_METHODS["PROXY_REQ_BODY_DECORATOR"] = "proxyReqBodyDecorator";
115
+ })(PROXY_METHODS = exports.PROXY_METHODS || (exports.PROXY_METHODS = {}));
116
+ // 'limit' | 'memoizeHost' | 'https' | 'preserveHostHdr' | 'parseReqBody' |
117
+ // 'reqAsBuffer' | 'reqBodyEncoding' | 'timeout';
118
+ var PROXY_PROPERTIES;
119
+ (function (PROXY_PROPERTIES) {
120
+ PROXY_PROPERTIES["LIMIT"] = "limit";
121
+ PROXY_PROPERTIES["MEMOIZE_HOST"] = "memoizeHost";
122
+ PROXY_PROPERTIES["HTTPS"] = "https";
123
+ PROXY_PROPERTIES["PRESERVE_HOST_HDR"] = "preserveHostHdr";
124
+ PROXY_PROPERTIES["PARSE_REQ_BODY"] = "parseReqBody";
125
+ PROXY_PROPERTIES["REQ_AS_BUFFER"] = "reqAsBuffer";
126
+ PROXY_PROPERTIES["REQ_BODY_ENCODING"] = "reqBodyEncoding";
127
+ PROXY_PROPERTIES["TIMEOUT"] = "timeout";
128
+ })(PROXY_PROPERTIES = exports.PROXY_PROPERTIES || (exports.PROXY_PROPERTIES = {}));
@@ -1,5 +1,6 @@
1
1
  /// <reference types="node" />
2
- import { Express, Router } from 'express';
2
+ /// <reference types="node" />
3
+ import { Express, RequestHandler, Router } from 'express';
3
4
  import * as http from 'http';
4
5
  import * as https from 'https';
5
6
  import { ExpressiveTeaMiddleware, ExpressMiddlewareHandler } from './types';
@@ -76,6 +77,17 @@ export interface IExpressiveTeaModule {
76
77
  readonly controllers: any[];
77
78
  __register(server: Express): void;
78
79
  }
80
+ export interface IExpressiveTeaProxySettings {
81
+ name: string;
82
+ source: string;
83
+ targetUrl: string;
84
+ }
85
+ export interface IExpressiveTeaProxy {
86
+ readonly source: string;
87
+ readonly target: string;
88
+ readonly proxyHandler: RequestHandler;
89
+ __register(server: Express): void;
90
+ }
79
91
  export interface IExpressiveTeaRoute {
80
92
  readonly router: Router;
81
93
  readonly mountpoint: string;
@@ -111,6 +123,7 @@ export interface ExpressiveTeaHandlerOptions {
111
123
  handler: ExpressiveTeaMiddleware & ExpressiveTeaMiddlewareExtends;
112
124
  target: unknown;
113
125
  propertyKey: string | symbol;
126
+ settings?: any;
114
127
  }
115
128
  export interface ExpressiveTeaArgumentOptions {
116
129
  key: string | symbol;
package/libs/types.d.ts CHANGED
@@ -10,3 +10,5 @@ export declare type ClassDecorator = <TFunction extends Function>(target: TFunct
10
10
  export declare type PropertyDecorator = (target: Object, propertyKey: string | symbol) => void;
11
11
  export declare type MethodDecorator = (target: Object, propertyKey: string | symbol, descriptor: PropertyDescriptor) => PropertyDescriptor | void;
12
12
  export declare type ParameterDecorator = (target: Object, propertyKey: string | symbol, parameterIndex: number) => void;
13
+ export declare type ExpressiveTeaProxyOptions = 'proxyReqPathResolver' | 'host' | 'filter' | 'userResDecorator' | 'userResHeaderDecorator' | 'skipToNextHandlerFilter' | 'proxyErrorHandler' | 'proxyReqOptDecorator' | 'proxyReqBodyDecorator';
14
+ export declare type ExpressiveTeaProxyProperty = 'limit' | 'memoizeHost' | 'https' | 'preserveHostHdr' | 'parseReqBody' | 'reqAsBuffer' | 'reqBodyEncoding' | 'timeout';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zerooneit/expressive-tea",
3
- "version": "1.3.0-beta.1",
3
+ "version": "1.3.0-beta.2",
4
4
  "description": "A REST API over Express and Typescript",
5
5
  "main": "classes/Boot.js",
6
6
  "engines": {
@@ -12,7 +12,7 @@
12
12
  "linter": "tslint -c tslint.json -p tsconfig.json",
13
13
  "build:dev": "tsc --project tsconfig.json --watch",
14
14
  "build": "tsc --project tsconfig.json",
15
- "clean:build": "gulp clean",
15
+ "clean:build": "trash '**/*.js' '**/*.d.ts' '**/*.js.map' '**/*.d.ts.map' '!node_modules/**/*' '!docs/**/*' '!coverage/**/*' '!gulpfile.js' '!tasks/*.js' '!jest.config.js' '!tools/**/*'",
16
16
  "publish:prepare": "npm run clean:build && npm run build",
17
17
  "postpublish": "npm run clean:build",
18
18
  "prepublishOnly": "npm test && npm run publish:prepare"
@@ -29,42 +29,40 @@
29
29
  "@types/bluebird": "3.5.36",
30
30
  "@types/express": "4.17.13",
31
31
  "@types/express-http-proxy": "1.6.3",
32
- "@types/express-serve-static-core": "4.17.25",
33
- "@types/jest": "27.0.2",
34
- "@types/lodash": "4.14.176",
35
- "@types/node": "16.11.7",
32
+ "@types/express-serve-static-core": "4.17.28",
33
+ "@types/jest": "27.5.1",
34
+ "@types/lodash": "4.14.182",
35
+ "@types/node": "17.0.36",
36
36
  "@types/reflect-metadata": "0.1.0",
37
37
  "@types/socket.io": "3.0.2",
38
38
  "@types/socket.io-client": "3.0.0",
39
- "@types/ws": "8.2.0",
40
- "gulp": "4.0.2",
41
- "gulp-clean": "0.4.0",
42
- "gulp-typescript": "6.0.0-alpha.1",
43
- "http-terminator": "3.0.3",
44
- "jest": "27.3.1",
39
+ "@types/ws": "8.5.3",
40
+ "trash-cli":"5.0.0",
41
+ "http-terminator": "3.2.0",
42
+ "jest": "28.1.0",
45
43
  "jest-express": "1.12.0",
46
- "jest-junit": "13.0.0",
44
+ "jest-junit": "13.2.0",
47
45
  "reflect-metadata": "0.1.13",
48
46
  "rimraf": "3.0.2",
49
- "supertest": "6.1.6",
47
+ "supertest": "6.2.3",
50
48
  "toast-jsdoc": "1.0.2",
51
- "ts-jest": "27.0.7",
52
- "ts-node": "10.4.0",
49
+ "ts-jest": "28.0.3",
50
+ "ts-node": "10.8.0",
53
51
  "tslint": "6.1.3",
54
- "typescript": "4.4.4"
52
+ "typescript": "4.7.2"
55
53
  },
56
54
  "dependencies": {
57
55
  "bluebird": "3.7.2",
58
- "eiows": "3.7.3",
59
- "express": "4.17.1",
56
+ "eiows": "4.1.2",
57
+ "express": "4.18.1",
60
58
  "express-http-proxy": "1.6.3",
61
- "inversify": "^5.1.1",
59
+ "inversify": "6.0.1",
62
60
  "inversify-inject-decorators": "3.1.0",
63
61
  "lodash": "4.17.21",
64
- "socket.io": "4.3.2",
65
- "socket.io-client": "4.3.2",
62
+ "socket.io": "4.5.1",
63
+ "socket.io-client": "4.5.1",
66
64
  "url-scheme": "1.0.5",
67
- "ws": "8.2.3"
65
+ "ws": "8.7.0"
68
66
  },
69
67
  "repository": {
70
68
  "type": "git",
@@ -107,11 +105,11 @@
107
105
  },
108
106
  "homepage": "https://github.com/Expressive-Tea/expresive-tea#readme",
109
107
  "optionalDependencies": {
110
- "bufferutil": "^4.0.2",
111
- "utf-8-validate": "^5.0.3"
108
+ "bufferutil": "4.0.6",
109
+ "utf-8-validate": "^5.0.9"
112
110
  },
113
111
  "resolutions": {
114
112
  "set-value": "4.1.0",
115
- "glob-parent": "5.1.2"
113
+ "glob-parent": "6.0.2"
116
114
  }
117
115
  }
@@ -1,4 +1,5 @@
1
1
  /// <reference types="node" />
2
+ /// <reference types="node" />
2
3
  import WebSocket from 'ws';
3
4
  import * as http from 'http';
4
5
  import * as https from 'https';