@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,56 @@
1
+ /// <reference types="node" />
2
+ import { IncomingMessage } from "http";
3
+ import { Observable } from "rxjs";
4
+ import { CustomHeader, RedirectResponse } from "./response.controller";
5
+ import { RequestMethod, RouteParamtypes } from "../enums";
6
+ import { VenokContextCreator } from "@venok/core/context";
7
+ import { ContextId, ContextType, PipeTransform } from "@venok/core";
8
+ import { HeaderStream } from "../helpers";
9
+ import { HttpServer } from "../interfaces";
10
+ import { RouterExceptionFiltersContext } from "../filters/context";
11
+ import { ParamData } from "../decorators";
12
+ export interface ParamProperties {
13
+ index: number;
14
+ type: RouteParamtypes | string;
15
+ data: ParamData;
16
+ pipes: PipeTransform[];
17
+ extractValue: <TRequest, TResponse>(req: TRequest, res: TResponse, next: Function) => any;
18
+ }
19
+ export type HandleResponseFn = HandlerResponseBasicFn | HandleSseResponseFn;
20
+ export type HandlerResponseBasicFn = <TResult, TResponse>(result: TResult, res: TResponse, req?: any) => any;
21
+ export type HandleSseResponseFn = <TResult extends Observable<unknown> = any, TResponse extends HeaderStream = any, TRequest extends IncomingMessage = any>(result: TResult, res: TResponse, req: TRequest) => any;
22
+ export interface HandlerMetadata {
23
+ argsLength: number;
24
+ paramtypes: any[];
25
+ httpStatusCode: number;
26
+ responseHeaders: any[];
27
+ hasCustomHeaders: boolean;
28
+ getParamsMetadata: (moduleKey: string, contextId?: ContextId, inquirerId?: string) => (ParamProperties & {
29
+ metatype?: any;
30
+ })[];
31
+ fnHandleResponse: HandleResponseFn;
32
+ }
33
+ export interface IRouteParamsFactory {
34
+ exchangeKeyForValue<TRequest extends Record<string, any> = any, TResponse = any, TResult = any>(key: RouteParamtypes | string, data: any, args: [TRequest, TResponse, Function]): TResult;
35
+ }
36
+ export declare class HttpContextCreator {
37
+ private readonly venokContextCreator;
38
+ private readonly exceptionsFilter;
39
+ private readonly applicationRef;
40
+ private readonly responseController;
41
+ constructor(venokContextCreator: VenokContextCreator, exceptionsFilter: RouterExceptionFiltersContext, applicationRef: HttpServer);
42
+ create(instance: Object, callback: (...args: any[]) => unknown, methodName: string, moduleKey: string, requestMethod: RequestMethod, contextId?: ContextId, inquirerId?: string): (...args: any[]) => Promise<any>;
43
+ getMetadata<TContext extends ContextType = ContextType>(instance: Object, callback: (...args: any[]) => any, methodName: string, moduleKey: string, requestMethod: RequestMethod, contextType: TContext): {
44
+ fnHandleResponse: HandleResponseFn;
45
+ httpStatusCode: number;
46
+ hasCustomHeaders: boolean;
47
+ responseHeaders: CustomHeader[];
48
+ };
49
+ reflectRedirect(callback: (...args: unknown[]) => unknown): RedirectResponse;
50
+ reflectHttpStatusCode(callback: (...args: unknown[]) => unknown): number;
51
+ reflectRenderTemplate(callback: (...args: unknown[]) => unknown): string;
52
+ reflectResponseHeaders(callback: (...args: unknown[]) => unknown): CustomHeader[];
53
+ reflectSse(callback: (...args: unknown[]) => unknown): string;
54
+ createHandleResponseFn(callback: (...args: unknown[]) => unknown, isResponseHandled: boolean, redirectResponse?: RedirectResponse, httpStatusCode?: number): HandleResponseFn;
55
+ private isResponseHandled;
56
+ }
@@ -0,0 +1,102 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.HttpContextCreator = void 0;
4
+ const response_controller_1 = require("./response.controller");
5
+ const constants_1 = require("../constants");
6
+ const enums_1 = require("../enums");
7
+ const constants_2 = require("../../core/injector/constants");
8
+ const constants_3 = require("../../core/constants");
9
+ const shared_helper_1 = require("../../core/helpers/shared.helper");
10
+ const factory_1 = require("../factory");
11
+ class HttpContextCreator {
12
+ constructor(venokContextCreator, exceptionsFilter, applicationRef) {
13
+ this.venokContextCreator = venokContextCreator;
14
+ this.exceptionsFilter = exceptionsFilter;
15
+ this.applicationRef = applicationRef;
16
+ this.responseController = new response_controller_1.RouterResponseController(applicationRef);
17
+ }
18
+ create(instance, callback, methodName, moduleKey, requestMethod, contextId = constants_2.STATIC_CONTEXT, inquirerId) {
19
+ const contextType = "http";
20
+ const { fnHandleResponse, httpStatusCode, responseHeaders, hasCustomHeaders } = this.getMetadata(instance, callback, methodName, moduleKey, requestMethod, contextType);
21
+ const doneCallback = async (result, req, res, next) => {
22
+ this.responseController.setStatus(res, httpStatusCode);
23
+ hasCustomHeaders && this.responseController.setHeaders(res, responseHeaders);
24
+ await fnHandleResponse(result, res, req);
25
+ };
26
+ const result = this.venokContextCreator.create(instance, callback, methodName, constants_3.ROUTE_ARGS_METADATA, new factory_1.RouteParamsFactory(), contextId, inquirerId, {
27
+ guards: true,
28
+ interceptors: true,
29
+ filters: false,
30
+ callback: doneCallback,
31
+ }, contextType);
32
+ const exceptionFilter = this.exceptionsFilter.create(instance, callback, moduleKey, contextId, inquirerId);
33
+ return this.venokContextCreator.venokProxy.createProxy(result, exceptionFilter);
34
+ }
35
+ getMetadata(instance, callback, methodName, moduleKey, requestMethod, contextType) {
36
+ const metadata = this.venokContextCreator.contextUtils.reflectCallbackMetadata(instance, methodName, constants_3.ROUTE_ARGS_METADATA) || {};
37
+ const keys = Object.keys(metadata);
38
+ const contextFactory = this.venokContextCreator.contextUtils.getContextFactory(contextType, instance, callback);
39
+ const getParamsMetadata = (moduleKey, contextId = constants_2.STATIC_CONTEXT, inquirerId) => this.venokContextCreator.exchangeKeysForValues(keys, metadata, moduleKey, new factory_1.RouteParamsFactory(), contextId, inquirerId, contextFactory);
40
+ const paramsMetadata = getParamsMetadata(moduleKey);
41
+ const isResponseHandled = this.isResponseHandled(instance, methodName, paramsMetadata);
42
+ const httpRedirectResponse = this.reflectRedirect(callback);
43
+ const fnHandleResponse = this.createHandleResponseFn(callback, isResponseHandled, httpRedirectResponse);
44
+ const httpCode = this.reflectHttpStatusCode(callback);
45
+ const httpStatusCode = httpCode ? httpCode : this.responseController.getStatusByMethod(requestMethod);
46
+ const responseHeaders = this.reflectResponseHeaders(callback);
47
+ const hasCustomHeaders = !(0, shared_helper_1.isEmpty)(responseHeaders);
48
+ return {
49
+ fnHandleResponse,
50
+ httpStatusCode,
51
+ hasCustomHeaders,
52
+ responseHeaders,
53
+ };
54
+ }
55
+ reflectRedirect(callback) {
56
+ return Reflect.getMetadata(constants_1.REDIRECT_METADATA, callback);
57
+ }
58
+ reflectHttpStatusCode(callback) {
59
+ return Reflect.getMetadata(constants_1.HTTP_CODE_METADATA, callback);
60
+ }
61
+ reflectRenderTemplate(callback) {
62
+ return Reflect.getMetadata(constants_1.RENDER_METADATA, callback);
63
+ }
64
+ reflectResponseHeaders(callback) {
65
+ return Reflect.getMetadata(constants_1.HEADERS_METADATA, callback) || [];
66
+ }
67
+ reflectSse(callback) {
68
+ return Reflect.getMetadata(constants_1.SSE_METADATA, callback);
69
+ }
70
+ createHandleResponseFn(callback, isResponseHandled, redirectResponse, httpStatusCode) {
71
+ const renderTemplate = this.reflectRenderTemplate(callback);
72
+ if (renderTemplate) {
73
+ return async (result, res) => {
74
+ return await this.responseController.render(result, res, renderTemplate);
75
+ };
76
+ }
77
+ if (redirectResponse && (0, shared_helper_1.isString)(redirectResponse.url)) {
78
+ return async (result, res) => {
79
+ await this.responseController.redirect(result, res, redirectResponse);
80
+ };
81
+ }
82
+ const isSseHandler = !!this.reflectSse(callback);
83
+ if (isSseHandler) {
84
+ return (result, res, req) => {
85
+ this.responseController.sse(result, res.raw || res, req.raw || req, {
86
+ additionalHeaders: res.getHeaders?.(),
87
+ });
88
+ };
89
+ }
90
+ return async (result, res) => {
91
+ result = await this.responseController.transformToResult(result);
92
+ !isResponseHandled && (await this.responseController.apply(result, res, httpStatusCode));
93
+ return res;
94
+ };
95
+ }
96
+ isResponseHandled(instance, methodName, paramsMetadata) {
97
+ const hasResponseOrNextDecorator = paramsMetadata.some(({ type }) => type === enums_1.RouteParamtypes.RESPONSE || type === enums_1.RouteParamtypes.NEXT);
98
+ const isPassthroughEnabled = Reflect.getMetadata(constants_1.RESPONSE_PASSTHROUGH_METADATA, instance.constructor, methodName);
99
+ return hasResponseOrNextDecorator && !isPassthroughEnabled;
100
+ }
101
+ }
102
+ exports.HttpContextCreator = HttpContextCreator;
@@ -0,0 +1,30 @@
1
+ /// <reference types="node" />
2
+ import { Observable } from "rxjs";
3
+ import { IncomingMessage } from "http";
4
+ import { AdditionalHeaders, WritableHeaderStream } from "../helpers";
5
+ import { HttpServer } from "../interfaces/http/server.interface";
6
+ import { RequestMethod } from "../enums";
7
+ export interface CustomHeader {
8
+ name: string;
9
+ value: string;
10
+ }
11
+ export interface RedirectResponse {
12
+ url: string;
13
+ statusCode?: number;
14
+ }
15
+ export declare class RouterResponseController {
16
+ private readonly applicationRef;
17
+ private readonly logger;
18
+ constructor(applicationRef: HttpServer);
19
+ apply<TInput = any, TResponse = any>(result: TInput, response: TResponse, httpStatusCode?: number): Promise<any>;
20
+ redirect<TInput = any, TResponse = any>(resultOrDeferred: TInput, response: TResponse, redirectResponse: RedirectResponse): Promise<void>;
21
+ render<TInput = unknown, TResponse = unknown>(resultOrDeferred: TInput, response: TResponse, template: string): Promise<any>;
22
+ transformToResult(resultOrDeferred: any): Promise<any>;
23
+ getStatusByMethod(requestMethod: RequestMethod): number;
24
+ setHeaders<TResponse = unknown>(response: TResponse, headers: CustomHeader[]): void;
25
+ setStatus<TResponse = unknown>(response: TResponse, statusCode: number): void;
26
+ sse<TInput extends Observable<unknown> = any, TResponse extends WritableHeaderStream = any, TRequest extends IncomingMessage = any>(result: TInput, response: TResponse, request: TRequest, options?: {
27
+ additionalHeaders: AdditionalHeaders;
28
+ }): void;
29
+ private assertObservable;
30
+ }
@@ -0,0 +1,86 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.RouterResponseController = void 0;
4
+ const rxjs_1 = require("rxjs");
5
+ const helpers_1 = require("../helpers");
6
+ const shared_helper_1 = require("../../core/helpers/shared.helper");
7
+ const logger_service_1 = require("../../core/services/logger.service");
8
+ const enums_1 = require("../enums");
9
+ class RouterResponseController {
10
+ constructor(applicationRef) {
11
+ this.applicationRef = applicationRef;
12
+ this.logger = new logger_service_1.Logger(RouterResponseController.name);
13
+ }
14
+ async apply(result, response, httpStatusCode) {
15
+ return this.applicationRef.reply(response, result, httpStatusCode);
16
+ }
17
+ async redirect(resultOrDeferred, response, redirectResponse) {
18
+ const result = await this.transformToResult(resultOrDeferred);
19
+ const statusCode = result && result.statusCode
20
+ ? result.statusCode
21
+ : redirectResponse.statusCode
22
+ ? redirectResponse.statusCode
23
+ : enums_1.HttpStatus.FOUND;
24
+ const url = result && result.url ? result.url : redirectResponse.url;
25
+ this.applicationRef.redirect(response, statusCode, url);
26
+ }
27
+ async render(resultOrDeferred, response, template) {
28
+ const result = await this.transformToResult(resultOrDeferred);
29
+ return this.applicationRef.render(response, template, result);
30
+ }
31
+ async transformToResult(resultOrDeferred) {
32
+ if ((0, rxjs_1.isObservable)(resultOrDeferred)) {
33
+ return (0, rxjs_1.lastValueFrom)(resultOrDeferred);
34
+ }
35
+ return resultOrDeferred;
36
+ }
37
+ getStatusByMethod(requestMethod) {
38
+ switch (requestMethod) {
39
+ case enums_1.RequestMethod.POST:
40
+ return enums_1.HttpStatus.CREATED;
41
+ default:
42
+ return enums_1.HttpStatus.OK;
43
+ }
44
+ }
45
+ setHeaders(response, headers) {
46
+ headers.forEach(({ name, value }) => this.applicationRef.setHeader(response, name, value));
47
+ }
48
+ setStatus(response, statusCode) {
49
+ this.applicationRef.status(response, statusCode);
50
+ }
51
+ sse(result, response, request, options) {
52
+ // It's possible that we sent headers already so don't use a stream
53
+ if (response.writableEnded)
54
+ return;
55
+ this.assertObservable(result);
56
+ const stream = new helpers_1.SseStream(request);
57
+ stream.pipe(response, options);
58
+ const subscription = result
59
+ .pipe((0, rxjs_1.map)((message) => {
60
+ if ((0, shared_helper_1.isObject)(message))
61
+ return message;
62
+ return { data: message };
63
+ }), (0, rxjs_1.debounce)((message) => new Promise((resolve) => stream.writeMessage(message, () => resolve()))), (0, rxjs_1.catchError)((err) => {
64
+ const data = err instanceof Error ? err.message : err;
65
+ stream.writeMessage({ type: "error", data }, (writeError) => {
66
+ if (writeError)
67
+ this.logger.error(writeError);
68
+ });
69
+ return rxjs_1.EMPTY;
70
+ }))
71
+ .subscribe({
72
+ complete: () => {
73
+ response.end();
74
+ },
75
+ });
76
+ request.on("close", () => {
77
+ subscription.unsubscribe();
78
+ });
79
+ }
80
+ assertObservable(value) {
81
+ if (!(0, rxjs_1.isObservable)(value)) {
82
+ throw new ReferenceError("You must return an Observable stream to use Server-Sent Events (SSE).");
83
+ }
84
+ }
85
+ }
86
+ exports.RouterResponseController = RouterResponseController;
@@ -0,0 +1,82 @@
1
+ import { ScopeOptions } from "@venok/core";
2
+ import { VersionOptions } from "../interfaces";
3
+ /**
4
+ * Interface defining options that can be passed to `@Controller()` decorator
5
+ *
6
+ * @publicApi
7
+ */
8
+ export interface ControllerOptions extends ScopeOptions, VersionOptions {
9
+ /**
10
+ * Specifies an optional `route path prefix`. The prefix is pre-pended to the
11
+ * path specified in any request decorator in the class.
12
+ *
13
+ * Supported only by HTTP-based application (does not apply to non-HTTP microservices).
14
+ */
15
+ path?: string | string[];
16
+ /**
17
+ * Specifies an optional HTTP Request host filter. When configured, methods
18
+ * within the controller will only be routed if the request host matches the
19
+ * specified value.
20
+ */
21
+ host?: string | RegExp | Array<string | RegExp>;
22
+ }
23
+ /**
24
+ * Decorator that marks a class as a Venok controller that can receive inbound
25
+ * requests and produce responses.
26
+ *
27
+ * An HTTP Controller responds to inbound HTTP Requests and produces HTTP Responses.
28
+ * It defines a class that provides the context for one or more related route
29
+ * handlers that correspond to HTTP request methods and associated routes
30
+ * for example `GET /api/profile`, `POST /users/resume`.
31
+ *
32
+ * A Microservice Controller responds to requests as well as events, running over
33
+ * a variety of transports. It defines a class that provides a context for
34
+ * one or more message or event handlers.
35
+ *
36
+ * @publicApi
37
+ */
38
+ export declare function Controller(): ClassDecorator;
39
+ /**
40
+ * Decorator that marks a class as a Venok controller that can receive inbound
41
+ * requests and produce responses.
42
+ *
43
+ * An HTTP Controller responds to inbound HTTP Requests and produces HTTP Responses.
44
+ * It defines a class that provides the context for one or more related route
45
+ * handlers that correspond to HTTP request methods and associated routes
46
+ * for example `GET /api/profile`, `POST /users/resume`.
47
+ *
48
+ * A Microservice Controller responds to requests as well as events, running over
49
+ * a variety of transports. It defines a class that provides a context for
50
+ * one or more message or event handlers.
51
+ *
52
+ * @param {string|Array} prefix string that defines a `route path prefix`. The prefix
53
+ * is pre-pended to the path specified in any request decorator in the class.
54
+ *
55
+ * @publicApi
56
+ */
57
+ export declare function Controller(prefix: string | string[]): ClassDecorator;
58
+ /**
59
+ * Decorator that marks a class as a Venok controller that can receive inbound
60
+ * requests and produce responses.
61
+ *
62
+ * An HTTP Controller responds to inbound HTTP Requests and produces HTTP Responses.
63
+ * It defines a class that provides the context for one or more related route
64
+ * handlers that correspond to HTTP request methods and associated routes
65
+ * for example `GET /api/profile`, `POST /users/resume`.
66
+ *
67
+ * A Microservice Controller responds to requests as well as events, running over
68
+ * a variety of transports. It defines a class that provides a context for
69
+ * one or more message or event handlers.
70
+ *
71
+ * @param {object} options configuration object specifying:
72
+ *
73
+ * - `scope` - symbol that determines the lifetime of a Controller instance.
74
+ * See Scope for more details.
75
+ * - `prefix` - string that defines a `route path prefix`. The prefix
76
+ * is pre-pended to the path specified in any request decorator in the class.
77
+ * - `version` - string, array of strings, or Symbol that defines the version
78
+ * of all routes in the class. See Versioning for more details.
79
+ *
80
+ * @publicApi
81
+ */
82
+ export declare function Controller(options: ControllerOptions): ClassDecorator;
@@ -0,0 +1,53 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Controller = void 0;
4
+ const constants_1 = require("../../core/constants");
5
+ const shared_helper_1 = require("../../core/helpers/shared.helper");
6
+ const constants_2 = require("@venok/http/constants");
7
+ /**
8
+ * Decorator that marks a class as a Venok controller that can receive inbound
9
+ * requests and produce responses.
10
+ *
11
+ * An HTTP Controller responds to inbound HTTP Requests and produces HTTP Responses.
12
+ * It defines a class that provides the context for one or more related route
13
+ * handlers that correspond to HTTP request methods and associated routes
14
+ * for example `GET /api/profile`, `POST /users/resume`
15
+ *
16
+ * A Microservice Controller responds to requests as well as events, running over
17
+ * a variety of transports. It defines a class that provides a context for
18
+ * one or more message or event handlers.
19
+ *
20
+ * @param prefixOrOptions a `route path prefix` or a `ControllerOptions` object.
21
+ * A `route path prefix` is pre-pended to the path specified in any request decorator
22
+ * in the class. `ControllerOptions` is an options configuration object specifying:
23
+ * - `scope` - symbol that determines the lifetime of a Controller instance.
24
+ * See Scope for more details.
25
+ * - `prefix` - string that defines a `route path prefix`. The prefix
26
+ * is pre-pended to the path specified in any request decorator in the class.
27
+ * - `version` - string, array of strings, or Symbol that defines the version
28
+ * of all routes in the class. See Versioning
29
+ * for more details.
30
+ *
31
+ * @publicApi
32
+ */
33
+ function Controller(prefixOrOptions) {
34
+ const defaultPath = "/";
35
+ const [path, host, scopeOptions, versionOptions] = (0, shared_helper_1.isUndefined)(prefixOrOptions)
36
+ ? [defaultPath, undefined, undefined, undefined]
37
+ : (0, shared_helper_1.isString)(prefixOrOptions) || Array.isArray(prefixOrOptions)
38
+ ? [prefixOrOptions, undefined, undefined, undefined]
39
+ : [
40
+ prefixOrOptions.path || defaultPath,
41
+ prefixOrOptions.host,
42
+ { scope: prefixOrOptions.scope, durable: prefixOrOptions.durable },
43
+ Array.isArray(prefixOrOptions.version) ? Array.from(new Set(prefixOrOptions.version)) : prefixOrOptions.version,
44
+ ];
45
+ return (target) => {
46
+ Reflect.defineMetadata(constants_2.CONTROLLER_WATERMARK, true, target);
47
+ Reflect.defineMetadata(constants_2.PATH_METADATA, path, target);
48
+ Reflect.defineMetadata(constants_2.HOST_METADATA, host, target);
49
+ Reflect.defineMetadata(constants_1.SCOPE_OPTIONS_METADATA, scopeOptions, target);
50
+ Reflect.defineMetadata(constants_2.VERSION_METADATA, versionOptions, target);
51
+ };
52
+ }
53
+ exports.Controller = Controller;
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Request method Decorator. Sets a response header.
3
+ *
4
+ * For example:
5
+ * `@Header('Cache-Control', 'none')`
6
+ *
7
+ * @param name string to be used for header name
8
+ * @param value string to be used for header value
9
+ *
10
+ * @publicApi
11
+ */
12
+ export declare function Header(name: string, value: string): MethodDecorator;
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Header = void 0;
4
+ const extends_metadata_helper_1 = require("../../core/helpers/extends-metadata.helper");
5
+ const constants_1 = require("@venok/http/constants");
6
+ /**
7
+ * Request method Decorator. Sets a response header.
8
+ *
9
+ * For example:
10
+ * `@Header('Cache-Control', 'none')`
11
+ *
12
+ * @param name string to be used for header name
13
+ * @param value string to be used for header value
14
+ *
15
+ * @publicApi
16
+ */
17
+ function Header(name, value) {
18
+ return (target, key, descriptor) => {
19
+ (0, extends_metadata_helper_1.extendArrayMetadata)(constants_1.HEADERS_METADATA, [{ name, value }], descriptor.value);
20
+ return descriptor;
21
+ };
22
+ }
23
+ exports.Header = Header;
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Request method Decorator. Defines the HTTP response status code. Overrides
3
+ * default status code for the decorated request method.
4
+ *
5
+ * @param statusCode HTTP response code to be returned by route handler.
6
+ *
7
+ * @publicApi
8
+ */
9
+ export declare function HttpCode(statusCode: number): MethodDecorator;
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.HttpCode = void 0;
4
+ const constants_1 = require("@venok/http/constants");
5
+ /**
6
+ * Request method Decorator. Defines the HTTP response status code. Overrides
7
+ * default status code for the decorated request method.
8
+ *
9
+ * @param statusCode HTTP response code to be returned by route handler.
10
+ *
11
+ * @publicApi
12
+ */
13
+ function HttpCode(statusCode) {
14
+ return (target, key, descriptor) => {
15
+ Reflect.defineMetadata(constants_1.HTTP_CODE_METADATA, statusCode, descriptor.value);
16
+ return descriptor;
17
+ };
18
+ }
19
+ exports.HttpCode = HttpCode;
@@ -0,0 +1,9 @@
1
+ export * from "./controller.decorator";
2
+ export * from "./header.decorator";
3
+ export * from "./http-code.decorator";
4
+ export * from "./redirect.decorator";
5
+ export * from "./render.decorator";
6
+ export * from "./request-mapping.decorator";
7
+ export * from "./route-params.decorator";
8
+ export * from "./sse.decorator";
9
+ export * from "./version.decorator";
@@ -0,0 +1,25 @@
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("./controller.decorator"), exports);
18
+ __exportStar(require("./header.decorator"), exports);
19
+ __exportStar(require("./http-code.decorator"), exports);
20
+ __exportStar(require("./redirect.decorator"), exports);
21
+ __exportStar(require("./render.decorator"), exports);
22
+ __exportStar(require("./request-mapping.decorator"), exports);
23
+ __exportStar(require("./route-params.decorator"), exports);
24
+ __exportStar(require("./sse.decorator"), exports);
25
+ __exportStar(require("./version.decorator"), exports);
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Redirects request to the specified URL.
3
+ *
4
+ * @publicApi
5
+ */
6
+ export declare function Redirect(url?: string, statusCode?: number): MethodDecorator;
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Redirect = void 0;
4
+ const constants_1 = require("@venok/http/constants");
5
+ /**
6
+ * Redirects request to the specified URL.
7
+ *
8
+ * @publicApi
9
+ */
10
+ function Redirect(url = "", statusCode) {
11
+ return (target, key, descriptor) => {
12
+ Reflect.defineMetadata(constants_1.REDIRECT_METADATA, { statusCode, url }, descriptor.value);
13
+ return descriptor;
14
+ };
15
+ }
16
+ exports.Redirect = Redirect;
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Route handler method Decorator. Defines a template to be rendered by the controller.
3
+ *
4
+ * For example: `@Render('index')`
5
+ *
6
+ * @param template name of the render engine template file
7
+ *
8
+ * @publicApi
9
+ */
10
+ export declare function Render(template: string): MethodDecorator;
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Render = void 0;
4
+ const constants_1 = require("@venok/http/constants");
5
+ /**
6
+ * Route handler method Decorator. Defines a template to be rendered by the controller.
7
+ *
8
+ * For example: `@Render('index')`
9
+ *
10
+ * @param template name of the render engine template file
11
+ *
12
+ * @publicApi
13
+ */
14
+ function Render(template) {
15
+ return (target, key, descriptor) => {
16
+ Reflect.defineMetadata(constants_1.RENDER_METADATA, template, descriptor.value);
17
+ return descriptor;
18
+ };
19
+ }
20
+ exports.Render = Render;
@@ -0,0 +1,78 @@
1
+ import { RequestMethod } from "@venok/http/enums";
2
+ export interface RequestMappingMetadata {
3
+ path?: string | string[];
4
+ method?: RequestMethod;
5
+ }
6
+ export declare const RequestMapping: (metadata?: RequestMappingMetadata) => MethodDecorator;
7
+ /**
8
+ * Route handler (method) Decorator. Routes HTTP POST requests to the specified path.
9
+ *
10
+ * @see [Routing](https://docs.nestjs.com/controllers#routing)
11
+ *
12
+ * @publicApi
13
+ */
14
+ export declare const Post: (path?: string | string[]) => MethodDecorator;
15
+ /**
16
+ * Route handler (method) Decorator. Routes HTTP GET requests to the specified path.
17
+ *
18
+ * @see [Routing](https://docs.nestjs.com/controllers#routing)
19
+ *
20
+ * @publicApi
21
+ */
22
+ export declare const Get: (path?: string | string[]) => MethodDecorator;
23
+ /**
24
+ * Route handler (method) Decorator. Routes HTTP DELETE requests to the specified path.
25
+ *
26
+ * @see [Routing](https://docs.nestjs.com/controllers#routing)
27
+ *
28
+ * @publicApi
29
+ */
30
+ export declare const Delete: (path?: string | string[]) => MethodDecorator;
31
+ /**
32
+ * Route handler (method) Decorator. Routes HTTP PUT requests to the specified path.
33
+ *
34
+ * @see [Routing](https://docs.nestjs.com/controllers#routing)
35
+ *
36
+ * @publicApi
37
+ */
38
+ export declare const Put: (path?: string | string[]) => MethodDecorator;
39
+ /**
40
+ * Route handler (method) Decorator. Routes HTTP PATCH requests to the specified path.
41
+ *
42
+ * @see [Routing](https://docs.nestjs.com/controllers#routing)
43
+ *
44
+ * @publicApi
45
+ */
46
+ export declare const Patch: (path?: string | string[]) => MethodDecorator;
47
+ /**
48
+ * Route handler (method) Decorator. Routes HTTP OPTIONS requests to the specified path.
49
+ *
50
+ * @see [Routing](https://docs.nestjs.com/controllers#routing)
51
+ *
52
+ * @publicApi
53
+ */
54
+ export declare const Options: (path?: string | string[]) => MethodDecorator;
55
+ /**
56
+ * Route handler (method) Decorator. Routes HTTP HEAD requests to the specified path.
57
+ *
58
+ * @see [Routing](https://docs.nestjs.com/controllers#routing)
59
+ *
60
+ * @publicApi
61
+ */
62
+ export declare const Head: (path?: string | string[]) => MethodDecorator;
63
+ /**
64
+ * Route handler (method) Decorator. Routes all HTTP requests to the specified path.
65
+ *
66
+ * @see [Routing](https://docs.nestjs.com/controllers#routing)
67
+ *
68
+ * @publicApi
69
+ */
70
+ export declare const All: (path?: string | string[]) => MethodDecorator;
71
+ /**
72
+ * Route handler (method) Decorator. Routes all HTTP requests to the specified path.
73
+ *
74
+ * @see [Routing](https://docs.nestjs.com/controllers#routing)
75
+ *
76
+ * @publicApi
77
+ */
78
+ export declare const Search: (path?: string | string[]) => MethodDecorator;