@venok/http 1.0.1-canary.0
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/adapter/adapter.d.ts +57 -0
- package/adapter/adapter.js +58 -0
- package/adapter/host.d.ts +27 -0
- package/adapter/host.js +33 -0
- package/application/application.d.ts +18 -0
- package/application/application.js +51 -0
- package/application/config.d.ts +16 -0
- package/application/config.js +47 -0
- package/application/http.module-defenition.d.ts +8 -0
- package/application/http.module-defenition.js +6 -0
- package/application/http.module.d.ts +3 -0
- package/application/http.module.js +21 -0
- package/application/http.service.d.ts +11 -0
- package/application/http.service.js +43 -0
- package/application/starter.d.ts +41 -0
- package/application/starter.js +140 -0
- package/constants.d.ts +12 -0
- package/constants.js +15 -0
- package/context/context.d.ts +56 -0
- package/context/context.js +102 -0
- package/context/response.controller.d.ts +30 -0
- package/context/response.controller.js +86 -0
- package/decorators/controller.decorator.d.ts +82 -0
- package/decorators/controller.decorator.js +53 -0
- package/decorators/header.decorator.d.ts +12 -0
- package/decorators/header.decorator.js +23 -0
- package/decorators/http-code.decorator.d.ts +9 -0
- package/decorators/http-code.decorator.js +19 -0
- package/decorators/index.d.ts +9 -0
- package/decorators/index.js +25 -0
- package/decorators/redirect.decorator.d.ts +6 -0
- package/decorators/redirect.decorator.js +16 -0
- package/decorators/render.decorator.d.ts +10 -0
- package/decorators/render.decorator.js +20 -0
- package/decorators/request-mapping.decorator.d.ts +78 -0
- package/decorators/request-mapping.decorator.js +98 -0
- package/decorators/route-params.decorator.d.ts +378 -0
- package/decorators/route-params.decorator.js +227 -0
- package/decorators/sse.decorator.d.ts +6 -0
- package/decorators/sse.decorator.js +20 -0
- package/decorators/version.decorator.d.ts +7 -0
- package/decorators/version.decorator.js +20 -0
- package/enums/http-status.enum.d.ts +53 -0
- package/enums/http-status.enum.js +57 -0
- package/enums/index.d.ts +4 -0
- package/enums/index.js +20 -0
- package/enums/request-method.enum.d.ts +11 -0
- package/enums/request-method.enum.js +15 -0
- package/enums/route-paramtypes.enum.d.ts +14 -0
- package/enums/route-paramtypes.enum.js +18 -0
- package/enums/version-type.enum.d.ts +9 -0
- package/enums/version-type.enum.js +13 -0
- package/errors/bad-gateway.exception.d.ts +33 -0
- package/errors/bad-gateway.exception.js +41 -0
- package/errors/bad-request.exception.d.ts +33 -0
- package/errors/bad-request.exception.js +41 -0
- package/errors/conflict.exception.d.ts +33 -0
- package/errors/conflict.exception.js +41 -0
- package/errors/forbidden.exception.d.ts +33 -0
- package/errors/forbidden.exception.js +41 -0
- package/errors/gateway-timeout.exception.d.ts +33 -0
- package/errors/gateway-timeout.exception.js +41 -0
- package/errors/gone.exception.d.ts +33 -0
- package/errors/gone.exception.js +41 -0
- package/errors/http-version-not-supported.exception.d.ts +33 -0
- package/errors/http-version-not-supported.exception.js +41 -0
- package/errors/http.exception.d.ts +79 -0
- package/errors/http.exception.js +123 -0
- package/errors/im-a-teapot.exception.d.ts +36 -0
- package/errors/im-a-teapot.exception.js +44 -0
- package/errors/index.d.ts +11 -0
- package/errors/index.js +27 -0
- package/errors/internal-server-error.exception.d.ts +33 -0
- package/errors/internal-server-error.exception.js +41 -0
- package/errors/invalid-middleware-configuration.exception.d.ts +4 -0
- package/errors/invalid-middleware-configuration.exception.js +11 -0
- package/errors/invalid-middleware.exception.d.ts +4 -0
- package/errors/invalid-middleware.exception.js +11 -0
- package/errors/not-found.exception.d.ts +33 -0
- package/errors/not-found.exception.js +41 -0
- package/errors/unknown-request-mapping.exception.d.ts +5 -0
- package/errors/unknown-request-mapping.exception.js +11 -0
- package/exceptions/messages.d.ts +4 -0
- package/exceptions/messages.js +13 -0
- package/explorers/path.explorer.d.ts +8 -0
- package/explorers/path.explorer.js +38 -0
- package/explorers/router.explorer.d.ts +51 -0
- package/explorers/router.explorer.js +195 -0
- package/factory/context-id.factory.d.ts +41 -0
- package/factory/context-id.factory.js +52 -0
- package/factory/index.d.ts +4 -0
- package/factory/index.js +20 -0
- package/factory/method.factory.d.ts +5 -0
- package/factory/method.factory.js +30 -0
- package/factory/params.factory.d.ts +5 -0
- package/factory/params.factory.js +39 -0
- package/factory/path.factory.d.ts +13 -0
- package/factory/path.factory.js +95 -0
- package/filters/context.d.ts +9 -0
- package/filters/context.js +15 -0
- package/filters/filter.d.ts +22 -0
- package/filters/filter.js +78 -0
- package/helpers/adapter.helper.d.ts +27 -0
- package/helpers/adapter.helper.js +37 -0
- package/helpers/exclude-route.helper.d.ts +4 -0
- package/helpers/exclude-route.helper.js +18 -0
- package/helpers/flatten-routes.helper.d.ts +5 -0
- package/helpers/flatten-routes.helper.js +27 -0
- package/helpers/index.d.ts +6 -0
- package/helpers/index.js +22 -0
- package/helpers/messages.helper.d.ts +6 -0
- package/helpers/messages.helper.js +25 -0
- package/helpers/path.helper.d.ts +3 -0
- package/helpers/path.helper.js +13 -0
- package/helpers/sse.helper.d.ts +45 -0
- package/helpers/sse.helper.js +83 -0
- package/index.d.ts +1 -0
- package/index.js +3 -0
- package/interfaces/http/cors.interface.d.ts +58 -0
- package/interfaces/http/cors.interface.js +2 -0
- package/interfaces/http/exception.interface.d.ts +6 -0
- package/interfaces/http/exception.interface.js +2 -0
- package/interfaces/http/exclude-route.interface.d.ts +15 -0
- package/interfaces/http/exclude-route.interface.js +2 -0
- package/interfaces/http/index.d.ts +10 -0
- package/interfaces/http/index.js +26 -0
- package/interfaces/http/message-event.interface.d.ts +6 -0
- package/interfaces/http/message-event.interface.js +2 -0
- package/interfaces/http/module.inteface.d.ts +5 -0
- package/interfaces/http/module.inteface.js +2 -0
- package/interfaces/http/options.interface.d.ts +127 -0
- package/interfaces/http/options.interface.js +2 -0
- package/interfaces/http/path-metadata.interface.d.ts +31 -0
- package/interfaces/http/path-metadata.interface.js +2 -0
- package/interfaces/http/prefix-options.interface.d.ts +7 -0
- package/interfaces/http/prefix-options.interface.js +2 -0
- package/interfaces/http/raw-request.d.ts +4 -0
- package/interfaces/http/raw-request.js +2 -0
- package/interfaces/http/routes.interface.d.ts +7 -0
- package/interfaces/http/routes.interface.js +2 -0
- package/interfaces/http/server.interface.d.ts +54 -0
- package/interfaces/http/server.interface.js +2 -0
- package/interfaces/index.d.ts +3 -0
- package/interfaces/index.js +19 -0
- package/interfaces/middleware/config-proxy.interface.d.ts +23 -0
- package/interfaces/middleware/config-proxy.interface.js +2 -0
- package/interfaces/middleware/configuration.interface.d.ts +12 -0
- package/interfaces/middleware/configuration.interface.js +2 -0
- package/interfaces/middleware/consumer.interface.d.ts +16 -0
- package/interfaces/middleware/consumer.interface.js +2 -0
- package/interfaces/middleware/index.d.ts +4 -0
- package/interfaces/middleware/index.js +20 -0
- package/interfaces/middleware/middleware.interface.d.ts +7 -0
- package/interfaces/middleware/middleware.interface.js +2 -0
- package/interfaces/router/callback-paramtypes.interface.d.ts +1 -0
- package/interfaces/router/callback-paramtypes.interface.js +2 -0
- package/interfaces/router/definition.interface.d.ts +10 -0
- package/interfaces/router/definition.interface.js +2 -0
- package/interfaces/router/index.d.ts +3 -0
- package/interfaces/router/index.js +19 -0
- package/interfaces/router/version-options.interface.d.ts +92 -0
- package/interfaces/router/version-options.interface.js +9 -0
- package/middleware/builder.d.ts +15 -0
- package/middleware/builder.js +78 -0
- package/middleware/container.d.ts +13 -0
- package/middleware/container.js +50 -0
- package/middleware/extractor.d.ts +15 -0
- package/middleware/extractor.js +50 -0
- package/middleware/index.d.ts +1 -0
- package/middleware/index.js +17 -0
- package/middleware/module.d.ts +33 -0
- package/middleware/module.js +180 -0
- package/middleware/resolver.d.ts +10 -0
- package/middleware/resolver.js +27 -0
- package/middleware/routes-mapper.d.ts +19 -0
- package/middleware/routes-mapper.js +111 -0
- package/middleware/utils.d.ts +8 -0
- package/middleware/utils.js +86 -0
- package/package.json +41 -0
- package/router/module.d.ts +18 -0
- package/router/module.js +88 -0
- package/router/resolver.d.ts +31 -0
- package/router/resolver.js +128 -0
- package/storage/http-instance.storage.d.ts +9 -0
- package/storage/http-instance.storage.js +19 -0
- package/stream/index.d.ts +1 -0
- package/stream/index.js +17 -0
- package/stream/interfaces/index.d.ts +2 -0
- package/stream/interfaces/index.js +18 -0
- package/stream/interfaces/streamable-handler-response.interface.d.ts +12 -0
- package/stream/interfaces/streamable-handler-response.interface.js +2 -0
- package/stream/interfaces/streamable-options.interface.d.ts +10 -0
- package/stream/interfaces/streamable-options.interface.js +2 -0
- package/stream/streamable-file.d.ts +22 -0
- package/stream/streamable-file.js +55 -0
- package/test/context/response.controller.spec.d.ts +1 -0
- package/test/context/response.controller.spec.js +328 -0
- package/test/decorators/controller.decorator.spec.d.ts +1 -0
- package/test/decorators/controller.decorator.spec.js +113 -0
- package/test/decorators/header.decorator.spec.d.ts +1 -0
- package/test/decorators/header.decorator.spec.js +33 -0
- package/test/decorators/http-code.decorator.spec.d.ts +1 -0
- package/test/decorators/http-code.decorator.spec.js +30 -0
- package/test/decorators/redirect.decorator.spec.d.ts +1 -0
- package/test/decorators/redirect.decorator.spec.js +36 -0
- package/test/decorators/render.decorator.spec.d.ts +1 -0
- package/test/decorators/render.decorator.spec.js +30 -0
- package/test/decorators/request-mapping.decorator.spec.d.ts +1 -0
- package/test/decorators/request-mapping.decorator.spec.js +85 -0
- package/test/decorators/route-params.decorator.spec.d.ts +1 -0
- package/test/decorators/route-params.decorator.spec.js +493 -0
- package/test/decorators/sse.decorator.spec.d.ts +1 -0
- package/test/decorators/sse.decorator.spec.js +35 -0
- package/test/decorators/version.decorator.spec.d.ts +1 -0
- package/test/decorators/version.decorator.spec.js +43 -0
- package/test/exceptions/handler.spec.d.ts +1 -0
- package/test/exceptions/handler.spec.js +145 -0
- package/test/exceptions/proxy.spec.d.ts +1 -0
- package/test/exceptions/proxy.spec.js +74 -0
- package/test/explorers/path.explorer.spec.d.ts +1 -0
- package/test/explorers/path.explorer.spec.js +190 -0
- package/test/explorers/router.explorer.spec.d.ts +1 -0
- package/test/explorers/router.explorer.spec.js +206 -0
- package/test/factory/method.factory.spec.d.ts +1 -0
- package/test/factory/method.factory.spec.js +33 -0
- package/test/factory/params.factory.spec.d.ts +1 -0
- package/test/factory/params.factory.spec.js +104 -0
- package/test/factory/path.factory.spec.d.ts +1 -0
- package/test/factory/path.factory.spec.js +260 -0
- package/test/filters/context.spec.d.ts +1 -0
- package/test/filters/context.spec.js +96 -0
- package/test/filters/filter.spec.d.ts +1 -0
- package/test/filters/filter.spec.js +96 -0
- package/test/helpers/flatten-routes.helper.spec.d.ts +1 -0
- package/test/helpers/flatten-routes.helper.spec.js +131 -0
- package/test/helpers/sse.helper.spec.d.ts +1 -0
- package/test/helpers/sse.helper.spec.js +132 -0
- package/test/middleware/builder.spec.d.ts +1 -0
- package/test/middleware/builder.spec.js +235 -0
- package/test/middleware/container.spec.d.ts +1 -0
- package/test/middleware/container.spec.js +81 -0
- package/test/middleware/module.spec.d.ts +1 -0
- package/test/middleware/module.spec.js +206 -0
- package/test/middleware/route-info-path-extractor.spec.d.ts +1 -0
- package/test/middleware/route-info-path-extractor.spec.js +123 -0
- package/test/middleware/routes-mapper.spec.d.ts +1 -0
- package/test/middleware/routes-mapper.spec.js +162 -0
- package/test/middleware/utils.spec.d.ts +1 -0
- package/test/middleware/utils.spec.js +132 -0
- package/test/router/module.spec.d.ts +1 -0
- package/test/router/module.spec.js +40 -0
- package/test/router/resolver.spec.d.ts +1 -0
- package/test/router/resolver.spec.js +326 -0
- package/tsconfig.tsbuildinfo +1 -0
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.isMiddlewareRouteExcluded = exports.assignToken = exports.isMiddlewareClass = exports.mapToClass = exports.filterMiddleware = exports.mapToExcludeRoute = void 0;
|
|
4
|
+
const path_to_regexp_1 = require("path-to-regexp");
|
|
5
|
+
const uid_1 = require("uid");
|
|
6
|
+
const shared_helper_1 = require("../../core/helpers/shared.helper");
|
|
7
|
+
const enums_1 = require("../enums");
|
|
8
|
+
const helpers_1 = require("../helpers");
|
|
9
|
+
const mapToExcludeRoute = (routes) => {
|
|
10
|
+
return routes.map((route) => {
|
|
11
|
+
if ((0, shared_helper_1.isString)(route)) {
|
|
12
|
+
return {
|
|
13
|
+
path: route,
|
|
14
|
+
requestMethod: enums_1.RequestMethod.ALL,
|
|
15
|
+
pathRegex: (0, path_to_regexp_1.pathToRegexp)((0, helpers_1.addLeadingSlash)(route)),
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
return {
|
|
19
|
+
path: route.path,
|
|
20
|
+
requestMethod: route.method,
|
|
21
|
+
pathRegex: (0, path_to_regexp_1.pathToRegexp)((0, helpers_1.addLeadingSlash)(route.path)),
|
|
22
|
+
};
|
|
23
|
+
});
|
|
24
|
+
};
|
|
25
|
+
exports.mapToExcludeRoute = mapToExcludeRoute;
|
|
26
|
+
const filterMiddleware = (middleware, routes, httpAdapter) => {
|
|
27
|
+
const excludedRoutes = (0, exports.mapToExcludeRoute)(routes);
|
|
28
|
+
return middleware.filter(shared_helper_1.isFunction).map((item) => (0, exports.mapToClass)(item, excludedRoutes, httpAdapter));
|
|
29
|
+
};
|
|
30
|
+
exports.filterMiddleware = filterMiddleware;
|
|
31
|
+
const mapToClass = (middleware, excludedRoutes, httpAdapter) => {
|
|
32
|
+
if (isMiddlewareClass(middleware)) {
|
|
33
|
+
if (excludedRoutes.length <= 0) {
|
|
34
|
+
return middleware;
|
|
35
|
+
}
|
|
36
|
+
const MiddlewareHost = class extends middleware {
|
|
37
|
+
use(...params) {
|
|
38
|
+
const [req, _, next] = params;
|
|
39
|
+
const isExcluded = isMiddlewareRouteExcluded(req, excludedRoutes, httpAdapter);
|
|
40
|
+
if (isExcluded) {
|
|
41
|
+
return next();
|
|
42
|
+
}
|
|
43
|
+
return super.use(...params);
|
|
44
|
+
}
|
|
45
|
+
};
|
|
46
|
+
return assignToken(MiddlewareHost, middleware.name);
|
|
47
|
+
}
|
|
48
|
+
return assignToken(class {
|
|
49
|
+
constructor() {
|
|
50
|
+
this.use = (...params) => {
|
|
51
|
+
const [req, _, next] = params;
|
|
52
|
+
const isExcluded = isMiddlewareRouteExcluded(req, excludedRoutes, httpAdapter);
|
|
53
|
+
if (isExcluded) {
|
|
54
|
+
return next();
|
|
55
|
+
}
|
|
56
|
+
return middleware(...params);
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
});
|
|
60
|
+
};
|
|
61
|
+
exports.mapToClass = mapToClass;
|
|
62
|
+
function isMiddlewareClass(middleware) {
|
|
63
|
+
const middlewareStr = middleware.toString();
|
|
64
|
+
if (middlewareStr.substring(0, 5) === "class") {
|
|
65
|
+
return true;
|
|
66
|
+
}
|
|
67
|
+
const middlewareArr = middlewareStr.split(" ");
|
|
68
|
+
return (middlewareArr[0] === "function" && /[A-Z]/.test(middlewareArr[1]?.[0]) && (0, shared_helper_1.isFunction)(middleware.prototype?.use));
|
|
69
|
+
}
|
|
70
|
+
exports.isMiddlewareClass = isMiddlewareClass;
|
|
71
|
+
function assignToken(metatype, token = (0, uid_1.uid)(21)) {
|
|
72
|
+
Object.defineProperty(metatype, "name", { value: token });
|
|
73
|
+
return metatype;
|
|
74
|
+
}
|
|
75
|
+
exports.assignToken = assignToken;
|
|
76
|
+
function isMiddlewareRouteExcluded(req, excludedRoutes, httpAdapter) {
|
|
77
|
+
if (excludedRoutes.length <= 0 || !httpAdapter.getRequestUrl || !httpAdapter.getRequestMethod) {
|
|
78
|
+
return false;
|
|
79
|
+
}
|
|
80
|
+
const reqMethod = httpAdapter.getRequestMethod(req);
|
|
81
|
+
const originalUrl = httpAdapter.getRequestUrl(req);
|
|
82
|
+
const queryParamsIndex = originalUrl && originalUrl.indexOf("?");
|
|
83
|
+
const pathname = (0, shared_helper_1.isNumber)(queryParamsIndex) && queryParamsIndex >= 0 ? originalUrl.slice(0, +queryParamsIndex) : originalUrl;
|
|
84
|
+
return (0, helpers_1.isRouteExcluded)(excludedRoutes, pathname, enums_1.RequestMethod[reqMethod]);
|
|
85
|
+
}
|
|
86
|
+
exports.isMiddlewareRouteExcluded = isMiddlewareRouteExcluded;
|
package/package.json
ADDED
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@venok/http",
|
|
3
|
+
"version": "1.0.1-canary.0",
|
|
4
|
+
"description": "",
|
|
5
|
+
"author": "0x303133",
|
|
6
|
+
"homepage": "",
|
|
7
|
+
"main": "index.ts",
|
|
8
|
+
"publishConfig": {
|
|
9
|
+
"access": "public"
|
|
10
|
+
},
|
|
11
|
+
"repository": {
|
|
12
|
+
"type": "git",
|
|
13
|
+
"url": "git+https://github.com/venokjs/venok.git",
|
|
14
|
+
"directory": "packages/http"
|
|
15
|
+
},
|
|
16
|
+
"scripts": {
|
|
17
|
+
"build": "venok build",
|
|
18
|
+
"postbuild": "ts-node ../../tools/move.ts http",
|
|
19
|
+
"test": "mocha test/**/*.spec.ts"
|
|
20
|
+
},
|
|
21
|
+
"mocha": {
|
|
22
|
+
"require": [
|
|
23
|
+
"ts-node/register",
|
|
24
|
+
"tsconfig-paths/register",
|
|
25
|
+
"../../node_modules/reflect-metadata/Reflect.js",
|
|
26
|
+
"../../hooks/mocha-init-hook.ts"
|
|
27
|
+
],
|
|
28
|
+
"exit": true
|
|
29
|
+
},
|
|
30
|
+
"devDependencies": {
|
|
31
|
+
"@types/eventsource": "^1.1.12",
|
|
32
|
+
"@types/http-errors": "^2.0.2",
|
|
33
|
+
"@types/path-to-regexp": "^1.7.0",
|
|
34
|
+
"eventsource": "^2.0.2",
|
|
35
|
+
"http-errors": "^2.0.0"
|
|
36
|
+
},
|
|
37
|
+
"dependencies": {
|
|
38
|
+
"@venok/core": "^1.0.1-canary.0",
|
|
39
|
+
"path-to-regexp": "^6.2.1"
|
|
40
|
+
}
|
|
41
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { DynamicModule, ModulesContainer } from "@venok/core";
|
|
2
|
+
import { Module as ModuleClass } from "@venok/core/injector/module/module";
|
|
3
|
+
import { Routes } from "../interfaces";
|
|
4
|
+
export declare const ROUTES: unique symbol;
|
|
5
|
+
export declare const targetModulesByContainer: WeakMap<ModulesContainer, WeakSet<ModuleClass>>;
|
|
6
|
+
/**
|
|
7
|
+
* @publicApi
|
|
8
|
+
*/
|
|
9
|
+
export declare class RouterModule {
|
|
10
|
+
private readonly modulesContainer;
|
|
11
|
+
private readonly routes;
|
|
12
|
+
constructor(modulesContainer: ModulesContainer, routes: Routes);
|
|
13
|
+
static register(routes: Routes): DynamicModule;
|
|
14
|
+
private deepCloneRoutes;
|
|
15
|
+
private initialize;
|
|
16
|
+
private registerModulePathMetadata;
|
|
17
|
+
private updateTargetModulesCache;
|
|
18
|
+
}
|
package/router/module.js
ADDED
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
+
};
|
|
11
|
+
var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
12
|
+
return function (target, key) { decorator(target, key, paramIndex); }
|
|
13
|
+
};
|
|
14
|
+
var RouterModule_1;
|
|
15
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
16
|
+
exports.RouterModule = exports.targetModulesByContainer = exports.ROUTES = void 0;
|
|
17
|
+
const core_1 = require("../../core/index.ts");
|
|
18
|
+
const helpers_1 = require("../helpers");
|
|
19
|
+
const constants_1 = require("../../core/constants");
|
|
20
|
+
const helpers_2 = require("../helpers");
|
|
21
|
+
exports.ROUTES = Symbol("ROUTES");
|
|
22
|
+
exports.targetModulesByContainer = new WeakMap();
|
|
23
|
+
/**
|
|
24
|
+
* @publicApi
|
|
25
|
+
*/
|
|
26
|
+
let RouterModule = RouterModule_1 = class RouterModule {
|
|
27
|
+
constructor(modulesContainer, routes) {
|
|
28
|
+
this.modulesContainer = modulesContainer;
|
|
29
|
+
this.routes = routes;
|
|
30
|
+
this.routes = this.deepCloneRoutes(routes);
|
|
31
|
+
this.initialize();
|
|
32
|
+
}
|
|
33
|
+
static register(routes) {
|
|
34
|
+
return {
|
|
35
|
+
module: RouterModule_1,
|
|
36
|
+
providers: [
|
|
37
|
+
{
|
|
38
|
+
provide: exports.ROUTES,
|
|
39
|
+
useValue: routes,
|
|
40
|
+
},
|
|
41
|
+
],
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
deepCloneRoutes(routes) {
|
|
45
|
+
return routes.map((routeOrType) => {
|
|
46
|
+
if (typeof routeOrType === "function")
|
|
47
|
+
return routeOrType;
|
|
48
|
+
if (routeOrType.children) {
|
|
49
|
+
return {
|
|
50
|
+
...routeOrType,
|
|
51
|
+
children: this.deepCloneRoutes(routeOrType.children),
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
return { ...routeOrType };
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
initialize() {
|
|
58
|
+
const flattenedRoutes = (0, helpers_2.flattenRoutePaths)(this.routes);
|
|
59
|
+
flattenedRoutes.forEach((route) => {
|
|
60
|
+
const modulePath = (0, helpers_1.normalizePath)(route.path);
|
|
61
|
+
this.registerModulePathMetadata(route.module, modulePath);
|
|
62
|
+
this.updateTargetModulesCache(route.module);
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
registerModulePathMetadata(moduleCtor, modulePath) {
|
|
66
|
+
Reflect.defineMetadata(constants_1.MODULE_PATH + this.modulesContainer.applicationId, modulePath, moduleCtor);
|
|
67
|
+
}
|
|
68
|
+
updateTargetModulesCache(moduleCtor) {
|
|
69
|
+
let moduleClassSet;
|
|
70
|
+
if (exports.targetModulesByContainer.has(this.modulesContainer)) {
|
|
71
|
+
moduleClassSet = exports.targetModulesByContainer.get(this.modulesContainer);
|
|
72
|
+
}
|
|
73
|
+
else {
|
|
74
|
+
moduleClassSet = new WeakSet();
|
|
75
|
+
exports.targetModulesByContainer.set(this.modulesContainer, moduleClassSet);
|
|
76
|
+
}
|
|
77
|
+
const moduleRef = Array.from(this.modulesContainer.values()).find((item) => item?.metatype === moduleCtor);
|
|
78
|
+
if (!moduleRef)
|
|
79
|
+
return;
|
|
80
|
+
moduleClassSet.add(moduleRef);
|
|
81
|
+
}
|
|
82
|
+
};
|
|
83
|
+
exports.RouterModule = RouterModule;
|
|
84
|
+
exports.RouterModule = RouterModule = RouterModule_1 = __decorate([
|
|
85
|
+
(0, core_1.Module)({}),
|
|
86
|
+
__param(1, (0, core_1.Inject)(exports.ROUTES)),
|
|
87
|
+
__metadata("design:paramtypes", [core_1.ModulesContainer, Array])
|
|
88
|
+
], RouterModule);
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { ApplicationConfig, VenokContainer } from "@venok/core";
|
|
2
|
+
import { Injector } from "@venok/core/injector/injector";
|
|
3
|
+
import { GraphInspector } from "@venok/core/inspector/graph-inspector";
|
|
4
|
+
import { HttpServer } from "../interfaces";
|
|
5
|
+
import { InstanceWrapper } from "@venok/core/injector/instance/wrapper";
|
|
6
|
+
import { HttpConfig } from "../application/config";
|
|
7
|
+
export interface Resolver {
|
|
8
|
+
resolve(instance: any, basePath: string): void;
|
|
9
|
+
registerNotFoundHandler(): void;
|
|
10
|
+
registerExceptionHandler(): void;
|
|
11
|
+
}
|
|
12
|
+
export declare class RoutesResolver implements Resolver {
|
|
13
|
+
private readonly container;
|
|
14
|
+
private readonly applicationConfig;
|
|
15
|
+
private readonly httpConfig;
|
|
16
|
+
private readonly injector;
|
|
17
|
+
private readonly logger;
|
|
18
|
+
private readonly routerProxy;
|
|
19
|
+
private readonly routePathFactory;
|
|
20
|
+
private readonly routerExceptionsFilter;
|
|
21
|
+
private readonly routerExplorer;
|
|
22
|
+
constructor(container: VenokContainer, applicationConfig: ApplicationConfig, httpConfig: HttpConfig, injector: Injector, graphInspector: GraphInspector);
|
|
23
|
+
resolve<T extends HttpServer>(applicationRef: T, globalPrefix: string): void;
|
|
24
|
+
registerRouters(routes: Map<string | symbol | Function, InstanceWrapper<Object>>, moduleName: string, globalPrefix: string, modulePath: string, applicationRef: HttpServer): void;
|
|
25
|
+
registerNotFoundHandler(): void;
|
|
26
|
+
registerExceptionHandler(): void;
|
|
27
|
+
mapExternalException(err: any): any;
|
|
28
|
+
private getModulePathMetadata;
|
|
29
|
+
private getHostMetadata;
|
|
30
|
+
private getVersionMetadata;
|
|
31
|
+
}
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.RoutesResolver = void 0;
|
|
4
|
+
const logger_service_1 = require("../../core/services/logger.service");
|
|
5
|
+
const factory_1 = require("../factory");
|
|
6
|
+
const context_1 = require("../filters/context");
|
|
7
|
+
const router_explorer_1 = require("../explorers/router.explorer");
|
|
8
|
+
const core_1 = require("../../core/index.ts");
|
|
9
|
+
const constants_1 = require("../constants");
|
|
10
|
+
const constants_2 = require("../../core/constants");
|
|
11
|
+
const helpers_1 = require("../helpers");
|
|
12
|
+
const errors_1 = require("../errors");
|
|
13
|
+
const shared_helper_1 = require("../../core/helpers/shared.helper");
|
|
14
|
+
const context_2 = require("../../core/context");
|
|
15
|
+
class RoutesResolver {
|
|
16
|
+
constructor(container, applicationConfig, httpConfig, injector, graphInspector) {
|
|
17
|
+
this.container = container;
|
|
18
|
+
this.applicationConfig = applicationConfig;
|
|
19
|
+
this.httpConfig = httpConfig;
|
|
20
|
+
this.injector = injector;
|
|
21
|
+
this.logger = new logger_service_1.Logger(RoutesResolver.name, {
|
|
22
|
+
timestamp: true,
|
|
23
|
+
});
|
|
24
|
+
this.routerProxy = new context_2.VenokProxy();
|
|
25
|
+
const httpAdapterRef = httpConfig.getHttpAdapterRef();
|
|
26
|
+
this.routerExceptionsFilter = new context_1.RouterExceptionFiltersContext(container, applicationConfig, httpAdapterRef);
|
|
27
|
+
this.routePathFactory = new factory_1.RoutePathFactory(this.httpConfig);
|
|
28
|
+
const metadataScanner = new core_1.MetadataScanner();
|
|
29
|
+
this.routerExplorer = new router_explorer_1.RouterExplorer(metadataScanner, this.container, this.injector, this.routerProxy, this.routerExceptionsFilter, this.applicationConfig, this.routePathFactory, graphInspector, httpConfig.getHttpAdapterRef());
|
|
30
|
+
}
|
|
31
|
+
resolve(applicationRef, globalPrefix) {
|
|
32
|
+
const modules = this.container.getModules();
|
|
33
|
+
// Change Controllers to Injectables
|
|
34
|
+
// Global change
|
|
35
|
+
modules.forEach(({ providers, metatype }, moduleName) => {
|
|
36
|
+
const modulePath = this.getModulePathMetadata(metatype);
|
|
37
|
+
this.registerRouters(providers, moduleName, globalPrefix, modulePath, applicationRef);
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
registerRouters(routes, moduleName, globalPrefix, modulePath, applicationRef) {
|
|
41
|
+
routes.forEach((instanceWrapper) => {
|
|
42
|
+
const { metatype } = instanceWrapper;
|
|
43
|
+
if ((0, shared_helper_1.isUndefined)(metatype) || (0, shared_helper_1.isNull)(metatype))
|
|
44
|
+
return;
|
|
45
|
+
if (!Reflect.hasMetadata(constants_1.CONTROLLER_WATERMARK, metatype))
|
|
46
|
+
return;
|
|
47
|
+
const host = this.getHostMetadata(metatype);
|
|
48
|
+
const routerPaths = this.routerExplorer.extractRouterPath(metatype);
|
|
49
|
+
const controllerVersion = this.getVersionMetadata(metatype);
|
|
50
|
+
const controllerName = metatype.name;
|
|
51
|
+
routerPaths.forEach((path) => {
|
|
52
|
+
const pathsToLog = this.routePathFactory.create({
|
|
53
|
+
ctrlPath: path,
|
|
54
|
+
modulePath,
|
|
55
|
+
globalPrefix,
|
|
56
|
+
});
|
|
57
|
+
if (!controllerVersion) {
|
|
58
|
+
pathsToLog.forEach((path) => {
|
|
59
|
+
const logMessage = (0, helpers_1.CONTROLLER_MAPPING_MESSAGE)(controllerName, path);
|
|
60
|
+
this.logger.log(logMessage);
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
else {
|
|
64
|
+
pathsToLog.forEach((path) => {
|
|
65
|
+
const logMessage = (0, helpers_1.VERSIONED_CONTROLLER_MAPPING_MESSAGE)(controllerName, path, controllerVersion);
|
|
66
|
+
this.logger.log(logMessage);
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
const versioningOptions = this.httpConfig.getVersioning();
|
|
70
|
+
const routePathMetadata = {
|
|
71
|
+
ctrlPath: path,
|
|
72
|
+
modulePath,
|
|
73
|
+
globalPrefix,
|
|
74
|
+
controllerVersion,
|
|
75
|
+
versioningOptions,
|
|
76
|
+
};
|
|
77
|
+
this.routerExplorer.explore(instanceWrapper, moduleName, applicationRef, host, routePathMetadata);
|
|
78
|
+
});
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
registerNotFoundHandler() {
|
|
82
|
+
const applicationRef = this.httpConfig.getHttpAdapterRef();
|
|
83
|
+
const callback = (req, res) => {
|
|
84
|
+
const method = applicationRef.getRequestMethod(req);
|
|
85
|
+
const url = applicationRef.getRequestUrl(req);
|
|
86
|
+
throw new errors_1.NotFoundException(`Cannot ${method} ${url}`);
|
|
87
|
+
};
|
|
88
|
+
const handler = this.routerExceptionsFilter.create({}, callback, undefined);
|
|
89
|
+
const proxy = this.routerProxy.createProxy(callback, handler);
|
|
90
|
+
applicationRef.setNotFoundHandler && applicationRef.setNotFoundHandler(proxy, this.httpConfig.getGlobalPrefix());
|
|
91
|
+
}
|
|
92
|
+
registerExceptionHandler() {
|
|
93
|
+
const callback = (err, req, res, next) => {
|
|
94
|
+
throw this.mapExternalException(err);
|
|
95
|
+
};
|
|
96
|
+
const handler = this.routerExceptionsFilter.create({}, callback, undefined);
|
|
97
|
+
// REFACTOR
|
|
98
|
+
const proxy = this.routerProxy.createProxy(callback, handler);
|
|
99
|
+
const applicationRef = this.httpConfig.getHttpAdapterRef();
|
|
100
|
+
if ("setErrorHandler" in applicationRef)
|
|
101
|
+
applicationRef.setErrorHandler(proxy, this.httpConfig.getGlobalPrefix());
|
|
102
|
+
}
|
|
103
|
+
mapExternalException(err) {
|
|
104
|
+
switch (true) {
|
|
105
|
+
// SyntaxError is thrown by Express body-parser when given invalid JSON (#422, #430)
|
|
106
|
+
// URIError is thrown by Express when given a path parameter with an invalid percentage
|
|
107
|
+
// encoding, e.g. '%FF' (#8915)
|
|
108
|
+
case err instanceof SyntaxError || err instanceof URIError:
|
|
109
|
+
return new errors_1.BadRequestException(err.message);
|
|
110
|
+
default:
|
|
111
|
+
return err;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
getModulePathMetadata(metatype) {
|
|
115
|
+
const modulesContainer = this.container.getModules();
|
|
116
|
+
const modulePath = Reflect.getMetadata(constants_2.MODULE_PATH + modulesContainer.applicationId, metatype);
|
|
117
|
+
return modulePath ?? Reflect.getMetadata(constants_2.MODULE_PATH, metatype);
|
|
118
|
+
}
|
|
119
|
+
getHostMetadata(metatype) {
|
|
120
|
+
return Reflect.getMetadata(constants_1.HOST_METADATA, metatype);
|
|
121
|
+
}
|
|
122
|
+
getVersionMetadata(metatype) {
|
|
123
|
+
const versioningConfig = this.httpConfig.getVersioning();
|
|
124
|
+
if (versioningConfig)
|
|
125
|
+
return Reflect.getMetadata(constants_1.VERSION_METADATA, metatype) ?? versioningConfig.defaultVersion;
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
exports.RoutesResolver = RoutesResolver;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { AbstractHttpAdapter } from "../adapter/adapter";
|
|
2
|
+
import { HttpAdapterHost } from "../adapter/host";
|
|
3
|
+
export declare class HttpInstanceStorage {
|
|
4
|
+
private readonly _httpAdapterHost;
|
|
5
|
+
private _httpAdapter;
|
|
6
|
+
get httpAdapterHost(): HttpAdapterHost;
|
|
7
|
+
get httpAdapter(): AbstractHttpAdapter;
|
|
8
|
+
set httpAdapter(httpAdapter: AbstractHttpAdapter);
|
|
9
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.HttpInstanceStorage = void 0;
|
|
4
|
+
const host_1 = require("../adapter/host");
|
|
5
|
+
class HttpInstanceStorage {
|
|
6
|
+
constructor() {
|
|
7
|
+
this._httpAdapterHost = new host_1.HttpAdapterHost();
|
|
8
|
+
}
|
|
9
|
+
get httpAdapterHost() {
|
|
10
|
+
return this._httpAdapterHost;
|
|
11
|
+
}
|
|
12
|
+
get httpAdapter() {
|
|
13
|
+
return this._httpAdapter;
|
|
14
|
+
}
|
|
15
|
+
set httpAdapter(httpAdapter) {
|
|
16
|
+
this._httpAdapter = httpAdapter;
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
exports.HttpInstanceStorage = HttpInstanceStorage;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from "./streamable-file";
|
package/stream/index.js
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./streamable-file"), exports);
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./streamable-options.interface"), exports);
|
|
18
|
+
__exportStar(require("./streamable-handler-response.interface"), exports);
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export interface StreamableHandlerResponse {
|
|
2
|
+
/** `true` if the connection is destroyed, `false` otherwise. */
|
|
3
|
+
destroyed: boolean;
|
|
4
|
+
/** `true` if headers were sent, `false` otherwise. */
|
|
5
|
+
headersSent: boolean;
|
|
6
|
+
/** The status code that will be sent to the client when the headers get flushed. */
|
|
7
|
+
statusCode: number;
|
|
8
|
+
/** Sends the HTTP response. */
|
|
9
|
+
send: (body: string) => void;
|
|
10
|
+
/** Signals to the server that all the response headers and body have been sent. */
|
|
11
|
+
end: () => void;
|
|
12
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/// <reference types="node" />
|
|
2
|
+
import { Readable } from "stream";
|
|
3
|
+
import { StreamableFileOptions, StreamableHandlerResponse } from "./interfaces";
|
|
4
|
+
/**
|
|
5
|
+
*
|
|
6
|
+
* @publicApi
|
|
7
|
+
*/
|
|
8
|
+
export declare class StreamableFile {
|
|
9
|
+
readonly options: StreamableFileOptions;
|
|
10
|
+
private readonly stream;
|
|
11
|
+
protected handleError: (err: Error, response: StreamableHandlerResponse) => void;
|
|
12
|
+
constructor(buffer: Uint8Array, options?: StreamableFileOptions);
|
|
13
|
+
constructor(readable: Readable, options?: StreamableFileOptions);
|
|
14
|
+
getStream(): Readable;
|
|
15
|
+
getHeaders(): {
|
|
16
|
+
type: string;
|
|
17
|
+
disposition: string | undefined;
|
|
18
|
+
length: number | undefined;
|
|
19
|
+
};
|
|
20
|
+
get errorHandler(): (err: Error, response: StreamableHandlerResponse) => void;
|
|
21
|
+
setErrorHandler(handler: (err: Error, response: StreamableHandlerResponse) => void): this;
|
|
22
|
+
}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.StreamableFile = void 0;
|
|
4
|
+
const stream_1 = require("../../../../../../stream");
|
|
5
|
+
const util_1 = require("util");
|
|
6
|
+
const enums_1 = require("../enums");
|
|
7
|
+
const shared_helper_1 = require("../../core/helpers/shared.helper");
|
|
8
|
+
/**
|
|
9
|
+
*
|
|
10
|
+
* @publicApi
|
|
11
|
+
*/
|
|
12
|
+
class StreamableFile {
|
|
13
|
+
constructor(bufferOrReadStream, options = {}) {
|
|
14
|
+
this.options = options;
|
|
15
|
+
this.handleError = (err, res) => {
|
|
16
|
+
if (res.destroyed) {
|
|
17
|
+
return;
|
|
18
|
+
}
|
|
19
|
+
if (res.headersSent) {
|
|
20
|
+
res.end();
|
|
21
|
+
return;
|
|
22
|
+
}
|
|
23
|
+
res.statusCode = enums_1.HttpStatus.BAD_REQUEST;
|
|
24
|
+
res.send(err.message);
|
|
25
|
+
};
|
|
26
|
+
if (util_1.types.isUint8Array(bufferOrReadStream)) {
|
|
27
|
+
this.stream = new stream_1.Readable();
|
|
28
|
+
this.stream.push(bufferOrReadStream);
|
|
29
|
+
this.stream.push(null);
|
|
30
|
+
this.options.length ??= bufferOrReadStream.length;
|
|
31
|
+
}
|
|
32
|
+
else if (bufferOrReadStream.pipe && (0, shared_helper_1.isFunction)(bufferOrReadStream.pipe)) {
|
|
33
|
+
this.stream = bufferOrReadStream;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
getStream() {
|
|
37
|
+
return this.stream;
|
|
38
|
+
}
|
|
39
|
+
getHeaders() {
|
|
40
|
+
const { type = "application/octet-stream", disposition = undefined, length = undefined } = this.options;
|
|
41
|
+
return {
|
|
42
|
+
type,
|
|
43
|
+
disposition,
|
|
44
|
+
length,
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
get errorHandler() {
|
|
48
|
+
return this.handleError;
|
|
49
|
+
}
|
|
50
|
+
setErrorHandler(handler) {
|
|
51
|
+
this.handleError = handler;
|
|
52
|
+
return this;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
exports.StreamableFile = StreamableFile;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|