@lenne.tech/nest-server 11.32.4 → 11.33.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (260) hide show
  1. package/.claude/rules/architecture.md +16 -0
  2. package/.claude/rules/configurable-features.md +11 -3
  3. package/.claude/rules/testing.md +101 -1
  4. package/CLAUDE.md +5 -0
  5. package/FRAMEWORK-API.md +58 -3
  6. package/dist/core/common/helpers/content-disposition.helper.d.ts +1 -0
  7. package/dist/core/common/helpers/content-disposition.helper.js +14 -0
  8. package/dist/core/common/helpers/content-disposition.helper.js.map +1 -0
  9. package/dist/core/common/helpers/file.helper.d.ts +7 -0
  10. package/dist/core/common/helpers/file.helper.js +21 -4
  11. package/dist/core/common/helpers/file.helper.js.map +1 -1
  12. package/dist/core/common/helpers/graceful-shutdown.helper.d.ts +2 -0
  13. package/dist/core/common/helpers/graceful-shutdown.helper.js +55 -0
  14. package/dist/core/common/helpers/graceful-shutdown.helper.js.map +1 -0
  15. package/dist/core/common/helpers/project-name.helper.d.ts +2 -0
  16. package/dist/core/common/helpers/project-name.helper.js +38 -0
  17. package/dist/core/common/helpers/project-name.helper.js.map +1 -0
  18. package/dist/core/common/interfaces/cron-job-config.interface.d.ts +1 -0
  19. package/dist/core/common/interfaces/server-options.interface.d.ts +39 -0
  20. package/dist/core/common/services/core-cron-jobs.initializer.d.ts +10 -0
  21. package/dist/core/common/services/core-cron-jobs.initializer.js +46 -0
  22. package/dist/core/common/services/core-cron-jobs.initializer.js.map +1 -0
  23. package/dist/core/common/services/core-cron-jobs.registry.d.ts +8 -0
  24. package/dist/core/common/services/core-cron-jobs.registry.js +12 -0
  25. package/dist/core/common/services/core-cron-jobs.registry.js.map +1 -0
  26. package/dist/core/common/services/core-cron-jobs.service.d.ts +37 -7
  27. package/dist/core/common/services/core-cron-jobs.service.js +278 -27
  28. package/dist/core/common/services/core-cron-jobs.service.js.map +1 -1
  29. package/dist/core/common/services/core-redis-pubsub.d.ts +20 -0
  30. package/dist/core/common/services/core-redis-pubsub.js +112 -0
  31. package/dist/core/common/services/core-redis-pubsub.js.map +1 -0
  32. package/dist/core/common/services/core-redis.service.d.ts +25 -0
  33. package/dist/core/common/services/core-redis.service.js +154 -0
  34. package/dist/core/common/services/core-redis.service.js.map +1 -0
  35. package/dist/core/common/services/core-s3.service.d.ts +51 -0
  36. package/dist/core/common/services/core-s3.service.js +261 -0
  37. package/dist/core/common/services/core-s3.service.js.map +1 -0
  38. package/dist/core/common/services/core-trust-proxy.initializer.d.ts +16 -0
  39. package/dist/core/common/services/core-trust-proxy.initializer.js +77 -0
  40. package/dist/core/common/services/core-trust-proxy.initializer.js.map +1 -0
  41. package/dist/core/common/services/rate-limit-store.d.ts +61 -0
  42. package/dist/core/common/services/rate-limit-store.js +235 -0
  43. package/dist/core/common/services/rate-limit-store.js.map +1 -0
  44. package/dist/core/modules/ai/core-ai-mcp.controller.d.ts +19 -3
  45. package/dist/core/modules/ai/core-ai-mcp.controller.js +148 -18
  46. package/dist/core/modules/ai/core-ai-mcp.controller.js.map +1 -1
  47. package/dist/core/modules/ai/services/core-ai.service.d.ts +7 -2
  48. package/dist/core/modules/ai/services/core-ai.service.js +24 -20
  49. package/dist/core/modules/ai/services/core-ai.service.js.map +1 -1
  50. package/dist/core/modules/auth/core-auth.module.js +4 -1
  51. package/dist/core/modules/auth/core-auth.module.js.map +1 -1
  52. package/dist/core/modules/auth/guards/legacy-auth-rate-limit.guard.d.ts +1 -1
  53. package/dist/core/modules/auth/guards/legacy-auth-rate-limit.guard.js +3 -14
  54. package/dist/core/modules/auth/guards/legacy-auth-rate-limit.guard.js.map +1 -1
  55. package/dist/core/modules/auth/services/legacy-auth-rate-limiter.service.d.ts +12 -10
  56. package/dist/core/modules/auth/services/legacy-auth-rate-limiter.service.js +30 -59
  57. package/dist/core/modules/auth/services/legacy-auth-rate-limiter.service.js.map +1 -1
  58. package/dist/core/modules/better-auth/core-better-auth-email-verification.service.d.ts +8 -2
  59. package/dist/core/modules/better-auth/core-better-auth-email-verification.service.js +118 -45
  60. package/dist/core/modules/better-auth/core-better-auth-email-verification.service.js.map +1 -1
  61. package/dist/core/modules/better-auth/core-better-auth-rate-limit.middleware.d.ts +1 -1
  62. package/dist/core/modules/better-auth/core-better-auth-rate-limit.middleware.js +2 -11
  63. package/dist/core/modules/better-auth/core-better-auth-rate-limit.middleware.js.map +1 -1
  64. package/dist/core/modules/better-auth/core-better-auth-rate-limiter.service.d.ts +12 -10
  65. package/dist/core/modules/better-auth/core-better-auth-rate-limiter.service.js +30 -85
  66. package/dist/core/modules/better-auth/core-better-auth-rate-limiter.service.js.map +1 -1
  67. package/dist/core/modules/better-auth/core-better-auth-user.mapper.js +0 -1
  68. package/dist/core/modules/better-auth/core-better-auth-user.mapper.js.map +1 -1
  69. package/dist/core/modules/file/core-file.controller.d.ts +11 -2
  70. package/dist/core/modules/file/core-file.controller.js +52 -15
  71. package/dist/core/modules/file/core-file.controller.js.map +1 -1
  72. package/dist/core/modules/file/core-file.resolver.d.ts +4 -4
  73. package/dist/core/modules/file/core-file.resolver.js +23 -16
  74. package/dist/core/modules/file/core-file.resolver.js.map +1 -1
  75. package/dist/core/modules/file/core-file.service.d.ts +41 -7
  76. package/dist/core/modules/file/core-file.service.js +227 -7
  77. package/dist/core/modules/file/core-file.service.js.map +1 -1
  78. package/dist/core/modules/file/file-metadata.helper.d.ts +16 -0
  79. package/dist/core/modules/file/file-metadata.helper.js +33 -0
  80. package/dist/core/modules/file/file-metadata.helper.js.map +1 -0
  81. package/dist/core/modules/file/file-roles.helper.d.ts +4 -0
  82. package/dist/core/modules/file/file-roles.helper.js +53 -0
  83. package/dist/core/modules/file/file-roles.helper.js.map +1 -0
  84. package/dist/core/modules/file/file-storage.helper.d.ts +13 -0
  85. package/dist/core/modules/file/file-storage.helper.js +65 -0
  86. package/dist/core/modules/file/file-storage.helper.js.map +1 -0
  87. package/dist/core/modules/file/filesystem-file.helper.d.ts +22 -0
  88. package/dist/core/modules/file/filesystem-file.helper.js +77 -0
  89. package/dist/core/modules/file/filesystem-file.helper.js.map +1 -0
  90. package/dist/core/modules/file/interfaces/file-service-options.interface.d.ts +1 -0
  91. package/dist/core/modules/file/interfaces/file-upload.interface.d.ts +7 -1
  92. package/dist/core/modules/file/s3-file.helper.d.ts +37 -0
  93. package/dist/core/modules/file/s3-file.helper.js +81 -0
  94. package/dist/core/modules/file/s3-file.helper.js.map +1 -0
  95. package/dist/core/modules/hub/core-hub.controller.d.ts +8 -8
  96. package/dist/core/modules/hub/core-hub.controller.js +24 -22
  97. package/dist/core/modules/hub/core-hub.controller.js.map +1 -1
  98. package/dist/core/modules/hub/helpers/hub-mask.helper.js +2 -2
  99. package/dist/core/modules/hub/helpers/hub-mask.helper.js.map +1 -1
  100. package/dist/core/modules/hub/hub-buffer.d.ts +23 -0
  101. package/dist/core/modules/hub/hub-buffer.js +101 -0
  102. package/dist/core/modules/hub/hub-buffer.js.map +1 -0
  103. package/dist/core/modules/hub/services/core-hub-mailbox.service.d.ts +7 -5
  104. package/dist/core/modules/hub/services/core-hub-mailbox.service.js +14 -10
  105. package/dist/core/modules/hub/services/core-hub-mailbox.service.js.map +1 -1
  106. package/dist/core/modules/hub/services/hub-log-buffer.service.d.ts +5 -2
  107. package/dist/core/modules/hub/services/hub-log-buffer.service.js +17 -8
  108. package/dist/core/modules/hub/services/hub-log-buffer.service.js.map +1 -1
  109. package/dist/core/modules/hub/services/hub-query-profiler.service.d.ts +4 -2
  110. package/dist/core/modules/hub/services/hub-query-profiler.service.js +13 -7
  111. package/dist/core/modules/hub/services/hub-query-profiler.service.js.map +1 -1
  112. package/dist/core/modules/hub/services/hub-trace-buffer.service.d.ts +4 -2
  113. package/dist/core/modules/hub/services/hub-trace-buffer.service.js +13 -8
  114. package/dist/core/modules/hub/services/hub-trace-buffer.service.js.map +1 -1
  115. package/dist/core/modules/migrate/helpers/migration.helper.d.ts +2 -6
  116. package/dist/core/modules/migrate/helpers/migration.helper.js +4 -4
  117. package/dist/core/modules/migrate/helpers/migration.helper.js.map +1 -1
  118. package/dist/core/modules/migrate/migration-runner.d.ts +1 -0
  119. package/dist/core/modules/migrate/migration-runner.js +4 -0
  120. package/dist/core/modules/migrate/migration-runner.js.map +1 -1
  121. package/dist/core/modules/migrate/mongo-state-store.d.ts +1 -0
  122. package/dist/core/modules/migrate/mongo-state-store.js +98 -9
  123. package/dist/core/modules/migrate/mongo-state-store.js.map +1 -1
  124. package/dist/core/modules/system-setup/core-system-setup.service.d.ts +2 -0
  125. package/dist/core/modules/system-setup/core-system-setup.service.js +31 -1
  126. package/dist/core/modules/system-setup/core-system-setup.service.js.map +1 -1
  127. package/dist/core/modules/tenant/core-tenant.guard.d.ts +17 -3
  128. package/dist/core/modules/tenant/core-tenant.guard.js +92 -15
  129. package/dist/core/modules/tenant/core-tenant.guard.js.map +1 -1
  130. package/dist/core/modules/tenant/core-tenant.module.js +3 -4
  131. package/dist/core/modules/tenant/core-tenant.module.js.map +1 -1
  132. package/dist/core/modules/tus/core-tus.controller.d.ts +2 -0
  133. package/dist/core/modules/tus/core-tus.controller.js +29 -3
  134. package/dist/core/modules/tus/core-tus.controller.js.map +1 -1
  135. package/dist/core/modules/tus/core-tus.service.d.ts +24 -1
  136. package/dist/core/modules/tus/core-tus.service.js +182 -28
  137. package/dist/core/modules/tus/core-tus.service.js.map +1 -1
  138. package/dist/core/modules/tus/interfaces/tus-config.interface.js +3 -0
  139. package/dist/core/modules/tus/interfaces/tus-config.interface.js.map +1 -1
  140. package/dist/core/modules/tus/tus-redis-locker.d.ts +25 -0
  141. package/dist/core/modules/tus/tus-redis-locker.js +87 -0
  142. package/dist/core/modules/tus/tus-redis-locker.js.map +1 -0
  143. package/dist/core/modules/tus/tus.module.d.ts +1 -0
  144. package/dist/core/modules/tus/tus.module.js +30 -4
  145. package/dist/core/modules/tus/tus.module.js.map +1 -1
  146. package/dist/core.module.js +18 -1
  147. package/dist/core.module.js.map +1 -1
  148. package/dist/index.d.ts +10 -0
  149. package/dist/index.js +10 -0
  150. package/dist/index.js.map +1 -1
  151. package/dist/main.js +2 -1
  152. package/dist/main.js.map +1 -1
  153. package/dist/server/modules/file/file.controller.js.map +1 -1
  154. package/dist/server/modules/file/file.resolver.js +1 -12
  155. package/dist/server/modules/file/file.resolver.js.map +1 -1
  156. package/dist/server/modules/file/file.service.d.ts +5 -1
  157. package/dist/server/modules/file/file.service.js +12 -3
  158. package/dist/server/modules/file/file.service.js.map +1 -1
  159. package/dist/server/modules/user/avatar.controller.d.ts +5 -1
  160. package/dist/server/modules/user/avatar.controller.js +26 -10
  161. package/dist/server/modules/user/avatar.controller.js.map +1 -1
  162. package/dist/server/modules/user/user.model.js +3 -2
  163. package/dist/server/modules/user/user.model.js.map +1 -1
  164. package/dist/server/modules/user/user.module.js +6 -2
  165. package/dist/server/modules/user/user.module.js.map +1 -1
  166. package/dist/server/modules/user/user.service.d.ts +1 -1
  167. package/dist/server/modules/user/user.service.js +6 -13
  168. package/dist/server/modules/user/user.service.js.map +1 -1
  169. package/dist/tsconfig.build.tsbuildinfo +1 -1
  170. package/docs/REQUEST-LIFECYCLE.md +57 -8
  171. package/docs/security-overrides.md +21 -3
  172. package/migration-guides/11.32.3-to-11.32.4.md +15 -3
  173. package/migration-guides/11.32.x-to-11.33.x.md +1551 -0
  174. package/package.json +74 -42
  175. package/src/core/common/helpers/content-disposition.helper.ts +90 -0
  176. package/src/core/common/helpers/file.helper.ts +53 -10
  177. package/src/core/common/helpers/graceful-shutdown.helper.ts +116 -0
  178. package/src/core/common/helpers/project-name.helper.ts +71 -0
  179. package/src/core/common/interfaces/cron-job-config.interface.ts +16 -0
  180. package/src/core/common/interfaces/server-options.interface.ts +439 -2
  181. package/src/core/common/services/core-cron-jobs.initializer.ts +39 -0
  182. package/src/core/common/services/core-cron-jobs.registry.ts +45 -0
  183. package/src/core/common/services/core-cron-jobs.service.ts +589 -47
  184. package/src/core/common/services/core-redis-pubsub.ts +183 -0
  185. package/src/core/common/services/core-redis.service.ts +249 -0
  186. package/src/core/common/services/core-s3.service.ts +465 -0
  187. package/src/core/common/services/core-trust-proxy.initializer.ts +112 -0
  188. package/src/core/common/services/rate-limit-store.ts +492 -0
  189. package/src/core/modules/ai/README.md +25 -0
  190. package/src/core/modules/ai/core-ai-mcp.controller.ts +253 -22
  191. package/src/core/modules/ai/services/core-ai.service.ts +33 -24
  192. package/src/core/modules/auth/core-auth.module.ts +7 -1
  193. package/src/core/modules/auth/guards/legacy-auth-rate-limit.guard.ts +12 -21
  194. package/src/core/modules/auth/services/legacy-auth-rate-limiter.service.ts +49 -93
  195. package/src/core/modules/better-auth/core-better-auth-email-verification.service.ts +202 -66
  196. package/src/core/modules/better-auth/core-better-auth-rate-limit.middleware.ts +11 -18
  197. package/src/core/modules/better-auth/core-better-auth-rate-limiter.service.ts +51 -132
  198. package/src/core/modules/better-auth/core-better-auth-user.mapper.ts +7 -1
  199. package/src/core/modules/file/INTEGRATION-CHECKLIST.md +108 -0
  200. package/src/core/modules/file/README.md +277 -53
  201. package/src/core/modules/file/core-file.controller.ts +168 -12
  202. package/src/core/modules/file/core-file.resolver.ts +46 -12
  203. package/src/core/modules/file/core-file.service.ts +482 -16
  204. package/src/core/modules/file/file-metadata.helper.ts +142 -0
  205. package/src/core/modules/file/file-roles.helper.ts +110 -0
  206. package/src/core/modules/file/file-storage.helper.ts +163 -0
  207. package/src/core/modules/file/filesystem-file.helper.ts +184 -0
  208. package/src/core/modules/file/interfaces/file-service-options.interface.ts +14 -0
  209. package/src/core/modules/file/interfaces/file-upload.interface.ts +17 -1
  210. package/src/core/modules/file/s3-file.helper.ts +209 -0
  211. package/src/core/modules/hub/README.md +48 -0
  212. package/src/core/modules/hub/core-hub.controller.ts +18 -16
  213. package/src/core/modules/hub/helpers/hub-mask.helper.ts +21 -4
  214. package/src/core/modules/hub/hub-buffer.ts +198 -0
  215. package/src/core/modules/hub/services/core-hub-mailbox.service.ts +22 -12
  216. package/src/core/modules/hub/services/hub-log-buffer.service.ts +24 -8
  217. package/src/core/modules/hub/services/hub-query-profiler.service.ts +9 -6
  218. package/src/core/modules/hub/services/hub-trace-buffer.service.ts +14 -9
  219. package/src/core/modules/migrate/README.md +33 -6
  220. package/src/core/modules/migrate/helpers/migration.helper.ts +13 -6
  221. package/src/core/modules/migrate/migration-runner.ts +10 -1
  222. package/src/core/modules/migrate/mongo-state-store.ts +179 -11
  223. package/src/core/modules/system-setup/README.md +7 -2
  224. package/src/core/modules/system-setup/core-system-setup.service.ts +95 -1
  225. package/src/core/modules/tenant/README.md +21 -1
  226. package/src/core/modules/tenant/core-tenant.guard.ts +135 -14
  227. package/src/core/modules/tenant/core-tenant.module.ts +8 -4
  228. package/src/core/modules/tus/INTEGRATION-CHECKLIST.md +93 -21
  229. package/src/core/modules/tus/README.md +35 -2
  230. package/src/core/modules/tus/core-tus.controller.ts +64 -12
  231. package/src/core/modules/tus/core-tus.service.ts +358 -34
  232. package/src/core/modules/tus/interfaces/tus-config.interface.ts +9 -0
  233. package/src/core/modules/tus/tus-redis-locker.ts +139 -0
  234. package/src/core/modules/tus/tus.module.ts +78 -6
  235. package/src/core.module.ts +26 -1
  236. package/src/index.ts +10 -0
  237. package/src/main.ts +7 -1
  238. package/src/server/modules/file/file.controller.ts +7 -3
  239. package/src/server/modules/file/file.resolver.ts +5 -17
  240. package/src/server/modules/file/file.service.ts +42 -3
  241. package/src/server/modules/user/avatar.controller.ts +39 -9
  242. package/src/server/modules/user/user.model.ts +9 -3
  243. package/src/server/modules/user/user.module.ts +12 -3
  244. package/src/server/modules/user/user.service.ts +20 -17
  245. package/src/test/README.md +7 -2
  246. package/src/core/common/helpers/file.helper.spec.ts +0 -145
  247. package/src/core/common/helpers/logging.helper.spec.ts +0 -61
  248. package/src/core/common/helpers/process-diagnostics.helper.spec.ts +0 -310
  249. package/src/core/common/services/brevo.service.spec.ts +0 -266
  250. package/src/core/modules/file/core-file.controller.spec.ts +0 -164
  251. package/src/core/modules/hub/core-hub.module.spec.ts +0 -108
  252. package/src/core/modules/hub/helpers/hub-command-shape.helper.spec.ts +0 -48
  253. package/src/core/modules/hub/helpers/hub-mask.helper.spec.ts +0 -67
  254. package/src/core/modules/hub/helpers/hub-mermaid.helper.spec.ts +0 -61
  255. package/src/core/modules/hub/helpers/hub-shell.helper.spec.ts +0 -106
  256. package/src/core/modules/hub/hub-config.helper.spec.ts +0 -108
  257. package/src/core/modules/hub/hub-ring-buffer.spec.ts +0 -95
  258. package/src/core/modules/hub/services/core-hub-mailbox.service.spec.ts +0 -116
  259. package/src/core/modules/hub/services/hub-trace-buffer.service.spec.ts +0 -112
  260. package/src/core/modules/migrate/helpers/migration.helper.spec.ts +0 -85
@@ -0,0 +1,77 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
12
+ return function (target, key) { decorator(target, key, paramIndex); }
13
+ };
14
+ var CoreTrustProxyInitializer_1;
15
+ Object.defineProperty(exports, "__esModule", { value: true });
16
+ exports.CoreTrustProxyInitializer = void 0;
17
+ const common_1 = require("@nestjs/common");
18
+ const core_1 = require("@nestjs/core");
19
+ const config_service_1 = require("./config.service");
20
+ const TRUST_PROXY = 'trust proxy';
21
+ let CoreTrustProxyInitializer = CoreTrustProxyInitializer_1 = class CoreTrustProxyInitializer {
22
+ httpAdapterHost;
23
+ logger = new common_1.Logger(CoreTrustProxyInitializer_1.name);
24
+ constructor(httpAdapterHost) {
25
+ this.httpAdapterHost = httpAdapterHost;
26
+ }
27
+ onModuleInit() {
28
+ const configured = this.getConfigured();
29
+ if (configured === undefined) {
30
+ return;
31
+ }
32
+ const app = this.getExpressApp();
33
+ if (!app) {
34
+ return;
35
+ }
36
+ app.set(TRUST_PROXY, configured);
37
+ this.logger.log(`Express "trust proxy" set to ${JSON.stringify(configured)} — request.ip follows X-Forwarded-For accordingly`);
38
+ }
39
+ onApplicationBootstrap() {
40
+ const limiters = this.enabledIpRateLimiters();
41
+ if (this.getConfigured() !== undefined || !limiters.length) {
42
+ return;
43
+ }
44
+ const app = this.getExpressApp();
45
+ if (!app || app.get(TRUST_PROXY)) {
46
+ return;
47
+ }
48
+ this.logger.warn(`Rate limiting is enabled (${limiters.join(', ')}) but Express "trust proxy" is not set. ` +
49
+ 'Behind a reverse proxy (Caddy, nginx, a Kubernetes ingress) request.ip is then the PROXY address for every ' +
50
+ 'request, so every client behind a reverse proxy shares one bucket and the limit throttles all of them at ' +
51
+ 'once. Set `trustProxy` in your server options to the number of proxy hops in front of this app ' +
52
+ '(e.g. `trustProxy: 1`), or `trustProxy: false` if nothing proxies it — which also silences this warning.');
53
+ }
54
+ enabledIpRateLimiters() {
55
+ return ['auth.rateLimit', 'betterAuth.rateLimit'].filter((path) => {
56
+ const config = config_service_1.ConfigService.getFastButReadOnly(path);
57
+ if (config === undefined || config === null || config === false) {
58
+ return false;
59
+ }
60
+ return typeof config === 'boolean' ? config : config.enabled !== false;
61
+ });
62
+ }
63
+ getConfigured() {
64
+ return config_service_1.ConfigService.getFastButReadOnly('trustProxy');
65
+ }
66
+ getExpressApp() {
67
+ const instance = this.httpAdapterHost?.httpAdapter?.getInstance?.();
68
+ return typeof instance?.set === 'function' && typeof instance?.get === 'function' ? instance : undefined;
69
+ }
70
+ };
71
+ exports.CoreTrustProxyInitializer = CoreTrustProxyInitializer;
72
+ exports.CoreTrustProxyInitializer = CoreTrustProxyInitializer = CoreTrustProxyInitializer_1 = __decorate([
73
+ (0, common_1.Injectable)(),
74
+ __param(0, (0, common_1.Optional)()),
75
+ __metadata("design:paramtypes", [core_1.HttpAdapterHost])
76
+ ], CoreTrustProxyInitializer);
77
+ //# sourceMappingURL=core-trust-proxy.initializer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"core-trust-proxy.initializer.js","sourceRoot":"","sources":["../../../../src/core/common/services/core-trust-proxy.initializer.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,2CAAoG;AACpG,uCAA+C;AAG/C,qDAAiD;AAGjD,MAAM,WAAW,GAAG,aAAa,CAAC;AAe3B,IAAM,yBAAyB,iCAA/B,MAAM,yBAAyB;IAGO;IAFxB,MAAM,GAAG,IAAI,eAAM,CAAC,2BAAyB,CAAC,IAAI,CAAC,CAAC;IAEvE,YAA2C,eAAiC;QAAjC,oBAAe,GAAf,eAAe,CAAkB;IAAG,CAAC;IAShF,YAAY;QACV,MAAM,UAAU,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;QACxC,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;YAC7B,OAAO;QACT,CAAC;QAED,MAAM,GAAG,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;QACjC,IAAI,CAAC,GAAG,EAAE,CAAC;YAGT,OAAO;QACT,CAAC;QAED,GAAG,CAAC,GAAG,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC;QACjC,IAAI,CAAC,MAAM,CAAC,GAAG,CACb,gCAAgC,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,mDAAmD,CAC9G,CAAC;IACJ,CAAC;IAaD,sBAAsB;QACpB,MAAM,QAAQ,GAAG,IAAI,CAAC,qBAAqB,EAAE,CAAC;QAC9C,IAAI,IAAI,CAAC,aAAa,EAAE,KAAK,SAAS,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;YAC3D,OAAO;QACT,CAAC;QAED,MAAM,GAAG,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;QACjC,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE,CAAC;YACjC,OAAO;QACT,CAAC;QAED,IAAI,CAAC,MAAM,CAAC,IAAI,CACd,6BAA6B,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,0CAA0C;YACxF,6GAA6G;YAC7G,2GAA2G;YAC3G,iGAAiG;YACjG,0GAA0G,CAC7G,CAAC;IACJ,CAAC;IASS,qBAAqB;QAC7B,OAAQ,CAAC,gBAAgB,EAAE,sBAAsB,CAAW,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE;YAC3E,MAAM,MAAM,GAAG,8BAAa,CAAC,kBAAkB,CAAkC,IAAI,CAAC,CAAC;YACvF,IAAI,MAAM,KAAK,SAAS,IAAI,MAAM,KAAK,IAAI,IAAI,MAAM,KAAK,KAAK,EAAE,CAAC;gBAChE,OAAO,KAAK,CAAC;YACf,CAAC;YACD,OAAO,OAAO,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,KAAK,KAAK,CAAC;QACzE,CAAC,CAAC,CAAC;IACL,CAAC;IAGS,aAAa;QACrB,OAAO,8BAAa,CAAC,kBAAkB,CAA+B,YAAY,CAAC,CAAC;IACtF,CAAC;IAGS,aAAa;QACrB,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,EAAE,WAAW,EAAE,WAAW,EAAE,EAAE,CAAC;QACpE,OAAO,OAAO,QAAQ,EAAE,GAAG,KAAK,UAAU,IAAI,OAAO,QAAQ,EAAE,GAAG,KAAK,UAAU,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC;IAC3G,CAAC;CACF,CAAA;AAzFY,8DAAyB;oCAAzB,yBAAyB;IADrC,IAAA,mBAAU,GAAE;IAIE,WAAA,IAAA,iBAAQ,GAAE,CAAA;qCAAsC,sBAAe;GAHjE,yBAAyB,CAyFrC"}
@@ -0,0 +1,61 @@
1
+ import { Logger } from '@nestjs/common';
2
+ import type { CoreRedisService } from './core-redis.service';
3
+ export declare function rateLimitKey(...parts: string[]): string;
4
+ export declare function rateLimitKeyPrefix(...parts: string[]): string;
5
+ export interface RateLimitStoreHit {
6
+ count: number;
7
+ resetIn: number;
8
+ }
9
+ export interface RateLimitStore {
10
+ clear(): Promise<void>;
11
+ hit(key: string, windowSeconds: number): Promise<RateLimitStoreHit>;
12
+ resetByPrefix(prefix: string): Promise<void>;
13
+ size(): number;
14
+ destroy?(): void;
15
+ }
16
+ export declare class InMemoryRateLimitStore implements RateLimitStore {
17
+ protected readonly maxEntries: number;
18
+ protected readonly store: Map<string, {
19
+ count: number;
20
+ resetTime: number;
21
+ }>;
22
+ protected cleanupInterval: NodeJS.Timeout | null;
23
+ protected atCapacity: boolean;
24
+ protected capacityWarned: boolean;
25
+ protected readonly overflow: Map<number, {
26
+ count: number;
27
+ resetTime: number;
28
+ }>;
29
+ constructor(maxEntries?: number);
30
+ clear(): Promise<void>;
31
+ hit(key: string, windowSeconds: number): Promise<RateLimitStoreHit>;
32
+ resetByPrefix(prefix: string): Promise<void>;
33
+ protected hitOverflow(key: string, windowSeconds: number, now: number): RateLimitStoreHit;
34
+ size(): number;
35
+ destroy(): void;
36
+ protected removeExpired(): number;
37
+ protected evictOldest(): void;
38
+ }
39
+ export declare class RedisRateLimitStore implements RateLimitStore {
40
+ protected readonly redisService: CoreRedisService;
41
+ protected readonly namespace: string;
42
+ protected readonly maxKeys: number;
43
+ protected readonly fallback: InMemoryRateLimitStore;
44
+ protected degraded: boolean;
45
+ protected readonly logger: Logger;
46
+ protected capacityWarned: boolean;
47
+ protected readonly prepared: WeakSet<object>;
48
+ constructor(redisService: CoreRedisService, namespace: string, maxKeys?: number);
49
+ clear(): Promise<void>;
50
+ hit(key: string, windowSeconds: number): Promise<RateLimitStoreHit>;
51
+ protected runHit(key: string, windowSeconds: number): Promise<[number, number, number]>;
52
+ resetByPrefix(prefix: string): Promise<void>;
53
+ size(): number;
54
+ destroy(): void;
55
+ protected guard<T>(operation: () => Promise<T>, onFailure: (() => Promise<T> | T) | undefined): Promise<T>;
56
+ protected redisKey(key: string): string;
57
+ protected redisKeyPattern(prefix: string): string;
58
+ protected cardinalityKey(): string;
59
+ protected overflowKey(key: string): string;
60
+ protected deleteByPattern(pattern: string): Promise<void>;
61
+ }
@@ -0,0 +1,235 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.RedisRateLimitStore = exports.InMemoryRateLimitStore = void 0;
4
+ exports.rateLimitKey = rateLimitKey;
5
+ exports.rateLimitKeyPrefix = rateLimitKeyPrefix;
6
+ const common_1 = require("@nestjs/common");
7
+ function escapeGlob(value) {
8
+ return value.replace(/[?[\]*\\^]/g, (char) => `\\${char}`);
9
+ }
10
+ function rateLimitKey(...parts) {
11
+ return parts.map((part) => part.replace(/\\/g, '\\\\').replace(/:/g, '\\:')).join(':');
12
+ }
13
+ function rateLimitKeyPrefix(...parts) {
14
+ return `${rateLimitKey(...parts)}:`;
15
+ }
16
+ function namespaceLabel(namespace) {
17
+ return `namespace ${namespace}`;
18
+ }
19
+ const OVERFLOW_BUCKETS = 64;
20
+ function overflowSlot(key) {
21
+ let hash = 0;
22
+ for (let i = 0; i < key.length; i++) {
23
+ hash = (hash * 31 + key.charCodeAt(i)) | 0;
24
+ }
25
+ return Math.abs(hash) % OVERFLOW_BUCKETS;
26
+ }
27
+ class InMemoryRateLimitStore {
28
+ maxEntries;
29
+ store = new Map();
30
+ cleanupInterval = null;
31
+ atCapacity = false;
32
+ capacityWarned = false;
33
+ overflow = new Map();
34
+ constructor(maxEntries = 10000) {
35
+ this.maxEntries = maxEntries;
36
+ this.cleanupInterval = setInterval(() => this.removeExpired(), 5 * 60 * 1000);
37
+ this.cleanupInterval.unref?.();
38
+ }
39
+ async clear() {
40
+ this.store.clear();
41
+ this.overflow.clear();
42
+ this.atCapacity = false;
43
+ this.capacityWarned = false;
44
+ }
45
+ async hit(key, windowSeconds) {
46
+ const now = Date.now();
47
+ let entry = this.store.get(key);
48
+ if (!entry || now >= entry.resetTime) {
49
+ if (!entry && this.store.size >= this.maxEntries) {
50
+ this.atCapacity = false;
51
+ this.evictOldest();
52
+ if (this.atCapacity) {
53
+ if (!this.capacityWarned) {
54
+ this.capacityWarned = true;
55
+ console.warn(`Rate limit store is at capacity (${this.maxEntries} live counters). New clients now share ` +
56
+ `${OVERFLOW_BUCKETS} coarse counters until entries expire, so they may be limited earlier than ` +
57
+ 'their own traffic warrants. Existing limits are unaffected.');
58
+ }
59
+ return this.hitOverflow(key, windowSeconds, now);
60
+ }
61
+ }
62
+ entry = { count: 1, resetTime: now + windowSeconds * 1000 };
63
+ this.store.set(key, entry);
64
+ return { count: 1, resetIn: windowSeconds };
65
+ }
66
+ entry.count++;
67
+ return { count: entry.count, resetIn: Math.ceil((entry.resetTime - now) / 1000) };
68
+ }
69
+ async resetByPrefix(prefix) {
70
+ for (const key of this.store.keys()) {
71
+ if (key.startsWith(prefix)) {
72
+ this.store.delete(key);
73
+ }
74
+ }
75
+ }
76
+ hitOverflow(key, windowSeconds, now) {
77
+ const slot = overflowSlot(key);
78
+ const entry = this.overflow.get(slot);
79
+ if (!entry || now >= entry.resetTime) {
80
+ this.overflow.set(slot, { count: 1, resetTime: now + windowSeconds * 1000 });
81
+ return { count: 1, resetIn: windowSeconds };
82
+ }
83
+ entry.count++;
84
+ return { count: entry.count, resetIn: Math.ceil((entry.resetTime - now) / 1000) };
85
+ }
86
+ size() {
87
+ return this.store.size;
88
+ }
89
+ destroy() {
90
+ if (this.cleanupInterval) {
91
+ clearInterval(this.cleanupInterval);
92
+ this.cleanupInterval = null;
93
+ }
94
+ }
95
+ removeExpired() {
96
+ const now = Date.now();
97
+ let removed = 0;
98
+ for (const [key, entry] of this.store.entries()) {
99
+ if (now >= entry.resetTime) {
100
+ this.store.delete(key);
101
+ removed++;
102
+ }
103
+ }
104
+ return removed;
105
+ }
106
+ evictOldest() {
107
+ const removed = this.removeExpired();
108
+ if (removed > 0 || this.store.size < this.maxEntries) {
109
+ return;
110
+ }
111
+ this.atCapacity = true;
112
+ }
113
+ }
114
+ exports.InMemoryRateLimitStore = InMemoryRateLimitStore;
115
+ const HIT_SCRIPT = `
116
+ local window = tonumber(ARGV[1])
117
+ local target = KEYS[1]
118
+ local overflow = 0
119
+ if redis.call('EXISTS', KEYS[1]) == 0 then
120
+ local seen = redis.call('INCR', KEYS[2])
121
+ if seen == 1 then
122
+ redis.call('EXPIRE', KEYS[2], window)
123
+ end
124
+ if seen > tonumber(ARGV[2]) then
125
+ target = KEYS[3]
126
+ overflow = 1
127
+ end
128
+ end
129
+ local c = redis.call('INCR', target)
130
+ if c == 1 then
131
+ redis.call('EXPIRE', target, window)
132
+ end
133
+ local ttl = redis.call('TTL', target)
134
+ if ttl < 0 then
135
+ redis.call('EXPIRE', target, window)
136
+ ttl = window
137
+ end
138
+ return {c, ttl, overflow}
139
+ `;
140
+ const HIT_COMMAND = 'ltRateLimitHit';
141
+ class RedisRateLimitStore {
142
+ redisService;
143
+ namespace;
144
+ maxKeys;
145
+ fallback = new InMemoryRateLimitStore();
146
+ degraded = false;
147
+ logger = new common_1.Logger(RedisRateLimitStore.name);
148
+ capacityWarned = false;
149
+ prepared = new WeakSet();
150
+ constructor(redisService, namespace, maxKeys = 10000) {
151
+ this.redisService = redisService;
152
+ this.namespace = namespace;
153
+ this.maxKeys = maxKeys;
154
+ }
155
+ async clear() {
156
+ await this.fallback.clear();
157
+ this.capacityWarned = false;
158
+ await this.guard(() => this.deleteByPattern(this.redisKeyPattern('')), undefined);
159
+ }
160
+ async hit(key, windowSeconds) {
161
+ return this.guard(async () => {
162
+ const [count, ttl, overflow] = await this.runHit(key, windowSeconds);
163
+ if (this.degraded) {
164
+ this.degraded = false;
165
+ this.logger.log('Redis rate limiting recovered — limits are shared across replicas again');
166
+ }
167
+ if (overflow && !this.capacityWarned) {
168
+ this.capacityWarned = true;
169
+ this.logger.warn(`Rate limit keyspace for ${namespaceLabel(this.namespace)} reached ${this.maxKeys} distinct counters ` +
170
+ `within one window. New clients now share ${OVERFLOW_BUCKETS} coarse counters until the window rolls ` +
171
+ 'over, so they may be limited earlier than their own traffic warrants. Existing limits are unaffected.');
172
+ }
173
+ return { count, resetIn: ttl };
174
+ }, () => this.fallback.hit(key, windowSeconds));
175
+ }
176
+ async runHit(key, windowSeconds) {
177
+ const client = this.redisService.getClient();
178
+ const args = [this.redisKey(key), this.cardinalityKey(), this.overflowKey(key), windowSeconds, this.maxKeys];
179
+ if (typeof client.defineCommand === 'function') {
180
+ if (!this.prepared.has(client)) {
181
+ client.defineCommand(HIT_COMMAND, { lua: HIT_SCRIPT, numberOfKeys: 3 });
182
+ this.prepared.add(client);
183
+ }
184
+ return (await client[HIT_COMMAND](...args));
185
+ }
186
+ return (await client.eval(HIT_SCRIPT, 3, ...args));
187
+ }
188
+ async resetByPrefix(prefix) {
189
+ await this.fallback.resetByPrefix(prefix);
190
+ await this.guard(() => this.deleteByPattern(this.redisKeyPattern(prefix)), undefined);
191
+ }
192
+ size() {
193
+ return -1;
194
+ }
195
+ destroy() {
196
+ this.fallback.destroy();
197
+ }
198
+ async guard(operation, onFailure) {
199
+ try {
200
+ return await operation();
201
+ }
202
+ catch (error) {
203
+ if (!this.degraded) {
204
+ this.degraded = true;
205
+ this.logger.error(`Redis rate limiting unavailable (${namespaceLabel(this.namespace)}): ${error instanceof Error ? error.message : 'Unknown error'}. Falling back to per-replica in-memory limits until Redis recovers.`);
206
+ }
207
+ return onFailure ? await onFailure() : undefined;
208
+ }
209
+ }
210
+ redisKey(key) {
211
+ return this.redisService.key('rate-limit', this.namespace, key);
212
+ }
213
+ redisKeyPattern(prefix) {
214
+ return `${escapeGlob(this.redisKey(prefix))}*`;
215
+ }
216
+ cardinalityKey() {
217
+ return this.redisService.key('rate-limit', this.namespace, '#meta', 'cardinality');
218
+ }
219
+ overflowKey(key) {
220
+ return this.redisService.key('rate-limit', this.namespace, '#overflow', String(overflowSlot(key)));
221
+ }
222
+ async deleteByPattern(pattern) {
223
+ const client = this.redisService.getClient();
224
+ let cursor = '0';
225
+ do {
226
+ const [nextCursor, keys] = await client.scan(cursor, 'MATCH', pattern, 'COUNT', 200);
227
+ if (keys.length) {
228
+ await client.del(...keys);
229
+ }
230
+ cursor = nextCursor;
231
+ } while (cursor !== '0');
232
+ }
233
+ }
234
+ exports.RedisRateLimitStore = RedisRateLimitStore;
235
+ //# sourceMappingURL=rate-limit-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rate-limit-store.js","sourceRoot":"","sources":["../../../../src/core/common/services/rate-limit-store.ts"],"names":[],"mappings":"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"}
@@ -1,21 +1,37 @@
1
- import { Logger } from '@nestjs/common';
1
+ import { Logger, OnModuleDestroy } from '@nestjs/common';
2
2
  import { Request, Response } from 'express';
3
+ import { CoreRedisService } from '../../common/services/core-redis.service';
3
4
  import { CoreAiMcpOAuthService } from './services/core-ai-mcp-oauth.service';
4
5
  import { CoreAiMcpService } from './services/core-ai-mcp.service';
5
- export declare class CoreAiMcpController {
6
+ export declare class CoreAiMcpController implements OnModuleDestroy {
6
7
  private readonly mcpService;
7
8
  private readonly oauthService;
9
+ protected readonly redisService?: CoreRedisService;
8
10
  protected readonly logger: Logger;
9
11
  private readonly transports;
12
+ private readonly maxSessionsPerUser;
10
13
  private readonly maxSessions;
11
- constructor(mcpService: CoreAiMcpService, oauthService: CoreAiMcpOAuthService);
14
+ protected readonly instanceId: string;
15
+ protected readonly sessionTtlSeconds = 3600;
16
+ constructor(mcpService: CoreAiMcpService, oauthService: CoreAiMcpOAuthService, redisService?: CoreRedisService);
12
17
  handlePost(req: Request, res: Response): Promise<void>;
13
18
  handleGet(req: Request, res: Response): Promise<void>;
14
19
  handleDelete(req: Request, res: Response): Promise<void>;
15
20
  protected resolveUser(req: Request): Promise<any | null>;
16
21
  protected oauthEnabled(): boolean;
17
22
  private handleSessionRequest;
23
+ protected foreignSessionOwner(sessionId: string, userId: string): Promise<string | undefined>;
24
+ protected parseSessionEntry(raw: null | string): undefined | {
25
+ instanceId: string;
26
+ userId: string;
27
+ };
28
+ protected registerSession(sessionId: string, userId: string): void;
29
+ protected releaseSession(sessionId: string): Promise<void>;
30
+ onModuleDestroy(): Promise<void>;
31
+ protected sessionKey(sessionId: string): string;
32
+ protected foreignSession(res: Response, owner: string): void;
18
33
  private mcpUnavailable;
19
34
  private unauthorized;
20
35
  private evictIfNeeded;
36
+ private evictOldestOf;
21
37
  }