@expressots/adapter-express 3.0.0 → 4.0.0-preview.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (239) hide show
  1. package/README.md +39 -96
  2. package/lib/CHANGELOG.md +31 -5
  3. package/lib/README.md +39 -96
  4. package/lib/cjs/adapter-express/application-express.base.js +3 -1
  5. package/lib/cjs/adapter-express/application-express.js +1049 -85
  6. package/lib/cjs/adapter-express/express-utils/conditional-middleware.js +102 -0
  7. package/lib/cjs/adapter-express/express-utils/constants.js +17 -0
  8. package/lib/cjs/adapter-express/express-utils/content-negotiation-decorators.js +129 -0
  9. package/lib/cjs/adapter-express/express-utils/decorators.js +186 -49
  10. package/lib/cjs/adapter-express/express-utils/exception-filter-decorators.js +11 -0
  11. package/lib/cjs/adapter-express/express-utils/guard-context-factory.js +84 -0
  12. package/lib/cjs/adapter-express/express-utils/guard-middleware.js +115 -0
  13. package/lib/cjs/adapter-express/express-utils/guard-utils.js +18 -0
  14. package/lib/cjs/adapter-express/express-utils/http-context-store.js +15 -0
  15. package/lib/cjs/adapter-express/express-utils/http-status-middleware.js +37 -2
  16. package/lib/cjs/adapter-express/express-utils/index.js +67 -1
  17. package/lib/cjs/adapter-express/express-utils/interceptor-middleware.js +132 -0
  18. package/lib/cjs/adapter-express/express-utils/inversify-express-server.js +810 -63
  19. package/lib/cjs/adapter-express/express-utils/lazy-module-middleware.js +241 -0
  20. package/lib/cjs/adapter-express/express-utils/middleware-composition.js +95 -0
  21. package/lib/cjs/adapter-express/express-utils/permission-preloader.middleware.js +48 -0
  22. package/lib/cjs/adapter-express/express-utils/route-constraints.js +95 -0
  23. package/lib/cjs/adapter-express/express-utils/scope-extractor.interface.js +2 -0
  24. package/lib/cjs/adapter-express/express-utils/scope-extractor.js +66 -0
  25. package/lib/cjs/adapter-express/express-utils/setup-authorization.js +71 -0
  26. package/lib/cjs/adapter-express/express-utils/setup-event-system.js +113 -0
  27. package/lib/cjs/adapter-express/express-utils/setup-interceptors.js +103 -0
  28. package/lib/cjs/adapter-express/express-utils/setup-lazy-loading.js +228 -0
  29. package/lib/cjs/adapter-express/express-utils/utils.js +30 -12
  30. package/lib/cjs/adapter-express/express-utils/validation-decorators.js +205 -0
  31. package/lib/cjs/adapter-express/express-utils/validation-service.js +252 -0
  32. package/lib/cjs/adapter-express/index.js +7 -5
  33. package/lib/cjs/adapter-express/micro-api/application-express-micro-route.js +31 -1
  34. package/lib/cjs/adapter-express/micro-api/application-express-micro.js +11 -37
  35. package/lib/cjs/adapter-express/micro-api/gateway/circuit-breaker.js +174 -0
  36. package/lib/cjs/adapter-express/micro-api/gateway/index.js +11 -0
  37. package/lib/cjs/adapter-express/micro-api/gateway/service-proxy.js +214 -0
  38. package/lib/cjs/adapter-express/micro-api/index.js +27 -3
  39. package/lib/cjs/adapter-express/micro-api/micro.js +217 -0
  40. package/lib/cjs/adapter-express/micro-api/queue/index.js +8 -0
  41. package/lib/cjs/adapter-express/micro-api/queue/queue.interface.js +2 -0
  42. package/lib/cjs/adapter-express/micro-api/queue/rabbitmq-consumer.js +255 -0
  43. package/lib/cjs/adapter-express/micro-api/serverless/aws-lambda.adapter.js +183 -0
  44. package/lib/cjs/adapter-express/micro-api/serverless/cloudflare.adapter.js +158 -0
  45. package/lib/cjs/adapter-express/micro-api/serverless/index.js +12 -0
  46. package/lib/cjs/adapter-express/micro-api/serverless/vercel.adapter.js +102 -0
  47. package/lib/cjs/adapter-express/micro-api/service-mesh/index.js +10 -0
  48. package/lib/cjs/adapter-express/micro-api/service-mesh/service-client.js +194 -0
  49. package/lib/cjs/adapter-express/micro-api/service-mesh/service-discovery.js +261 -0
  50. package/lib/cjs/adapter-express/middleware/index.js +21 -0
  51. package/lib/cjs/adapter-express/middleware/request-logging.middleware.js +244 -0
  52. package/lib/cjs/adapter-express/render/engine.js +15 -15
  53. package/lib/cjs/adapter-express/render/index.js +5 -0
  54. package/lib/cjs/adapter-express/studio/index.js +9 -0
  55. package/lib/cjs/adapter-express/studio/studio-integration.js +214 -0
  56. package/lib/cjs/index.js +1 -1
  57. package/lib/cjs/types/adapter-express/application-express.base.d.ts +20 -7
  58. package/lib/cjs/types/adapter-express/application-express.d.ts +273 -32
  59. package/lib/cjs/types/adapter-express/express-utils/base-middleware.d.ts +2 -2
  60. package/lib/cjs/types/adapter-express/express-utils/conditional-middleware.d.ts +97 -0
  61. package/lib/cjs/types/adapter-express/express-utils/constants.d.ts +13 -0
  62. package/lib/cjs/types/adapter-express/express-utils/content-negotiation-decorators.d.ts +94 -0
  63. package/lib/cjs/types/adapter-express/express-utils/decorators.d.ts +54 -6
  64. package/lib/cjs/types/adapter-express/express-utils/exception-filter-decorators.d.ts +6 -0
  65. package/lib/cjs/types/adapter-express/express-utils/guard-context-factory.d.ts +17 -0
  66. package/lib/cjs/types/adapter-express/express-utils/guard-middleware.d.ts +22 -0
  67. package/lib/cjs/types/adapter-express/express-utils/guard-utils.d.ts +11 -0
  68. package/lib/cjs/types/adapter-express/express-utils/http-context-store.d.ts +20 -0
  69. package/lib/cjs/types/adapter-express/express-utils/httpResponseMessage.d.ts +1 -1
  70. package/lib/cjs/types/adapter-express/express-utils/index.d.ts +30 -2
  71. package/lib/cjs/types/adapter-express/express-utils/interceptor-middleware.d.ts +40 -0
  72. package/lib/cjs/types/adapter-express/express-utils/interfaces.d.ts +42 -5
  73. package/lib/cjs/types/adapter-express/express-utils/inversify-express-server.d.ts +114 -2
  74. package/lib/cjs/types/adapter-express/express-utils/lazy-module-middleware.d.ts +122 -0
  75. package/lib/cjs/types/adapter-express/express-utils/middleware-composition.d.ts +85 -0
  76. package/lib/cjs/types/adapter-express/express-utils/permission-preloader.middleware.d.ts +10 -0
  77. package/lib/cjs/types/adapter-express/express-utils/route-constraints.d.ts +89 -0
  78. package/lib/cjs/types/adapter-express/express-utils/scope-extractor.d.ts +21 -0
  79. package/lib/cjs/types/adapter-express/express-utils/scope-extractor.interface.d.ts +12 -0
  80. package/lib/cjs/types/adapter-express/express-utils/setup-authorization.d.ts +34 -0
  81. package/lib/cjs/types/adapter-express/express-utils/setup-event-system.d.ts +118 -0
  82. package/lib/cjs/types/adapter-express/express-utils/setup-interceptors.d.ts +115 -0
  83. package/lib/cjs/types/adapter-express/express-utils/setup-lazy-loading.d.ts +123 -0
  84. package/lib/cjs/types/adapter-express/express-utils/utils.d.ts +17 -2
  85. package/lib/cjs/types/adapter-express/express-utils/validation-decorators.d.ts +145 -0
  86. package/lib/cjs/types/adapter-express/express-utils/validation-service.d.ts +88 -0
  87. package/lib/cjs/types/adapter-express/index.d.ts +6 -4
  88. package/lib/cjs/types/adapter-express/micro-api/application-express-micro-route.d.ts +25 -14
  89. package/lib/cjs/types/adapter-express/micro-api/application-express-micro.d.ts +3 -10
  90. package/lib/cjs/types/adapter-express/micro-api/gateway/circuit-breaker.d.ts +111 -0
  91. package/lib/cjs/types/adapter-express/micro-api/gateway/index.d.ts +5 -0
  92. package/lib/cjs/types/adapter-express/micro-api/gateway/service-proxy.d.ts +83 -0
  93. package/lib/cjs/types/adapter-express/micro-api/index.d.ts +7 -1
  94. package/lib/cjs/types/adapter-express/micro-api/micro.d.ts +66 -0
  95. package/lib/cjs/types/adapter-express/micro-api/queue/index.d.ts +5 -0
  96. package/lib/cjs/types/adapter-express/micro-api/queue/queue.interface.d.ts +60 -0
  97. package/lib/cjs/types/adapter-express/micro-api/queue/rabbitmq-consumer.d.ts +86 -0
  98. package/lib/cjs/types/adapter-express/micro-api/serverless/aws-lambda.adapter.d.ts +77 -0
  99. package/lib/cjs/types/adapter-express/micro-api/serverless/cloudflare.adapter.d.ts +64 -0
  100. package/lib/cjs/types/adapter-express/micro-api/serverless/index.d.ts +6 -0
  101. package/lib/cjs/types/adapter-express/micro-api/serverless/vercel.adapter.d.ts +56 -0
  102. package/lib/cjs/types/adapter-express/micro-api/service-mesh/index.d.ts +5 -0
  103. package/lib/cjs/types/adapter-express/micro-api/service-mesh/service-client.d.ts +122 -0
  104. package/lib/cjs/types/adapter-express/micro-api/service-mesh/service-discovery.d.ts +150 -0
  105. package/lib/cjs/types/adapter-express/middleware/index.d.ts +5 -0
  106. package/lib/cjs/types/adapter-express/middleware/request-logging.middleware.d.ts +65 -0
  107. package/lib/cjs/types/adapter-express/render/index.d.ts +1 -0
  108. package/lib/cjs/types/adapter-express/studio/index.d.ts +1 -0
  109. package/lib/cjs/types/adapter-express/studio/studio-integration.d.ts +92 -0
  110. package/lib/cjs/types/index.d.ts +1 -1
  111. package/lib/esm/adapter-express/application-express.base.js +24 -0
  112. package/lib/esm/adapter-express/application-express.js +1300 -0
  113. package/lib/esm/adapter-express/application-express.types.js +1 -0
  114. package/lib/esm/adapter-express/express-utils/base-middleware.js +19 -0
  115. package/lib/esm/adapter-express/express-utils/conditional-middleware.js +96 -0
  116. package/lib/esm/adapter-express/express-utils/constants.js +63 -0
  117. package/lib/esm/adapter-express/express-utils/content/httpContent.js +6 -0
  118. package/lib/esm/adapter-express/express-utils/content-negotiation-decorators.js +120 -0
  119. package/lib/esm/adapter-express/express-utils/decorators.js +575 -0
  120. package/lib/esm/adapter-express/express-utils/exception-filter-decorators.js +6 -0
  121. package/lib/esm/adapter-express/express-utils/guard-context-factory.js +83 -0
  122. package/lib/esm/adapter-express/express-utils/guard-middleware.js +115 -0
  123. package/lib/esm/adapter-express/express-utils/guard-utils.js +14 -0
  124. package/lib/esm/adapter-express/express-utils/http-context-store.js +10 -0
  125. package/lib/esm/adapter-express/express-utils/http-status-middleware.js +116 -0
  126. package/lib/esm/adapter-express/express-utils/httpResponseMessage.js +29 -0
  127. package/lib/esm/adapter-express/express-utils/index.js +24 -0
  128. package/lib/esm/adapter-express/express-utils/interceptor-middleware.js +130 -0
  129. package/lib/esm/adapter-express/express-utils/interfaces.js +1 -0
  130. package/lib/esm/adapter-express/express-utils/inversify-express-server.js +1031 -0
  131. package/lib/esm/adapter-express/express-utils/lazy-module-middleware.js +236 -0
  132. package/lib/esm/adapter-express/express-utils/middleware-composition.js +89 -0
  133. package/lib/esm/adapter-express/express-utils/permission-preloader.middleware.js +45 -0
  134. package/lib/esm/adapter-express/express-utils/resolver-multer.js +30 -0
  135. package/lib/esm/adapter-express/express-utils/route-constraints.js +91 -0
  136. package/lib/esm/adapter-express/express-utils/scope-extractor.interface.js +1 -0
  137. package/lib/esm/adapter-express/express-utils/scope-extractor.js +63 -0
  138. package/lib/esm/adapter-express/express-utils/setup-authorization.js +68 -0
  139. package/lib/esm/adapter-express/express-utils/setup-event-system.js +110 -0
  140. package/lib/esm/adapter-express/express-utils/setup-interceptors.js +100 -0
  141. package/lib/esm/adapter-express/express-utils/setup-lazy-loading.js +225 -0
  142. package/lib/esm/adapter-express/express-utils/utils.js +68 -0
  143. package/lib/esm/adapter-express/express-utils/validation-decorators.js +199 -0
  144. package/lib/esm/adapter-express/express-utils/validation-service.js +251 -0
  145. package/lib/esm/adapter-express/index.js +7 -0
  146. package/lib/esm/adapter-express/micro-api/application-express-micro-container.js +48 -0
  147. package/lib/esm/adapter-express/micro-api/application-express-micro-route.js +128 -0
  148. package/lib/esm/adapter-express/micro-api/application-express-micro.js +161 -0
  149. package/lib/esm/adapter-express/micro-api/gateway/circuit-breaker.js +174 -0
  150. package/lib/esm/adapter-express/micro-api/gateway/index.js +5 -0
  151. package/lib/esm/adapter-express/micro-api/gateway/service-proxy.js +210 -0
  152. package/lib/esm/adapter-express/micro-api/index.js +10 -0
  153. package/lib/esm/adapter-express/micro-api/micro.js +211 -0
  154. package/lib/esm/adapter-express/micro-api/queue/index.js +4 -0
  155. package/lib/esm/adapter-express/micro-api/queue/queue.interface.js +1 -0
  156. package/lib/esm/adapter-express/micro-api/queue/rabbitmq-consumer.js +229 -0
  157. package/lib/esm/adapter-express/micro-api/serverless/aws-lambda.adapter.js +180 -0
  158. package/lib/esm/adapter-express/micro-api/serverless/cloudflare.adapter.js +155 -0
  159. package/lib/esm/adapter-express/micro-api/serverless/index.js +6 -0
  160. package/lib/esm/adapter-express/micro-api/serverless/vercel.adapter.js +99 -0
  161. package/lib/esm/adapter-express/micro-api/service-mesh/index.js +5 -0
  162. package/lib/esm/adapter-express/micro-api/service-mesh/service-client.js +191 -0
  163. package/lib/esm/adapter-express/micro-api/service-mesh/service-discovery.js +259 -0
  164. package/lib/esm/adapter-express/middleware/index.js +5 -0
  165. package/lib/esm/adapter-express/middleware/request-logging.middleware.js +239 -0
  166. package/lib/esm/adapter-express/render/constants.js +37 -0
  167. package/lib/esm/adapter-express/render/engine.js +51 -0
  168. package/lib/esm/adapter-express/render/index.js +1 -0
  169. package/lib/esm/adapter-express/render/resolve-render.js +30 -0
  170. package/lib/esm/adapter-express/studio/index.js +1 -0
  171. package/lib/esm/adapter-express/studio/studio-integration.js +184 -0
  172. package/lib/esm/index.mjs +1 -0
  173. package/lib/esm/package.json +3 -0
  174. package/lib/esm/types/adapter-express/application-express.base.d.ts +77 -0
  175. package/lib/esm/types/adapter-express/application-express.d.ts +411 -0
  176. package/lib/esm/types/adapter-express/application-express.types.d.ts +23 -0
  177. package/lib/esm/types/adapter-express/express-utils/base-middleware.d.ts +8 -0
  178. package/lib/esm/types/adapter-express/express-utils/conditional-middleware.d.ts +97 -0
  179. package/lib/esm/types/adapter-express/express-utils/constants.d.ts +57 -0
  180. package/lib/esm/types/adapter-express/express-utils/content/httpContent.d.ts +6 -0
  181. package/lib/esm/types/adapter-express/express-utils/content-negotiation-decorators.d.ts +94 -0
  182. package/lib/esm/types/adapter-express/express-utils/decorators.d.ts +257 -0
  183. package/lib/esm/types/adapter-express/express-utils/exception-filter-decorators.d.ts +6 -0
  184. package/lib/esm/types/adapter-express/express-utils/guard-context-factory.d.ts +17 -0
  185. package/lib/esm/types/adapter-express/express-utils/guard-middleware.d.ts +22 -0
  186. package/lib/esm/types/adapter-express/express-utils/guard-utils.d.ts +11 -0
  187. package/lib/esm/types/adapter-express/express-utils/http-context-store.d.ts +20 -0
  188. package/lib/esm/types/adapter-express/express-utils/http-status-middleware.d.ts +26 -0
  189. package/lib/esm/types/adapter-express/express-utils/httpResponseMessage.d.ts +14 -0
  190. package/lib/esm/types/adapter-express/express-utils/index.d.ts +30 -0
  191. package/lib/esm/types/adapter-express/express-utils/interceptor-middleware.d.ts +40 -0
  192. package/lib/esm/types/adapter-express/express-utils/interfaces.d.ts +115 -0
  193. package/lib/esm/types/adapter-express/express-utils/inversify-express-server.d.ts +172 -0
  194. package/lib/esm/types/adapter-express/express-utils/lazy-module-middleware.d.ts +122 -0
  195. package/lib/esm/types/adapter-express/express-utils/middleware-composition.d.ts +85 -0
  196. package/lib/esm/types/adapter-express/express-utils/permission-preloader.middleware.d.ts +10 -0
  197. package/lib/esm/types/adapter-express/express-utils/resolver-multer.d.ts +7 -0
  198. package/lib/esm/types/adapter-express/express-utils/route-constraints.d.ts +89 -0
  199. package/lib/esm/types/adapter-express/express-utils/scope-extractor.d.ts +21 -0
  200. package/lib/esm/types/adapter-express/express-utils/scope-extractor.interface.d.ts +12 -0
  201. package/lib/esm/types/adapter-express/express-utils/setup-authorization.d.ts +34 -0
  202. package/lib/esm/types/adapter-express/express-utils/setup-event-system.d.ts +118 -0
  203. package/lib/esm/types/adapter-express/express-utils/setup-interceptors.d.ts +115 -0
  204. package/lib/esm/types/adapter-express/express-utils/setup-lazy-loading.d.ts +123 -0
  205. package/lib/esm/types/adapter-express/express-utils/utils.d.ts +24 -0
  206. package/lib/esm/types/adapter-express/express-utils/validation-decorators.d.ts +145 -0
  207. package/lib/esm/types/adapter-express/express-utils/validation-service.d.ts +88 -0
  208. package/lib/esm/types/adapter-express/index.d.ts +7 -0
  209. package/lib/esm/types/adapter-express/micro-api/application-express-micro-container.d.ts +47 -0
  210. package/lib/esm/types/adapter-express/micro-api/application-express-micro-route.d.ts +104 -0
  211. package/lib/esm/types/adapter-express/micro-api/application-express-micro.d.ts +72 -0
  212. package/lib/esm/types/adapter-express/micro-api/gateway/circuit-breaker.d.ts +111 -0
  213. package/lib/esm/types/adapter-express/micro-api/gateway/index.d.ts +5 -0
  214. package/lib/esm/types/adapter-express/micro-api/gateway/service-proxy.d.ts +83 -0
  215. package/lib/esm/types/adapter-express/micro-api/index.d.ts +7 -0
  216. package/lib/esm/types/adapter-express/micro-api/micro.d.ts +66 -0
  217. package/lib/esm/types/adapter-express/micro-api/queue/index.d.ts +5 -0
  218. package/lib/esm/types/adapter-express/micro-api/queue/queue.interface.d.ts +60 -0
  219. package/lib/esm/types/adapter-express/micro-api/queue/rabbitmq-consumer.d.ts +86 -0
  220. package/lib/esm/types/adapter-express/micro-api/serverless/aws-lambda.adapter.d.ts +77 -0
  221. package/lib/esm/types/adapter-express/micro-api/serverless/cloudflare.adapter.d.ts +64 -0
  222. package/lib/esm/types/adapter-express/micro-api/serverless/index.d.ts +6 -0
  223. package/lib/esm/types/adapter-express/micro-api/serverless/vercel.adapter.d.ts +56 -0
  224. package/lib/esm/types/adapter-express/micro-api/service-mesh/index.d.ts +5 -0
  225. package/lib/esm/types/adapter-express/micro-api/service-mesh/service-client.d.ts +122 -0
  226. package/lib/esm/types/adapter-express/micro-api/service-mesh/service-discovery.d.ts +150 -0
  227. package/lib/esm/types/adapter-express/middleware/index.d.ts +5 -0
  228. package/lib/esm/types/adapter-express/middleware/request-logging.middleware.d.ts +65 -0
  229. package/lib/esm/types/adapter-express/render/constants.d.ts +26 -0
  230. package/lib/esm/types/adapter-express/render/engine.d.ts +20 -0
  231. package/lib/esm/types/adapter-express/render/index.d.ts +5 -0
  232. package/lib/esm/types/adapter-express/render/resolve-render.d.ts +7 -0
  233. package/lib/esm/types/adapter-express/studio/index.d.ts +1 -0
  234. package/lib/esm/types/adapter-express/studio/studio-integration.d.ts +92 -0
  235. package/lib/esm/types/index.d.ts +1 -0
  236. package/lib/package.json +156 -146
  237. package/package.json +156 -146
  238. package/lib/cjs/di/di.interfaces.js +0 -10
  239. package/lib/cjs/types/di/di.interfaces.d.ts +0 -289
@@ -0,0 +1,161 @@
1
+ import { Console, Logger, Middleware } from "@expressots/core";
2
+ import express from "express";
3
+ import { IOC } from "./application-express-micro-container.js";
4
+ import { Route } from "./application-express-micro-route.js";
5
+ class AppExpressMicro {
6
+ logger = new Logger();
7
+ app;
8
+ httpServer;
9
+ port;
10
+ environment;
11
+ container;
12
+ globalPrefix = "/";
13
+ middlewareManager;
14
+ routeManager;
15
+ /**
16
+ * Handle the exit of the server
17
+ * @private
18
+ */
19
+ handleExit() {
20
+ this.logger.info("Server shutting down.", "MicroAPI");
21
+ process.exit(0);
22
+ }
23
+ /**
24
+ * Configure the middleware for the application
25
+ * @private
26
+ */
27
+ configureMiddleware() {
28
+ const sortedMiddlewarePipeline = this.middlewareManager.getMiddlewarePipeline();
29
+ const pipeline = sortedMiddlewarePipeline.map((entry) => entry.middleware);
30
+ for (const entry of pipeline) {
31
+ if (typeof entry === "function") {
32
+ this.app.use(entry);
33
+ }
34
+ else if (entry.middlewares) {
35
+ const { path, middlewares } = entry;
36
+ for (const mid of middlewares) {
37
+ if (path) {
38
+ this.app.use(path, mid);
39
+ }
40
+ else {
41
+ this.app.use(mid);
42
+ }
43
+ }
44
+ }
45
+ }
46
+ }
47
+ /**
48
+ * Set the global route prefix
49
+ * @param prefix - The global route prefix
50
+ * @public API
51
+ */
52
+ setGlobalRoutePrefix(prefix) {
53
+ this.globalPrefix = prefix;
54
+ }
55
+ /**
56
+ * Get the Middleware instance
57
+ * @returns IMiddleware
58
+ * @public API
59
+ */
60
+ get Middleware() {
61
+ return this.middlewareManager;
62
+ }
63
+ /**
64
+ * Get the Route instance
65
+ * @returns IRoute
66
+ * @public API
67
+ */
68
+ get Route() {
69
+ return this.routeManager;
70
+ }
71
+ /**
72
+ * Get the Container instance
73
+ * @returns IIOC
74
+ * @public API
75
+ */
76
+ get Container() {
77
+ return this.container;
78
+ }
79
+ /**
80
+ * Get the Express HTTP Server instance
81
+ * @returns express.Application
82
+ * @public API
83
+ */
84
+ getHttpServer() {
85
+ return this.httpServer;
86
+ }
87
+ /**
88
+ * Create a new instance of the Express Micro API adapter
89
+ * @param config - Configuration options
90
+ * @returns ICreateMicroAPI
91
+ * @public API
92
+ */
93
+ create(config) {
94
+ this.app = express();
95
+ this.routeManager = new Route(this.app);
96
+ this.container = new IOC(config?.containerOptions);
97
+ this.middlewareManager = new Middleware();
98
+ this.environment = "development";
99
+ return this;
100
+ }
101
+ /**
102
+ * Build the Web Server Micro API
103
+ * @returns IWebServerMicroAPI
104
+ * @public API
105
+ */
106
+ build() {
107
+ this.routeManager.setGlobalRoutePrefix(this.globalPrefix);
108
+ return this;
109
+ }
110
+ /**
111
+ * Listen for incoming requests
112
+ * @param port - The port to listen on
113
+ * @param appInfo - Information about the application
114
+ * @public API
115
+ */
116
+ async listen(port, appInfo) {
117
+ const logger = new Logger();
118
+ const console = new Console();
119
+ const normalizedPort = typeof port === "string" ? parseInt(port, 10) : port;
120
+ this.configureMiddleware();
121
+ this.routeManager.applyRoutes();
122
+ if (this.Middleware.getErrorHandler()) {
123
+ this.app.use(this.Middleware.getErrorHandler());
124
+ }
125
+ return new Promise((resolve, reject) => {
126
+ this.httpServer = this.app.listen(normalizedPort, async () => {
127
+ const address = this.httpServer.address();
128
+ if (typeof address === "object" && address?.port) {
129
+ this.port = address.port;
130
+ }
131
+ else {
132
+ this.port = normalizedPort;
133
+ }
134
+ // Display startup message using Console class
135
+ await console.messageServer(this.port, this.environment, {
136
+ appName: appInfo?.appName || "ExpressoTS Micro",
137
+ appVersion: appInfo?.appVersion || "1.0.0",
138
+ });
139
+ ["SIGTERM", "SIGHUP", "SIGBREAK", "SIGQUIT", "SIGINT"].forEach((signal) => {
140
+ process.on(signal, this.handleExit.bind(this));
141
+ });
142
+ resolve();
143
+ });
144
+ this.httpServer.on("error", (error) => {
145
+ logger.error(`Error starting server: ${error.message}`, "MicroAPI");
146
+ reject(error);
147
+ });
148
+ });
149
+ }
150
+ }
151
+ /**
152
+ * Create a new instance of the Express Micro API adapter
153
+ * @param config - Configuration options
154
+ * @returns ICreateMicroAPI
155
+ * @public API
156
+ */
157
+ export function createMicroAPI(config) {
158
+ const microAPI = new AppExpressMicro();
159
+ const create = microAPI.create.bind(microAPI);
160
+ return create(config);
161
+ }
@@ -0,0 +1,174 @@
1
+ /**
2
+ * CircuitBreaker - Protect against cascading failures in distributed systems.
3
+ *
4
+ * States:
5
+ * - CLOSED: Normal operation, requests pass through
6
+ * - OPEN: Requests fail immediately without calling the service
7
+ * - HALF_OPEN: Limited requests pass through to test if service recovered
8
+ *
9
+ * @example
10
+ * ```typescript
11
+ * const circuitBreaker = new CircuitBreaker({
12
+ * failureThreshold: 5,
13
+ * timeout: 60000,
14
+ * });
15
+ *
16
+ * app.Route.get("/external-api", async (req, res) => {
17
+ * try {
18
+ * const result = await circuitBreaker.execute(async () => {
19
+ * return await fetch("https://external-api.com/data");
20
+ * });
21
+ * res.json(await result.json());
22
+ * } catch (error) {
23
+ * if (error.message === "Circuit breaker is OPEN") {
24
+ * res.status(503).json({ error: "Service temporarily unavailable" });
25
+ * } else {
26
+ * res.status(500).json({ error: error.message });
27
+ * }
28
+ * }
29
+ * });
30
+ * ```
31
+ */
32
+ export class CircuitBreaker {
33
+ state = "CLOSED";
34
+ failures = 0;
35
+ successes = 0;
36
+ totalSuccesses = 0;
37
+ totalCalls = 0;
38
+ lastFailure;
39
+ lastSuccess;
40
+ openedAt;
41
+ recentFailures = [];
42
+ config;
43
+ constructor(config) {
44
+ this.config = {
45
+ failureThreshold: config?.failureThreshold ?? 5,
46
+ successThreshold: config?.successThreshold ?? 2,
47
+ timeout: config?.timeout ?? 60000,
48
+ monitoringPeriod: config?.monitoringPeriod ?? 10000,
49
+ };
50
+ }
51
+ /**
52
+ * Execute a function with circuit breaker protection
53
+ * @param fn - Function to execute
54
+ * @throws Error if circuit is open
55
+ */
56
+ async execute(fn) {
57
+ this.totalCalls++;
58
+ // Check if circuit is open
59
+ if (this.state === "OPEN") {
60
+ // Check if timeout has passed
61
+ if (this.shouldAttemptReset()) {
62
+ this.state = "HALF_OPEN";
63
+ this.successes = 0;
64
+ }
65
+ else {
66
+ throw new Error("Circuit breaker is OPEN");
67
+ }
68
+ }
69
+ try {
70
+ const result = await fn();
71
+ this.onSuccess();
72
+ return result;
73
+ }
74
+ catch (error) {
75
+ this.onFailure();
76
+ throw error;
77
+ }
78
+ }
79
+ /**
80
+ * Get current circuit state
81
+ */
82
+ getState() {
83
+ return this.state;
84
+ }
85
+ /**
86
+ * Get circuit breaker statistics
87
+ */
88
+ getStats() {
89
+ return {
90
+ state: this.state,
91
+ failures: this.failures,
92
+ successes: this.totalSuccesses,
93
+ totalCalls: this.totalCalls,
94
+ lastFailure: this.lastFailure,
95
+ lastSuccess: this.lastSuccess,
96
+ openedAt: this.openedAt,
97
+ };
98
+ }
99
+ /**
100
+ * Manually reset the circuit breaker
101
+ */
102
+ reset() {
103
+ this.state = "CLOSED";
104
+ this.failures = 0;
105
+ this.successes = 0;
106
+ this.totalSuccesses = 0;
107
+ this.recentFailures = [];
108
+ this.openedAt = undefined;
109
+ }
110
+ /**
111
+ * Manually open the circuit
112
+ */
113
+ open() {
114
+ this.state = "OPEN";
115
+ this.openedAt = new Date();
116
+ }
117
+ /**
118
+ * Handle successful call
119
+ */
120
+ onSuccess() {
121
+ this.totalSuccesses++;
122
+ this.lastSuccess = new Date();
123
+ if (this.state === "HALF_OPEN") {
124
+ this.successes++;
125
+ if (this.successes >= this.config.successThreshold) {
126
+ this.state = "CLOSED";
127
+ this.failures = 0;
128
+ this.recentFailures = [];
129
+ this.openedAt = undefined;
130
+ }
131
+ }
132
+ else if (this.state === "CLOSED") {
133
+ // Clear old failures outside monitoring period
134
+ this.cleanupRecentFailures();
135
+ }
136
+ }
137
+ /**
138
+ * Handle failed call
139
+ */
140
+ onFailure() {
141
+ this.failures++;
142
+ this.lastFailure = new Date();
143
+ this.recentFailures.push(this.lastFailure);
144
+ if (this.state === "HALF_OPEN") {
145
+ // Any failure in half-open state reopens the circuit
146
+ this.state = "OPEN";
147
+ this.openedAt = new Date();
148
+ this.successes = 0;
149
+ }
150
+ else if (this.state === "CLOSED") {
151
+ this.cleanupRecentFailures();
152
+ // Check if we've hit the failure threshold
153
+ if (this.recentFailures.length >= this.config.failureThreshold) {
154
+ this.state = "OPEN";
155
+ this.openedAt = new Date();
156
+ }
157
+ }
158
+ }
159
+ /**
160
+ * Check if timeout has passed and we should try to reset
161
+ */
162
+ shouldAttemptReset() {
163
+ if (!this.openedAt)
164
+ return true;
165
+ return Date.now() - this.openedAt.getTime() >= this.config.timeout;
166
+ }
167
+ /**
168
+ * Remove failures outside the monitoring period
169
+ */
170
+ cleanupRecentFailures() {
171
+ const cutoff = Date.now() - this.config.monitoringPeriod;
172
+ this.recentFailures = this.recentFailures.filter((date) => date.getTime() > cutoff);
173
+ }
174
+ }
@@ -0,0 +1,5 @@
1
+ /**
2
+ * API Gateway Utilities for ExpressoTS Micro Template
3
+ */
4
+ export { CircuitBreaker, } from "./circuit-breaker.js";
5
+ export { ServiceProxy, createProxy } from "./service-proxy.js";
@@ -0,0 +1,210 @@
1
+ import { CircuitBreaker } from "./circuit-breaker.js";
2
+ /**
3
+ * ServiceProxy - Proxy requests to other microservices.
4
+ *
5
+ * Features:
6
+ * - Automatic request forwarding
7
+ * - Path rewriting
8
+ * - Custom headers
9
+ * - Request timeout
10
+ * - Retry support
11
+ * - Optional circuit breaker integration
12
+ *
13
+ * @example
14
+ * ```typescript
15
+ * // Proxy to user service
16
+ * const userProxy = createProxy({
17
+ * target: "http://user-service:3001",
18
+ * pathRewrite: (path) => path.replace("/api/users", ""),
19
+ * timeout: 5000,
20
+ * retries: 3,
21
+ * circuitBreaker: true,
22
+ * });
23
+ *
24
+ * app.Route.get("/api/users/*", userProxy.handler());
25
+ * app.Route.post("/api/users/*", userProxy.handler());
26
+ * ```
27
+ */
28
+ export class ServiceProxy {
29
+ config;
30
+ constructor(config) {
31
+ this.config = {
32
+ target: config.target,
33
+ timeout: config.timeout ?? 30000,
34
+ retries: config.retries ?? 0,
35
+ headers: config.headers ?? {},
36
+ pathRewrite: config.pathRewrite ?? ((path) => path),
37
+ debug: config.debug ?? false,
38
+ };
39
+ // Initialize circuit breaker if enabled
40
+ if (config.circuitBreaker) {
41
+ const cbConfig = typeof config.circuitBreaker === "object" ? config.circuitBreaker : undefined;
42
+ this.config.circuitBreaker = new CircuitBreaker(cbConfig);
43
+ }
44
+ }
45
+ /**
46
+ * Create an Express handler for proxying requests
47
+ */
48
+ handler() {
49
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
50
+ return async (req, res, _next) => {
51
+ try {
52
+ const result = await this.proxyRequest(req);
53
+ // Copy status and headers
54
+ res.status(result.status);
55
+ result.headers.forEach((value, key) => {
56
+ // Skip certain headers
57
+ if (!["content-encoding", "transfer-encoding"].includes(key.toLowerCase())) {
58
+ res.setHeader(key, value);
59
+ }
60
+ });
61
+ // Send body
62
+ const body = await result.text();
63
+ res.send(body);
64
+ }
65
+ catch (error) {
66
+ const errorMessage = error instanceof Error ? error.message : String(error);
67
+ if (this.config.debug) {
68
+ console.error(`[Proxy] Error:`, errorMessage);
69
+ }
70
+ if (errorMessage === "Circuit breaker is OPEN") {
71
+ res.status(503).json({
72
+ error: "Service temporarily unavailable",
73
+ service: this.config.target,
74
+ });
75
+ }
76
+ else if (error instanceof Error && error.name === "AbortError") {
77
+ res.status(504).json({
78
+ error: "Gateway timeout",
79
+ service: this.config.target,
80
+ });
81
+ }
82
+ else {
83
+ res.status(502).json({
84
+ error: "Bad gateway",
85
+ message: errorMessage,
86
+ service: this.config.target,
87
+ });
88
+ }
89
+ }
90
+ };
91
+ }
92
+ /**
93
+ * Proxy a request to the target service
94
+ */
95
+ async proxyRequest(req) {
96
+ const execute = async () => {
97
+ return await this.executeWithRetry(req);
98
+ };
99
+ if (this.config.circuitBreaker) {
100
+ return await this.config.circuitBreaker.execute(execute);
101
+ }
102
+ return await execute();
103
+ }
104
+ /**
105
+ * Execute request with retry logic
106
+ */
107
+ async executeWithRetry(req, attempt = 0) {
108
+ try {
109
+ return await this.executeRequest(req);
110
+ }
111
+ catch (error) {
112
+ if (attempt < this.config.retries) {
113
+ // Exponential backoff
114
+ await this.delay(Math.pow(2, attempt) * 100);
115
+ return await this.executeWithRetry(req, attempt + 1);
116
+ }
117
+ throw error;
118
+ }
119
+ }
120
+ /**
121
+ * Execute a single request
122
+ */
123
+ async executeRequest(req) {
124
+ // Rewrite path if configured
125
+ const path = this.config.pathRewrite(req.path);
126
+ const url = new URL(path, this.config.target);
127
+ // Copy query parameters
128
+ Object.entries(req.query).forEach(([key, value]) => {
129
+ if (typeof value === "string") {
130
+ url.searchParams.append(key, value);
131
+ }
132
+ });
133
+ // Build headers
134
+ const headers = {
135
+ ...this.extractHeaders(req),
136
+ ...this.config.headers,
137
+ };
138
+ // Build request options
139
+ const controller = new AbortController();
140
+ const timeoutId = setTimeout(() => controller.abort(), this.config.timeout);
141
+ const requestInit = {
142
+ method: req.method,
143
+ headers,
144
+ signal: controller.signal,
145
+ };
146
+ // Add body for non-GET requests
147
+ if (req.method !== "GET" && req.method !== "HEAD" && req.body) {
148
+ requestInit.body = JSON.stringify(req.body);
149
+ headers["content-type"] = "application/json";
150
+ }
151
+ if (this.config.debug) {
152
+ console.log(`[Proxy] ${req.method} ${url.toString()}`);
153
+ }
154
+ try {
155
+ const response = await fetch(url.toString(), requestInit);
156
+ clearTimeout(timeoutId);
157
+ // Cast to ProxyResponse to avoid conflict with Express Response type
158
+ return response;
159
+ }
160
+ catch (error) {
161
+ clearTimeout(timeoutId);
162
+ throw error;
163
+ }
164
+ }
165
+ /**
166
+ * Extract relevant headers from incoming request
167
+ */
168
+ extractHeaders(req) {
169
+ const headers = {};
170
+ const forwardHeaders = [
171
+ "authorization",
172
+ "content-type",
173
+ "accept",
174
+ "user-agent",
175
+ "x-request-id",
176
+ "x-trace-id",
177
+ "x-span-id",
178
+ "x-correlation-id",
179
+ ];
180
+ forwardHeaders.forEach((header) => {
181
+ const value = req.headers[header];
182
+ if (typeof value === "string") {
183
+ headers[header] = value;
184
+ }
185
+ });
186
+ // Add X-Forwarded headers
187
+ headers["x-forwarded-for"] = req.ip || req.socket.remoteAddress || "unknown";
188
+ headers["x-forwarded-host"] = req.headers.host || "";
189
+ headers["x-forwarded-proto"] = req.protocol;
190
+ return headers;
191
+ }
192
+ /**
193
+ * Delay helper
194
+ */
195
+ delay(ms) {
196
+ return new Promise((resolve) => setTimeout(resolve, ms));
197
+ }
198
+ /**
199
+ * Get circuit breaker stats (if enabled)
200
+ */
201
+ getCircuitBreakerStats() {
202
+ return this.config.circuitBreaker?.getStats();
203
+ }
204
+ }
205
+ /**
206
+ * Create a new service proxy
207
+ */
208
+ export function createProxy(config) {
209
+ return new ServiceProxy(config);
210
+ }
@@ -0,0 +1,10 @@
1
+ // Primary API - pure simplicity
2
+ export { micro } from "./micro.js";
3
+ // Advanced features - import separately when needed
4
+ export * from "./gateway/index.js"; // CircuitBreaker, ServiceProxy
5
+ export * from "./service-mesh/index.js"; // ServiceDiscovery, ServiceClient
6
+ export * from "./serverless/index.js"; // Lambda, Cloudflare, Vercel adapters
7
+ export * from "./queue/index.js"; // RabbitMQ consumer
8
+ // Legacy API - deprecated, will be removed in v6
9
+ /** @deprecated Use micro() instead */
10
+ export { createMicroAPI } from "./application-express-micro.js";