@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.
Files changed (254) hide show
  1. package/adapter/adapter.d.ts +57 -0
  2. package/adapter/adapter.js +58 -0
  3. package/adapter/host.d.ts +27 -0
  4. package/adapter/host.js +33 -0
  5. package/application/application.d.ts +18 -0
  6. package/application/application.js +51 -0
  7. package/application/config.d.ts +16 -0
  8. package/application/config.js +47 -0
  9. package/application/http.module-defenition.d.ts +8 -0
  10. package/application/http.module-defenition.js +6 -0
  11. package/application/http.module.d.ts +3 -0
  12. package/application/http.module.js +21 -0
  13. package/application/http.service.d.ts +11 -0
  14. package/application/http.service.js +43 -0
  15. package/application/starter.d.ts +41 -0
  16. package/application/starter.js +140 -0
  17. package/constants.d.ts +12 -0
  18. package/constants.js +15 -0
  19. package/context/context.d.ts +56 -0
  20. package/context/context.js +102 -0
  21. package/context/response.controller.d.ts +30 -0
  22. package/context/response.controller.js +86 -0
  23. package/decorators/controller.decorator.d.ts +82 -0
  24. package/decorators/controller.decorator.js +53 -0
  25. package/decorators/header.decorator.d.ts +12 -0
  26. package/decorators/header.decorator.js +23 -0
  27. package/decorators/http-code.decorator.d.ts +9 -0
  28. package/decorators/http-code.decorator.js +19 -0
  29. package/decorators/index.d.ts +9 -0
  30. package/decorators/index.js +25 -0
  31. package/decorators/redirect.decorator.d.ts +6 -0
  32. package/decorators/redirect.decorator.js +16 -0
  33. package/decorators/render.decorator.d.ts +10 -0
  34. package/decorators/render.decorator.js +20 -0
  35. package/decorators/request-mapping.decorator.d.ts +78 -0
  36. package/decorators/request-mapping.decorator.js +98 -0
  37. package/decorators/route-params.decorator.d.ts +378 -0
  38. package/decorators/route-params.decorator.js +227 -0
  39. package/decorators/sse.decorator.d.ts +6 -0
  40. package/decorators/sse.decorator.js +20 -0
  41. package/decorators/version.decorator.d.ts +7 -0
  42. package/decorators/version.decorator.js +20 -0
  43. package/enums/http-status.enum.d.ts +53 -0
  44. package/enums/http-status.enum.js +57 -0
  45. package/enums/index.d.ts +4 -0
  46. package/enums/index.js +20 -0
  47. package/enums/request-method.enum.d.ts +11 -0
  48. package/enums/request-method.enum.js +15 -0
  49. package/enums/route-paramtypes.enum.d.ts +14 -0
  50. package/enums/route-paramtypes.enum.js +18 -0
  51. package/enums/version-type.enum.d.ts +9 -0
  52. package/enums/version-type.enum.js +13 -0
  53. package/errors/bad-gateway.exception.d.ts +33 -0
  54. package/errors/bad-gateway.exception.js +41 -0
  55. package/errors/bad-request.exception.d.ts +33 -0
  56. package/errors/bad-request.exception.js +41 -0
  57. package/errors/conflict.exception.d.ts +33 -0
  58. package/errors/conflict.exception.js +41 -0
  59. package/errors/forbidden.exception.d.ts +33 -0
  60. package/errors/forbidden.exception.js +41 -0
  61. package/errors/gateway-timeout.exception.d.ts +33 -0
  62. package/errors/gateway-timeout.exception.js +41 -0
  63. package/errors/gone.exception.d.ts +33 -0
  64. package/errors/gone.exception.js +41 -0
  65. package/errors/http-version-not-supported.exception.d.ts +33 -0
  66. package/errors/http-version-not-supported.exception.js +41 -0
  67. package/errors/http.exception.d.ts +79 -0
  68. package/errors/http.exception.js +123 -0
  69. package/errors/im-a-teapot.exception.d.ts +36 -0
  70. package/errors/im-a-teapot.exception.js +44 -0
  71. package/errors/index.d.ts +11 -0
  72. package/errors/index.js +27 -0
  73. package/errors/internal-server-error.exception.d.ts +33 -0
  74. package/errors/internal-server-error.exception.js +41 -0
  75. package/errors/invalid-middleware-configuration.exception.d.ts +4 -0
  76. package/errors/invalid-middleware-configuration.exception.js +11 -0
  77. package/errors/invalid-middleware.exception.d.ts +4 -0
  78. package/errors/invalid-middleware.exception.js +11 -0
  79. package/errors/not-found.exception.d.ts +33 -0
  80. package/errors/not-found.exception.js +41 -0
  81. package/errors/unknown-request-mapping.exception.d.ts +5 -0
  82. package/errors/unknown-request-mapping.exception.js +11 -0
  83. package/exceptions/messages.d.ts +4 -0
  84. package/exceptions/messages.js +13 -0
  85. package/explorers/path.explorer.d.ts +8 -0
  86. package/explorers/path.explorer.js +38 -0
  87. package/explorers/router.explorer.d.ts +51 -0
  88. package/explorers/router.explorer.js +195 -0
  89. package/factory/context-id.factory.d.ts +41 -0
  90. package/factory/context-id.factory.js +52 -0
  91. package/factory/index.d.ts +4 -0
  92. package/factory/index.js +20 -0
  93. package/factory/method.factory.d.ts +5 -0
  94. package/factory/method.factory.js +30 -0
  95. package/factory/params.factory.d.ts +5 -0
  96. package/factory/params.factory.js +39 -0
  97. package/factory/path.factory.d.ts +13 -0
  98. package/factory/path.factory.js +95 -0
  99. package/filters/context.d.ts +9 -0
  100. package/filters/context.js +15 -0
  101. package/filters/filter.d.ts +22 -0
  102. package/filters/filter.js +78 -0
  103. package/helpers/adapter.helper.d.ts +27 -0
  104. package/helpers/adapter.helper.js +37 -0
  105. package/helpers/exclude-route.helper.d.ts +4 -0
  106. package/helpers/exclude-route.helper.js +18 -0
  107. package/helpers/flatten-routes.helper.d.ts +5 -0
  108. package/helpers/flatten-routes.helper.js +27 -0
  109. package/helpers/index.d.ts +6 -0
  110. package/helpers/index.js +22 -0
  111. package/helpers/messages.helper.d.ts +6 -0
  112. package/helpers/messages.helper.js +25 -0
  113. package/helpers/path.helper.d.ts +3 -0
  114. package/helpers/path.helper.js +13 -0
  115. package/helpers/sse.helper.d.ts +45 -0
  116. package/helpers/sse.helper.js +83 -0
  117. package/index.d.ts +1 -0
  118. package/index.js +3 -0
  119. package/interfaces/http/cors.interface.d.ts +58 -0
  120. package/interfaces/http/cors.interface.js +2 -0
  121. package/interfaces/http/exception.interface.d.ts +6 -0
  122. package/interfaces/http/exception.interface.js +2 -0
  123. package/interfaces/http/exclude-route.interface.d.ts +15 -0
  124. package/interfaces/http/exclude-route.interface.js +2 -0
  125. package/interfaces/http/index.d.ts +10 -0
  126. package/interfaces/http/index.js +26 -0
  127. package/interfaces/http/message-event.interface.d.ts +6 -0
  128. package/interfaces/http/message-event.interface.js +2 -0
  129. package/interfaces/http/module.inteface.d.ts +5 -0
  130. package/interfaces/http/module.inteface.js +2 -0
  131. package/interfaces/http/options.interface.d.ts +127 -0
  132. package/interfaces/http/options.interface.js +2 -0
  133. package/interfaces/http/path-metadata.interface.d.ts +31 -0
  134. package/interfaces/http/path-metadata.interface.js +2 -0
  135. package/interfaces/http/prefix-options.interface.d.ts +7 -0
  136. package/interfaces/http/prefix-options.interface.js +2 -0
  137. package/interfaces/http/raw-request.d.ts +4 -0
  138. package/interfaces/http/raw-request.js +2 -0
  139. package/interfaces/http/routes.interface.d.ts +7 -0
  140. package/interfaces/http/routes.interface.js +2 -0
  141. package/interfaces/http/server.interface.d.ts +54 -0
  142. package/interfaces/http/server.interface.js +2 -0
  143. package/interfaces/index.d.ts +3 -0
  144. package/interfaces/index.js +19 -0
  145. package/interfaces/middleware/config-proxy.interface.d.ts +23 -0
  146. package/interfaces/middleware/config-proxy.interface.js +2 -0
  147. package/interfaces/middleware/configuration.interface.d.ts +12 -0
  148. package/interfaces/middleware/configuration.interface.js +2 -0
  149. package/interfaces/middleware/consumer.interface.d.ts +16 -0
  150. package/interfaces/middleware/consumer.interface.js +2 -0
  151. package/interfaces/middleware/index.d.ts +4 -0
  152. package/interfaces/middleware/index.js +20 -0
  153. package/interfaces/middleware/middleware.interface.d.ts +7 -0
  154. package/interfaces/middleware/middleware.interface.js +2 -0
  155. package/interfaces/router/callback-paramtypes.interface.d.ts +1 -0
  156. package/interfaces/router/callback-paramtypes.interface.js +2 -0
  157. package/interfaces/router/definition.interface.d.ts +10 -0
  158. package/interfaces/router/definition.interface.js +2 -0
  159. package/interfaces/router/index.d.ts +3 -0
  160. package/interfaces/router/index.js +19 -0
  161. package/interfaces/router/version-options.interface.d.ts +92 -0
  162. package/interfaces/router/version-options.interface.js +9 -0
  163. package/middleware/builder.d.ts +15 -0
  164. package/middleware/builder.js +78 -0
  165. package/middleware/container.d.ts +13 -0
  166. package/middleware/container.js +50 -0
  167. package/middleware/extractor.d.ts +15 -0
  168. package/middleware/extractor.js +50 -0
  169. package/middleware/index.d.ts +1 -0
  170. package/middleware/index.js +17 -0
  171. package/middleware/module.d.ts +33 -0
  172. package/middleware/module.js +180 -0
  173. package/middleware/resolver.d.ts +10 -0
  174. package/middleware/resolver.js +27 -0
  175. package/middleware/routes-mapper.d.ts +19 -0
  176. package/middleware/routes-mapper.js +111 -0
  177. package/middleware/utils.d.ts +8 -0
  178. package/middleware/utils.js +86 -0
  179. package/package.json +41 -0
  180. package/router/module.d.ts +18 -0
  181. package/router/module.js +88 -0
  182. package/router/resolver.d.ts +31 -0
  183. package/router/resolver.js +128 -0
  184. package/storage/http-instance.storage.d.ts +9 -0
  185. package/storage/http-instance.storage.js +19 -0
  186. package/stream/index.d.ts +1 -0
  187. package/stream/index.js +17 -0
  188. package/stream/interfaces/index.d.ts +2 -0
  189. package/stream/interfaces/index.js +18 -0
  190. package/stream/interfaces/streamable-handler-response.interface.d.ts +12 -0
  191. package/stream/interfaces/streamable-handler-response.interface.js +2 -0
  192. package/stream/interfaces/streamable-options.interface.d.ts +10 -0
  193. package/stream/interfaces/streamable-options.interface.js +2 -0
  194. package/stream/streamable-file.d.ts +22 -0
  195. package/stream/streamable-file.js +55 -0
  196. package/test/context/response.controller.spec.d.ts +1 -0
  197. package/test/context/response.controller.spec.js +328 -0
  198. package/test/decorators/controller.decorator.spec.d.ts +1 -0
  199. package/test/decorators/controller.decorator.spec.js +113 -0
  200. package/test/decorators/header.decorator.spec.d.ts +1 -0
  201. package/test/decorators/header.decorator.spec.js +33 -0
  202. package/test/decorators/http-code.decorator.spec.d.ts +1 -0
  203. package/test/decorators/http-code.decorator.spec.js +30 -0
  204. package/test/decorators/redirect.decorator.spec.d.ts +1 -0
  205. package/test/decorators/redirect.decorator.spec.js +36 -0
  206. package/test/decorators/render.decorator.spec.d.ts +1 -0
  207. package/test/decorators/render.decorator.spec.js +30 -0
  208. package/test/decorators/request-mapping.decorator.spec.d.ts +1 -0
  209. package/test/decorators/request-mapping.decorator.spec.js +85 -0
  210. package/test/decorators/route-params.decorator.spec.d.ts +1 -0
  211. package/test/decorators/route-params.decorator.spec.js +493 -0
  212. package/test/decorators/sse.decorator.spec.d.ts +1 -0
  213. package/test/decorators/sse.decorator.spec.js +35 -0
  214. package/test/decorators/version.decorator.spec.d.ts +1 -0
  215. package/test/decorators/version.decorator.spec.js +43 -0
  216. package/test/exceptions/handler.spec.d.ts +1 -0
  217. package/test/exceptions/handler.spec.js +145 -0
  218. package/test/exceptions/proxy.spec.d.ts +1 -0
  219. package/test/exceptions/proxy.spec.js +74 -0
  220. package/test/explorers/path.explorer.spec.d.ts +1 -0
  221. package/test/explorers/path.explorer.spec.js +190 -0
  222. package/test/explorers/router.explorer.spec.d.ts +1 -0
  223. package/test/explorers/router.explorer.spec.js +206 -0
  224. package/test/factory/method.factory.spec.d.ts +1 -0
  225. package/test/factory/method.factory.spec.js +33 -0
  226. package/test/factory/params.factory.spec.d.ts +1 -0
  227. package/test/factory/params.factory.spec.js +104 -0
  228. package/test/factory/path.factory.spec.d.ts +1 -0
  229. package/test/factory/path.factory.spec.js +260 -0
  230. package/test/filters/context.spec.d.ts +1 -0
  231. package/test/filters/context.spec.js +96 -0
  232. package/test/filters/filter.spec.d.ts +1 -0
  233. package/test/filters/filter.spec.js +96 -0
  234. package/test/helpers/flatten-routes.helper.spec.d.ts +1 -0
  235. package/test/helpers/flatten-routes.helper.spec.js +131 -0
  236. package/test/helpers/sse.helper.spec.d.ts +1 -0
  237. package/test/helpers/sse.helper.spec.js +132 -0
  238. package/test/middleware/builder.spec.d.ts +1 -0
  239. package/test/middleware/builder.spec.js +235 -0
  240. package/test/middleware/container.spec.d.ts +1 -0
  241. package/test/middleware/container.spec.js +81 -0
  242. package/test/middleware/module.spec.d.ts +1 -0
  243. package/test/middleware/module.spec.js +206 -0
  244. package/test/middleware/route-info-path-extractor.spec.d.ts +1 -0
  245. package/test/middleware/route-info-path-extractor.spec.js +123 -0
  246. package/test/middleware/routes-mapper.spec.d.ts +1 -0
  247. package/test/middleware/routes-mapper.spec.js +162 -0
  248. package/test/middleware/utils.spec.d.ts +1 -0
  249. package/test/middleware/utils.spec.js +132 -0
  250. package/test/router/module.spec.d.ts +1 -0
  251. package/test/router/module.spec.js +40 -0
  252. package/test/router/resolver.spec.d.ts +1 -0
  253. package/test/router/resolver.spec.js +326 -0
  254. package/tsconfig.tsbuildinfo +1 -0
@@ -0,0 +1,95 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.RoutePathFactory = void 0;
4
+ const interfaces_1 = require("../interfaces");
5
+ const enums_1 = require("../enums");
6
+ const flatten_helper_1 = require("../../core/helpers/flatten.helper");
7
+ const helpers_1 = require("../helpers");
8
+ const shared_helper_1 = require("../../core/helpers/shared.helper");
9
+ class RoutePathFactory {
10
+ constructor(config) {
11
+ this.config = config;
12
+ }
13
+ create(metadata, requestMethod) {
14
+ let paths = [""];
15
+ const versionOrVersions = this.getVersion(metadata);
16
+ if (versionOrVersions && metadata.versioningOptions?.type === enums_1.VersioningType.URI) {
17
+ const versionPrefix = this.getVersionPrefix(metadata.versioningOptions);
18
+ if (Array.isArray(versionOrVersions)) {
19
+ paths = (0, flatten_helper_1.flatten)(paths.map((path) => versionOrVersions.map((version) =>
20
+ // Version Neutral - Do not include version in URL
21
+ version === interfaces_1.VERSION_NEUTRAL ? path : `${path}/${versionPrefix}${version}`)));
22
+ }
23
+ else {
24
+ // Version Neutral - Do not include version in URL
25
+ if (versionOrVersions !== interfaces_1.VERSION_NEUTRAL) {
26
+ paths = paths.map((path) => `${path}/${versionPrefix}${versionOrVersions}`);
27
+ }
28
+ }
29
+ }
30
+ paths = this.appendToAllIfDefined(paths, metadata.modulePath);
31
+ paths = this.appendToAllIfDefined(paths, metadata.ctrlPath);
32
+ paths = this.appendToAllIfDefined(paths, metadata.methodPath);
33
+ if (metadata.globalPrefix) {
34
+ paths = paths.map((path) => {
35
+ if (this.isExcludedFromGlobalPrefix(path, requestMethod, versionOrVersions, metadata.versioningOptions)) {
36
+ return path;
37
+ }
38
+ return (0, helpers_1.stripEndSlash)(metadata.globalPrefix || "") + path;
39
+ });
40
+ }
41
+ return paths.map((path) => (0, helpers_1.addLeadingSlash)(path || "/")).map((path) => (path !== "/" ? (0, helpers_1.stripEndSlash)(path) : path));
42
+ }
43
+ getVersion(metadata) {
44
+ // The version will be either the path version or the controller version,
45
+ // with the pathVersion taking priority.
46
+ return metadata.methodVersion || metadata.controllerVersion;
47
+ }
48
+ getVersionPrefix(versioningOptions) {
49
+ const defaultPrefix = "v";
50
+ if (versioningOptions.type === enums_1.VersioningType.URI) {
51
+ if (versioningOptions.prefix === false) {
52
+ return "";
53
+ }
54
+ else if (versioningOptions.prefix !== undefined) {
55
+ return versioningOptions.prefix;
56
+ }
57
+ }
58
+ return defaultPrefix;
59
+ }
60
+ appendToAllIfDefined(paths, fragmentToAppend) {
61
+ if (!fragmentToAppend) {
62
+ return paths;
63
+ }
64
+ const concatPaths = (a, b) => (0, helpers_1.stripEndSlash)(a) + (0, helpers_1.addLeadingSlash)(b);
65
+ if (Array.isArray(fragmentToAppend)) {
66
+ const paths2dArray = paths.map((path) => fragmentToAppend.map((fragment) => concatPaths(path, fragment)));
67
+ return (0, flatten_helper_1.flatten)(paths2dArray);
68
+ }
69
+ return paths.map((path) => concatPaths(path, fragmentToAppend));
70
+ }
71
+ isExcludedFromGlobalPrefix(path, requestMethod, versionOrVersions, versioningOptions) {
72
+ if ((0, shared_helper_1.isUndefined)(requestMethod)) {
73
+ return false;
74
+ }
75
+ const options = this.config.getGlobalPrefixOptions();
76
+ const excludedRoutes = options.exclude;
77
+ if (versionOrVersions && versionOrVersions !== interfaces_1.VERSION_NEUTRAL && versioningOptions?.type === enums_1.VersioningType.URI) {
78
+ path = this.truncateVersionPrefixFromPath(path, versionOrVersions, versioningOptions);
79
+ }
80
+ return Array.isArray(excludedRoutes) && (0, helpers_1.isRouteExcluded)(excludedRoutes, path, requestMethod);
81
+ }
82
+ truncateVersionPrefixFromPath(path, versionValue, versioningOptions) {
83
+ if (typeof versionValue !== "string") {
84
+ versionValue.forEach((version) => {
85
+ if (typeof version === "string") {
86
+ path = this.truncateVersionPrefixFromPath(path, version, versioningOptions);
87
+ }
88
+ });
89
+ return path;
90
+ }
91
+ const prefix = `/${this.getVersionPrefix(versioningOptions)}${versionValue}`;
92
+ return path.startsWith(prefix) ? path.replace(prefix, "") : path;
93
+ }
94
+ }
95
+ exports.RoutePathFactory = RoutePathFactory;
@@ -0,0 +1,9 @@
1
+ import { ApplicationConfig, VenokContainer } from "@venok/core";
2
+ import { HttpServer } from "../interfaces";
3
+ import { HttpExceptionFilter } from "./filter";
4
+ import { VenokExceptionFilterContext } from "@venok/core/filters/context";
5
+ export declare class RouterExceptionFiltersContext extends VenokExceptionFilterContext {
6
+ private readonly applicationRef;
7
+ constructor(container: VenokContainer, config: ApplicationConfig, applicationRef: HttpServer);
8
+ getExceptionFilter(): HttpExceptionFilter<any>;
9
+ }
@@ -0,0 +1,15 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.RouterExceptionFiltersContext = void 0;
4
+ const filter_1 = require("./filter");
5
+ const context_1 = require("../../core/filters/context");
6
+ class RouterExceptionFiltersContext extends context_1.VenokExceptionFilterContext {
7
+ constructor(container, config, applicationRef) {
8
+ super(container, config);
9
+ this.applicationRef = applicationRef;
10
+ }
11
+ getExceptionFilter() {
12
+ return new filter_1.HttpExceptionFilter(this.applicationRef);
13
+ }
14
+ }
15
+ exports.RouterExceptionFiltersContext = RouterExceptionFiltersContext;
@@ -0,0 +1,22 @@
1
+ import { ExceptionFilter } from "@venok/core/interfaces/features/exception-filter.interface";
2
+ import { ArgumentsHost } from "@venok/core/interfaces/context/arguments-host.interface";
3
+ import { HttpServer } from "../interfaces";
4
+ import { HttpAdapterHost } from "../adapter/host";
5
+ import { AbstractHttpAdapter } from "../adapter/adapter";
6
+ export declare class HttpExceptionFilter<T = any> implements ExceptionFilter<T> {
7
+ protected readonly applicationRef?: HttpServer<any, any, any> | undefined;
8
+ private static readonly logger;
9
+ protected readonly httpAdapterHost?: HttpAdapterHost;
10
+ constructor(applicationRef?: HttpServer<any, any, any> | undefined);
11
+ catch(exception: T, host: ArgumentsHost): void;
12
+ handleUnknownError(exception: T, host: ArgumentsHost, applicationRef: AbstractHttpAdapter | HttpServer): void;
13
+ isExceptionObject(err: any): err is Error;
14
+ /**
15
+ * Checks if the thrown error comes from the "http-errors" library.
16
+ * @param err error object
17
+ */
18
+ isHttpError(err: any): err is {
19
+ statusCode: number;
20
+ message: string;
21
+ };
22
+ }
@@ -0,0 +1,78 @@
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
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.HttpExceptionFilter = void 0;
13
+ const logger_service_1 = require("../../core/services/logger.service");
14
+ const core_1 = require("../../core/index.ts");
15
+ const shared_helper_1 = require("../../core/helpers/shared.helper");
16
+ const constants_1 = require("../../core/constants");
17
+ const enums_1 = require("../enums");
18
+ const host_1 = require("../adapter/host");
19
+ const errors_1 = require("../errors");
20
+ class HttpExceptionFilter {
21
+ constructor(applicationRef) {
22
+ this.applicationRef = applicationRef;
23
+ }
24
+ catch(exception, host) {
25
+ const applicationRef = this.applicationRef || (this.httpAdapterHost && this.httpAdapterHost.httpAdapter);
26
+ if (!(exception instanceof errors_1.HttpException)) {
27
+ return this.handleUnknownError(exception, host, applicationRef);
28
+ }
29
+ const res = exception.getResponse();
30
+ const message = (0, shared_helper_1.isObject)(res)
31
+ ? res
32
+ : {
33
+ statusCode: exception.getStatus(),
34
+ message: res,
35
+ };
36
+ const response = host.getArgByIndex(1);
37
+ if (!applicationRef.isHeadersSent(response))
38
+ applicationRef.reply(response, message, exception.getStatus());
39
+ else
40
+ applicationRef.end(response);
41
+ }
42
+ handleUnknownError(exception, host, applicationRef) {
43
+ const body = this.isHttpError(exception)
44
+ ? {
45
+ statusCode: exception.statusCode,
46
+ message: exception.message,
47
+ }
48
+ : {
49
+ statusCode: enums_1.HttpStatus.INTERNAL_SERVER_ERROR,
50
+ message: constants_1.MESSAGES.UNKNOWN_EXCEPTION_MESSAGE,
51
+ };
52
+ const response = host.getArgByIndex(1);
53
+ if (!applicationRef.isHeadersSent(response))
54
+ applicationRef.reply(response, body, body.statusCode);
55
+ else
56
+ applicationRef.end(response);
57
+ if (this.isExceptionObject(exception))
58
+ return HttpExceptionFilter.logger.error(exception.message, exception.stack);
59
+ return HttpExceptionFilter.logger.error(exception);
60
+ }
61
+ isExceptionObject(err) {
62
+ return (0, shared_helper_1.isObject)(err) && !!err.message;
63
+ }
64
+ /**
65
+ * Checks if the thrown error comes from the "http-errors" library.
66
+ * @param err error object
67
+ */
68
+ isHttpError(err) {
69
+ return err?.statusCode && err?.message;
70
+ }
71
+ }
72
+ exports.HttpExceptionFilter = HttpExceptionFilter;
73
+ HttpExceptionFilter.logger = new logger_service_1.Logger("ExceptionsHandler");
74
+ __decorate([
75
+ (0, core_1.Optional)(),
76
+ (0, core_1.Inject)(),
77
+ __metadata("design:type", host_1.HttpAdapterHost)
78
+ ], HttpExceptionFilter.prototype, "httpAdapterHost", void 0);
@@ -0,0 +1,27 @@
1
+ import { AbstractHttpAdapter } from "@venok/http/adapter/adapter";
2
+ import { RequestMethod } from "@venok/http/enums";
3
+ import { VersioningOptions, VersionValue } from "../interfaces/router/version-options.interface";
4
+ export declare class NoopHttpAdapter extends AbstractHttpAdapter {
5
+ constructor(instance: any);
6
+ close(): any;
7
+ initHttpServer(options: any): any;
8
+ useStaticAssets(...args: any[]): any;
9
+ setViewEngine(engine: string): any;
10
+ getRequestHostname(request: any): any;
11
+ getRequestMethod(request: any): any;
12
+ getRequestUrl(request: any): any;
13
+ reply(response: any, body: any): any;
14
+ end(response: any, message?: any): any;
15
+ status(response: any, statusCode: number): any;
16
+ render(response: any, view: string, options: any): any;
17
+ redirect(response: any, statusCode: number, url: string): void;
18
+ setErrorHandler(handler: Function, prefix?: string): any;
19
+ setNotFoundHandler(handler: Function, prefix?: string): any;
20
+ isHeadersSent(response: any): any;
21
+ setHeader(response: any, name: string, value: string): any;
22
+ registerParserMiddleware(): any;
23
+ enableCors(options: any): any;
24
+ createMiddlewareFactory(requestMethod: RequestMethod): any;
25
+ getType(): string;
26
+ applyVersionFilter(handler: Function, version: VersionValue, versioningOptions: VersioningOptions): (req: any, res: any, next: any) => () => void;
27
+ }
@@ -0,0 +1,37 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.NoopHttpAdapter = void 0;
4
+ const adapter_1 = require("@venok/http/adapter/adapter");
5
+ class NoopHttpAdapter extends adapter_1.AbstractHttpAdapter {
6
+ constructor(instance) {
7
+ super(instance);
8
+ }
9
+ close() { }
10
+ initHttpServer(options) { }
11
+ useStaticAssets(...args) { }
12
+ setViewEngine(engine) { }
13
+ getRequestHostname(request) { }
14
+ getRequestMethod(request) { }
15
+ getRequestUrl(request) { }
16
+ reply(response, body) { }
17
+ end(response, message) { }
18
+ status(response, statusCode) { }
19
+ render(response, view, options) { }
20
+ redirect(response, statusCode, url) { }
21
+ setErrorHandler(handler, prefix = "/") { }
22
+ setNotFoundHandler(handler, prefix = "/") { }
23
+ isHeadersSent(response) { }
24
+ setHeader(response, name, value) { }
25
+ registerParserMiddleware() { }
26
+ enableCors(options) { }
27
+ createMiddlewareFactory(requestMethod) { }
28
+ getType() {
29
+ return "";
30
+ }
31
+ applyVersionFilter(handler, version, versioningOptions) {
32
+ return (req, res, next) => {
33
+ return () => { };
34
+ };
35
+ }
36
+ }
37
+ exports.NoopHttpAdapter = NoopHttpAdapter;
@@ -0,0 +1,4 @@
1
+ import { RequestMethod } from "../enums";
2
+ import { ExcludeRouteMetadata } from "../interfaces/http/exclude-route.interface";
3
+ export declare const isRequestMethodAll: (method: RequestMethod) => boolean;
4
+ export declare function isRouteExcluded(excludedRoutes: ExcludeRouteMetadata[], path: string, requestMethod?: RequestMethod): boolean;
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.isRouteExcluded = exports.isRequestMethodAll = void 0;
4
+ const enums_1 = require("../enums");
5
+ const path_helper_1 = require("./path.helper");
6
+ const isRequestMethodAll = (method) => {
7
+ return enums_1.RequestMethod.ALL === method || method === -1;
8
+ };
9
+ exports.isRequestMethodAll = isRequestMethodAll;
10
+ function isRouteExcluded(excludedRoutes, path, requestMethod) {
11
+ return excludedRoutes.some((route) => {
12
+ if ((0, exports.isRequestMethodAll)(route.requestMethod) || route.requestMethod === requestMethod) {
13
+ return route.pathRegex.exec((0, path_helper_1.addLeadingSlash)(path));
14
+ }
15
+ return false;
16
+ });
17
+ }
18
+ exports.isRouteExcluded = isRouteExcluded;
@@ -0,0 +1,5 @@
1
+ import { Routes } from "../interfaces/http/routes.interface";
2
+ export declare function flattenRoutePaths(routes: Routes): {
3
+ module: any;
4
+ path: string;
5
+ }[];
@@ -0,0 +1,27 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.flattenRoutePaths = void 0;
4
+ const shared_helper_1 = require("../../core/helpers/shared.helper");
5
+ const path_helper_1 = require("./path.helper");
6
+ function flattenRoutePaths(routes) {
7
+ const result = [];
8
+ routes.forEach((item) => {
9
+ if (item.module && item.path) {
10
+ result.push({ module: item.module, path: item.path });
11
+ }
12
+ if (item.children) {
13
+ const childrenRef = item.children;
14
+ childrenRef.forEach((child) => {
15
+ if (!(0, shared_helper_1.isString)(child) && child.path) {
16
+ child.path = (0, path_helper_1.normalizePath)((0, path_helper_1.normalizePath)(item.path) + (0, path_helper_1.normalizePath)(child.path));
17
+ }
18
+ else {
19
+ result.push({ path: item.path, module: child });
20
+ }
21
+ });
22
+ result.push(...flattenRoutePaths(childrenRef));
23
+ }
24
+ });
25
+ return result;
26
+ }
27
+ exports.flattenRoutePaths = flattenRoutePaths;
@@ -0,0 +1,6 @@
1
+ export * from "./adapter.helper";
2
+ export * from "./exclude-route.helper";
3
+ export * from "./flatten-routes.helper";
4
+ export * from "./messages.helper";
5
+ export * from "./path.helper";
6
+ export * from "./sse.helper";
@@ -0,0 +1,22 @@
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("./adapter.helper"), exports);
18
+ __exportStar(require("./exclude-route.helper"), exports);
19
+ __exportStar(require("./flatten-routes.helper"), exports);
20
+ __exportStar(require("./messages.helper"), exports);
21
+ __exportStar(require("./path.helper"), exports);
22
+ __exportStar(require("./sse.helper"), exports);
@@ -0,0 +1,6 @@
1
+ import { VersionValue } from "../interfaces/router/version-options.interface";
2
+ export declare const ROUTE_MAPPED_MESSAGE: (path: string, method: string | number) => string;
3
+ export declare const VERSIONED_ROUTE_MAPPED_MESSAGE: (path: string, method: string | number, version: VersionValue) => string;
4
+ export declare const CONTROLLER_MAPPING_MESSAGE: (name: string, path: string) => string;
5
+ export declare const VERSIONED_CONTROLLER_MAPPING_MESSAGE: (name: string, path: string, version: VersionValue) => string;
6
+ export declare const VENOK_HTTP_SERVER_START: (port: string | number) => string;
@@ -0,0 +1,25 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.VENOK_HTTP_SERVER_START = exports.VERSIONED_CONTROLLER_MAPPING_MESSAGE = exports.CONTROLLER_MAPPING_MESSAGE = exports.VERSIONED_ROUTE_MAPPED_MESSAGE = exports.ROUTE_MAPPED_MESSAGE = void 0;
4
+ const enums_1 = require("../enums");
5
+ const version_options_interface_1 = require("../interfaces/router/version-options.interface");
6
+ const ROUTE_MAPPED_MESSAGE = (path, method) => `Mapped {${path}, ${enums_1.RequestMethod[method]}} route`;
7
+ exports.ROUTE_MAPPED_MESSAGE = ROUTE_MAPPED_MESSAGE;
8
+ const VERSIONED_ROUTE_MAPPED_MESSAGE = (path, method, version) => {
9
+ const controllerVersions = Array.isArray(version) ? version : [version];
10
+ const versions = controllerVersions.map((version) => (version === version_options_interface_1.VERSION_NEUTRAL ? "Neutral" : version)).join(",");
11
+ return `Mapped {${path}, ${enums_1.RequestMethod[method]}} (version: ${versions}) route`;
12
+ };
13
+ exports.VERSIONED_ROUTE_MAPPED_MESSAGE = VERSIONED_ROUTE_MAPPED_MESSAGE;
14
+ const CONTROLLER_MAPPING_MESSAGE = (name, path) => `${name} {${path}}:`;
15
+ exports.CONTROLLER_MAPPING_MESSAGE = CONTROLLER_MAPPING_MESSAGE;
16
+ const VERSIONED_CONTROLLER_MAPPING_MESSAGE = (name, path, version) => {
17
+ const controllerVersions = Array.isArray(version) ? version : [version];
18
+ const versions = controllerVersions.map((version) => (version === version_options_interface_1.VERSION_NEUTRAL ? "Neutral" : version)).join(",");
19
+ return `${name} {${path}} (version: ${versions}):`;
20
+ };
21
+ exports.VERSIONED_CONTROLLER_MAPPING_MESSAGE = VERSIONED_CONTROLLER_MAPPING_MESSAGE;
22
+ const VENOK_HTTP_SERVER_START = (port) => {
23
+ return `Venok start Http server on port: ${port}`;
24
+ };
25
+ exports.VENOK_HTTP_SERVER_START = VENOK_HTTP_SERVER_START;
@@ -0,0 +1,3 @@
1
+ export declare const addLeadingSlash: (path?: string) => string;
2
+ export declare const normalizePath: (path?: string) => string;
3
+ export declare const stripEndSlash: (path: string) => string;
@@ -0,0 +1,13 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.stripEndSlash = exports.normalizePath = exports.addLeadingSlash = void 0;
4
+ const addLeadingSlash = (path) => path && typeof path === "string" ? (path.charAt(0) !== "/" ? "/" + path : path) : "";
5
+ exports.addLeadingSlash = addLeadingSlash;
6
+ const normalizePath = (path) => path
7
+ ? path.startsWith("/")
8
+ ? ("/" + path.replace(/\/+$/, "")).replace(/\/+/g, "/")
9
+ : "/" + path.replace(/\/+$/, "")
10
+ : "/";
11
+ exports.normalizePath = normalizePath;
12
+ const stripEndSlash = (path) => (path[path.length - 1] === "/" ? path.slice(0, path.length - 1) : path);
13
+ exports.stripEndSlash = stripEndSlash;
@@ -0,0 +1,45 @@
1
+ /// <reference types="node" />
2
+ /// <reference types="node" />
3
+ /// <reference types="node" />
4
+ import { IncomingMessage, OutgoingHttpHeaders } from "http";
5
+ import { Transform } from "stream";
6
+ import { MessageEvent } from "@venok/http/interfaces/http/message-event.interface";
7
+ export type AdditionalHeaders = Record<string, string[] | string | number | undefined>;
8
+ interface ReadHeaders {
9
+ getHeaders?(): AdditionalHeaders;
10
+ }
11
+ interface WriteHeaders {
12
+ writableEnded?: boolean;
13
+ writeHead?(statusCode: number, reasonPhrase?: string, headers?: OutgoingHttpHeaders): void;
14
+ writeHead?(statusCode: number, headers?: OutgoingHttpHeaders): void;
15
+ flushHeaders?(): void;
16
+ }
17
+ export type WritableHeaderStream = NodeJS.WritableStream & WriteHeaders;
18
+ export type HeaderStream = WritableHeaderStream & ReadHeaders;
19
+ /**
20
+ * Adapted from https://raw.githubusercontent.com/EventSource/node-ssestream
21
+ * Transforms "messages" to W3C event stream content.
22
+ * See https://html.spec.whatwg.org/multipage/server-sent-events.html
23
+ * A message is an object with one or more of the following properties:
24
+ * - data (String or object, which gets turned into JSON)
25
+ * - type
26
+ * - id
27
+ * - retry
28
+ *
29
+ * If constructed with an HTTP Request, it will optimise the socket for streaming.
30
+ * If this stream is piped to an HTTP Response, it will set appropriate headers.
31
+ */
32
+ export declare class SseStream extends Transform {
33
+ private lastEventId;
34
+ constructor(req?: IncomingMessage);
35
+ pipe<T extends WritableHeaderStream>(destination: T, options?: {
36
+ additionalHeaders?: AdditionalHeaders;
37
+ end?: boolean;
38
+ }): T;
39
+ _transform(message: MessageEvent, encoding: string, callback: (error?: Error | null, data?: any) => void): void;
40
+ /**
41
+ * Calls `.write` but handles the drain if needed
42
+ */
43
+ writeMessage(message: MessageEvent, cb: (error: Error | null | undefined) => void): void;
44
+ }
45
+ export {};
@@ -0,0 +1,83 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SseStream = void 0;
4
+ const stream_1 = require("../../../../../../stream");
5
+ const shared_helper_1 = require("../../core/helpers/shared.helper");
6
+ function toDataString(data) {
7
+ if ((0, shared_helper_1.isObject)(data)) {
8
+ return toDataString(JSON.stringify(data));
9
+ }
10
+ return data
11
+ .split(/\r\n|\r|\n/)
12
+ .map((line) => `data: ${line}\n`)
13
+ .join("");
14
+ }
15
+ /**
16
+ * Adapted from https://raw.githubusercontent.com/EventSource/node-ssestream
17
+ * Transforms "messages" to W3C event stream content.
18
+ * See https://html.spec.whatwg.org/multipage/server-sent-events.html
19
+ * A message is an object with one or more of the following properties:
20
+ * - data (String or object, which gets turned into JSON)
21
+ * - type
22
+ * - id
23
+ * - retry
24
+ *
25
+ * If constructed with an HTTP Request, it will optimise the socket for streaming.
26
+ * If this stream is piped to an HTTP Response, it will set appropriate headers.
27
+ */
28
+ class SseStream extends stream_1.Transform {
29
+ constructor(req) {
30
+ super({ objectMode: true });
31
+ this.lastEventId = 0;
32
+ if (req && req.socket) {
33
+ req.socket.setKeepAlive(true);
34
+ req.socket.setNoDelay(true);
35
+ req.socket.setTimeout(0);
36
+ }
37
+ }
38
+ pipe(destination, options) {
39
+ if (destination.writeHead) {
40
+ destination.writeHead(200, {
41
+ ...options?.additionalHeaders,
42
+ // See https://github.com/dunglas/mercure/blob/master/hub/subscribe.go#L124-L130
43
+ "Content-Type": "text/event-stream",
44
+ Connection: "keep-alive",
45
+ // Disable cache, even for old browsers and proxies
46
+ "Cache-Control": "private, no-cache, no-store, must-revalidate, max-age=0, no-transform",
47
+ Pragma: "no-cache",
48
+ Expire: "0",
49
+ // NGINX support https://www.nginx.com/resources/wiki/start/topics/examples/x-accel/#x-accel-buffering
50
+ "X-Accel-Buffering": "no",
51
+ });
52
+ if (destination.flushHeaders)
53
+ destination.flushHeaders();
54
+ }
55
+ destination.write("\n");
56
+ return super.pipe(destination, options);
57
+ }
58
+ _transform(message, encoding, callback) {
59
+ let data = message.type ? `event: ${message.type}\n` : "";
60
+ data += message.id ? `id: ${message.id}\n` : "";
61
+ data += message.retry ? `retry: ${message.retry}\n` : "";
62
+ data += message.data ? toDataString(message.data) : "";
63
+ data += "\n";
64
+ this.push(data);
65
+ callback();
66
+ }
67
+ /**
68
+ * Calls `.write` but handles the drain if needed
69
+ */
70
+ writeMessage(message, cb) {
71
+ if (!message.id) {
72
+ this.lastEventId++;
73
+ message.id = this.lastEventId.toString();
74
+ }
75
+ if (!this.write(message, "utf-8", cb)) {
76
+ this.once("drain", cb);
77
+ }
78
+ else {
79
+ process.nextTick(cb);
80
+ }
81
+ }
82
+ }
83
+ exports.SseStream = SseStream;
package/index.d.ts ADDED
@@ -0,0 +1 @@
1
+ import "reflect-metadata";
package/index.js ADDED
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ require("reflect-metadata");
@@ -0,0 +1,58 @@
1
+ type StaticOrigin = boolean | string | RegExp | (string | RegExp)[];
2
+ /**
3
+ * Set origin to a function implementing some custom logic. The function takes the
4
+ * request origin as the first parameter and a callback (which expects the signature
5
+ * err [object], allow [bool]) as the second.
6
+ *
7
+ * @see https://github.com/expressjs/cors
8
+ *
9
+ * @publicApi
10
+ */
11
+ export type CustomOrigin = (requestOrigin: string, callback: (err: Error | null, origin?: StaticOrigin) => void) => void;
12
+ /**
13
+ * Interface describing CORS options that can be set.
14
+ *
15
+ * @see https://github.com/expressjs/cors
16
+ * @publicApi
17
+ */
18
+ export interface CorsOptions {
19
+ /**
20
+ * Configures the `Access-Control-Allow-Origins` CORS header. See [here for more detail.](https://github.com/expressjs/cors#configuration-options)
21
+ */
22
+ origin?: StaticOrigin | CustomOrigin;
23
+ /**
24
+ * Configures the Access-Control-Allow-Methods CORS header.
25
+ */
26
+ methods?: string | string[];
27
+ /**
28
+ * Configures the Access-Control-Allow-Headers CORS header.
29
+ */
30
+ allowedHeaders?: string | string[];
31
+ /**
32
+ * Configures the Access-Control-Expose-Headers CORS header.
33
+ */
34
+ exposedHeaders?: string | string[];
35
+ /**
36
+ * Configures the Access-Control-Allow-Credentials CORS header.
37
+ */
38
+ credentials?: boolean;
39
+ /**
40
+ * Configures the Access-Control-Max-Age CORS header.
41
+ */
42
+ maxAge?: number;
43
+ /**
44
+ * Whether to pass the CORS preflight response to the next handler.
45
+ */
46
+ preflightContinue?: boolean;
47
+ /**
48
+ * Provides a status code to use for successful OPTIONS requests.
49
+ */
50
+ optionsSuccessStatus?: number;
51
+ }
52
+ export interface CorsOptionsCallback {
53
+ s(error: Error, options: CorsOptions): void;
54
+ }
55
+ export interface CorsOptionsDelegate<T> {
56
+ (req: T, cb: CorsOptionsCallback): void;
57
+ }
58
+ export {};
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,6 @@
1
+ export type HttpExceptionBodyMessage = string | string[];
2
+ export interface HttpExceptionBody {
3
+ message: HttpExceptionBodyMessage;
4
+ error?: string;
5
+ statusCode: number;
6
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });