@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.
- package/amqp-lib/amqp/connection.d.ts +5 -0
- package/amqp-lib/amqp/connection.js +78 -21
- package/amqp-lib/amqp/connection.js.map +1 -1
- package/amqp-lib/amqp/retry-policy.d.ts +25 -0
- package/amqp-lib/amqp/retry-policy.js +101 -0
- package/amqp-lib/amqp/retry-policy.js.map +1 -0
- package/amqp-lib/config/rabbitmq.config.d.ts +2 -0
- package/amqp-lib/index.d.ts +1 -0
- package/amqp-lib/index.js +1 -0
- package/amqp-lib/index.js.map +1 -1
- package/amqp-lib/models/errors.model.d.ts +4 -0
- package/amqp-lib/models/errors.model.js +9 -1
- package/amqp-lib/models/errors.model.js.map +1 -1
- package/amqp-lib/models/rabbitmq-handler.model.d.ts +2 -0
- package/modules/acl/acl.module.js +3 -1
- package/modules/acl/acl.module.js.map +1 -1
- package/modules/acl/cache/acl-cache.service.d.ts +5 -1
- package/modules/acl/cache/acl-cache.service.js +23 -3
- package/modules/acl/cache/acl-cache.service.js.map +1 -1
- package/modules/acl/config/acl.config.d.ts +8 -0
- package/modules/acl/const.d.ts +2 -0
- package/modules/acl/const.js +3 -1
- package/modules/acl/const.js.map +1 -1
- package/modules/acl/index.d.ts +1 -0
- package/modules/acl/index.js +1 -0
- package/modules/acl/index.js.map +1 -1
- package/modules/acl/services/acl-invalidation.service.d.ts +18 -0
- package/modules/acl/services/acl-invalidation.service.js +81 -0
- package/modules/acl/services/acl-invalidation.service.js.map +1 -0
- package/modules/acl/services/acl-management.service.d.ts +7 -1
- package/modules/acl/services/acl-management.service.js +31 -15
- package/modules/acl/services/acl-management.service.js.map +1 -1
- package/modules/acl/services/acl.service.d.ts +9 -1
- package/modules/acl/services/acl.service.js +42 -12
- package/modules/acl/services/acl.service.js.map +1 -1
- package/modules/broker/broker.module.d.ts +2 -0
- package/modules/broker/broker.module.js +23 -2
- package/modules/broker/broker.module.js.map +1 -1
- package/modules/broker/config/topics.config.d.ts +2 -0
- package/modules/broker/decorators/broker-action.decorator.d.ts +3 -1
- package/modules/broker/decorators/broker-action.decorator.js +2 -1
- package/modules/broker/decorators/broker-action.decorator.js.map +1 -1
- package/modules/broker/services/broker.service.js +39 -16
- package/modules/broker/services/broker.service.js.map +1 -1
- package/modules/broker/services/metadata-scanner.service.js +45 -32
- package/modules/broker/services/metadata-scanner.service.js.map +1 -1
- package/modules/gateway-admin/config/gateway-admin.config.d.ts +1 -0
- package/modules/gateway-admin/const.d.ts +2 -0
- package/modules/gateway-admin/const.js +3 -1
- package/modules/gateway-admin/const.js.map +1 -1
- package/modules/gateway-admin/index.d.ts +1 -0
- package/modules/gateway-admin/index.js +1 -0
- package/modules/gateway-admin/index.js.map +1 -1
- package/modules/gateway-admin/repository/http-path.repository.js.map +1 -1
- package/modules/gateway-admin/scheduler-lock.d.ts +8 -0
- package/modules/gateway-admin/scheduler-lock.js +8 -0
- package/modules/gateway-admin/scheduler-lock.js.map +1 -0
- package/modules/gateway-admin/services/gateway-metrics-rollup.service.d.ts +8 -1
- package/modules/gateway-admin/services/gateway-metrics-rollup.service.js +59 -4
- package/modules/gateway-admin/services/gateway-metrics-rollup.service.js.map +1 -1
- package/modules/gateway-admin/services/gateway-metrics.service.d.ts +4 -1
- package/modules/gateway-admin/services/gateway-metrics.service.js +19 -6
- package/modules/gateway-admin/services/gateway-metrics.service.js.map +1 -1
- package/modules/gateway-admin/services/gateway-retention.service.d.ts +4 -1
- package/modules/gateway-admin/services/gateway-retention.service.js +33 -3
- package/modules/gateway-admin/services/gateway-retention.service.js.map +1 -1
- package/modules/gateway-admin/services/route-sync.service.js +25 -5
- package/modules/gateway-admin/services/route-sync.service.js.map +1 -1
- package/modules/proxy/config/path-definition.config.d.ts +7 -0
- package/modules/proxy/services/http-handler.service.d.ts +3 -0
- package/modules/proxy/services/http-handler.service.js +54 -6
- package/modules/proxy/services/http-handler.service.js.map +1 -1
- package/modules/proxy/services/websocket.service.js +28 -2
- package/modules/proxy/services/websocket.service.js.map +1 -1
- package/package.json +1 -1
- package/schematics/nest-add/files/skills/rlb-amqp/references/config-schema.md +20 -3
- package/schematics/nest-add/files/skills/rlb-amqp/references/gotchas.md +19 -3
- package/schematics/nest-add/files/skills/rlb-amqp-acl/SKILL.md +35 -10
- 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
|
-
|
|
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
|
-
|
|
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,
|
|
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
|
-
|
|
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.
|
|
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.
|
|
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
|
-
|
|
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":";;;;;;;;;;;;;;;;AAAA,
|
|
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
|
-
|
|
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,
|
|
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
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
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:
|
|
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,
|
|
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
|
-
|
|
153
|
-
|
|
154
|
-
|
|
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
|
-
|
|
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;
|