@open-rlb/nestjs-amqp 2.0.13 → 2.1.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 (79) hide show
  1. package/amqp-lib/amqp/connection.d.ts +5 -0
  2. package/amqp-lib/amqp/connection.js +78 -21
  3. package/amqp-lib/amqp/connection.js.map +1 -1
  4. package/amqp-lib/amqp/retry-policy.d.ts +25 -0
  5. package/amqp-lib/amqp/retry-policy.js +101 -0
  6. package/amqp-lib/amqp/retry-policy.js.map +1 -0
  7. package/amqp-lib/config/rabbitmq.config.d.ts +2 -0
  8. package/amqp-lib/index.d.ts +1 -0
  9. package/amqp-lib/index.js +1 -0
  10. package/amqp-lib/index.js.map +1 -1
  11. package/amqp-lib/models/errors.model.d.ts +4 -0
  12. package/amqp-lib/models/errors.model.js +9 -1
  13. package/amqp-lib/models/errors.model.js.map +1 -1
  14. package/amqp-lib/models/rabbitmq-handler.model.d.ts +2 -0
  15. package/modules/acl/acl.module.js +3 -1
  16. package/modules/acl/acl.module.js.map +1 -1
  17. package/modules/acl/cache/acl-cache.service.d.ts +5 -1
  18. package/modules/acl/cache/acl-cache.service.js +23 -3
  19. package/modules/acl/cache/acl-cache.service.js.map +1 -1
  20. package/modules/acl/config/acl.config.d.ts +8 -0
  21. package/modules/acl/const.d.ts +2 -0
  22. package/modules/acl/const.js +3 -1
  23. package/modules/acl/const.js.map +1 -1
  24. package/modules/acl/index.d.ts +1 -0
  25. package/modules/acl/index.js +1 -0
  26. package/modules/acl/index.js.map +1 -1
  27. package/modules/acl/services/acl-invalidation.service.d.ts +18 -0
  28. package/modules/acl/services/acl-invalidation.service.js +81 -0
  29. package/modules/acl/services/acl-invalidation.service.js.map +1 -0
  30. package/modules/acl/services/acl-management.service.d.ts +7 -1
  31. package/modules/acl/services/acl-management.service.js +31 -15
  32. package/modules/acl/services/acl-management.service.js.map +1 -1
  33. package/modules/acl/services/acl.service.d.ts +9 -1
  34. package/modules/acl/services/acl.service.js +42 -12
  35. package/modules/acl/services/acl.service.js.map +1 -1
  36. package/modules/broker/broker.module.d.ts +2 -0
  37. package/modules/broker/broker.module.js +23 -2
  38. package/modules/broker/broker.module.js.map +1 -1
  39. package/modules/broker/config/topics.config.d.ts +2 -0
  40. package/modules/broker/decorators/broker-action.decorator.d.ts +3 -1
  41. package/modules/broker/decorators/broker-action.decorator.js +2 -1
  42. package/modules/broker/decorators/broker-action.decorator.js.map +1 -1
  43. package/modules/broker/services/broker.service.js +39 -16
  44. package/modules/broker/services/broker.service.js.map +1 -1
  45. package/modules/broker/services/metadata-scanner.service.js +45 -32
  46. package/modules/broker/services/metadata-scanner.service.js.map +1 -1
  47. package/modules/gateway-admin/config/gateway-admin.config.d.ts +1 -0
  48. package/modules/gateway-admin/const.d.ts +2 -0
  49. package/modules/gateway-admin/const.js +3 -1
  50. package/modules/gateway-admin/const.js.map +1 -1
  51. package/modules/gateway-admin/index.d.ts +1 -0
  52. package/modules/gateway-admin/index.js +1 -0
  53. package/modules/gateway-admin/index.js.map +1 -1
  54. package/modules/gateway-admin/repository/http-path.repository.js.map +1 -1
  55. package/modules/gateway-admin/scheduler-lock.d.ts +8 -0
  56. package/modules/gateway-admin/scheduler-lock.js +8 -0
  57. package/modules/gateway-admin/scheduler-lock.js.map +1 -0
  58. package/modules/gateway-admin/services/gateway-metrics-rollup.service.d.ts +8 -1
  59. package/modules/gateway-admin/services/gateway-metrics-rollup.service.js +59 -4
  60. package/modules/gateway-admin/services/gateway-metrics-rollup.service.js.map +1 -1
  61. package/modules/gateway-admin/services/gateway-metrics.service.d.ts +4 -1
  62. package/modules/gateway-admin/services/gateway-metrics.service.js +19 -6
  63. package/modules/gateway-admin/services/gateway-metrics.service.js.map +1 -1
  64. package/modules/gateway-admin/services/gateway-retention.service.d.ts +4 -1
  65. package/modules/gateway-admin/services/gateway-retention.service.js +33 -3
  66. package/modules/gateway-admin/services/gateway-retention.service.js.map +1 -1
  67. package/modules/gateway-admin/services/route-sync.service.js +25 -5
  68. package/modules/gateway-admin/services/route-sync.service.js.map +1 -1
  69. package/modules/proxy/config/path-definition.config.d.ts +7 -0
  70. package/modules/proxy/services/http-handler.service.d.ts +3 -0
  71. package/modules/proxy/services/http-handler.service.js +54 -6
  72. package/modules/proxy/services/http-handler.service.js.map +1 -1
  73. package/modules/proxy/services/websocket.service.js +28 -2
  74. package/modules/proxy/services/websocket.service.js.map +1 -1
  75. package/package.json +1 -1
  76. package/schematics/nest-add/files/skills/rlb-amqp/references/config-schema.md +20 -3
  77. package/schematics/nest-add/files/skills/rlb-amqp/references/gotchas.md +19 -3
  78. package/schematics/nest-add/files/skills/rlb-amqp-acl/SKILL.md +35 -10
  79. package/schematics/nest-add/files/skills/rlb-amqp-gateway-admin/SKILL.md +27 -1
@@ -17,12 +17,16 @@ exports.GatewayMetricsRollupService = void 0;
17
17
  const common_1 = require("@nestjs/common");
18
18
  const const_1 = require("../const");
19
19
  const http_metric_repository_1 = require("../repository/http-metric.repository");
20
+ const scheduler_lock_1 = require("../scheduler-lock");
20
21
  const metrics_1 = require("../util/metrics");
21
22
  const HOUR_MS = 3_600_000;
22
23
  const DEFAULT_ROLLUP_RETENTION_DAYS = 365;
24
+ const LOCK_TTL_MS = 5 * 60_000;
25
+ const BOOT_CATCHUP_HOURS = 3;
23
26
  let GatewayMetricsRollupService = GatewayMetricsRollupService_1 = class GatewayMetricsRollupService {
24
- constructor(metrics, options) {
27
+ constructor(metrics, options, lock) {
25
28
  this.metrics = metrics;
29
+ this.lock = lock;
26
30
  this.logger = new common_1.Logger(GatewayMetricsRollupService_1.name);
27
31
  this.enabled = (options?.rollupRetentionDays ?? DEFAULT_ROLLUP_RETENTION_DAYS) > 0;
28
32
  }
@@ -31,6 +35,7 @@ let GatewayMetricsRollupService = GatewayMetricsRollupService_1 = class GatewayM
31
35
  this.logger.log('[rollup] disabled (rollupRetentionDays <= 0)');
32
36
  return;
33
37
  }
38
+ void this.runCatchup(BOOT_CATCHUP_HOURS);
34
39
  this.timer = setInterval(() => void this.rollup(), HOUR_MS);
35
40
  this.timer.unref?.();
36
41
  }
@@ -38,8 +43,48 @@ let GatewayMetricsRollupService = GatewayMetricsRollupService_1 = class GatewayM
38
43
  if (this.timer)
39
44
  clearInterval(this.timer);
40
45
  }
46
+ async acquire(name) {
47
+ if (!this.lock)
48
+ return true;
49
+ try {
50
+ return await this.lock.tryAcquire(name, LOCK_TTL_MS);
51
+ }
52
+ catch (e) {
53
+ this.logger.warn(`[rollup] scheduler lock '${name}' errored (${e?.message}); running anyway`);
54
+ return true;
55
+ }
56
+ }
41
57
  async rollup() {
42
- const hourStart = Math.floor(Date.now() / HOUR_MS) * HOUR_MS - HOUR_MS;
58
+ if (!(await this.acquire(scheduler_lock_1.GW_SCHED_LOCK_NAMES.rollup))) {
59
+ this.logger.debug?.('[rollup] skipped this tick: lock held by another instance');
60
+ return;
61
+ }
62
+ try {
63
+ await this.rollupHour(this.previousHourStart());
64
+ }
65
+ finally {
66
+ await this.releaseLock();
67
+ }
68
+ }
69
+ async runCatchup(hours) {
70
+ if (!(await this.acquire(scheduler_lock_1.GW_SCHED_LOCK_NAMES.rollup))) {
71
+ this.logger.debug?.('[rollup] boot catch-up skipped: lock held by another instance');
72
+ return;
73
+ }
74
+ try {
75
+ const base = this.previousHourStart();
76
+ for (let i = 0; i < hours; i++) {
77
+ await this.rollupHour(base - i * HOUR_MS);
78
+ }
79
+ }
80
+ finally {
81
+ await this.releaseLock();
82
+ }
83
+ }
84
+ previousHourStart() {
85
+ return Math.floor(Date.now() / HOUR_MS) * HOUR_MS - HOUR_MS;
86
+ }
87
+ async rollupHour(hourStart) {
43
88
  try {
44
89
  const points = await this.metrics.points({ from: hourStart, to: hourStart + HOUR_MS - 1 });
45
90
  if (!points.length)
@@ -49,7 +94,15 @@ let GatewayMetricsRollupService = GatewayMetricsRollupService_1 = class GatewayM
49
94
  this.logger.log(`[rollup] ${points.length} point(s) → ${rollups.length} hourly rollup(s) for ${new Date(hourStart).toISOString()}`);
50
95
  }
51
96
  catch (e) {
52
- this.logger.warn(`[rollup] failed: ${e?.message}`);
97
+ this.logger.warn(`[rollup] failed for ${new Date(hourStart).toISOString()}: ${e?.message}`);
98
+ }
99
+ }
100
+ async releaseLock() {
101
+ if (this.lock?.release) {
102
+ try {
103
+ await this.lock.release(scheduler_lock_1.GW_SCHED_LOCK_NAMES.rollup);
104
+ }
105
+ catch { }
53
106
  }
54
107
  }
55
108
  };
@@ -58,6 +111,8 @@ exports.GatewayMetricsRollupService = GatewayMetricsRollupService = GatewayMetri
58
111
  (0, common_1.Injectable)(),
59
112
  __param(1, (0, common_1.Optional)()),
60
113
  __param(1, (0, common_1.Inject)(const_1.RLB_GW_ADMIN_OPTIONS)),
61
- __metadata("design:paramtypes", [http_metric_repository_1.HttpMetricRepository, Object])
114
+ __param(2, (0, common_1.Optional)()),
115
+ __param(2, (0, common_1.Inject)(const_1.RLB_GW_SCHED_LOCK)),
116
+ __metadata("design:paramtypes", [http_metric_repository_1.HttpMetricRepository, Object, Object])
62
117
  ], GatewayMetricsRollupService);
63
118
  //# sourceMappingURL=gateway-metrics-rollup.service.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"gateway-metrics-rollup.service.js","sourceRoot":"","sources":["../../../../libs/rlb-nestjs-amqp/src/modules/gateway-admin/services/gateway-metrics-rollup.service.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,2CAA+G;AAE/G,oCAAgD;AAChD,iFAA4E;AAC5E,6CAAmD;AAEnD,MAAM,OAAO,GAAG,SAAS,CAAC;AAC1B,MAAM,6BAA6B,GAAG,GAAG,CAAC;AAQnC,IAAM,2BAA2B,mCAAjC,MAAM,2BAA2B;IAKtC,YACmB,OAA6B,EACJ,OAAmC;QAD5D,YAAO,GAAP,OAAO,CAAsB;QAL/B,WAAM,GAAG,IAAI,eAAM,CAAC,6BAA2B,CAAC,IAAI,CAAC,CAAC;QAQrE,IAAI,CAAC,OAAO,GAAG,CAAC,OAAO,EAAE,mBAAmB,IAAI,6BAA6B,CAAC,GAAG,CAAC,CAAC;IACrF,CAAC;IAED,sBAAsB;QACpB,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;YAClB,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,8CAA8C,CAAC,CAAC;YAChE,OAAO;QACT,CAAC;QACD,IAAI,CAAC,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC,KAAK,IAAI,CAAC,MAAM,EAAE,EAAE,OAAO,CAAC,CAAC;QAC5D,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,EAAE,CAAC;IACvB,CAAC;IAED,eAAe;QACb,IAAI,IAAI,CAAC,KAAK;YAAE,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC5C,CAAC;IAGO,KAAK,CAAC,MAAM;QAClB,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,OAAO,CAAC,GAAG,OAAO,GAAG,OAAO,CAAC;QACvE,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,EAAE,SAAS,GAAG,OAAO,GAAG,CAAC,EAAE,CAAC,CAAC;YAC3F,IAAI,CAAC,MAAM,CAAC,MAAM;gBAAE,OAAO;YAC3B,MAAM,OAAO,GAAG,IAAA,0BAAgB,EAAC,MAAM,EAAE,OAAO,CAAC,CAAC;YAClD,MAAM,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;YAC1C,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,YAAY,MAAM,CAAC,MAAM,eAAe,OAAO,CAAC,MAAM,yBAAyB,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;QACtI,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,oBAAqB,CAAW,EAAE,OAAO,EAAE,CAAC,CAAC;QAChE,CAAC;IACH,CAAC;CACF,CAAA;AAtCY,kEAA2B;sCAA3B,2BAA2B;IADvC,IAAA,mBAAU,GAAE;IAQR,WAAA,IAAA,iBAAQ,GAAE,CAAA;IAAE,WAAA,IAAA,eAAM,EAAC,4BAAoB,CAAC,CAAA;qCADf,6CAAoB;GANrC,2BAA2B,CAsCvC"}
1
+ {"version":3,"file":"gateway-metrics-rollup.service.js","sourceRoot":"","sources":["../../../../libs/rlb-nestjs-amqp/src/modules/gateway-admin/services/gateway-metrics-rollup.service.ts"],"names":[],"mappings":"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"}
@@ -1,9 +1,12 @@
1
+ import { GatewayAdminModuleOptions } from '../config/gateway-admin.config';
1
2
  import { HttpMetric, HttpMetricPoint, HttpMetricRollup, MetricSeriesBucket, MetricSummary, TrackCallInput } from '../models';
2
3
  import { HttpMetricRepository } from '../repository/http-metric.repository';
3
4
  export declare class GatewayMetricsService {
4
5
  private readonly repo;
5
6
  private readonly logger;
6
- constructor(repo: HttpMetricRepository);
7
+ private readonly queryMaxPoints;
8
+ constructor(repo: HttpMetricRepository, options?: GatewayAdminModuleOptions);
9
+ private pointsCapped;
7
10
  track(input: TrackCallInput): Promise<void>;
8
11
  get(route?: string): Promise<(HttpMetric & {
9
12
  avgDurationMs: number;
@@ -19,16 +19,25 @@ const broker_1 = require("../../broker");
19
19
  const const_1 = require("../const");
20
20
  const http_metric_repository_1 = require("../repository/http-metric.repository");
21
21
  const metrics_1 = require("../util/metrics");
22
+ const DEFAULT_QUERY_MAX_POINTS = 500_000;
22
23
  let GatewayMetricsService = GatewayMetricsService_1 = class GatewayMetricsService {
23
- constructor(repo) {
24
+ constructor(repo, options) {
24
25
  this.repo = repo;
25
26
  this.logger = new common_1.Logger(GatewayMetricsService_1.name);
27
+ this.queryMaxPoints = options?.metricsQueryMaxPoints ?? DEFAULT_QUERY_MAX_POINTS;
28
+ }
29
+ async pointsCapped(query, label) {
30
+ const cap = this.queryMaxPoints;
31
+ const points = await this.repo.points(cap > 0 ? { ...query, limit: cap } : query);
32
+ if (cap > 0 && points.length >= cap) {
33
+ this.logger.warn(`[metrics] '${label}' hit the ${cap}-point cap; aggregates cover only the newest ${cap} point(s). Narrow the from/to window or raise metricsQueryMaxPoints.`);
34
+ }
35
+ return points;
26
36
  }
27
37
  async track(input) {
28
38
  try {
29
39
  if (!input?.method || !input?.route)
30
40
  return;
31
- await this.repo.increment(input);
32
41
  await this.repo.record({
33
42
  ts: input.ts ?? Date.now(),
34
43
  method: input.method,
@@ -41,6 +50,7 @@ let GatewayMetricsService = GatewayMetricsService_1 = class GatewayMetricsServic
41
50
  durationMs: input.durationMs,
42
51
  code: input.code,
43
52
  });
53
+ await this.repo.increment(input);
44
54
  }
45
55
  catch (error) {
46
56
  this.logger.error(error);
@@ -52,7 +62,7 @@ let GatewayMetricsService = GatewayMetricsService_1 = class GatewayMetricsServic
52
62
  async series(bucketMs, from, to, method, route, name) {
53
63
  const f = from != null ? Number(from) : undefined;
54
64
  const t = to != null ? Number(to) : undefined;
55
- const points = await this.repo.points({ method, route, name, from: f, to: t });
65
+ const points = await this.pointsCapped({ method, route, name, from: f, to: t }, 'series');
56
66
  return (0, metrics_1.buildSeries)(points, { bucketMs: Number(bucketMs) || 60_000, from: f, to: t, method, route, name });
57
67
  }
58
68
  async points(method, route, from, to, limit) {
@@ -65,11 +75,11 @@ let GatewayMetricsService = GatewayMetricsService_1 = class GatewayMetricsServic
65
75
  });
66
76
  }
67
77
  async summary(from, to, method, route, name, topN) {
68
- const points = await this.repo.points({
78
+ const points = await this.pointsCapped({
69
79
  method, route, name,
70
80
  from: from != null ? Number(from) : undefined,
71
81
  to: to != null ? Number(to) : undefined,
72
- });
82
+ }, 'summary');
73
83
  return (0, metrics_1.buildSummary)(points, Number(topN) || 10);
74
84
  }
75
85
  async prometheus(route) {
@@ -86,6 +96,7 @@ let GatewayMetricsService = GatewayMetricsService_1 = class GatewayMetricsServic
86
96
  };
87
97
  exports.GatewayMetricsService = GatewayMetricsService;
88
98
  __decorate([
99
+ (0, broker_1.BrokerAction)(const_1.GATEWAY_METRICS_TOPIC, const_1.GW_ADMIN_ACTIONS.metricsTrack, 'event', { optional: true }),
89
100
  (0, broker_1.BrokerAction)(const_1.GATEWAY_ADMIN_TOPIC, const_1.GW_ADMIN_ACTIONS.metricsTrack, 'event'),
90
101
  __param(0, (0, broker_1.BrokerParam)('body-full')),
91
102
  __metadata("design:type", Function),
@@ -155,6 +166,8 @@ __decorate([
155
166
  ], GatewayMetricsService.prototype, "rollups", null);
156
167
  exports.GatewayMetricsService = GatewayMetricsService = GatewayMetricsService_1 = __decorate([
157
168
  (0, common_1.Injectable)(),
158
- __metadata("design:paramtypes", [http_metric_repository_1.HttpMetricRepository])
169
+ __param(1, (0, common_1.Optional)()),
170
+ __param(1, (0, common_1.Inject)(const_1.RLB_GW_ADMIN_OPTIONS)),
171
+ __metadata("design:paramtypes", [http_metric_repository_1.HttpMetricRepository, Object])
159
172
  ], GatewayMetricsService);
160
173
  //# sourceMappingURL=gateway-metrics.service.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"gateway-metrics.service.js","sourceRoot":"","sources":["../../../../libs/rlb-nestjs-amqp/src/modules/gateway-admin/services/gateway-metrics.service.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"gateway-metrics.service.js","sourceRoot":"","sources":["../../../../libs/rlb-nestjs-amqp/src/modules/gateway-admin/services/gateway-metrics.service.ts"],"names":[],"mappings":"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"}
@@ -2,15 +2,18 @@ import { OnApplicationBootstrap, OnModuleDestroy } from '@nestjs/common';
2
2
  import { GatewayAdminModuleOptions } from '../config/gateway-admin.config';
3
3
  import { HttpMetricRepository } from '../repository/http-metric.repository';
4
4
  import { RouteSyncLogRepository } from '../repository/route-sync-log.repository';
5
+ import { GatewaySchedulerLock } from '../scheduler-lock';
5
6
  export declare class GatewayRetentionService implements OnApplicationBootstrap, OnModuleDestroy {
6
7
  private readonly logs;
7
8
  private readonly metrics;
9
+ private readonly lock?;
8
10
  private readonly logger;
9
11
  private readonly windowMs;
10
12
  private readonly rollupWindowMs;
11
13
  private timer?;
12
- constructor(logs: RouteSyncLogRepository, metrics: HttpMetricRepository, options?: GatewayAdminModuleOptions);
14
+ constructor(logs: RouteSyncLogRepository, metrics: HttpMetricRepository, options?: GatewayAdminModuleOptions, lock?: GatewaySchedulerLock);
13
15
  onApplicationBootstrap(): void;
14
16
  onModuleDestroy(): void;
17
+ private acquire;
15
18
  private prune;
16
19
  }
@@ -18,13 +18,17 @@ const common_1 = require("@nestjs/common");
18
18
  const const_1 = require("../const");
19
19
  const http_metric_repository_1 = require("../repository/http-metric.repository");
20
20
  const route_sync_log_repository_1 = require("../repository/route-sync-log.repository");
21
+ const scheduler_lock_1 = require("../scheduler-lock");
21
22
  const DAY_MS = 86_400_000;
22
23
  const DEFAULT_RETENTION_DAYS = 90;
23
24
  const DEFAULT_ROLLUP_RETENTION_DAYS = 365;
25
+ const LOCK_TTL_MS = 10 * 60_000;
26
+ const BOOT_JITTER_MS = 30_000;
24
27
  let GatewayRetentionService = GatewayRetentionService_1 = class GatewayRetentionService {
25
- constructor(logs, metrics, options) {
28
+ constructor(logs, metrics, options, lock) {
26
29
  this.logs = logs;
27
30
  this.metrics = metrics;
31
+ this.lock = lock;
28
32
  this.logger = new common_1.Logger(GatewayRetentionService_1.name);
29
33
  this.windowMs = (options?.retentionDays ?? DEFAULT_RETENTION_DAYS) * DAY_MS;
30
34
  this.rollupWindowMs = (options?.rollupRetentionDays ?? DEFAULT_ROLLUP_RETENTION_DAYS) * DAY_MS;
@@ -34,7 +38,8 @@ let GatewayRetentionService = GatewayRetentionService_1 = class GatewayRetention
34
38
  this.logger.log('[retention] disabled');
35
39
  return;
36
40
  }
37
- void this.prune();
41
+ const jitter = this.lock ? 0 : Math.floor(Math.random() * BOOT_JITTER_MS);
42
+ setTimeout(() => void this.prune(), jitter).unref?.();
38
43
  this.timer = setInterval(() => void this.prune(), DAY_MS);
39
44
  this.timer.unref?.();
40
45
  }
@@ -42,7 +47,22 @@ let GatewayRetentionService = GatewayRetentionService_1 = class GatewayRetention
42
47
  if (this.timer)
43
48
  clearInterval(this.timer);
44
49
  }
50
+ async acquire(name) {
51
+ if (!this.lock)
52
+ return true;
53
+ try {
54
+ return await this.lock.tryAcquire(name, LOCK_TTL_MS);
55
+ }
56
+ catch (e) {
57
+ this.logger.warn(`[retention] scheduler lock '${name}' errored (${e?.message}); running anyway`);
58
+ return true;
59
+ }
60
+ }
45
61
  async prune() {
62
+ if (!(await this.acquire(scheduler_lock_1.GW_SCHED_LOCK_NAMES.retention))) {
63
+ this.logger.debug?.('[retention] skipped this tick: lock held by another instance');
64
+ return;
65
+ }
46
66
  const now = Date.now();
47
67
  try {
48
68
  let prunedLogs = 0, prunedPoints = 0, prunedRollups = 0;
@@ -58,6 +78,14 @@ let GatewayRetentionService = GatewayRetentionService_1 = class GatewayRetention
58
78
  catch (e) {
59
79
  this.logger.warn(`[retention] prune failed: ${e?.message}`);
60
80
  }
81
+ finally {
82
+ if (this.lock?.release) {
83
+ try {
84
+ await this.lock.release(scheduler_lock_1.GW_SCHED_LOCK_NAMES.retention);
85
+ }
86
+ catch { }
87
+ }
88
+ }
61
89
  }
62
90
  };
63
91
  exports.GatewayRetentionService = GatewayRetentionService;
@@ -65,7 +93,9 @@ exports.GatewayRetentionService = GatewayRetentionService = GatewayRetentionServ
65
93
  (0, common_1.Injectable)(),
66
94
  __param(2, (0, common_1.Optional)()),
67
95
  __param(2, (0, common_1.Inject)(const_1.RLB_GW_ADMIN_OPTIONS)),
96
+ __param(3, (0, common_1.Optional)()),
97
+ __param(3, (0, common_1.Inject)(const_1.RLB_GW_SCHED_LOCK)),
68
98
  __metadata("design:paramtypes", [route_sync_log_repository_1.RouteSyncLogRepository,
69
- http_metric_repository_1.HttpMetricRepository, Object])
99
+ http_metric_repository_1.HttpMetricRepository, Object, Object])
70
100
  ], GatewayRetentionService);
71
101
  //# sourceMappingURL=gateway-retention.service.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"gateway-retention.service.js","sourceRoot":"","sources":["../../../../libs/rlb-nestjs-amqp/src/modules/gateway-admin/services/gateway-retention.service.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,2CAA+G;AAE/G,oCAAgD;AAChD,iFAA4E;AAC5E,uFAAiF;AAEjF,MAAM,MAAM,GAAG,UAAU,CAAC;AAC1B,MAAM,sBAAsB,GAAG,EAAE,CAAC;AAClC,MAAM,6BAA6B,GAAG,GAAG,CAAC;AAQnC,IAAM,uBAAuB,+BAA7B,MAAM,uBAAuB;IAMlC,YACmB,IAA4B,EAC5B,OAA6B,EACJ,OAAmC;QAF5D,SAAI,GAAJ,IAAI,CAAwB;QAC5B,YAAO,GAAP,OAAO,CAAsB;QAP/B,WAAM,GAAG,IAAI,eAAM,CAAC,yBAAuB,CAAC,IAAI,CAAC,CAAC;QAUjE,IAAI,CAAC,QAAQ,GAAG,CAAC,OAAO,EAAE,aAAa,IAAI,sBAAsB,CAAC,GAAG,MAAM,CAAC;QAC5E,IAAI,CAAC,cAAc,GAAG,CAAC,OAAO,EAAE,mBAAmB,IAAI,6BAA6B,CAAC,GAAG,MAAM,CAAC;IACjG,CAAC;IAED,sBAAsB;QACpB,IAAI,IAAI,CAAC,QAAQ,IAAI,CAAC,IAAI,IAAI,CAAC,cAAc,IAAI,CAAC,EAAE,CAAC;YACnD,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;YACxC,OAAO;QACT,CAAC;QACD,KAAK,IAAI,CAAC,KAAK,EAAE,CAAC;QAClB,IAAI,CAAC,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC,KAAK,IAAI,CAAC,KAAK,EAAE,EAAE,MAAM,CAAC,CAAC;QAC1D,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,EAAE,CAAC;IACvB,CAAC;IAED,eAAe;QACb,IAAI,IAAI,CAAC,KAAK;YAAE,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC5C,CAAC;IAGO,KAAK,CAAC,KAAK;QACjB,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,IAAI,CAAC;YACH,IAAI,UAAU,GAAG,CAAC,EAAE,YAAY,GAAG,CAAC,EAAE,aAAa,GAAG,CAAC,CAAC;YACxD,IAAI,IAAI,CAAC,QAAQ,GAAG,CAAC,EAAE,CAAC;gBACtB,MAAM,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC;gBACnC,UAAU,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;gBAC3C,YAAY,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;YACxD,CAAC;YACD,IAAI,IAAI,CAAC,cAAc,GAAG,CAAC;gBAAE,aAAa,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,GAAG,GAAG,IAAI,CAAC,cAAc,CAAC,CAAC;YACxG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,sBAAsB,UAAU,cAAc,YAAY,eAAe,aAAa,YAAY,CAAC,CAAC;QACtH,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,6BAA8B,CAAW,EAAE,OAAO,EAAE,CAAC,CAAC;QACzE,CAAC;IACH,CAAC;CACF,CAAA;AA7CY,0DAAuB;kCAAvB,uBAAuB;IADnC,IAAA,mBAAU,GAAE;IAUR,WAAA,IAAA,iBAAQ,GAAE,CAAA;IAAE,WAAA,IAAA,eAAM,EAAC,4BAAoB,CAAC,CAAA;qCAFlB,kDAAsB;QACnB,6CAAoB;GARrC,uBAAuB,CA6CnC"}
1
+ {"version":3,"file":"gateway-retention.service.js","sourceRoot":"","sources":["../../../../libs/rlb-nestjs-amqp/src/modules/gateway-admin/services/gateway-retention.service.ts"],"names":[],"mappings":"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"}
@@ -15,6 +15,7 @@ var RouteSyncService_1;
15
15
  Object.defineProperty(exports, "__esModule", { value: true });
16
16
  exports.RouteSyncService = void 0;
17
17
  const common_1 = require("@nestjs/common");
18
+ const common_2 = require("../../../common");
18
19
  const amqp_lib_1 = require("../../../amqp-lib");
19
20
  const broker_1 = require("../../broker");
20
21
  const const_1 = require("../../broker/const");
@@ -88,12 +89,31 @@ let RouteSyncService = RouteSyncService_1 = class RouteSyncService {
88
89
  await this.journal({ service, level: 'error', event: 'invalid', message: `invalid route dropped: ${JSON.stringify(inv.route)?.slice(0, 200)}` });
89
90
  }
90
91
  for (const u of diff.upserts) {
91
- if (u.existingId)
92
- await this.paths.updateById(u.existingId, u.model);
93
- else
94
- await this.paths.insert(u.model);
92
+ let added = u.added;
93
+ try {
94
+ if (u.existingId)
95
+ await this.paths.updateById(u.existingId, u.model);
96
+ else
97
+ await this.paths.insert(u.model);
98
+ }
99
+ catch (e) {
100
+ if (!(e instanceof common_2.ConflictError))
101
+ throw e;
102
+ const clashes = await this.paths.findByRouteKey(u.routeKey);
103
+ const mine = (clashes || []).find((c) => (c.owner ?? 'manual') === service);
104
+ if (mine?._id) {
105
+ await this.paths.updateById(mine._id, u.model);
106
+ added = false;
107
+ }
108
+ else {
109
+ const conflictWith = (clashes || []).find((c) => (c.owner ?? 'manual') !== service)?.owner ?? 'manual';
110
+ this.logger.warn(`[route-sync] ${service}: insert race lost on '${u.routeKey}' (won by '${conflictWith}') → skipped`);
111
+ await this.journal({ service, level: 'warn', event: 'collision', routeKey: u.routeKey, method: u.model.method, path: u.model.path, conflictWith, message: `route '${u.routeKey}' claimed concurrently by '${conflictWith}'; skipped` });
112
+ continue;
113
+ }
114
+ }
95
115
  const rendered = u.changes?.length ? (0, route_manifest_1.renderChanges)(u.changes) : undefined;
96
- await this.journal({ service, level: 'info', event: u.added ? 'added' : 'updated', routeKey: u.routeKey, method: u.model.method, path: u.model.path, topic: u.model.topic, action: u.model.action, changes: u.changes, message: rendered });
116
+ await this.journal({ service, level: 'info', event: added ? 'added' : 'updated', routeKey: u.routeKey, method: u.model.method, path: u.model.path, topic: u.model.topic, action: u.model.action, changes: u.changes, message: rendered });
97
117
  if (rendered)
98
118
  this.logger.log(`[route-sync] ${service}: '${u.routeKey}' updated → ${rendered}`);
99
119
  }
@@ -1 +1 @@
1
- {"version":3,"file":"route-sync.service.js","sourceRoot":"","sources":["../../../../libs/rlb-nestjs-amqp/src/modules/gateway-admin/services/route-sync.service.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"route-sync.service.js","sourceRoot":"","sources":["../../../../libs/rlb-nestjs-amqp/src/modules/gateway-admin/services/route-sync.service.ts"],"names":[],"mappings":"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"}
@@ -45,6 +45,7 @@ export interface WebSocketGatewayOptions {
45
45
  heartbeatIntervalMs?: number;
46
46
  allowedOrigins?: string[];
47
47
  maxMessageBytes?: number;
48
+ maxBufferedBytes?: number;
48
49
  }
49
50
  export interface GatewayConfigLoader {
50
51
  paths?: GatewayConfigSource;
@@ -63,4 +64,10 @@ export interface GatewayConfig {
63
64
  ws?: WebSocketGatewayOptions;
64
65
  reloadTopic?: string;
65
66
  metrics?: GatewayConfigSource;
67
+ upload?: {
68
+ maxFileSizeMb?: number;
69
+ maxFiles?: number;
70
+ };
71
+ maxConcurrentRequests?: number;
72
+ maxBodyBytes?: number | string;
66
73
  }
@@ -18,11 +18,14 @@ export declare class HttpHandlerService implements OnModuleInit {
18
18
  private readonly metricsHook?;
19
19
  private server;
20
20
  private dynamicRouter;
21
+ private inFlight;
21
22
  private reloadInFlight;
22
23
  private reloadPending;
23
24
  private readonly logger;
24
25
  private readonly multer;
26
+ private readonly multipartParser;
25
27
  constructor(httpAdapterHost: HttpAdapterHost, broker: BrokerService, utils: UtilsService, httpAuthHandlerService: HttpAuthHandlerService, authRegistry: AuthProviderRegistry, appConfig: AppConfig, gatewayConfig: GatewayConfig, metricsHook?: GatewayMetricsHook);
28
+ private parseMultipart;
26
29
  onModuleInit(): Promise<void>;
27
30
  reload(): Promise<number>;
28
31
  private doReload;
@@ -31,6 +31,8 @@ const ERROR_STATUS = {
31
31
  ForbiddenError: 403,
32
32
  NotFoundError: 404,
33
33
  ConflictError: 409,
34
+ RpcTimeoutError: 504,
35
+ RetryExhaustedError: 502,
34
36
  };
35
37
  let HttpHandlerService = HttpHandlerService_1 = class HttpHandlerService {
36
38
  constructor(httpAdapterHost, broker, utils, httpAuthHandlerService, authRegistry, appConfig, gatewayConfig, metricsHook) {
@@ -43,15 +45,44 @@ let HttpHandlerService = HttpHandlerService_1 = class HttpHandlerService {
43
45
  this.gatewayConfig = gatewayConfig;
44
46
  this.metricsHook = metricsHook;
45
47
  this.dynamicRouter = null;
48
+ this.inFlight = 0;
46
49
  this.reloadInFlight = false;
47
50
  this.reloadPending = false;
48
51
  this.logger = new common_1.Logger(HttpHandlerService_1.name);
49
52
  this.multer = multer({
50
53
  storage: multer.memoryStorage(),
54
+ limits: {
55
+ fileSize: (this.gatewayConfig.upload?.maxFileSizeMb ?? 25) * 1024 * 1024,
56
+ files: this.gatewayConfig.upload?.maxFiles ?? 10,
57
+ },
51
58
  });
59
+ this.multipartParser = this.multer.any();
60
+ }
61
+ parseMultipart(req, res) {
62
+ return new Promise((resolve, reject) => this.multipartParser(req, res, (err) => (err ? reject(err) : resolve())));
52
63
  }
53
64
  async onModuleInit() {
54
65
  this.server = this.httpAdapterHost.httpAdapter.getInstance();
66
+ const maxConcurrent = this.gatewayConfig.maxConcurrentRequests;
67
+ if (maxConcurrent && maxConcurrent > 0) {
68
+ this.server.use((req, res, next) => {
69
+ if (this.inFlight >= maxConcurrent) {
70
+ res.setHeader('Retry-After', '1');
71
+ this.sendError(res, { name: 'ServiceUnavailable', message: 'Server busy' }, 503);
72
+ return;
73
+ }
74
+ this.inFlight++;
75
+ let released = false;
76
+ const release = () => { if (!released) {
77
+ released = true;
78
+ this.inFlight--;
79
+ } };
80
+ res.once('finish', release);
81
+ res.once('close', release);
82
+ next();
83
+ });
84
+ this.logger.log(`[gateway] HTTP concurrency cap enabled: ${maxConcurrent} in-flight requests`);
85
+ }
55
86
  this.server.use((req, res, next) => {
56
87
  if (this.dynamicRouter)
57
88
  return this.dynamicRouter(req, res, next);
@@ -145,17 +176,34 @@ let HttpHandlerService = HttpHandlerService_1 = class HttpHandlerService {
145
176
  this.logger.error(`Path '${path.name || path.path}' references unknown auth provider '${path.auth}'; requests will be denied (401). Check 'auth-providers'.`);
146
177
  }
147
178
  const target = router ?? (this.dynamicRouter ?? (this.dynamicRouter = (0, express_1.Router)()));
148
- target[path.method.toLowerCase()](path.path, this.multer.any(), async (req, res) => {
179
+ target[path.method.toLowerCase()](path.path, async (req, res) => {
149
180
  this.trackMetrics(req, res, path);
150
181
  const authData = await this.httpAuthHandlerService.processAuthData(req, path);
182
+ if (path.allowAnonymous !== true && path.auth && !authData?.success) {
183
+ this.sendError(res, { name: 'Unauthorized', message: 'Unauthorized' }, 401);
184
+ this.logger.warn(`[${path.mode.toUpperCase()}] [${path.method.toUpperCase()}] '${path.path}' => ${path.topic} | UNAUTHORIZED '401'`);
185
+ return;
186
+ }
187
+ try {
188
+ await this.parseMultipart(req, res);
189
+ }
190
+ catch (error) {
191
+ this.sendError(res, error, error?.name === 'MulterError' ? 413 : 400);
192
+ this.logger.warn(`[${path.mode.toUpperCase()}] [${path.method.toUpperCase()}] '${path.path}' => ${path.topic} | UPLOAD REJECTED '${error?.message}'`);
193
+ return;
194
+ }
151
195
  if (path.allowAnonymous !== true) {
152
- if (path.auth && !authData?.success) {
153
- this.sendError(res, { name: 'Unauthorized', message: 'Unauthorized' }, 401);
154
- this.logger.warn(`[${path.mode.toUpperCase()}] [${path.method.toUpperCase()}] '${path.path}' => ${path.topic} | UNAUTHORIZED '401'`);
196
+ const resourceCtx = this.httpAuthHandlerService.extractResourceContext(req);
197
+ let allowed;
198
+ try {
199
+ allowed = await this.httpAuthHandlerService.checkActions(authData, path, resourceCtx);
200
+ }
201
+ catch (error) {
202
+ this.logger.error(`[${path.mode.toUpperCase()}] [${path.method.toUpperCase()}] '${path.path}' => ${path.topic} | ACL CHECK FAILED '${error?.name}' ${error?.message}`);
203
+ this.sendError(res, { name: 'ServiceUnavailable', message: 'Authorization service unavailable' }, 503);
155
204
  return;
156
205
  }
157
- const resourceCtx = this.httpAuthHandlerService.extractResourceContext(req);
158
- if (!(await this.httpAuthHandlerService.checkActions(authData, path, resourceCtx))) {
206
+ if (!allowed) {
159
207
  this.sendError(res, { name: 'Forbidden', message: 'Forbidden' }, 403);
160
208
  this.logger.warn(`[${path.mode.toUpperCase()}] [${path.method.toUpperCase()}] '${path.path}' => ${path.topic} | FORBIDDEN '403'`);
161
209
  return;