@open-rlb/nestjs-amqp 2.0.9 → 2.0.11
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/README.md +35 -35
- package/modules/acl/{authz-match.js → auth-match.js} +1 -1
- package/modules/acl/auth-match.js.map +1 -0
- package/modules/acl/const.d.ts +3 -0
- package/modules/acl/const.js +3 -0
- package/modules/acl/const.js.map +1 -1
- package/modules/acl/index.d.ts +1 -1
- package/modules/acl/index.js +1 -1
- package/modules/acl/index.js.map +1 -1
- package/modules/acl/repository/acl-action.repository.d.ts +1 -0
- package/modules/acl/repository/acl-action.repository.js.map +1 -1
- package/modules/acl/repository/acl-grant.repository.d.ts +1 -0
- package/modules/acl/repository/acl-grant.repository.js.map +1 -1
- package/modules/acl/repository/acl-role.repository.d.ts +1 -0
- package/modules/acl/repository/acl-role.repository.js.map +1 -1
- package/modules/acl/services/acl-management.service.d.ts +3 -0
- package/modules/acl/services/acl-management.service.js +38 -2
- package/modules/acl/services/acl-management.service.js.map +1 -1
- package/modules/acl/services/acl.service.d.ts +1 -1
- package/modules/acl/services/acl.service.js +2 -2
- package/modules/acl/services/acl.service.js.map +1 -1
- package/modules/broker/decorators/broker-action.decorator.d.ts +1 -1
- package/modules/broker/decorators/broker-action.decorator.js.map +1 -1
- package/modules/gateway-admin/config/gateway-admin.config.d.ts +2 -0
- package/modules/gateway-admin/const.d.ts +7 -0
- package/modules/gateway-admin/const.js +7 -0
- package/modules/gateway-admin/const.js.map +1 -1
- package/modules/gateway-admin/gateway-admin.module.js +4 -1
- package/modules/gateway-admin/gateway-admin.module.js.map +1 -1
- package/modules/gateway-admin/health.d.ts +14 -0
- package/modules/gateway-admin/health.js +5 -0
- package/modules/gateway-admin/health.js.map +1 -0
- package/modules/gateway-admin/index.d.ts +5 -0
- package/modules/gateway-admin/index.js +5 -0
- package/modules/gateway-admin/index.js.map +1 -1
- package/modules/gateway-admin/models.d.ts +61 -0
- package/modules/gateway-admin/repository/auth-provider.repository.d.ts +1 -0
- package/modules/gateway-admin/repository/auth-provider.repository.js.map +1 -1
- package/modules/gateway-admin/repository/http-metric.repository.d.ts +6 -2
- package/modules/gateway-admin/repository/http-metric.repository.js.map +1 -1
- package/modules/gateway-admin/repository/http-path.repository.d.ts +3 -0
- package/modules/gateway-admin/repository/http-path.repository.js.map +1 -1
- package/modules/gateway-admin/repository/route-sync-log.repository.d.ts +4 -1
- package/modules/gateway-admin/repository/route-sync-log.repository.js.map +1 -1
- package/modules/gateway-admin/services/gateway-auth.service.d.ts +1 -0
- package/modules/gateway-admin/services/gateway-auth.service.js +12 -0
- package/modules/gateway-admin/services/gateway-auth.service.js.map +1 -1
- package/modules/gateway-admin/services/gateway-health.service.d.ts +10 -0
- package/modules/gateway-admin/services/gateway-health.service.js +64 -0
- package/modules/gateway-admin/services/gateway-health.service.js.map +1 -0
- package/modules/gateway-admin/services/gateway-metrics-rollup.service.d.ts +13 -0
- package/modules/gateway-admin/services/gateway-metrics-rollup.service.js +63 -0
- package/modules/gateway-admin/services/gateway-metrics-rollup.service.js.map +1 -0
- package/modules/gateway-admin/services/gateway-metrics.service.d.ts +5 -4
- package/modules/gateway-admin/services/gateway-metrics.service.js +56 -17
- package/modules/gateway-admin/services/gateway-metrics.service.js.map +1 -1
- package/modules/gateway-admin/services/gateway-path.service.d.ts +11 -4
- package/modules/gateway-admin/services/gateway-path.service.js +79 -11
- package/modules/gateway-admin/services/gateway-path.service.js.map +1 -1
- package/modules/gateway-admin/services/gateway-retention.service.d.ts +16 -0
- package/modules/gateway-admin/services/gateway-retention.service.js +71 -0
- package/modules/gateway-admin/services/gateway-retention.service.js.map +1 -0
- package/modules/gateway-admin/services/route-sync.service.js +12 -5
- package/modules/gateway-admin/services/route-sync.service.js.map +1 -1
- package/modules/gateway-admin/util/metrics.d.ts +10 -0
- package/modules/gateway-admin/util/metrics.js +170 -0
- package/modules/gateway-admin/util/metrics.js.map +1 -0
- package/modules/gateway-admin/util/route-diff.d.ts +7 -0
- package/modules/gateway-admin/util/route-diff.js +7 -2
- package/modules/gateway-admin/util/route-diff.js.map +1 -1
- package/modules/gateway-admin/util/route-manifest.d.ts +3 -0
- package/modules/gateway-admin/util/route-manifest.js +35 -0
- package/modules/gateway-admin/util/route-manifest.js.map +1 -1
- package/modules/proxy/config/path-definition.config.d.ts +2 -1
- package/modules/proxy/services/acl.service.d.ts +1 -1
- package/modules/proxy/services/http-auth-handler.service.d.ts +1 -1
- package/modules/proxy/services/http-auth-handler.service.js.map +1 -1
- package/modules/proxy/services/http-handler.service.d.ts +1 -0
- package/modules/proxy/services/http-handler.service.js +24 -32
- package/modules/proxy/services/http-handler.service.js.map +1 -1
- package/modules/proxy/services/metrics-hook.d.ts +1 -0
- package/package.json +1 -1
- package/schematics/nest-add/files/acl/src/modules/database/repository/acl.repository.ts +3 -0
- package/schematics/nest-add/files/db-core/src/modules/database/repository/in-memory-collection.ts +29 -0
- package/schematics/nest-add/files/gateway-admin/src/modules/database/repository/gateway.repository.ts +48 -20
- package/schematics/nest-add/files/gateway-admin/src/modules/database/repository/route-sync.repository.ts +24 -1
- package/schematics/nest-add/files/skills/rlb-amqp-acl/SKILL.md +6 -1
- package/schematics/nest-add/files/skills/rlb-amqp-add-route/SKILL.md +1 -1
- package/schematics/nest-add/files/skills/rlb-amqp-gateway-admin/SKILL.md +48 -8
- package/schematics/nest-add/index.js +73 -0
- package/schematics/nest-add/index.js.map +1 -1
- package/schematics/nest-add/index.ts +73 -0
- package/modules/acl/authz-match.js.map +0 -1
- /package/modules/acl/{authz-match.d.ts → auth-match.d.ts} +0 -0
|
@@ -19,14 +19,16 @@ const common_2 = require("../../../common");
|
|
|
19
19
|
const broker_1 = require("../../broker");
|
|
20
20
|
const const_1 = require("../const");
|
|
21
21
|
const http_path_repository_1 = require("../repository/http-path.repository");
|
|
22
|
+
const route_sync_log_repository_1 = require("../repository/route-sync-log.repository");
|
|
22
23
|
const path_order_1 = require("../util/path-order");
|
|
23
24
|
const route_manifest_1 = require("../util/route-manifest");
|
|
24
25
|
let GatewayPathService = GatewayPathService_1 = class GatewayPathService {
|
|
25
|
-
constructor(repo) {
|
|
26
|
+
constructor(repo, logs) {
|
|
26
27
|
this.repo = repo;
|
|
28
|
+
this.logs = logs;
|
|
27
29
|
this.logger = new common_1.Logger(GatewayPathService_1.name);
|
|
28
30
|
}
|
|
29
|
-
async create(model) {
|
|
31
|
+
async create(model, currentUser) {
|
|
30
32
|
if (!model?.name)
|
|
31
33
|
throw new common_2.BadRequestError('name is required');
|
|
32
34
|
if (!model?.method)
|
|
@@ -37,17 +39,28 @@ let GatewayPathService = GatewayPathService_1 = class GatewayPathService {
|
|
|
37
39
|
throw new common_2.BadRequestError('topic is required');
|
|
38
40
|
const routeKey = (0, route_manifest_1.routeKeyOf)(model);
|
|
39
41
|
await this.assertNoRouteConflict(routeKey);
|
|
40
|
-
|
|
42
|
+
const created = await this.repo.insert({ ...model, routeKey, source: 'user', modified: false });
|
|
43
|
+
const actor = currentUser ?? 'unknown';
|
|
44
|
+
await this.journal({ service: created.owner ?? 'manual', actor, level: 'info', event: 'created', routeKey, method: created.method, path: created.path, topic: created.topic, action: created.action });
|
|
45
|
+
this.logger.log(`[gw-path] ${actor} created '${routeKey}'`);
|
|
46
|
+
return created;
|
|
41
47
|
}
|
|
42
|
-
async update(id, model) {
|
|
48
|
+
async update(id, model, currentUser) {
|
|
43
49
|
if (!id)
|
|
44
50
|
throw new common_2.BadRequestError('id is required');
|
|
51
|
+
const existing = await this.repo.findById(id);
|
|
45
52
|
if (model?.method && model?.path) {
|
|
46
53
|
const routeKey = (0, route_manifest_1.routeKeyOf)(model);
|
|
47
54
|
await this.assertNoRouteConflict(routeKey, id);
|
|
48
55
|
model = { ...model, routeKey };
|
|
49
56
|
}
|
|
50
|
-
|
|
57
|
+
const changes = existing ? (0, route_manifest_1.diffRouteFields)(existing, { ...existing, ...model }) : [];
|
|
58
|
+
const updated = await this.repo.updateById(id, { ...model, modified: true });
|
|
59
|
+
const actor = currentUser ?? 'unknown';
|
|
60
|
+
const rendered = (0, route_manifest_1.renderChanges)(changes);
|
|
61
|
+
await this.journal({ service: updated?.owner ?? existing?.owner ?? 'manual', actor, level: 'info', event: 'updated', routeKey: updated?.routeKey ?? existing?.routeKey, method: updated?.method ?? existing?.method, path: updated?.path ?? existing?.path, changes, message: rendered });
|
|
62
|
+
this.logger.log(`[gw-path] ${actor} updated '${updated?.routeKey ?? existing?.routeKey}'${rendered ? ` → ${rendered}` : ''}`);
|
|
63
|
+
return updated;
|
|
51
64
|
}
|
|
52
65
|
async assertNoRouteConflict(routeKey, excludeId) {
|
|
53
66
|
const clashes = await this.repo.findByRouteKey(routeKey);
|
|
@@ -56,8 +69,12 @@ let GatewayPathService = GatewayPathService_1 = class GatewayPathService {
|
|
|
56
69
|
throw new common_2.ConflictError(`A route '${routeKey}' already exists (owner '${conflict.owner ?? 'manual'}', id ${conflict._id}).`);
|
|
57
70
|
}
|
|
58
71
|
}
|
|
59
|
-
async remove(id) {
|
|
60
|
-
|
|
72
|
+
async remove(id, currentUser) {
|
|
73
|
+
const removed = await this.repo.removeById(id);
|
|
74
|
+
const actor = currentUser ?? 'unknown';
|
|
75
|
+
await this.journal({ service: removed?.owner ?? 'manual', actor, level: 'info', event: 'deleted', routeKey: removed?.routeKey, method: removed?.method, path: removed?.path });
|
|
76
|
+
this.logger.log(`[gw-path] ${actor} deleted '${removed?.routeKey ?? id}'`);
|
|
77
|
+
return removed;
|
|
61
78
|
}
|
|
62
79
|
async get(id) {
|
|
63
80
|
return this.repo.findById(id);
|
|
@@ -65,32 +82,52 @@ let GatewayPathService = GatewayPathService_1 = class GatewayPathService {
|
|
|
65
82
|
async list(page, limit) {
|
|
66
83
|
return this.repo.filterPaginated({}, Number(page) || 1, Number(limit) || 10);
|
|
67
84
|
}
|
|
85
|
+
async searchRoutes(q, page, limit) {
|
|
86
|
+
return this.repo.search(q, Number(page) || 1, Number(limit) || 10);
|
|
87
|
+
}
|
|
68
88
|
async export() {
|
|
69
89
|
const paths = await this.repo.listEnabled();
|
|
70
90
|
return (0, path_order_1.orderPaths)(paths);
|
|
71
91
|
}
|
|
92
|
+
async logList(limit) {
|
|
93
|
+
return this.logs.list(Number(limit) || 100);
|
|
94
|
+
}
|
|
95
|
+
async logSearch(actor, service, event, routeKey, from, to, page, limit) {
|
|
96
|
+
return this.logs.query({ actor, service, event, routeKey, from: from != null ? Number(from) : undefined, to: to != null ? Number(to) : undefined }, Number(page) || 1, Number(limit) || 20);
|
|
97
|
+
}
|
|
98
|
+
async journal(entry) {
|
|
99
|
+
try {
|
|
100
|
+
await this.logs.insert({ ts: Date.now(), ...entry });
|
|
101
|
+
}
|
|
102
|
+
catch (e) {
|
|
103
|
+
this.logger.warn(`[gw-path] journal write failed: ${e?.message}`);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
72
106
|
};
|
|
73
107
|
exports.GatewayPathService = GatewayPathService;
|
|
74
108
|
__decorate([
|
|
75
109
|
(0, broker_1.BrokerAction)(const_1.GATEWAY_ADMIN_TOPIC, const_1.GW_ADMIN_ACTIONS.pathCreate, 'rpc'),
|
|
76
110
|
__param(0, (0, broker_1.BrokerParam)('body-full')),
|
|
111
|
+
__param(1, (0, broker_1.BrokerParam)('header', 'X-GTW-AUTH-USERID')),
|
|
77
112
|
__metadata("design:type", Function),
|
|
78
|
-
__metadata("design:paramtypes", [Object]),
|
|
113
|
+
__metadata("design:paramtypes", [Object, String]),
|
|
79
114
|
__metadata("design:returntype", Promise)
|
|
80
115
|
], GatewayPathService.prototype, "create", null);
|
|
81
116
|
__decorate([
|
|
82
117
|
(0, broker_1.BrokerAction)(const_1.GATEWAY_ADMIN_TOPIC, const_1.GW_ADMIN_ACTIONS.pathUpdate, 'rpc'),
|
|
83
118
|
__param(0, (0, broker_1.BrokerParam)('body', 'id')),
|
|
84
119
|
__param(1, (0, broker_1.BrokerParam)('body-full')),
|
|
120
|
+
__param(2, (0, broker_1.BrokerParam)('header', 'X-GTW-AUTH-USERID')),
|
|
85
121
|
__metadata("design:type", Function),
|
|
86
|
-
__metadata("design:paramtypes", [String, Object]),
|
|
122
|
+
__metadata("design:paramtypes", [String, Object, String]),
|
|
87
123
|
__metadata("design:returntype", Promise)
|
|
88
124
|
], GatewayPathService.prototype, "update", null);
|
|
89
125
|
__decorate([
|
|
90
126
|
(0, broker_1.BrokerAction)(const_1.GATEWAY_ADMIN_TOPIC, const_1.GW_ADMIN_ACTIONS.pathDelete, 'rpc'),
|
|
91
127
|
__param(0, (0, broker_1.BrokerParam)('body', 'id')),
|
|
128
|
+
__param(1, (0, broker_1.BrokerParam)('header', 'X-GTW-AUTH-USERID')),
|
|
92
129
|
__metadata("design:type", Function),
|
|
93
|
-
__metadata("design:paramtypes", [String]),
|
|
130
|
+
__metadata("design:paramtypes", [String, String]),
|
|
94
131
|
__metadata("design:returntype", Promise)
|
|
95
132
|
], GatewayPathService.prototype, "remove", null);
|
|
96
133
|
__decorate([
|
|
@@ -108,14 +145,45 @@ __decorate([
|
|
|
108
145
|
__metadata("design:paramtypes", [Number, Number]),
|
|
109
146
|
__metadata("design:returntype", Promise)
|
|
110
147
|
], GatewayPathService.prototype, "list", null);
|
|
148
|
+
__decorate([
|
|
149
|
+
(0, broker_1.BrokerAction)(const_1.GATEWAY_ADMIN_TOPIC, const_1.GW_ADMIN_ACTIONS.pathSearch, 'rpc'),
|
|
150
|
+
__param(0, (0, broker_1.BrokerParam)('body', 'q')),
|
|
151
|
+
__param(1, (0, broker_1.BrokerParam)('body', 'page')),
|
|
152
|
+
__param(2, (0, broker_1.BrokerParam)('body', 'limit')),
|
|
153
|
+
__metadata("design:type", Function),
|
|
154
|
+
__metadata("design:paramtypes", [String, Number, Number]),
|
|
155
|
+
__metadata("design:returntype", Promise)
|
|
156
|
+
], GatewayPathService.prototype, "searchRoutes", null);
|
|
111
157
|
__decorate([
|
|
112
158
|
(0, broker_1.BrokerAction)(const_1.GATEWAY_ADMIN_TOPIC, const_1.GW_ADMIN_ACTIONS.pathExport, 'rpc'),
|
|
113
159
|
__metadata("design:type", Function),
|
|
114
160
|
__metadata("design:paramtypes", []),
|
|
115
161
|
__metadata("design:returntype", Promise)
|
|
116
162
|
], GatewayPathService.prototype, "export", null);
|
|
163
|
+
__decorate([
|
|
164
|
+
(0, broker_1.BrokerAction)(const_1.GATEWAY_ADMIN_TOPIC, const_1.GW_ADMIN_ACTIONS.routeLogList, 'rpc'),
|
|
165
|
+
__param(0, (0, broker_1.BrokerParam)('body', 'limit')),
|
|
166
|
+
__metadata("design:type", Function),
|
|
167
|
+
__metadata("design:paramtypes", [Number]),
|
|
168
|
+
__metadata("design:returntype", Promise)
|
|
169
|
+
], GatewayPathService.prototype, "logList", null);
|
|
170
|
+
__decorate([
|
|
171
|
+
(0, broker_1.BrokerAction)(const_1.GATEWAY_ADMIN_TOPIC, const_1.GW_ADMIN_ACTIONS.routeLogSearch, 'rpc'),
|
|
172
|
+
__param(0, (0, broker_1.BrokerParam)('body', 'actor')),
|
|
173
|
+
__param(1, (0, broker_1.BrokerParam)('body', 'service')),
|
|
174
|
+
__param(2, (0, broker_1.BrokerParam)('body', 'event')),
|
|
175
|
+
__param(3, (0, broker_1.BrokerParam)('body', 'routeKey')),
|
|
176
|
+
__param(4, (0, broker_1.BrokerParam)('body', 'from')),
|
|
177
|
+
__param(5, (0, broker_1.BrokerParam)('body', 'to')),
|
|
178
|
+
__param(6, (0, broker_1.BrokerParam)('body', 'page')),
|
|
179
|
+
__param(7, (0, broker_1.BrokerParam)('body', 'limit')),
|
|
180
|
+
__metadata("design:type", Function),
|
|
181
|
+
__metadata("design:paramtypes", [String, String, String, String, Number, Number, Number, Number]),
|
|
182
|
+
__metadata("design:returntype", Promise)
|
|
183
|
+
], GatewayPathService.prototype, "logSearch", null);
|
|
117
184
|
exports.GatewayPathService = GatewayPathService = GatewayPathService_1 = __decorate([
|
|
118
185
|
(0, common_1.Injectable)(),
|
|
119
|
-
__metadata("design:paramtypes", [http_path_repository_1.HttpPathRepository
|
|
186
|
+
__metadata("design:paramtypes", [http_path_repository_1.HttpPathRepository,
|
|
187
|
+
route_sync_log_repository_1.RouteSyncLogRepository])
|
|
120
188
|
], GatewayPathService);
|
|
121
189
|
//# sourceMappingURL=gateway-path.service.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gateway-path.service.js","sourceRoot":"","sources":["../../../../libs/rlb-nestjs-amqp/src/modules/gateway-admin/services/gateway-path.service.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,2CAAoD;AACpD,4CAAkF;AAClF,yCAAyD;AAEzD,oCAAiE;
|
|
1
|
+
{"version":3,"file":"gateway-path.service.js","sourceRoot":"","sources":["../../../../libs/rlb-nestjs-amqp/src/modules/gateway-admin/services/gateway-path.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { OnApplicationBootstrap, OnModuleDestroy } from '@nestjs/common';
|
|
2
|
+
import { GatewayAdminModuleOptions } from '../config/gateway-admin.config';
|
|
3
|
+
import { HttpMetricRepository } from '../repository/http-metric.repository';
|
|
4
|
+
import { RouteSyncLogRepository } from '../repository/route-sync-log.repository';
|
|
5
|
+
export declare class GatewayRetentionService implements OnApplicationBootstrap, OnModuleDestroy {
|
|
6
|
+
private readonly logs;
|
|
7
|
+
private readonly metrics;
|
|
8
|
+
private readonly logger;
|
|
9
|
+
private readonly windowMs;
|
|
10
|
+
private readonly rollupWindowMs;
|
|
11
|
+
private timer?;
|
|
12
|
+
constructor(logs: RouteSyncLogRepository, metrics: HttpMetricRepository, options?: GatewayAdminModuleOptions);
|
|
13
|
+
onApplicationBootstrap(): void;
|
|
14
|
+
onModuleDestroy(): void;
|
|
15
|
+
private prune;
|
|
16
|
+
}
|
|
@@ -0,0 +1,71 @@
|
|
|
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 GatewayRetentionService_1;
|
|
15
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
16
|
+
exports.GatewayRetentionService = void 0;
|
|
17
|
+
const common_1 = require("@nestjs/common");
|
|
18
|
+
const const_1 = require("../const");
|
|
19
|
+
const http_metric_repository_1 = require("../repository/http-metric.repository");
|
|
20
|
+
const route_sync_log_repository_1 = require("../repository/route-sync-log.repository");
|
|
21
|
+
const DAY_MS = 86_400_000;
|
|
22
|
+
const DEFAULT_RETENTION_DAYS = 90;
|
|
23
|
+
const DEFAULT_ROLLUP_RETENTION_DAYS = 365;
|
|
24
|
+
let GatewayRetentionService = GatewayRetentionService_1 = class GatewayRetentionService {
|
|
25
|
+
constructor(logs, metrics, options) {
|
|
26
|
+
this.logs = logs;
|
|
27
|
+
this.metrics = metrics;
|
|
28
|
+
this.logger = new common_1.Logger(GatewayRetentionService_1.name);
|
|
29
|
+
this.windowMs = (options?.retentionDays ?? DEFAULT_RETENTION_DAYS) * DAY_MS;
|
|
30
|
+
this.rollupWindowMs = (options?.rollupRetentionDays ?? DEFAULT_ROLLUP_RETENTION_DAYS) * DAY_MS;
|
|
31
|
+
}
|
|
32
|
+
onApplicationBootstrap() {
|
|
33
|
+
if (this.windowMs <= 0 && this.rollupWindowMs <= 0) {
|
|
34
|
+
this.logger.log('[retention] disabled');
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
void this.prune();
|
|
38
|
+
this.timer = setInterval(() => void this.prune(), DAY_MS);
|
|
39
|
+
this.timer.unref?.();
|
|
40
|
+
}
|
|
41
|
+
onModuleDestroy() {
|
|
42
|
+
if (this.timer)
|
|
43
|
+
clearInterval(this.timer);
|
|
44
|
+
}
|
|
45
|
+
async prune() {
|
|
46
|
+
const now = Date.now();
|
|
47
|
+
try {
|
|
48
|
+
let prunedLogs = 0, prunedPoints = 0, prunedRollups = 0;
|
|
49
|
+
if (this.windowMs > 0) {
|
|
50
|
+
const cutoff = now - this.windowMs;
|
|
51
|
+
prunedLogs = await this.logs.prune(cutoff);
|
|
52
|
+
prunedPoints = await this.metrics.prunePoints(cutoff);
|
|
53
|
+
}
|
|
54
|
+
if (this.rollupWindowMs > 0)
|
|
55
|
+
prunedRollups = await this.metrics.pruneRollups(now - this.rollupWindowMs);
|
|
56
|
+
this.logger.log(`[retention] pruned ${prunedLogs} journal + ${prunedPoints} point(s) + ${prunedRollups} rollup(s)`);
|
|
57
|
+
}
|
|
58
|
+
catch (e) {
|
|
59
|
+
this.logger.warn(`[retention] prune failed: ${e?.message}`);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
};
|
|
63
|
+
exports.GatewayRetentionService = GatewayRetentionService;
|
|
64
|
+
exports.GatewayRetentionService = GatewayRetentionService = GatewayRetentionService_1 = __decorate([
|
|
65
|
+
(0, common_1.Injectable)(),
|
|
66
|
+
__param(2, (0, common_1.Optional)()),
|
|
67
|
+
__param(2, (0, common_1.Inject)(const_1.RLB_GW_ADMIN_OPTIONS)),
|
|
68
|
+
__metadata("design:paramtypes", [route_sync_log_repository_1.RouteSyncLogRepository,
|
|
69
|
+
http_metric_repository_1.HttpMetricRepository, Object])
|
|
70
|
+
], GatewayRetentionService);
|
|
71
|
+
//# sourceMappingURL=gateway-retention.service.js.map
|
|
@@ -0,0 +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"}
|
|
@@ -88,19 +88,26 @@ let RouteSyncService = RouteSyncService_1 = class RouteSyncService {
|
|
|
88
88
|
await this.paths.updateById(u.existingId, u.model);
|
|
89
89
|
else
|
|
90
90
|
await this.paths.insert(u.model);
|
|
91
|
-
|
|
91
|
+
const rendered = u.changes?.length ? (0, route_manifest_1.renderChanges)(u.changes) : undefined;
|
|
92
|
+
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 });
|
|
93
|
+
if (rendered)
|
|
94
|
+
this.logger.log(`[route-sync] ${service}: '${u.routeKey}' updated → ${rendered}`);
|
|
92
95
|
}
|
|
93
96
|
for (const d of diff.disables) {
|
|
94
97
|
await this.paths.updateById(d.id, { enabled: false });
|
|
95
98
|
await this.journal({ service, level: 'info', event: 'removed', routeKey: d.routeKey, method: d.method, path: d.path });
|
|
96
99
|
}
|
|
100
|
+
for (const s of diff.skipped) {
|
|
101
|
+
this.logger.log(`[route-sync] ${service}: '${s.routeKey}' is user-modified → manifest update skipped (user version kept)`);
|
|
102
|
+
await this.journal({ service, level: 'info', event: 'skipped', routeKey: s.routeKey, method: s.method, path: s.path, message: 'route user-modified; manifest update skipped' });
|
|
103
|
+
}
|
|
97
104
|
if (diff.changed) {
|
|
98
105
|
await this.triggerReload();
|
|
99
|
-
await this.journal({ service, level: 'info', event: 'reload', message: `${diff.upserts.length} upserted, ${diff.disables.length} removed, ${diff.collisions.length} collision(s)` });
|
|
100
|
-
this.logger.log(`[route-sync] ${service}: ${diff.upserts.length} upserted, ${diff.disables.length} removed, ${diff.collisions.length} collision(s) → reload`);
|
|
106
|
+
await this.journal({ service, level: 'info', event: 'reload', message: `${diff.upserts.length} upserted, ${diff.disables.length} removed, ${diff.skipped.length} user-modified skipped, ${diff.collisions.length} collision(s)` });
|
|
107
|
+
this.logger.log(`[route-sync] ${service}: ${diff.upserts.length} upserted, ${diff.disables.length} removed, ${diff.skipped.length} user-modified skipped, ${diff.collisions.length} collision(s) → reload`);
|
|
101
108
|
}
|
|
102
109
|
else {
|
|
103
|
-
this.logger.log(`[route-sync] ${service}: no route changes (${diff.collisions.length} collision(s))`);
|
|
110
|
+
this.logger.log(`[route-sync] ${service}: no route changes (${diff.skipped.length} user-modified skipped, ${diff.collisions.length} collision(s))`);
|
|
104
111
|
}
|
|
105
112
|
}
|
|
106
113
|
catch (e) {
|
|
@@ -109,7 +116,7 @@ let RouteSyncService = RouteSyncService_1 = class RouteSyncService {
|
|
|
109
116
|
}
|
|
110
117
|
async journal(entry) {
|
|
111
118
|
try {
|
|
112
|
-
await this.logs.insert({ ts: Date.now(), ...entry });
|
|
119
|
+
await this.logs.insert({ ts: Date.now(), actor: 'system', ...entry });
|
|
113
120
|
}
|
|
114
121
|
catch (e) {
|
|
115
122
|
this.logger.warn(`[route-sync] journal write failed: ${e?.message}`);
|
|
@@ -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":";;;;;;;;;;;;;;;;AAAA,2CAA8F;AAC9F,gDAAmD;AACnD,yCAA4D;AAC5D,8CAA4H;AAG5H,oCAAgD;AAEhD,6EAAwE;AACxE,uFAAiF;AACjF,mDAAgD;AAChD,
|
|
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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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { HttpMetric, HttpMetricPoint, HttpMetricRollup, MetricSeriesBucket, MetricSeriesQuery, MetricStatusClass, MetricSummary } from '../models';
|
|
2
|
+
export declare function statusClass(status?: number): MetricStatusClass | undefined;
|
|
3
|
+
export declare function percentile(sortedAsc: number[], p: number): number | undefined;
|
|
4
|
+
export declare function buildSeries(points: HttpMetricPoint[], query: MetricSeriesQuery): MetricSeriesBucket[];
|
|
5
|
+
export declare function buildSummary(points: HttpMetricPoint[], topN?: number): MetricSummary;
|
|
6
|
+
export declare function aggregateRollups(points: HttpMetricPoint[], granularityMs: number): HttpMetricRollup[];
|
|
7
|
+
export declare function toPrometheus(counters: (HttpMetric & {
|
|
8
|
+
avgDurationMs: number;
|
|
9
|
+
errorRate?: number;
|
|
10
|
+
})[]): string;
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.statusClass = statusClass;
|
|
4
|
+
exports.percentile = percentile;
|
|
5
|
+
exports.buildSeries = buildSeries;
|
|
6
|
+
exports.buildSummary = buildSummary;
|
|
7
|
+
exports.aggregateRollups = aggregateRollups;
|
|
8
|
+
exports.toPrometheus = toPrometheus;
|
|
9
|
+
function statusClass(status) {
|
|
10
|
+
if (status == null)
|
|
11
|
+
return undefined;
|
|
12
|
+
if (status >= 500)
|
|
13
|
+
return '5xx';
|
|
14
|
+
if (status >= 400)
|
|
15
|
+
return '4xx';
|
|
16
|
+
if (status >= 300)
|
|
17
|
+
return '3xx';
|
|
18
|
+
if (status >= 200)
|
|
19
|
+
return '2xx';
|
|
20
|
+
return undefined;
|
|
21
|
+
}
|
|
22
|
+
function percentile(sortedAsc, p) {
|
|
23
|
+
if (!sortedAsc.length)
|
|
24
|
+
return undefined;
|
|
25
|
+
const rank = Math.ceil((p / 100) * sortedAsc.length);
|
|
26
|
+
const idx = Math.min(sortedAsc.length - 1, Math.max(0, rank - 1));
|
|
27
|
+
return sortedAsc[idx];
|
|
28
|
+
}
|
|
29
|
+
function emptyStatusClasses() {
|
|
30
|
+
return { '2xx': 0, '3xx': 0, '4xx': 0, '5xx': 0 };
|
|
31
|
+
}
|
|
32
|
+
function buildSeries(points, query) {
|
|
33
|
+
const width = query.bucketMs > 0 ? query.bucketMs : 60_000;
|
|
34
|
+
const buckets = new Map();
|
|
35
|
+
for (const p of points || []) {
|
|
36
|
+
const start = Math.floor(p.ts / width) * width;
|
|
37
|
+
let b = buckets.get(start);
|
|
38
|
+
if (!b) {
|
|
39
|
+
b = { durations: [], count: 0, errorCount: 0, total: 0, byStatus: emptyStatusClasses() };
|
|
40
|
+
buckets.set(start, b);
|
|
41
|
+
}
|
|
42
|
+
b.count++;
|
|
43
|
+
if ((p.status ?? 0) >= 400)
|
|
44
|
+
b.errorCount++;
|
|
45
|
+
const d = p.durationMs ?? 0;
|
|
46
|
+
b.total += d;
|
|
47
|
+
b.durations.push(d);
|
|
48
|
+
b.min = b.min == null ? d : Math.min(b.min, d);
|
|
49
|
+
b.max = b.max == null ? d : Math.max(b.max, d);
|
|
50
|
+
const sc = statusClass(p.status);
|
|
51
|
+
if (sc)
|
|
52
|
+
b.byStatus[sc]++;
|
|
53
|
+
}
|
|
54
|
+
return [...buckets.entries()].sort((a, b) => a[0] - b[0]).map(([bucketStart, b]) => {
|
|
55
|
+
const sorted = b.durations.sort((x, y) => x - y);
|
|
56
|
+
return {
|
|
57
|
+
bucketStart,
|
|
58
|
+
count: b.count,
|
|
59
|
+
errorCount: b.errorCount,
|
|
60
|
+
totalDurationMs: b.total,
|
|
61
|
+
avgDurationMs: b.count ? Math.round(b.total / b.count) : 0,
|
|
62
|
+
minDurationMs: b.min,
|
|
63
|
+
maxDurationMs: b.max,
|
|
64
|
+
p50: percentile(sorted, 50),
|
|
65
|
+
p95: percentile(sorted, 95),
|
|
66
|
+
p99: percentile(sorted, 99),
|
|
67
|
+
byStatus: b.byStatus,
|
|
68
|
+
};
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
function buildSummary(points, topN = 10) {
|
|
72
|
+
const byStatus = emptyStatusClasses();
|
|
73
|
+
const durations = [];
|
|
74
|
+
let total = 0;
|
|
75
|
+
let errors = 0;
|
|
76
|
+
const per = new Map();
|
|
77
|
+
for (const p of points || []) {
|
|
78
|
+
const d = p.durationMs ?? 0;
|
|
79
|
+
durations.push(d);
|
|
80
|
+
total += d;
|
|
81
|
+
const isError = (p.status ?? 0) >= 400;
|
|
82
|
+
if (isError)
|
|
83
|
+
errors++;
|
|
84
|
+
const sc = statusClass(p.status);
|
|
85
|
+
if (sc)
|
|
86
|
+
byStatus[sc]++;
|
|
87
|
+
const key = `${p.method} ${p.route}`;
|
|
88
|
+
let e = per.get(key);
|
|
89
|
+
if (!e) {
|
|
90
|
+
e = { method: p.method, route: p.route, name: p.name, count: 0, errorCount: 0, total: 0, durations: [] };
|
|
91
|
+
per.set(key, e);
|
|
92
|
+
}
|
|
93
|
+
e.count++;
|
|
94
|
+
e.total += d;
|
|
95
|
+
e.durations.push(d);
|
|
96
|
+
if (isError)
|
|
97
|
+
e.errorCount++;
|
|
98
|
+
}
|
|
99
|
+
const n = points?.length || 0;
|
|
100
|
+
const sortedAll = durations.sort((a, b) => a - b);
|
|
101
|
+
const entries = [...per.values()].map((e) => {
|
|
102
|
+
const sorted = e.durations.sort((a, b) => a - b);
|
|
103
|
+
return {
|
|
104
|
+
method: e.method, route: e.route, name: e.name,
|
|
105
|
+
count: e.count, errorCount: e.errorCount,
|
|
106
|
+
errorRate: e.count ? e.errorCount / e.count : 0,
|
|
107
|
+
avgDurationMs: e.count ? Math.round(e.total / e.count) : 0,
|
|
108
|
+
p95: percentile(sorted, 95),
|
|
109
|
+
};
|
|
110
|
+
});
|
|
111
|
+
const top = (cmp) => [...entries].sort(cmp).slice(0, topN);
|
|
112
|
+
return {
|
|
113
|
+
totalRequests: n,
|
|
114
|
+
totalErrors: errors,
|
|
115
|
+
errorRate: n ? errors / n : 0,
|
|
116
|
+
avgDurationMs: n ? Math.round(total / n) : 0,
|
|
117
|
+
p50: percentile(sortedAll, 50),
|
|
118
|
+
p95: percentile(sortedAll, 95),
|
|
119
|
+
p99: percentile(sortedAll, 99),
|
|
120
|
+
byStatus,
|
|
121
|
+
topByTraffic: top((a, b) => b.count - a.count),
|
|
122
|
+
topByErrors: top((a, b) => (b.errorCount - a.errorCount) || (b.errorRate - a.errorRate)),
|
|
123
|
+
topByLatency: top((a, b) => (b.p95 ?? 0) - (a.p95 ?? 0)),
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
function aggregateRollups(points, granularityMs) {
|
|
127
|
+
const g = granularityMs > 0 ? granularityMs : 3_600_000;
|
|
128
|
+
const rollups = new Map();
|
|
129
|
+
for (const p of points || []) {
|
|
130
|
+
const bucketStart = Math.floor(p.ts / g) * g;
|
|
131
|
+
const key = `${bucketStart}|${p.method}|${p.route}`;
|
|
132
|
+
let r = rollups.get(key);
|
|
133
|
+
if (!r) {
|
|
134
|
+
r = { bucketStart, granularityMs: g, method: p.method, route: p.route, name: p.name, count: 0, errorCount: 0, totalDurationMs: 0, byStatus: emptyStatusClasses() };
|
|
135
|
+
rollups.set(key, r);
|
|
136
|
+
}
|
|
137
|
+
r.count++;
|
|
138
|
+
if ((p.status ?? 0) >= 400)
|
|
139
|
+
r.errorCount++;
|
|
140
|
+
const d = p.durationMs ?? 0;
|
|
141
|
+
r.totalDurationMs += d;
|
|
142
|
+
r.minDurationMs = r.minDurationMs == null ? d : Math.min(r.minDurationMs, d);
|
|
143
|
+
r.maxDurationMs = r.maxDurationMs == null ? d : Math.max(r.maxDurationMs, d);
|
|
144
|
+
const sc = statusClass(p.status);
|
|
145
|
+
if (sc && r.byStatus)
|
|
146
|
+
r.byStatus[sc]++;
|
|
147
|
+
}
|
|
148
|
+
return [...rollups.values()];
|
|
149
|
+
}
|
|
150
|
+
function escapeLabel(value) {
|
|
151
|
+
return String(value ?? '').replace(/\\/g, '\\\\').replace(/"/g, '\\"').replace(/\n/g, ' ');
|
|
152
|
+
}
|
|
153
|
+
function toPrometheus(counters) {
|
|
154
|
+
const labels = (m) => `method="${escapeLabel(m.method)}",route="${escapeLabel(m.route)}"${m.name ? `,name="${escapeLabel(m.name)}"` : ''}`;
|
|
155
|
+
const lines = [];
|
|
156
|
+
lines.push('# HELP gateway_requests_total Total HTTP requests handled by the gateway.');
|
|
157
|
+
lines.push('# TYPE gateway_requests_total counter');
|
|
158
|
+
for (const m of counters || [])
|
|
159
|
+
lines.push(`gateway_requests_total{${labels(m)}} ${m.count}`);
|
|
160
|
+
lines.push('# HELP gateway_request_errors_total Error responses (status >= 400).');
|
|
161
|
+
lines.push('# TYPE gateway_request_errors_total counter');
|
|
162
|
+
for (const m of counters || [])
|
|
163
|
+
lines.push(`gateway_request_errors_total{${labels(m)}} ${m.errorCount}`);
|
|
164
|
+
lines.push('# HELP gateway_request_duration_ms_sum Total request duration in milliseconds.');
|
|
165
|
+
lines.push('# TYPE gateway_request_duration_ms_sum counter');
|
|
166
|
+
for (const m of counters || [])
|
|
167
|
+
lines.push(`gateway_request_duration_ms_sum{${labels(m)}} ${m.totalDurationMs}`);
|
|
168
|
+
return lines.join('\n') + '\n';
|
|
169
|
+
}
|
|
170
|
+
//# sourceMappingURL=metrics.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"metrics.js","sourceRoot":"","sources":["../../../../libs/rlb-nestjs-amqp/src/modules/gateway-admin/util/metrics.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { PathDefinition } from '../../proxy/config/path-definition.config';
|
|
2
|
+
import { RouteFieldChange } from '../models';
|
|
2
3
|
import { StoredHttpPath } from '../repository/http-path.repository';
|
|
3
4
|
export interface RouteDiff {
|
|
4
5
|
upserts: {
|
|
@@ -6,6 +7,7 @@ export interface RouteDiff {
|
|
|
6
7
|
existingId?: string;
|
|
7
8
|
added: boolean;
|
|
8
9
|
model: StoredHttpPath;
|
|
10
|
+
changes?: RouteFieldChange[];
|
|
9
11
|
}[];
|
|
10
12
|
disables: {
|
|
11
13
|
id: string;
|
|
@@ -19,6 +21,11 @@ export interface RouteDiff {
|
|
|
19
21
|
path?: string;
|
|
20
22
|
conflictWith: string;
|
|
21
23
|
}[];
|
|
24
|
+
skipped: {
|
|
25
|
+
routeKey: string;
|
|
26
|
+
method?: string;
|
|
27
|
+
path?: string;
|
|
28
|
+
}[];
|
|
22
29
|
invalid: {
|
|
23
30
|
route: any;
|
|
24
31
|
}[];
|
|
@@ -3,7 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.diffRoutes = diffRoutes;
|
|
4
4
|
const route_manifest_1 = require("./route-manifest");
|
|
5
5
|
function diffRoutes(service, incoming, existing, reserved) {
|
|
6
|
-
const diff = { upserts: [], disables: [], collisions: [], invalid: [], changed: false };
|
|
6
|
+
const diff = { upserts: [], disables: [], collisions: [], skipped: [], invalid: [], changed: false };
|
|
7
7
|
const existingByKey = new Map();
|
|
8
8
|
for (const e of existing || [])
|
|
9
9
|
if (e.routeKey)
|
|
@@ -24,13 +24,18 @@ function diffRoutes(service, incoming, existing, reserved) {
|
|
|
24
24
|
continue;
|
|
25
25
|
}
|
|
26
26
|
const ex = existingByKey.get(key);
|
|
27
|
+
if (ex && ex.modified === true) {
|
|
28
|
+
diff.skipped.push({ routeKey: key, method: r.method, path: r.path });
|
|
29
|
+
continue;
|
|
30
|
+
}
|
|
27
31
|
if (ex && ex.enabled !== false && (0, route_manifest_1.routeContent)(ex) === (0, route_manifest_1.routeContent)(r))
|
|
28
32
|
continue;
|
|
29
33
|
diff.upserts.push({
|
|
30
34
|
routeKey: key,
|
|
31
35
|
existingId: ex?._id,
|
|
32
36
|
added: !ex,
|
|
33
|
-
model: { ...r, owner: service, routeKey: key, enabled: true },
|
|
37
|
+
model: { ...r, owner: service, routeKey: key, enabled: true, source: 'microservice', modified: false },
|
|
38
|
+
changes: ex ? (0, route_manifest_1.diffRouteFields)(ex, r) : undefined,
|
|
34
39
|
});
|
|
35
40
|
}
|
|
36
41
|
for (const [key, ex] of existingByKey) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"route-diff.js","sourceRoot":"","sources":["../../../../libs/rlb-nestjs-amqp/src/modules/gateway-admin/util/route-diff.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"route-diff.js","sourceRoot":"","sources":["../../../../libs/rlb-nestjs-amqp/src/modules/gateway-admin/util/route-diff.ts"],"names":[],"mappings":"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"}
|