@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,244 @@
1
+ "use strict";
2
+ /**
3
+ * @file request-logging.middleware.ts
4
+ * @description HTTP request/response logging middleware with context enrichment
5
+ * @module @expressots/adapter-express
6
+ *
7
+ * Features:
8
+ * - Request ID generation/extraction
9
+ * - Request/response timing
10
+ * - Slow request detection
11
+ * - Configurable verbosity levels
12
+ * - Body logging with redaction support
13
+ */
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.getDefaultRequestLoggingConfig = getDefaultRequestLoggingConfig;
16
+ exports.createRequestLoggingMiddleware = createRequestLoggingMiddleware;
17
+ exports.requestIdMiddleware = requestIdMiddleware;
18
+ const core_1 = require("@expressots/core");
19
+ /**
20
+ * Default request logging configuration.
21
+ */
22
+ function getDefaultRequestLoggingConfig() {
23
+ return {
24
+ verbosity: "normal",
25
+ logBody: false,
26
+ logHeaders: false,
27
+ logResponseBody: false,
28
+ slowRequestThreshold: 1000, // 1 second
29
+ skipPatterns: [/^\/health$/, /^\/ready$/, /^\/live$/, /^\/_health$/],
30
+ requestIdHeader: "x-request-id",
31
+ correlationIdHeader: "x-correlation-id",
32
+ logUserAgent: true,
33
+ logIp: true,
34
+ };
35
+ }
36
+ /**
37
+ * Create request logging middleware.
38
+ * @param logger - Logger instance to use
39
+ * @param config - Optional configuration
40
+ * @returns Express middleware function
41
+ * @public API
42
+ */
43
+ function createRequestLoggingMiddleware(logger, config) {
44
+ const finalConfig = {
45
+ ...getDefaultRequestLoggingConfig(),
46
+ ...config,
47
+ };
48
+ return (req, res, next) => {
49
+ // Skip logging for configured patterns
50
+ if (finalConfig.skipPatterns.some((pattern) => pattern.test(req.path))) {
51
+ next();
52
+ return;
53
+ }
54
+ // Create HTTP context with custom header names
55
+ const httpContext = core_1.ContextManager.createHttpContext(req, {
56
+ requestIdHeader: finalConfig.requestIdHeader,
57
+ correlationIdHeader: finalConfig.correlationIdHeader,
58
+ });
59
+ // Set request/correlation ID headers for downstream services
60
+ res.setHeader(finalConfig.requestIdHeader, httpContext.requestId);
61
+ if (httpContext.correlationId) {
62
+ res.setHeader(finalConfig.correlationIdHeader, httpContext.correlationId);
63
+ }
64
+ // Create log context
65
+ const logContext = {
66
+ requestId: httpContext.requestId,
67
+ userId: httpContext.userId,
68
+ tenantId: httpContext.tenantId,
69
+ metadata: {
70
+ method: httpContext.method,
71
+ path: httpContext.path,
72
+ },
73
+ };
74
+ // Initialize flow tracker (if flow tracking is enabled)
75
+ const flowConfig = logger.getConfig()?.flow;
76
+ const flowTracker = (0, core_1.getFlowTracker)(httpContext.requestId, httpContext.method, httpContext.path, flowConfig);
77
+ // Log request start based on verbosity
78
+ logRequestStart(logger, httpContext, finalConfig);
79
+ // Capture response timing
80
+ const startTime = Date.now();
81
+ const startMemory = process.memoryUsage().heapUsed;
82
+ // Store error on request for later retrieval
83
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
84
+ req.__expressotsFlowError = undefined;
85
+ // Override res.end to capture response
86
+ const originalEnd = res.end;
87
+ let endCalled = false;
88
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
89
+ res.end = function (...args) {
90
+ // Prevent multiple calls
91
+ if (endCalled) {
92
+ return originalEnd.apply(this, args);
93
+ }
94
+ endCalled = true;
95
+ const duration = Date.now() - startTime;
96
+ const memoryDelta = process.memoryUsage().heapUsed - startMemory;
97
+ // Get error from request if available (set by controllers, guards, or error handlers)
98
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
99
+ const error = req.__expressotsFlowError;
100
+ // Finalize flow and get flow data (pass error if available)
101
+ const flow = flowTracker.finalize(res.statusCode, error);
102
+ // Log response with flow data
103
+ logRequestEnd(logger, httpContext, res, duration, memoryDelta, finalConfig, flow);
104
+ // Cleanup flow tracker
105
+ (0, core_1.removeFlowTracker)(httpContext.requestId);
106
+ // Call original end
107
+ return originalEnd.apply(this, args);
108
+ };
109
+ // Wrap next to capture errors passed to next()
110
+ const wrappedNext = (err) => {
111
+ if (err) {
112
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
113
+ req.__expressotsFlowError = err instanceof Error ? err : new Error(String(err));
114
+ }
115
+ next(err);
116
+ };
117
+ // Also hook into res.status() to capture error status codes
118
+ // This helps capture errors that Express error handlers set
119
+ const originalStatus = res.status.bind(res);
120
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
121
+ res.status = function (code) {
122
+ // If status is >= 400 and no error is stored yet, try to get it from Express error handling
123
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
124
+ if (code >= 400 && !req.__expressotsFlowError) {
125
+ // Check if there's an error in the response locals (Express error handlers sometimes put it there)
126
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
127
+ const errorFromLocals = res.locals?.error;
128
+ if (errorFromLocals) {
129
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
130
+ req.__expressotsFlowError =
131
+ errorFromLocals instanceof Error ? errorFromLocals : new Error(String(errorFromLocals));
132
+ }
133
+ }
134
+ return originalStatus(code);
135
+ };
136
+ // Run the rest of the middleware chain with context
137
+ core_1.ContextManager.runWithContext(logContext, () => {
138
+ wrappedNext();
139
+ });
140
+ };
141
+ }
142
+ /**
143
+ * Log request start.
144
+ */
145
+ function logRequestStart(logger, context, config) {
146
+ const { verbosity, logHeaders, logUserAgent, logIp } = config;
147
+ if (verbosity === "minimal") {
148
+ // Minimal: Just log that request started
149
+ logger.debug(`→ ${context.method} ${context.path}`, { requestId: context.requestId });
150
+ return;
151
+ }
152
+ // Build log data based on verbosity
153
+ const logData = {
154
+ requestId: context.requestId,
155
+ };
156
+ if (logIp && context.ip) {
157
+ logData.ip = context.ip;
158
+ }
159
+ if (logUserAgent && context.userAgent) {
160
+ logData.userAgent =
161
+ context.userAgent.length > 50
162
+ ? context.userAgent.substring(0, 50) + "..."
163
+ : context.userAgent;
164
+ }
165
+ if (context.userId) {
166
+ logData.userId = context.userId;
167
+ }
168
+ if (context.tenantId) {
169
+ logData.tenantId = context.tenantId;
170
+ }
171
+ if (verbosity === "detailed" || verbosity === "debug") {
172
+ if (logHeaders && context.headers) {
173
+ logData.headers = context.headers;
174
+ }
175
+ }
176
+ logger.info(`→ ${context.method} ${context.path}`, "request", logData);
177
+ }
178
+ /**
179
+ * Log request end.
180
+ */
181
+ function logRequestEnd(logger, context, res, duration, memoryDelta, config, flow) {
182
+ const { verbosity, slowRequestThreshold } = config;
183
+ const statusCode = res.statusCode;
184
+ // Determine log level based on status and duration
185
+ const isSlowRequest = duration >= slowRequestThreshold;
186
+ const isError = statusCode >= 400;
187
+ // Build log data
188
+ const logData = {
189
+ requestId: context.requestId,
190
+ status: statusCode,
191
+ duration: `${duration}ms`,
192
+ };
193
+ if (verbosity === "detailed" || verbosity === "debug") {
194
+ logData.memoryDelta = `${(memoryDelta / 1024).toFixed(1)}KB`;
195
+ }
196
+ if (context.userId) {
197
+ logData.userId = context.userId;
198
+ }
199
+ // Format message
200
+ const statusEmoji = isError ? "✗" : "✓";
201
+ const message = `← ${context.method} ${context.path} ${statusCode} ${statusEmoji} ${duration}ms`;
202
+ // Log with appropriate level and include flow data if available
203
+ if (isError && statusCode >= 500) {
204
+ logger.error(message, "request", { ...logData, flow });
205
+ }
206
+ else if (isError) {
207
+ logger.warn(message, "request", { ...logData, flow });
208
+ }
209
+ else if (isSlowRequest) {
210
+ logger.warn(`[SLOW] ${message}`, "request", {
211
+ ...logData,
212
+ slowRequestThreshold: `${slowRequestThreshold}ms`,
213
+ flow,
214
+ });
215
+ }
216
+ else if (verbosity !== "minimal") {
217
+ logger.info(message, "request", { ...logData, flow });
218
+ }
219
+ else {
220
+ // debug only takes 2 args: message and data
221
+ logger.debug(`[request] ${message}`, { ...logData, flow });
222
+ }
223
+ }
224
+ /**
225
+ * Express middleware that assigns a request ID to each request.
226
+ * Simpler alternative to full request logging.
227
+ * @param headerName - Header name for request ID (default: x-request-id)
228
+ * @returns Express middleware
229
+ * @public API
230
+ */
231
+ function requestIdMiddleware(headerName = "x-request-id") {
232
+ return (req, res, next) => {
233
+ const existingId = req.headers[headerName.toLowerCase()];
234
+ const requestId = existingId || core_1.ContextManager.generateRequestId();
235
+ // Set on request for access by other middleware
236
+ req.requestId = requestId;
237
+ // Set on response header
238
+ res.setHeader(headerName, requestId);
239
+ // Run with context
240
+ core_1.ContextManager.runWithContext({ requestId }, () => {
241
+ next();
242
+ });
243
+ };
244
+ }
@@ -4,17 +4,17 @@ exports.setEngineEjs = setEngineEjs;
4
4
  exports.setEngineHandlebars = setEngineHandlebars;
5
5
  exports.setEnginePug = setEnginePug;
6
6
  const core_1 = require("@expressots/core");
7
- const resolve_render_1 = require("./resolve-render");
8
- const constants_1 = require("./constants");
7
+ const resolve_render_js_1 = require("./resolve-render.js");
8
+ const constants_js_1 = require("./constants.js");
9
9
  /**
10
10
  * Set Ejs as the view engine
11
11
  * @param {Application} app - The express application
12
12
  * @param {EjsOptions} [options=EJS_DEFAULTS] - The ejs options
13
13
  */
14
- async function setEngineEjs(app, options = constants_1.EJS_DEFAULTS) {
15
- (0, resolve_render_1.packageResolver)("ejs");
16
- app.set("view engine", options.viewEngine || constants_1.EJS_DEFAULTS.viewEngine);
17
- app.set("views", options.viewsDir || constants_1.EJS_DEFAULTS.viewsDir);
14
+ async function setEngineEjs(app, options = constants_js_1.EJS_DEFAULTS) {
15
+ (0, resolve_render_js_1.packageResolver)("ejs");
16
+ app.set("view engine", options.viewEngine || constants_js_1.EJS_DEFAULTS.viewEngine);
17
+ app.set("views", options.viewsDir || constants_js_1.EJS_DEFAULTS.viewsDir);
18
18
  if (Array.isArray(options.viewsDir)) {
19
19
  options.viewsDir.forEach((dir) => {
20
20
  app.set("views", dir);
@@ -32,13 +32,13 @@ async function setEngineEjs(app, options = constants_1.EJS_DEFAULTS) {
32
32
  * @param {express.Application} app - The express application
33
33
  * @param {HandlebarsOptions} [options=HANDLEBARS_DEFAULTS] - The handlebars options
34
34
  */
35
- async function setEngineHandlebars(app, options = constants_1.HANDLEBARS_DEFAULTS) {
35
+ async function setEngineHandlebars(app, options = constants_js_1.HANDLEBARS_DEFAULTS) {
36
36
  const logger = new core_1.Logger();
37
37
  try {
38
- const hbs = (0, resolve_render_1.packageResolver)("hbs");
39
- hbs.registerPartials(options.partialsDir || constants_1.DEFAULT_PARTIALS_DIR);
40
- app.set("view engine", options.viewEngine || constants_1.HANDLEBARS_DEFAULTS.viewEngine);
41
- app.set("views", options.viewsDir || constants_1.HANDLEBARS_DEFAULTS.viewsDir);
38
+ const hbs = (0, resolve_render_js_1.packageResolver)("hbs");
39
+ hbs.registerPartials(options.partialsDir || constants_js_1.DEFAULT_PARTIALS_DIR);
40
+ app.set("view engine", options.viewEngine || constants_js_1.HANDLEBARS_DEFAULTS.viewEngine);
41
+ app.set("views", options.viewsDir || constants_js_1.HANDLEBARS_DEFAULTS.viewsDir);
42
42
  }
43
43
  catch (error) {
44
44
  logger.error(error.message, "handlebars-config");
@@ -49,8 +49,8 @@ async function setEngineHandlebars(app, options = constants_1.HANDLEBARS_DEFAULT
49
49
  * @param {express.Application} app - The express application
50
50
  * @param {PugOptions} [options=PUG_DEFAULTS] - The pug options
51
51
  */
52
- async function setEnginePug(app, options = constants_1.PUG_DEFAULTS) {
53
- (0, resolve_render_1.packageResolver)("pug");
54
- app.set("view engine", options.viewEngine || constants_1.PUG_DEFAULTS.viewEngine);
55
- app.set("views", options.viewsDir || constants_1.PUG_DEFAULTS.viewsDir);
52
+ async function setEnginePug(app, options = constants_js_1.PUG_DEFAULTS) {
53
+ (0, resolve_render_js_1.packageResolver)("pug");
54
+ app.set("view engine", options.viewEngine || constants_js_1.PUG_DEFAULTS.viewEngine);
55
+ app.set("views", options.viewsDir || constants_js_1.PUG_DEFAULTS.viewsDir);
56
56
  }
@@ -1,2 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.setEnginePug = exports.setEngineHandlebars = exports.setEngineEjs = void 0;
4
+ var engine_js_1 = require("./engine.js");
5
+ Object.defineProperty(exports, "setEngineEjs", { enumerable: true, get: function () { return engine_js_1.setEngineEjs; } });
6
+ Object.defineProperty(exports, "setEngineHandlebars", { enumerable: true, get: function () { return engine_js_1.setEngineHandlebars; } });
7
+ Object.defineProperty(exports, "setEnginePug", { enumerable: true, get: function () { return engine_js_1.setEnginePug; } });
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.reportStudioRuntimeInfo = exports.getStudioAgent = exports.isStudioEnabled = exports.stopStudio = exports.initializeStudio = void 0;
4
+ var studio_integration_js_1 = require("./studio-integration.js");
5
+ Object.defineProperty(exports, "initializeStudio", { enumerable: true, get: function () { return studio_integration_js_1.initializeStudio; } });
6
+ Object.defineProperty(exports, "stopStudio", { enumerable: true, get: function () { return studio_integration_js_1.stopStudio; } });
7
+ Object.defineProperty(exports, "isStudioEnabled", { enumerable: true, get: function () { return studio_integration_js_1.isStudioEnabled; } });
8
+ Object.defineProperty(exports, "getStudioAgent", { enumerable: true, get: function () { return studio_integration_js_1.getStudioAgent; } });
9
+ Object.defineProperty(exports, "reportStudioRuntimeInfo", { enumerable: true, get: function () { return studio_integration_js_1.reportStudioRuntimeInfo; } });
@@ -0,0 +1,214 @@
1
+ "use strict";
2
+ /**
3
+ * Studio Integration - Auto-detects and integrates ExpressoTS Studio Agent
4
+ *
5
+ * This module provides automatic integration with @expressots/studio-agent
6
+ * when it's installed in the project. It enables request recording, tracing,
7
+ * and real-time monitoring without requiring manual setup.
8
+ */
9
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ var desc = Object.getOwnPropertyDescriptor(m, k);
12
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
13
+ desc = { enumerable: true, get: function() { return m[k]; } };
14
+ }
15
+ Object.defineProperty(o, k2, desc);
16
+ }) : (function(o, m, k, k2) {
17
+ if (k2 === undefined) k2 = k;
18
+ o[k2] = m[k];
19
+ }));
20
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
21
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
22
+ }) : function(o, v) {
23
+ o["default"] = v;
24
+ });
25
+ var __importStar = (this && this.__importStar) || function (mod) {
26
+ if (mod && mod.__esModule) return mod;
27
+ var result = {};
28
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
29
+ __setModuleDefault(result, mod);
30
+ return result;
31
+ };
32
+ Object.defineProperty(exports, "__esModule", { value: true });
33
+ exports.initializeStudio = initializeStudio;
34
+ exports.reportStudioRuntimeInfo = reportStudioRuntimeInfo;
35
+ exports.stopStudio = stopStudio;
36
+ exports.isStudioEnabled = isStudioEnabled;
37
+ exports.getStudioAgent = getStudioAgent;
38
+ let studioAgent = null;
39
+ let studioEnabled = false;
40
+ /**
41
+ * Check if @expressots/studio-agent is installed
42
+ */
43
+ async function isStudioAgentInstalled() {
44
+ const debug = process.env.EXPRESSOTS_STUDIO_DEBUG === "true";
45
+ try {
46
+ // Try to resolve the module first (works for both CJS and ESM)
47
+ const resolved = require.resolve("@expressots/studio-agent");
48
+ if (debug)
49
+ console.log("[Studio] Resolved studio-agent at:", resolved);
50
+ return true;
51
+ }
52
+ catch (error) {
53
+ if (debug)
54
+ console.log("[Studio] Cannot resolve studio-agent:", error instanceof Error ? error.message : error);
55
+ // Module not installed
56
+ return false;
57
+ }
58
+ }
59
+ /**
60
+ * Initialize the Studio Agent if available
61
+ */
62
+ async function initializeStudio(app, config = {}, appContainer) {
63
+ const debug = process.env.EXPRESSOTS_STUDIO_DEBUG === "true";
64
+ // Check if explicitly disabled
65
+ if (config.enabled === false || process.env.EXPRESSOTS_STUDIO === "false") {
66
+ if (debug)
67
+ console.log("[Studio] Disabled via config or env");
68
+ return false;
69
+ }
70
+ // Only enable in development by default
71
+ const isDev = process.env.NODE_ENV === "development" || !process.env.NODE_ENV;
72
+ if (!isDev && config.enabled !== true) {
73
+ if (debug)
74
+ console.log("[Studio] Not in development mode, skipping");
75
+ return false;
76
+ }
77
+ // Check if studio-agent is installed
78
+ const installed = await isStudioAgentInstalled();
79
+ if (debug)
80
+ console.log("[Studio] studio-agent installed:", installed);
81
+ if (!installed) {
82
+ return false;
83
+ }
84
+ // Defensive: if a previous agent instance from this same process is still
85
+ // around (e.g. App.init() called twice without a stop in between) shut it
86
+ // down first so we don't leak the WebSocket port.
87
+ if (studioAgent) {
88
+ try {
89
+ await studioAgent.stop();
90
+ }
91
+ catch {
92
+ // best-effort cleanup
93
+ }
94
+ studioAgent = null;
95
+ studioEnabled = false;
96
+ }
97
+ try {
98
+ if (debug)
99
+ console.log("[Studio] Attempting dynamic import...");
100
+ // Dynamic import for ESM module
101
+ const studioAgentModule = await Promise.resolve().then(() => __importStar(require("@expressots/studio-agent")));
102
+ if (debug)
103
+ console.log("[Studio] Import successful, keys:", Object.keys(studioAgentModule));
104
+ // studio-agent ships only named exports; cast through `any` so the
105
+ // ESM build does not reject the legacy `default.StudioAgent`
106
+ // fallback (kept for older preview tarballs).
107
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
108
+ const studioAgentModuleAny = studioAgentModule;
109
+ const StudioAgent = studioAgentModuleAny.StudioAgent || studioAgentModuleAny.default?.StudioAgent;
110
+ if (!StudioAgent) {
111
+ console.warn("⚠️ Studio Agent module found but StudioAgent class not exported");
112
+ if (debug)
113
+ console.log("[Studio] Module contents:", studioAgentModule);
114
+ return false;
115
+ }
116
+ if (debug)
117
+ console.log("[Studio] StudioAgent class found, initializing...");
118
+ const agentOptions = {
119
+ port: config.port ?? parseInt(process.env.EXPRESSOTS_STUDIO_PORT ?? "3334", 10),
120
+ dbPath: config.dbPath ?? process.env.EXPRESSOTS_STUDIO_DB ?? ".studio/studio.db",
121
+ serviceName: config.serviceName ?? "expressots-app",
122
+ enableRecording: true,
123
+ enableProfiling: true,
124
+ expressApp: app, // Pass Express app for runtime route scanning
125
+ appContainer, // Pass AppContainer so the agent can build a DI snapshot
126
+ appPort: config.appPort,
127
+ globalPrefix: config.globalPrefix,
128
+ };
129
+ studioAgent = new StudioAgent(agentOptions);
130
+ // Add the middleware BEFORE other routes to capture all requests
131
+ const middleware = studioAgent.createMiddleware();
132
+ app.use(middleware);
133
+ // Start the agent (this also scans routes)
134
+ await studioAgent.start();
135
+ studioEnabled = true;
136
+ console.log(`[ExpressoTS] Studio Agent listening on ws://localhost:${agentOptions.port}`);
137
+ return true;
138
+ }
139
+ catch (error) {
140
+ // Best-effort cleanup so a half-initialised agent doesn't hold the
141
+ // WebSocket port across a retry.
142
+ if (studioAgent) {
143
+ try {
144
+ await studioAgent.stop();
145
+ }
146
+ catch {
147
+ // ignore
148
+ }
149
+ studioAgent = null;
150
+ }
151
+ studioEnabled = false;
152
+ const errorMessage = error instanceof Error ? error.message : String(error);
153
+ const errorCode = error && typeof error === "object" && "code" in error
154
+ ? error.code
155
+ : undefined;
156
+ // Expected when @expressots/studio-agent isn't installed — silent.
157
+ if (errorMessage.includes("Cannot find module") ||
158
+ errorMessage.includes("ERR_MODULE_NOT_FOUND")) {
159
+ return false;
160
+ }
161
+ // Friendlier message for the most common failure mode: hot-reload
162
+ // race left the port in TIME_WAIT.
163
+ if (errorCode === "EADDRINUSE") {
164
+ console.warn(`⚠️ Studio Agent could not bind its WebSocket port ` +
165
+ `(${errorMessage}). The host app will continue without Studio. ` +
166
+ `If this happened during hot-reload, the next restart should recover.`);
167
+ return false;
168
+ }
169
+ console.warn("⚠️ Failed to initialize Studio Agent:", errorMessage);
170
+ return false;
171
+ }
172
+ }
173
+ /**
174
+ * Push runtime details to the agent that the host only knows after the
175
+ * HTTP server has started — most importantly the actual listening port
176
+ * and total boot time. No-ops when:
177
+ * - the agent isn't running, or
178
+ * - the installed agent is from an older preview without
179
+ * `updateRuntimeInfo()` (we feature-detect to stay forward-compatible).
180
+ */
181
+ function reportStudioRuntimeInfo(patch) {
182
+ if (!studioAgent)
183
+ return;
184
+ if (typeof studioAgent.updateRuntimeInfo !== "function")
185
+ return;
186
+ try {
187
+ studioAgent.updateRuntimeInfo(patch);
188
+ }
189
+ catch {
190
+ // Best-effort — never break the host on a status-page update.
191
+ }
192
+ }
193
+ /**
194
+ * Stop the Studio Agent
195
+ */
196
+ async function stopStudio() {
197
+ if (studioAgent) {
198
+ await studioAgent.stop();
199
+ studioAgent = null;
200
+ studioEnabled = false;
201
+ }
202
+ }
203
+ /**
204
+ * Check if Studio is enabled
205
+ */
206
+ function isStudioEnabled() {
207
+ return studioEnabled;
208
+ }
209
+ /**
210
+ * Get the Studio Agent instance
211
+ */
212
+ function getStudioAgent() {
213
+ return studioAgent;
214
+ }
package/lib/cjs/index.js CHANGED
@@ -14,4 +14,4 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
14
  for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
15
  };
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
- __exportStar(require("./adapter-express"), exports);
17
+ __exportStar(require("./adapter-express/index.js"), exports);
@@ -12,7 +12,9 @@
12
12
  * class Application extends ApplicationBase {
13
13
  * protected configureServices() { //... }
14
14
  * protected postServerInitialization() { //... }
15
- * protected serverShutdown() { //... }
15
+ * protected serverShutdown(signal) {
16
+ * console.log(`Shutting down due to ${signal}`);
17
+ * }
16
18
  * }
17
19
  *
18
20
  * @export
@@ -21,15 +23,18 @@
21
23
  export declare abstract class ApplicationBase {
22
24
  /**
23
25
  * Implement this method to set up global configurations for the server.
24
- * This method is called before any other server initialization methods.
25
- * Use this method to configure global settings that apply to the entire
26
- * server application. Supports asynchronous setup with a Promise.
26
+ * This method is called synchronously in the constructor before any other
27
+ * server initialization methods. Use this method to configure global settings
28
+ * that apply to the entire server application.
29
+ *
30
+ * Note: This method is synchronous and called during object construction.
31
+ * For asynchronous initialization, use `configureServices()` instead.
27
32
  *
28
33
  * @abstract
29
- * @returns {void | Promise<void>}
34
+ * @returns {void}
30
35
  * @public API
31
36
  */
32
- protected abstract globalConfiguration(): void | Promise<void>;
37
+ protected abstract globalConfiguration(): void;
33
38
  /**
34
39
  * Implement this method to set up required services or configurations before
35
40
  * the server starts. This is essential for initializing dependencies or settings
@@ -56,9 +61,17 @@ export declare abstract class ApplicationBase {
56
61
  * cleanup procedures to ensure a graceful server shutdown. Supports asynchronous
57
62
  * cleanup with a Promise.
58
63
  *
64
+ * The signal parameter indicates what triggered the shutdown:
65
+ * - SIGTERM: Graceful termination (e.g., Kubernetes pod shutdown)
66
+ * - SIGINT: User interrupt (e.g., Ctrl+C)
67
+ * - SIGHUP: Terminal hangup
68
+ * - SIGQUIT: Quit with core dump
69
+ * - SIGBREAK: Windows break signal
70
+ *
59
71
  * @abstract
72
+ * @param signal - The signal that triggered the shutdown (optional for backward compatibility)
60
73
  * @returns {void | Promise<void>}
61
74
  * @public API
62
75
  */
63
- protected abstract serverShutdown(): void | Promise<void>;
76
+ protected abstract serverShutdown(signal?: NodeJS.Signals): void | Promise<void>;
64
77
  }