@expressots/adapter-express 3.0.0-beta.4.2 → 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 +43 -0
  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,102 @@
1
+ "use strict";
2
+ /**
3
+ * Vercel Adapter for ExpressoTS Micro API
4
+ *
5
+ * Converts Vercel serverless function requests to Express format.
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.vercelAdapter = vercelAdapter;
9
+ /**
10
+ * Create a Vercel serverless handler from an Express app
11
+ *
12
+ * @example
13
+ * ```typescript
14
+ * // api/index.ts
15
+ * import { createMicroAPI, vercelAdapter } from "@expressots/adapter-express";
16
+ *
17
+ * const microAPI = createMicroAPI();
18
+ * const app = microAPI.build();
19
+ *
20
+ * app.Middleware.parse();
21
+ * app.Route.get("/api", (req, res) => res.json({ message: "Hello Vercel!" }));
22
+ *
23
+ * export default vercelAdapter(app);
24
+ * ```
25
+ *
26
+ * vercel.json:
27
+ * ```json
28
+ * {
29
+ * "rewrites": [{ "source": "/api/(.*)", "destination": "/api" }]
30
+ * }
31
+ * ```
32
+ */
33
+ function vercelAdapter(app, config) {
34
+ const expressApp = "getExpressApp" in app && app.getExpressApp ? app.getExpressApp() : app;
35
+ const debug = config?.debug ?? false;
36
+ return async (req, res) => {
37
+ if (debug) {
38
+ console.log("[Vercel] Request:", {
39
+ method: req.method,
40
+ url: req.url,
41
+ query: req.query,
42
+ });
43
+ }
44
+ // Vercel passes the request directly to Express
45
+ // We just need to handle the response properly
46
+ return new Promise((resolve) => {
47
+ const originalEnd = res.end.bind(res);
48
+ // Override end to resolve the promise when response is complete
49
+ // Using 'any' to avoid complex Express Response type conflicts
50
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
51
+ res.end = function (chunk, encoding, callback) {
52
+ if (debug) {
53
+ console.log("[Vercel] Response:", {
54
+ statusCode: res.statusCode,
55
+ });
56
+ }
57
+ // Call original end with proper typing
58
+ if (typeof chunk === "function") {
59
+ originalEnd();
60
+ chunk();
61
+ }
62
+ else if (typeof encoding === "function") {
63
+ originalEnd(chunk);
64
+ encoding();
65
+ }
66
+ else if (callback) {
67
+ originalEnd(chunk, encoding, callback);
68
+ }
69
+ else if (encoding) {
70
+ originalEnd(chunk, encoding);
71
+ }
72
+ else if (chunk) {
73
+ originalEnd(chunk);
74
+ }
75
+ else {
76
+ originalEnd();
77
+ }
78
+ resolve();
79
+ return this;
80
+ };
81
+ // Handle request through Express
82
+ try {
83
+ expressApp(req, res, (err) => {
84
+ if (err) {
85
+ console.error("[Vercel] Express error:", err);
86
+ res.status(500).json({
87
+ error: err instanceof Error ? err.message : "Unknown error",
88
+ });
89
+ resolve();
90
+ }
91
+ });
92
+ }
93
+ catch (error) {
94
+ console.error("[Vercel] Handler error:", error);
95
+ res.status(500).json({
96
+ error: error instanceof Error ? error.message : "Unknown error",
97
+ });
98
+ resolve();
99
+ }
100
+ });
101
+ };
102
+ }
@@ -0,0 +1,10 @@
1
+ "use strict";
2
+ /**
3
+ * Service Mesh Utilities for ExpressoTS Micro Template
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.ServiceDiscovery = exports.ServiceClient = void 0;
7
+ var service_client_js_1 = require("./service-client.js");
8
+ Object.defineProperty(exports, "ServiceClient", { enumerable: true, get: function () { return service_client_js_1.ServiceClient; } });
9
+ var service_discovery_js_1 = require("./service-discovery.js");
10
+ Object.defineProperty(exports, "ServiceDiscovery", { enumerable: true, get: function () { return service_discovery_js_1.ServiceDiscovery; } });
@@ -0,0 +1,194 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ServiceClient = void 0;
4
+ const circuit_breaker_js_1 = require("../gateway/circuit-breaker.js");
5
+ /**
6
+ * ServiceClient - HTTP client for service-to-service communication.
7
+ *
8
+ * Features:
9
+ * - Automatic retries with exponential backoff
10
+ * - Circuit breaker integration
11
+ * - Request timeout
12
+ * - JSON request/response handling
13
+ * - Trace context propagation
14
+ *
15
+ * @example
16
+ * ```typescript
17
+ * const userService = new ServiceClient({
18
+ * name: "user-service",
19
+ * baseUrl: "http://user-service:3001",
20
+ * timeout: 5000,
21
+ * retries: 3,
22
+ * circuitBreaker: true,
23
+ * });
24
+ *
25
+ * // GET request
26
+ * const user = await userService.call<User>("/users/123");
27
+ *
28
+ * // POST request
29
+ * const newUser = await userService.call<User>("/users", {
30
+ * method: "POST",
31
+ * body: { name: "John", email: "john@example.com" },
32
+ * });
33
+ *
34
+ * // With query parameters
35
+ * const users = await userService.call<User[]>("/users", {
36
+ * params: { page: "1", limit: "10" },
37
+ * });
38
+ * ```
39
+ */
40
+ class ServiceClient {
41
+ constructor(config) {
42
+ this.stats = {
43
+ totalRequests: 0,
44
+ successfulRequests: 0,
45
+ failedRequests: 0,
46
+ };
47
+ this.config = {
48
+ name: config.name,
49
+ baseUrl: config.baseUrl.replace(/\/$/, ""), // Remove trailing slash
50
+ timeout: config.timeout ?? 5000,
51
+ retries: config.retries ?? 3,
52
+ headers: config.headers ?? {},
53
+ };
54
+ // Initialize circuit breaker
55
+ if (config.circuitBreaker !== false) {
56
+ const cbConfig = typeof config.circuitBreaker === "object" ? config.circuitBreaker : undefined;
57
+ this.config.circuitBreaker = new circuit_breaker_js_1.CircuitBreaker(cbConfig);
58
+ }
59
+ }
60
+ /**
61
+ * Make a request to the service
62
+ * @param path - Request path
63
+ * @param options - Request options
64
+ */
65
+ async call(path, options = {}) {
66
+ this.stats.totalRequests++;
67
+ const execute = async () => {
68
+ return await this.executeWithRetry(path, options);
69
+ };
70
+ try {
71
+ let result;
72
+ if (this.config.circuitBreaker) {
73
+ result = await this.config.circuitBreaker.execute(execute);
74
+ }
75
+ else {
76
+ result = await execute();
77
+ }
78
+ this.stats.successfulRequests++;
79
+ return result;
80
+ }
81
+ catch (error) {
82
+ this.stats.failedRequests++;
83
+ throw error;
84
+ }
85
+ }
86
+ /**
87
+ * GET request helper
88
+ */
89
+ async get(path, options) {
90
+ return this.call(path, { ...options, method: "GET" });
91
+ }
92
+ /**
93
+ * POST request helper
94
+ */
95
+ async post(path, body, options) {
96
+ return this.call(path, { ...options, method: "POST", body });
97
+ }
98
+ /**
99
+ * PUT request helper
100
+ */
101
+ async put(path, body, options) {
102
+ return this.call(path, { ...options, method: "PUT", body });
103
+ }
104
+ /**
105
+ * PATCH request helper
106
+ */
107
+ async patch(path, body, options) {
108
+ return this.call(path, { ...options, method: "PATCH", body });
109
+ }
110
+ /**
111
+ * DELETE request helper
112
+ */
113
+ async delete(path, options) {
114
+ return this.call(path, { ...options, method: "DELETE" });
115
+ }
116
+ /**
117
+ * Get service stats
118
+ */
119
+ getStats() {
120
+ return {
121
+ name: this.config.name,
122
+ baseUrl: this.config.baseUrl,
123
+ ...this.stats,
124
+ circuitBreaker: this.config.circuitBreaker?.getStats(),
125
+ };
126
+ }
127
+ /**
128
+ * Execute request with retry logic
129
+ */
130
+ async executeWithRetry(path, options, attempt = 1) {
131
+ try {
132
+ return await this.executeRequest(path, options);
133
+ }
134
+ catch (error) {
135
+ if (attempt < this.config.retries) {
136
+ // Exponential backoff
137
+ await this.delay(Math.pow(2, attempt) * 100);
138
+ return await this.executeWithRetry(path, options, attempt + 1);
139
+ }
140
+ throw error;
141
+ }
142
+ }
143
+ /**
144
+ * Execute a single request
145
+ */
146
+ async executeRequest(path, options) {
147
+ // Build URL
148
+ const url = new URL(path, this.config.baseUrl);
149
+ // Add query parameters
150
+ if (options.params) {
151
+ Object.entries(options.params).forEach(([key, value]) => {
152
+ url.searchParams.append(key, value);
153
+ });
154
+ }
155
+ // Build headers
156
+ const headers = {
157
+ "Content-Type": "application/json",
158
+ Accept: "application/json",
159
+ ...this.config.headers,
160
+ ...options.headers,
161
+ };
162
+ // Setup timeout
163
+ const controller = new AbortController();
164
+ const timeoutId = setTimeout(() => controller.abort(), options.timeout ?? this.config.timeout);
165
+ try {
166
+ const response = await fetch(url.toString(), {
167
+ method: options.method || "GET",
168
+ headers,
169
+ body: options.body ? JSON.stringify(options.body) : undefined,
170
+ signal: controller.signal,
171
+ });
172
+ clearTimeout(timeoutId);
173
+ if (!response.ok) {
174
+ const errorBody = await response.text();
175
+ throw new Error(`HTTP ${response.status}: ${response.statusText}. ${errorBody}`);
176
+ }
177
+ return await response.json();
178
+ }
179
+ catch (error) {
180
+ clearTimeout(timeoutId);
181
+ if (error instanceof Error && error.name === "AbortError") {
182
+ throw new Error(`Request timeout: ${this.config.name} ${path}`);
183
+ }
184
+ throw error;
185
+ }
186
+ }
187
+ /**
188
+ * Delay helper
189
+ */
190
+ delay(ms) {
191
+ return new Promise((resolve) => setTimeout(resolve, ms));
192
+ }
193
+ }
194
+ exports.ServiceClient = ServiceClient;
@@ -0,0 +1,261 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ServiceDiscovery = void 0;
4
+ /**
5
+ * ServiceDiscovery - Service discovery for microservices.
6
+ *
7
+ * Features:
8
+ * - Static service registration
9
+ * - Consul integration
10
+ * - etcd integration
11
+ * - Automatic service refresh
12
+ * - Round-robin load balancing
13
+ * - Health-based filtering
14
+ *
15
+ * @example
16
+ * ```typescript
17
+ * // Static service discovery
18
+ * const discovery = new ServiceDiscovery({ type: "static" });
19
+ *
20
+ * discovery.registerService({
21
+ * id: "user-service-1",
22
+ * name: "user-service",
23
+ * host: "user-service",
24
+ * port: 3001,
25
+ * health: "healthy",
26
+ * lastCheck: new Date(),
27
+ * });
28
+ *
29
+ * // Get a healthy instance
30
+ * const instance = discovery.getService("user-service");
31
+ * const client = new ServiceClient({
32
+ * name: "user-service",
33
+ * baseUrl: `http://${instance.host}:${instance.port}`,
34
+ * });
35
+ *
36
+ * // Or with Consul
37
+ * const discovery = new ServiceDiscovery({
38
+ * type: "consul",
39
+ * endpoint: "http://consul:8500",
40
+ * });
41
+ * await discovery.initialize();
42
+ * ```
43
+ */
44
+ class ServiceDiscovery {
45
+ constructor(config) {
46
+ this.services = new Map();
47
+ this.roundRobinIndex = new Map();
48
+ this.config = {
49
+ type: config.type,
50
+ endpoint: config.endpoint ?? "",
51
+ refreshInterval: config.refreshInterval ?? 30000,
52
+ debug: config.debug ?? false,
53
+ };
54
+ }
55
+ /**
56
+ * Initialize the service discovery
57
+ * For consul/etcd, this starts the refresh loop
58
+ */
59
+ async initialize() {
60
+ if (this.config.type === "static") {
61
+ // Static configuration - no auto-discovery
62
+ return;
63
+ }
64
+ // Initial refresh
65
+ await this.refresh();
66
+ // Start refresh loop
67
+ if (this.config.refreshInterval > 0) {
68
+ this.refreshTimer = setInterval(() => this.refresh(), this.config.refreshInterval);
69
+ }
70
+ }
71
+ /**
72
+ * Register a service instance (for static mode)
73
+ * @param service - Service instance to register
74
+ */
75
+ registerService(service) {
76
+ const instances = this.services.get(service.name) || [];
77
+ // Check if instance already exists
78
+ const existingIndex = instances.findIndex((i) => i.id === service.id);
79
+ if (existingIndex >= 0) {
80
+ instances[existingIndex] = service;
81
+ }
82
+ else {
83
+ instances.push(service);
84
+ }
85
+ this.services.set(service.name, instances);
86
+ if (this.config.debug) {
87
+ console.log(`[ServiceDiscovery] Registered ${service.name} (${service.id})`);
88
+ }
89
+ }
90
+ /**
91
+ * Deregister a service instance
92
+ * @param serviceName - Service name
93
+ * @param instanceId - Instance ID to remove
94
+ */
95
+ deregisterService(serviceName, instanceId) {
96
+ const instances = this.services.get(serviceName);
97
+ if (!instances)
98
+ return;
99
+ const filtered = instances.filter((i) => i.id !== instanceId);
100
+ this.services.set(serviceName, filtered);
101
+ if (this.config.debug) {
102
+ console.log(`[ServiceDiscovery] Deregistered ${serviceName} (${instanceId})`);
103
+ }
104
+ }
105
+ /**
106
+ * Get a healthy instance of a service (round-robin)
107
+ * @param name - Service name
108
+ * @returns A healthy service instance or null
109
+ */
110
+ getService(name) {
111
+ const instances = this.services.get(name);
112
+ if (!instances || instances.length === 0) {
113
+ return null;
114
+ }
115
+ // Filter to healthy instances only
116
+ const healthy = instances.filter((i) => i.health === "healthy");
117
+ if (healthy.length === 0) {
118
+ return null;
119
+ }
120
+ // Round-robin selection
121
+ const currentIndex = this.roundRobinIndex.get(name) ?? 0;
122
+ const instance = healthy[currentIndex % healthy.length];
123
+ this.roundRobinIndex.set(name, currentIndex + 1);
124
+ return instance;
125
+ }
126
+ /**
127
+ * Get all instances of a service
128
+ * @param name - Service name
129
+ * @param healthyOnly - Only return healthy instances (default: true)
130
+ */
131
+ getServiceInstances(name, healthyOnly = true) {
132
+ const instances = this.services.get(name) || [];
133
+ if (healthyOnly) {
134
+ return instances.filter((i) => i.health === "healthy");
135
+ }
136
+ return instances;
137
+ }
138
+ /**
139
+ * Get all registered services
140
+ */
141
+ getAllServices() {
142
+ return new Map(this.services);
143
+ }
144
+ /**
145
+ * List all registered service names
146
+ */
147
+ listServices() {
148
+ return Array.from(this.services.keys());
149
+ }
150
+ /**
151
+ * Update health status of a service instance
152
+ * @param serviceName - Service name
153
+ * @param instanceId - Instance ID
154
+ * @param health - New health status
155
+ */
156
+ updateHealth(serviceName, instanceId, health) {
157
+ const instances = this.services.get(serviceName);
158
+ if (!instances)
159
+ return false;
160
+ const instance = instances.find((i) => i.id === instanceId);
161
+ if (!instance)
162
+ return false;
163
+ instance.health = health;
164
+ instance.lastCheck = new Date();
165
+ if (this.config.debug) {
166
+ console.log(`[ServiceDiscovery] Updated ${serviceName} (${instanceId}) health to ${health}`);
167
+ }
168
+ return true;
169
+ }
170
+ /**
171
+ * Get service statistics
172
+ */
173
+ getStats() {
174
+ const stats = {};
175
+ for (const [name, instances] of this.services) {
176
+ stats[name] = {
177
+ total: instances.length,
178
+ healthy: instances.filter((i) => i.health === "healthy").length,
179
+ unhealthy: instances.filter((i) => i.health === "unhealthy").length,
180
+ };
181
+ }
182
+ return stats;
183
+ }
184
+ /**
185
+ * Stop the service discovery
186
+ */
187
+ stop() {
188
+ if (this.refreshTimer) {
189
+ clearInterval(this.refreshTimer);
190
+ this.refreshTimer = undefined;
191
+ }
192
+ }
193
+ /**
194
+ * Refresh service list from discovery backend
195
+ */
196
+ async refresh() {
197
+ try {
198
+ if (this.config.type === "consul") {
199
+ await this.refreshFromConsul();
200
+ }
201
+ else if (this.config.type === "etcd") {
202
+ await this.refreshFromEtcd();
203
+ }
204
+ }
205
+ catch (error) {
206
+ console.error("[ServiceDiscovery] Refresh failed:", error);
207
+ }
208
+ }
209
+ /**
210
+ * Refresh from Consul
211
+ */
212
+ async refreshFromConsul() {
213
+ if (!this.config.endpoint) {
214
+ throw new Error("Consul endpoint not configured");
215
+ }
216
+ try {
217
+ // Get list of services
218
+ const servicesResponse = await fetch(`${this.config.endpoint}/v1/catalog/services`);
219
+ const services = await servicesResponse.json();
220
+ // Get instances for each service
221
+ for (const serviceName of Object.keys(services)) {
222
+ const instances = await this.getConsulInstances(serviceName);
223
+ this.services.set(serviceName, instances);
224
+ }
225
+ if (this.config.debug) {
226
+ console.log(`[ServiceDiscovery] Refreshed ${this.services.size} services from Consul`);
227
+ }
228
+ }
229
+ catch (error) {
230
+ console.error("[ServiceDiscovery] Consul refresh failed:", error);
231
+ throw error;
232
+ }
233
+ }
234
+ /**
235
+ * Get instances from Consul for a specific service
236
+ */
237
+ async getConsulInstances(serviceName) {
238
+ const response = await fetch(`${this.config.endpoint}/v1/health/service/${serviceName}?passing=true`);
239
+ const data = (await response.json());
240
+ return data.map((entry) => ({
241
+ id: entry.Service.ID,
242
+ name: entry.Service.Service,
243
+ host: entry.Service.Address || entry.Node.Address,
244
+ port: entry.Service.Port,
245
+ metadata: entry.Service.Meta,
246
+ health: "healthy",
247
+ lastCheck: new Date(),
248
+ }));
249
+ }
250
+ /**
251
+ * Refresh from etcd
252
+ */
253
+ async refreshFromEtcd() {
254
+ if (!this.config.endpoint) {
255
+ throw new Error("etcd endpoint not configured");
256
+ }
257
+ // etcd v3 API implementation
258
+ console.log("[ServiceDiscovery] etcd integration requires etcd3 client library");
259
+ }
260
+ }
261
+ exports.ServiceDiscovery = ServiceDiscovery;
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ /**
3
+ * @file middleware/index.ts
4
+ * @description Exports for ExpressoTS middleware
5
+ */
6
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
7
+ if (k2 === undefined) k2 = k;
8
+ var desc = Object.getOwnPropertyDescriptor(m, k);
9
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
10
+ desc = { enumerable: true, get: function() { return m[k]; } };
11
+ }
12
+ Object.defineProperty(o, k2, desc);
13
+ }) : (function(o, m, k, k2) {
14
+ if (k2 === undefined) k2 = k;
15
+ o[k2] = m[k];
16
+ }));
17
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
18
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
19
+ };
20
+ Object.defineProperty(exports, "__esModule", { value: true });
21
+ __exportStar(require("./request-logging.middleware.js"), exports);