@open-rlb/nestjs-amqp 2.0.2 → 2.0.3

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 (112) hide show
  1. package/README.md +6 -8
  2. package/common/errors.d.ts +2 -0
  3. package/common/errors.js +4 -1
  4. package/common/errors.js.map +1 -1
  5. package/index.d.ts +0 -1
  6. package/index.js +0 -1
  7. package/index.js.map +1 -1
  8. package/modules/acl/cache/acl-cache.service.d.ts +2 -2
  9. package/modules/acl/cache/acl-cache.service.js +6 -6
  10. package/modules/acl/cache/acl-cache.service.js.map +1 -1
  11. package/modules/acl/config/acl.config.d.ts +0 -1
  12. package/modules/acl/const.d.ts +5 -0
  13. package/modules/acl/const.js +5 -0
  14. package/modules/acl/const.js.map +1 -1
  15. package/modules/acl/models.d.ts +9 -0
  16. package/modules/acl/repository/acl-action.repository.d.ts +10 -0
  17. package/modules/acl/repository/acl-action.repository.js.map +1 -1
  18. package/modules/acl/repository/acl-grant.repository.d.ts +4 -0
  19. package/modules/acl/repository/acl-grant.repository.js.map +1 -1
  20. package/modules/acl/repository/acl-role.repository.d.ts +10 -0
  21. package/modules/acl/repository/acl-role.repository.js.map +1 -1
  22. package/modules/acl/services/acl-management.service.d.ts +4 -1
  23. package/modules/acl/services/acl-management.service.js +50 -6
  24. package/modules/acl/services/acl-management.service.js.map +1 -1
  25. package/modules/acl/services/acl.service.d.ts +12 -3
  26. package/modules/acl/services/acl.service.js +129 -11
  27. package/modules/acl/services/acl.service.js.map +1 -1
  28. package/modules/broker/broker.module.d.ts +4 -1
  29. package/modules/broker/broker.module.js +17 -1
  30. package/modules/broker/broker.module.js.map +1 -1
  31. package/modules/broker/config/decorator-paths.d.ts +1 -0
  32. package/modules/broker/config/decorator-paths.js +35 -0
  33. package/modules/broker/config/decorator-paths.js.map +1 -0
  34. package/modules/broker/config/handler-auth.config.d.ts +2 -2
  35. package/modules/broker/config/route-discovery.config.d.ts +8 -0
  36. package/modules/broker/config/route-discovery.config.js +3 -0
  37. package/modules/broker/config/route-discovery.config.js.map +1 -0
  38. package/modules/broker/const.d.ts +3 -0
  39. package/modules/broker/const.js +4 -1
  40. package/modules/broker/const.js.map +1 -1
  41. package/modules/broker/decorators/broker-action.decorator.d.ts +15 -2
  42. package/modules/broker/decorators/broker-action.decorator.js +4 -4
  43. package/modules/broker/decorators/broker-action.decorator.js.map +1 -1
  44. package/modules/broker/index.d.ts +3 -0
  45. package/modules/broker/index.js +3 -0
  46. package/modules/broker/index.js.map +1 -1
  47. package/modules/broker/services/metadata-scanner.service.d.ts +1 -0
  48. package/modules/broker/services/metadata-scanner.service.js +28 -4
  49. package/modules/broker/services/metadata-scanner.service.js.map +1 -1
  50. package/modules/broker/services/route-discovery-publisher.service.d.ts +13 -0
  51. package/modules/broker/services/route-discovery-publisher.service.js +64 -0
  52. package/modules/broker/services/route-discovery-publisher.service.js.map +1 -0
  53. package/modules/gateway-admin/const.d.ts +2 -0
  54. package/modules/gateway-admin/const.js +2 -0
  55. package/modules/gateway-admin/const.js.map +1 -1
  56. package/modules/gateway-admin/gateway-admin.module.js +2 -1
  57. package/modules/gateway-admin/gateway-admin.module.js.map +1 -1
  58. package/modules/gateway-admin/index.d.ts +4 -0
  59. package/modules/gateway-admin/index.js +4 -0
  60. package/modules/gateway-admin/index.js.map +1 -1
  61. package/modules/gateway-admin/models.d.ts +49 -0
  62. package/modules/gateway-admin/repository/http-metric.repository.d.ts +4 -1
  63. package/modules/gateway-admin/repository/http-metric.repository.js.map +1 -1
  64. package/modules/gateway-admin/repository/http-path.repository.d.ts +5 -0
  65. package/modules/gateway-admin/repository/http-path.repository.js +6 -0
  66. package/modules/gateway-admin/repository/http-path.repository.js.map +1 -1
  67. package/modules/gateway-admin/repository/route-sync-log.repository.d.ts +5 -0
  68. package/modules/gateway-admin/repository/route-sync-log.repository.js +7 -0
  69. package/modules/gateway-admin/repository/route-sync-log.repository.js.map +1 -0
  70. package/modules/gateway-admin/services/gateway-metrics.service.d.ts +3 -1
  71. package/modules/gateway-admin/services/gateway-metrics.service.js +53 -0
  72. package/modules/gateway-admin/services/gateway-metrics.service.js.map +1 -1
  73. package/modules/gateway-admin/services/gateway-path.service.d.ts +1 -0
  74. package/modules/gateway-admin/services/gateway-path.service.js +16 -1
  75. package/modules/gateway-admin/services/gateway-path.service.js.map +1 -1
  76. package/modules/gateway-admin/services/route-sync.service.d.ts +19 -0
  77. package/modules/gateway-admin/services/route-sync.service.js +137 -0
  78. package/modules/gateway-admin/services/route-sync.service.js.map +1 -0
  79. package/modules/gateway-admin/util/route-diff.d.ts +27 -0
  80. package/modules/gateway-admin/util/route-diff.js +44 -0
  81. package/modules/gateway-admin/util/route-diff.js.map +1 -0
  82. package/modules/gateway-admin/util/route-manifest.d.ts +7 -0
  83. package/modules/gateway-admin/util/route-manifest.js +34 -0
  84. package/modules/gateway-admin/util/route-manifest.js.map +1 -0
  85. package/modules/proxy/index.d.ts +1 -0
  86. package/modules/proxy/index.js +1 -0
  87. package/modules/proxy/index.js.map +1 -1
  88. package/modules/proxy/services/acl.service.d.ts +2 -1
  89. package/modules/proxy/services/http-auth-handler.service.d.ts +1 -1
  90. package/modules/proxy/services/http-auth-handler.service.js +29 -34
  91. package/modules/proxy/services/http-auth-handler.service.js.map +1 -1
  92. package/modules/proxy/services/http-handler.service.d.ts +3 -1
  93. package/modules/proxy/services/http-handler.service.js +49 -18
  94. package/modules/proxy/services/http-handler.service.js.map +1 -1
  95. package/modules/proxy/services/metrics-hook.d.ts +15 -0
  96. package/modules/proxy/services/metrics-hook.js +5 -0
  97. package/modules/proxy/services/metrics-hook.js.map +1 -0
  98. package/modules/proxy/services/websocket.service.js +4 -1
  99. package/modules/proxy/services/websocket.service.js.map +1 -1
  100. package/package.json +1 -1
  101. package/schematics/nest-add/files/skills/rlb-amqp/references/config-schema.md +4 -3
  102. package/schematics/nest-add/files/skills/rlb-amqp/references/gotchas.md +14 -5
  103. package/schematics/nest-add/files/skills/rlb-amqp-add-route/SKILL.md +5 -2
  104. package/modules/remote-config/index.d.ts +0 -2
  105. package/modules/remote-config/index.js +0 -19
  106. package/modules/remote-config/index.js.map +0 -1
  107. package/modules/remote-config/remote-config.module.d.ts +0 -2
  108. package/modules/remote-config/remote-config.module.js +0 -22
  109. package/modules/remote-config/remote-config.module.js.map +0 -1
  110. package/modules/remote-config/remote-config.service.d.ts +0 -12
  111. package/modules/remote-config/remote-config.service.js +0 -68
  112. package/modules/remote-config/remote-config.service.js.map +0 -1
@@ -0,0 +1,137 @@
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 RouteSyncService_1;
15
+ Object.defineProperty(exports, "__esModule", { value: true });
16
+ exports.RouteSyncService = void 0;
17
+ const common_1 = require("@nestjs/common");
18
+ const amqp_lib_1 = require("../../../amqp-lib");
19
+ const broker_1 = require("../../broker");
20
+ const const_1 = require("../../broker/const");
21
+ const http_path_repository_1 = require("../repository/http-path.repository");
22
+ const route_sync_log_repository_1 = require("../repository/route-sync-log.repository");
23
+ const route_diff_1 = require("../util/route-diff");
24
+ const route_manifest_1 = require("../util/route-manifest");
25
+ let RouteSyncService = RouteSyncService_1 = class RouteSyncService {
26
+ constructor(amqp, broker, paths, logs, gatewayConfig) {
27
+ this.amqp = amqp;
28
+ this.broker = broker;
29
+ this.paths = paths;
30
+ this.logs = logs;
31
+ this.gatewayConfig = gatewayConfig;
32
+ this.logger = new common_1.Logger(RouteSyncService_1.name);
33
+ }
34
+ async onApplicationBootstrap() {
35
+ try {
36
+ await this.amqp.channel.assertExchange(const_1.ROUTE_DISCOVERY_EXCHANGE, 'fanout', { durable: true });
37
+ await this.amqp.createSubscriber(async (msg) => { await this.handle(msg); }, {
38
+ queue: const_1.ROUTE_SYNC_QUEUE,
39
+ exchange: const_1.ROUTE_DISCOVERY_EXCHANGE,
40
+ routingKey: '',
41
+ createQueueIfNotExists: true,
42
+ queueOptions: { durable: true, exclusive: false, autoDelete: false },
43
+ }, const_1.ROUTE_SYNC_QUEUE);
44
+ this.logger.log(`[route-sync] listening on '${const_1.ROUTE_SYNC_QUEUE}' (exchange '${const_1.ROUTE_DISCOVERY_EXCHANGE}', competing consumers)`);
45
+ }
46
+ catch (e) {
47
+ this.logger.error(`[route-sync] subscribe failed: ${e?.message}`);
48
+ }
49
+ }
50
+ async handle(manifest) {
51
+ try {
52
+ const service = manifest?.service;
53
+ if (!service) {
54
+ this.logger.warn('[route-sync] manifest without `service`; ignored');
55
+ return;
56
+ }
57
+ const routes = Array.isArray(manifest.routes) ? manifest.routes : [];
58
+ const existing = await this.paths.findByOwner(service);
59
+ if (routes.length === 0 && existing.length > 0) {
60
+ this.logger.warn(`[route-sync] ${service}: manifest is EMPTY but ${existing.length} route(s) exist for this service → all will be soft-disabled. Verify the publisher is not mis-firing.`);
61
+ }
62
+ const reserved = new Map();
63
+ for (const p of this.gatewayConfig?.paths || [])
64
+ reserved.set((0, route_manifest_1.routeKeyOf)(p), 'yaml');
65
+ for (const r of routes) {
66
+ const key = (0, route_manifest_1.routeKeyOf)(r);
67
+ if (reserved.has(key))
68
+ continue;
69
+ const clashes = await this.paths.findByRouteKey(key);
70
+ const other = (clashes || []).find((c) => (c.owner ?? 'manual') !== service);
71
+ if (other)
72
+ reserved.set(key, other.owner ?? 'manual');
73
+ }
74
+ const diff = (0, route_diff_1.diffRoutes)(service, routes, existing, reserved);
75
+ for (const c of diff.collisions) {
76
+ this.logger.warn(`[route-sync] ${service}: collision on '${c.routeKey}' (owned by '${c.conflictWith}') → skipped`);
77
+ await this.journal({ service, level: 'warn', event: 'collision', routeKey: c.routeKey, method: c.method, path: c.path, conflictWith: c.conflictWith, message: `route '${c.routeKey}' already owned by '${c.conflictWith}'; skipped` });
78
+ }
79
+ for (const inv of diff.invalid) {
80
+ await this.journal({ service, level: 'error', event: 'invalid', message: `invalid route dropped: ${JSON.stringify(inv.route)?.slice(0, 200)}` });
81
+ }
82
+ for (const u of diff.upserts) {
83
+ if (u.existingId)
84
+ await this.paths.updateById(u.existingId, u.model);
85
+ else
86
+ await this.paths.insert(u.model);
87
+ 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 });
88
+ }
89
+ for (const d of diff.disables) {
90
+ await this.paths.updateById(d.id, { enabled: false });
91
+ await this.journal({ service, level: 'info', event: 'removed', routeKey: d.routeKey, method: d.method, path: d.path });
92
+ }
93
+ if (diff.changed) {
94
+ await this.triggerReload();
95
+ await this.journal({ service, level: 'info', event: 'reload', message: `${diff.upserts.length} upserted, ${diff.disables.length} removed, ${diff.collisions.length} collision(s)` });
96
+ this.logger.log(`[route-sync] ${service}: ${diff.upserts.length} upserted, ${diff.disables.length} removed, ${diff.collisions.length} collision(s) → reload`);
97
+ }
98
+ else {
99
+ this.logger.log(`[route-sync] ${service}: no route changes (${diff.collisions.length} collision(s))`);
100
+ }
101
+ }
102
+ catch (e) {
103
+ this.logger.error(`[route-sync] handle failed: ${e?.message}`);
104
+ }
105
+ }
106
+ async journal(entry) {
107
+ try {
108
+ await this.logs.insert({ ts: Date.now(), ...entry });
109
+ }
110
+ catch (e) {
111
+ this.logger.warn(`[route-sync] journal write failed: ${e?.message}`);
112
+ }
113
+ }
114
+ async triggerReload() {
115
+ const topic = this.gatewayConfig?.reloadTopic;
116
+ if (!topic) {
117
+ this.logger.warn('[route-sync] no gateway.reloadTopic configured; routes persisted but instances will not auto-reload.');
118
+ return;
119
+ }
120
+ try {
121
+ await this.broker.publishMessage(topic, 'route-sync', {});
122
+ }
123
+ catch (e) {
124
+ this.logger.error(`[route-sync] reload broadcast failed: ${e?.message}`);
125
+ }
126
+ }
127
+ };
128
+ exports.RouteSyncService = RouteSyncService;
129
+ exports.RouteSyncService = RouteSyncService = RouteSyncService_1 = __decorate([
130
+ (0, common_1.Injectable)(),
131
+ __param(4, (0, common_1.Inject)(const_1.RLB_AMQP_GATEWAY_OPTIONS)),
132
+ __metadata("design:paramtypes", [amqp_lib_1.AmqpConnection,
133
+ broker_1.BrokerService,
134
+ http_path_repository_1.HttpPathRepository,
135
+ route_sync_log_repository_1.RouteSyncLogRepository, Object])
136
+ ], RouteSyncService);
137
+ //# sourceMappingURL=route-sync.service.js.map
@@ -0,0 +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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"}
@@ -0,0 +1,27 @@
1
+ import { PathDefinition } from '../../proxy/config/path-definition.config';
2
+ import { StoredHttpPath } from '../repository/http-path.repository';
3
+ export interface RouteDiff {
4
+ upserts: {
5
+ routeKey: string;
6
+ existingId?: string;
7
+ added: boolean;
8
+ model: StoredHttpPath;
9
+ }[];
10
+ disables: {
11
+ id: string;
12
+ routeKey: string;
13
+ method?: string;
14
+ path?: string;
15
+ }[];
16
+ collisions: {
17
+ routeKey: string;
18
+ method?: string;
19
+ path?: string;
20
+ conflictWith: string;
21
+ }[];
22
+ invalid: {
23
+ route: any;
24
+ }[];
25
+ changed: boolean;
26
+ }
27
+ export declare function diffRoutes(service: string, incoming: PathDefinition[], existing: StoredHttpPath[], reserved: Map<string, string>): RouteDiff;
@@ -0,0 +1,44 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.diffRoutes = diffRoutes;
4
+ const route_manifest_1 = require("./route-manifest");
5
+ function diffRoutes(service, incoming, existing, reserved) {
6
+ const diff = { upserts: [], disables: [], collisions: [], invalid: [], changed: false };
7
+ const existingByKey = new Map();
8
+ for (const e of existing || [])
9
+ if (e.routeKey)
10
+ existingByKey.set(e.routeKey, e);
11
+ const seen = new Set();
12
+ for (const r of incoming || []) {
13
+ if (!(0, route_manifest_1.isValidRoute)(r)) {
14
+ diff.invalid.push({ route: r });
15
+ continue;
16
+ }
17
+ const key = (0, route_manifest_1.routeKeyOf)(r);
18
+ if (seen.has(key))
19
+ continue;
20
+ seen.add(key);
21
+ const owner = reserved.get(key);
22
+ if (owner && owner !== service) {
23
+ diff.collisions.push({ routeKey: key, method: r.method, path: r.path, conflictWith: owner });
24
+ continue;
25
+ }
26
+ const ex = existingByKey.get(key);
27
+ if (ex && ex.enabled !== false && (0, route_manifest_1.routeContent)(ex) === (0, route_manifest_1.routeContent)(r))
28
+ continue;
29
+ diff.upserts.push({
30
+ routeKey: key,
31
+ existingId: ex?._id,
32
+ added: !ex,
33
+ model: { ...r, owner: service, routeKey: key, enabled: true },
34
+ });
35
+ }
36
+ for (const [key, ex] of existingByKey) {
37
+ if (!seen.has(key) && ex.enabled !== false) {
38
+ diff.disables.push({ id: ex._id, routeKey: key, method: ex.method, path: ex.path });
39
+ }
40
+ }
41
+ diff.changed = diff.upserts.length > 0 || diff.disables.length > 0;
42
+ return diff;
43
+ }
44
+ //# sourceMappingURL=route-diff.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"route-diff.js","sourceRoot":"","sources":["../../../../libs/rlb-nestjs-amqp/src/modules/gateway-admin/util/route-diff.ts"],"names":[],"mappings":";;AAwBA,gCAyCC;AA/DD,qDAA0E;AAsB1E,SAAgB,UAAU,CACxB,OAAe,EACf,QAA0B,EAC1B,QAA0B,EAC1B,QAA6B;IAE7B,MAAM,IAAI,GAAc,EAAE,OAAO,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;IACnG,MAAM,aAAa,GAAG,IAAI,GAAG,EAA0B,CAAC;IACxD,KAAK,MAAM,CAAC,IAAI,QAAQ,IAAI,EAAE;QAAE,IAAI,CAAC,CAAC,QAAQ;YAAE,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;IACjF,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAE/B,KAAK,MAAM,CAAC,IAAI,QAAQ,IAAI,EAAE,EAAE,CAAC;QAC/B,IAAI,CAAC,IAAA,6BAAY,EAAC,CAAC,CAAC,EAAE,CAAC;YAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;YAAC,SAAS;QAAC,CAAC;QACpE,MAAM,GAAG,GAAG,IAAA,2BAAU,EAAC,CAAC,CAAC,CAAC;QAC1B,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;YAAE,SAAS;QAC5B,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAEd,MAAM,KAAK,GAAG,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAChC,IAAI,KAAK,IAAI,KAAK,KAAK,OAAO,EAAE,CAAC;YAC/B,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,CAAC,CAAC;YAC7F,SAAS;QACX,CAAC;QAED,MAAM,EAAE,GAAG,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAClC,IAAI,EAAE,IAAI,EAAE,CAAC,OAAO,KAAK,KAAK,IAAI,IAAA,6BAAY,EAAC,EAAE,CAAC,KAAK,IAAA,6BAAY,EAAC,CAAC,CAAC;YAAE,SAAS;QACjF,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC;YAChB,QAAQ,EAAE,GAAG;YACb,UAAU,EAAE,EAAE,EAAE,GAAG;YACnB,KAAK,EAAE,CAAC,EAAE;YACV,KAAK,EAAE,EAAE,GAAG,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE;SAC9D,CAAC,CAAC;IACL,CAAC;IAED,KAAK,MAAM,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,aAAa,EAAE,CAAC;QACtC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,OAAO,KAAK,KAAK,EAAE,CAAC;YAC3C,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,GAAI,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC;QACvF,CAAC;IACH,CAAC;IAED,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC;IACnE,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -0,0 +1,7 @@
1
+ export declare function routeKeyOf(r: {
2
+ method?: string;
3
+ path?: string;
4
+ }): string;
5
+ export declare function stableStringify(value: any): string;
6
+ export declare function routeContent(r: any): string;
7
+ export declare function isValidRoute(r: any): boolean;
@@ -0,0 +1,34 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.routeKeyOf = routeKeyOf;
4
+ exports.stableStringify = stableStringify;
5
+ exports.routeContent = routeContent;
6
+ exports.isValidRoute = isValidRoute;
7
+ function routeKeyOf(r) {
8
+ return `${(r.method || '').toUpperCase()} ${r.path || ''}`;
9
+ }
10
+ function canonicalRoute(r) {
11
+ return {
12
+ name: r.name, method: r.method, path: r.path, dataSource: r.dataSource,
13
+ topic: r.topic, action: r.action, mode: r.mode, auth: r.auth ?? null,
14
+ allowAnonymous: r.allowAnonymous ?? null, roles: r.roles ?? [],
15
+ successStatusCode: r.successStatusCode ?? null, timeout: r.timeout ?? null,
16
+ parseRaw: r.parseRaw ?? null, binary: r.binary ?? null, redirect: r.redirect ?? null,
17
+ headers: r.headers ?? {}, forwardHeaders: r.forwardHeaders ?? {},
18
+ };
19
+ }
20
+ function stableStringify(value) {
21
+ if (value === null || typeof value !== 'object')
22
+ return JSON.stringify(value) ?? 'null';
23
+ if (Array.isArray(value))
24
+ return `[${value.map(stableStringify).join(',')}]`;
25
+ const keys = Object.keys(value).sort();
26
+ return `{${keys.map((k) => `${JSON.stringify(k)}:${stableStringify(value[k])}`).join(',')}}`;
27
+ }
28
+ function routeContent(r) {
29
+ return stableStringify(canonicalRoute(r));
30
+ }
31
+ function isValidRoute(r) {
32
+ return !!(r && r.method && r.path && r.topic && r.action && (r.mode === 'rpc' || r.mode === 'event'));
33
+ }
34
+ //# sourceMappingURL=route-manifest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"route-manifest.js","sourceRoot":"","sources":["../../../../libs/rlb-nestjs-amqp/src/modules/gateway-admin/util/route-manifest.ts"],"names":[],"mappings":";;AACA,gCAEC;AAoBD,0CAKC;AAOD,oCAEC;AAID,oCAEC;AA1CD,SAAgB,UAAU,CAAC,CAAqC;IAC9D,OAAO,GAAG,CAAC,CAAC,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC,IAAI,IAAI,EAAE,EAAE,CAAC;AAC7D,CAAC;AAGD,SAAS,cAAc,CAAC,CAAM;IAC5B,OAAO;QACL,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC,UAAU;QACtE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,IAAI,IAAI;QACpE,cAAc,EAAE,CAAC,CAAC,cAAc,IAAI,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,IAAI,EAAE;QAC9D,iBAAiB,EAAE,CAAC,CAAC,iBAAiB,IAAI,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,IAAI,IAAI;QAC1E,QAAQ,EAAE,CAAC,CAAC,QAAQ,IAAI,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,IAAI,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC,QAAQ,IAAI,IAAI;QACpF,OAAO,EAAE,CAAC,CAAC,OAAO,IAAI,EAAE,EAAE,cAAc,EAAE,CAAC,CAAC,cAAc,IAAI,EAAE;KACjE,CAAC;AACJ,CAAC;AAQD,SAAgB,eAAe,CAAC,KAAU;IACxC,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,MAAM,CAAC;IACxF,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,IAAI,KAAK,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;IAC7E,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC;IACvC,OAAO,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,eAAe,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;AAC/F,CAAC;AAOD,SAAgB,YAAY,CAAC,CAAM;IACjC,OAAO,eAAe,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC;AAC5C,CAAC;AAID,SAAgB,YAAY,CAAC,CAAM;IACjC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC,IAAI,KAAK,KAAK,IAAI,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC;AACxG,CAAC"}
@@ -1,6 +1,7 @@
1
1
  export * from './config/path-definition.config';
2
2
  export * from './proxy.module';
3
3
  export * from './services/acl.service';
4
+ export * from './services/metrics-hook';
4
5
  export interface ProcessedAuthData {
5
6
  [key: string]: any;
6
7
  success: boolean;
@@ -17,4 +17,5 @@ Object.defineProperty(exports, "__esModule", { value: true });
17
17
  __exportStar(require("./config/path-definition.config"), exports);
18
18
  __exportStar(require("./proxy.module"), exports);
19
19
  __exportStar(require("./services/acl.service"), exports);
20
+ __exportStar(require("./services/metrics-hook"), exports);
20
21
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../libs/rlb-nestjs-amqp/src/modules/proxy/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,kEAAgD;AAChD,iDAA+B;AAC/B,yDAAuC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../libs/rlb-nestjs-amqp/src/modules/proxy/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,kEAAgD;AAChD,iDAA+B;AAC/B,yDAAuC;AACvC,0DAAwC"}
@@ -1,4 +1,5 @@
1
1
  export declare const RLB_GTW_ACL_ROLE_SERVICE = "RLB_GTW_ACL_ROLE_SERVICE";
2
2
  export interface IAclRoleService {
3
- canUserDo(topic: string, action: string, userId: string): Promise<boolean>;
3
+ canUserDoGtw(roles: string | string[], userId: string): Promise<boolean>;
4
+ canUserDo(roles: string | string[], userId: string, resourceId?: string): Promise<boolean>;
4
5
  }
@@ -17,7 +17,7 @@ export declare class HttpAuthHandlerService {
17
17
  checkJwt(req: Request, authConfig: HandlerAuthConfig): Promise<ProcessedAuthData>;
18
18
  checkRolesForClaims(authConfig: HandlerAuthConfig, claims: {
19
19
  [key: string]: any;
20
- }): Promise<boolean>;
20
+ }, roles?: string | string[]): Promise<boolean>;
21
21
  checkBasicAuth(req: Request, authConfig: HandlerAuthConfig): Promise<ProcessedAuthData>;
22
22
  checkStringCompare(req: Request, authConfig: HandlerAuthConfig): Promise<ProcessedAuthData>;
23
23
  checkRoles(data: {
@@ -30,8 +30,10 @@ let HttpAuthHandlerService = HttpAuthHandlerService_1 = class HttpAuthHandlerSer
30
30
  if (!path?.auth)
31
31
  return out;
32
32
  const authConfig = this.authProviders.find(o => o.name === path.auth);
33
- if (!authConfig)
34
- throw new Error(`Auth provider ${path.auth} not found`);
33
+ if (!authConfig) {
34
+ this.logger.error(`Auth provider '${path.auth}' referenced by path '${path.name || path.path}' is not configured; denying request (401).`);
35
+ return out;
36
+ }
35
37
  switch (authConfig.type) {
36
38
  case 'basic':
37
39
  out = await this.checkBasicAuth(req, authConfig);
@@ -68,7 +70,7 @@ let HttpAuthHandlerService = HttpAuthHandlerService_1 = class HttpAuthHandlerSer
68
70
  if (!decoded)
69
71
  return { success: false };
70
72
  if (!authConfig.jwtMap) {
71
- return { ...decoded, success: true };
73
+ return { success: true };
72
74
  }
73
75
  const out = { success: true };
74
76
  authConfig.jwtMap.map(o => o.split(':')).forEach(([source, dest]) => {
@@ -82,21 +84,28 @@ let HttpAuthHandlerService = HttpAuthHandlerService_1 = class HttpAuthHandlerSer
82
84
  const decoded = await this.verifyToken(authConfig, jwt);
83
85
  return this.mapClaims(authConfig, decoded);
84
86
  }
85
- async checkRolesForClaims(authConfig, claims) {
86
- if (authConfig.type !== 'jwt' && authConfig.type !== 'jwks')
87
- throw new Error(`Auth provider ${authConfig.name} is not a JWT or JWKS provider`);
88
- if (!authConfig.aclTopic)
89
- throw new Error(`Auth provider ${authConfig.name} has no ACL topic defined`);
90
- if (!authConfig.aclAction)
91
- throw new Error(`Auth provider ${authConfig.name} has no ACL action defined`);
92
- if (!this.aclRoleService)
93
- throw new Error(`ACL Role Service not found. Please check AppModule.`);
87
+ async checkRolesForClaims(authConfig, claims, roles) {
88
+ const list = Array.isArray(roles) ? roles : (roles ? [roles] : []);
89
+ if (!list.length)
90
+ return true;
91
+ if (authConfig.type !== 'jwt' && authConfig.type !== 'jwks') {
92
+ this.logger.error(`Auth provider '${authConfig.name}' is not a JWT/JWKS provider; cannot run role checks → denying.`);
93
+ return false;
94
+ }
95
+ if (!authConfig.uidClaim) {
96
+ this.logger.error(`Auth provider '${authConfig.name}' has no 'uidClaim' configured; cannot identify the user → denying. Set uidClaim (e.g. USERID).`);
97
+ return false;
98
+ }
99
+ if (!this.aclRoleService) {
100
+ this.logger.error(`ACL Role Service not found (RLB_GTW_ACL_ROLE_SERVICE not registered) but a path requires roles → denying.`);
101
+ return false;
102
+ }
94
103
  if (!claims)
95
104
  return false;
96
105
  const userId = claims[`${authConfig.headerPrefix}${authConfig.uidClaim}`];
97
106
  if (!userId)
98
107
  return false;
99
- return this.aclRoleService.canUserDo(authConfig.aclTopic, authConfig.aclAction, userId);
108
+ return this.aclRoleService.canUserDoGtw(list, userId);
100
109
  }
101
110
  async checkBasicAuth(req, authConfig) {
102
111
  let out = { success: false };
@@ -140,30 +149,16 @@ let HttpAuthHandlerService = HttpAuthHandlerService_1 = class HttpAuthHandlerSer
140
149
  return out;
141
150
  }
142
151
  async checkRoles(data, path) {
143
- if (!path?.auth)
152
+ if (!path?.roles?.length)
144
153
  return true;
145
- if (!path?.roles)
146
- return true;
147
- const authConfig = this.authProviders.find(o => o.name === path.auth);
148
- if (!authConfig)
149
- throw new Error(`Auth provider ${path.auth} not found`);
150
- if (authConfig.type !== 'jwt' && authConfig.type !== 'jwks')
151
- throw new Error(`Auth provider ${path.auth} is not a JWT or JWKS provider`);
152
- if (!authConfig.usernameClaim)
153
- throw new Error(`Auth provider ${path.auth} has no username claim defined`);
154
- if (!authConfig.aclTopic)
155
- throw new Error(`Auth provider ${path.auth} has no ACL topic defined`);
156
- if (!authConfig.aclAction)
157
- throw new Error(`Auth provider ${path.auth} has no ACL action defined`);
158
- if (!this.aclRoleService)
159
- throw new Error(`ACL Role Service not found. Please check AppModule.`);
160
- if (!data)
154
+ if (!path?.auth)
161
155
  return false;
162
- const userId = data[`${authConfig.headerPrefix}${authConfig.uidClaim}`];
163
- if (!userId)
156
+ const authConfig = this.authProviders.find(o => o.name === path.auth);
157
+ if (!authConfig) {
158
+ this.logger.error(`Path '${path.name || path.path}' references unknown auth provider '${path.auth}' → denying role check.`);
164
159
  return false;
165
- const canUserDo = await this.aclRoleService.canUserDo(authConfig.aclTopic, authConfig.aclAction, userId);
166
- return canUserDo;
160
+ }
161
+ return this.checkRolesForClaims(authConfig, data, path.roles);
167
162
  }
168
163
  };
169
164
  exports.HttpAuthHandlerService = HttpAuthHandlerService;
@@ -1 +1 @@
1
- {"version":3,"file":"http-auth-handler.service.js","sourceRoot":"","sources":["../../../../libs/rlb-nestjs-amqp/src/modules/proxy/services/http-auth-handler.service.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"http-auth-handler.service.js","sourceRoot":"","sources":["../../../../libs/rlb-nestjs-amqp/src/modules/proxy/services/http-auth-handler.service.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,2CAAsE;AAItE,8CAA2D;AAE3D,+CAA0E;AAC1E,+CAA2C;AAGpC,IAAM,sBAAsB,8BAA5B,MAAM,sBAAsB;IAIjC,YACgD,cAAgD,EAC/D,aAAmD,EACjE,UAAsB;QAFwB,mBAAc,GAAd,cAAc,CAAiB;QAC9C,kBAAa,GAAb,aAAa,CAAqB;QACjE,eAAU,GAAV,UAAU,CAAY;QALxB,WAAM,GAAG,IAAI,eAAM,CAAC,wBAAsB,CAAC,IAAI,CAAC,CAAC;IAMlE,CAAC;IAED,KAAK,CAAC,eAAe,CAAC,GAAY,EAAE,IAAoB;QAEtD,IAAI,GAAG,GAAsB,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;QAChD,IAAI,CAAC,IAAI,EAAE,IAAI;YAAE,OAAO,GAAG,CAAC;QAC5B,MAAM,UAAU,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,CAAC,CAAC;QAItE,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,kBAAkB,IAAI,CAAC,IAAI,yBAAyB,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,6CAA6C,CAAC,CAAC;YAC3I,OAAO,GAAG,CAAC;QACb,CAAC;QAED,QAAQ,UAAU,CAAC,IAAI,EAAE,CAAC;YACxB,KAAK,OAAO;gBAAE,GAAG,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;gBAAC,MAAM;YACtE,KAAK,KAAK;gBAAE,GAAG,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;gBAAC,MAAM;YAC9D,KAAK,MAAM;gBAAE,GAAG,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;gBAAC,MAAM;YAC/D,KAAK,aAAa;gBAAE,GAAG,GAAG,MAAM,IAAI,CAAC,kBAAkB,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;gBAAC,MAAM;YAChF;gBACE,MAAM;QACV,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC;IAGD,YAAY,CAAC,IAAY;QACvB,OAAO,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;IACvD,CAAC;IAGD,KAAK,CAAC,WAAW,CAAC,UAA6B,EAAE,KAAa;QAC5D,IAAI,CAAC,KAAK;YAAE,OAAO,SAAS,CAAC;QAC7B,IAAI,UAAU,CAAC,IAAI,KAAK,KAAK,EAAE,CAAC;YAC9B,OAAO,IAAI,CAAC,UAAU,CAAC,iBAAiB,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;QAC9D,CAAC;QACD,IAAI,UAAU,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YAC/B,OAAO,IAAI,CAAC,UAAU,CAAC,eAAe,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;QAC5D,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IAGD,SAAS,CAAC,UAA6B,EAAE,OAAY;QACnD,IAAI,CAAC,OAAO;YAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;QAMxC,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC;YACvB,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QAC3B,CAAC;QACD,MAAM,GAAG,GAAsB,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QACjD,UAAU,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,EAAE,IAAI,CAAC,EAAE,EAAE;YAClE,IAAI,OAAO,EAAE,CAAC,MAAM,CAAC;gBACnB,GAAG,CAAC,GAAG,UAAU,CAAC,YAAY,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC,GAAG,OAAO,EAAE,CAAC,MAAM,CAAC,CAAC;QACtF,CAAC,CAAC,CAAC;QACH,OAAO,GAAG,CAAC;IACb,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,GAAY,EAAE,UAA6B;QACxD,MAAM,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,aAAa,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QACrD,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC;QACxD,OAAO,IAAI,CAAC,SAAS,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;IAC7C,CAAC;IAQD,KAAK,CAAC,mBAAmB,CAAC,UAA6B,EAAE,MAA+B,EAAE,KAAyB;QACjH,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACnE,IAAI,CAAC,IAAI,CAAC,MAAM;YAAE,OAAO,IAAI,CAAC;QAI9B,IAAI,UAAU,CAAC,IAAI,KAAK,KAAK,IAAI,UAAU,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YAC5D,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,kBAAkB,UAAU,CAAC,IAAI,iEAAiE,CAAC,CAAC;YACtH,OAAO,KAAK,CAAC;QACf,CAAC;QACD,IAAI,CAAC,UAAU,CAAC,QAAQ,EAAE,CAAC;YACzB,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,kBAAkB,UAAU,CAAC,IAAI,iGAAiG,CAAC,CAAC;YACtJ,OAAO,KAAK,CAAC;QACf,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC;YACzB,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,2GAA2G,CAAC,CAAC;YAC/H,OAAO,KAAK,CAAC;QACf,CAAC;QACD,IAAI,CAAC,MAAM;YAAE,OAAO,KAAK,CAAC;QAC1B,MAAM,MAAM,GAAG,MAAM,CAAC,GAAG,UAAU,CAAC,YAAY,GAAG,UAAU,CAAC,QAAQ,EAAE,CAAC,CAAC;QAC1E,IAAI,CAAC,MAAM;YAAE,OAAO,KAAK,CAAC;QAC1B,OAAO,IAAI,CAAC,cAAc,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACxD,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,GAAY,EAAE,UAA6B;QAC9D,IAAI,GAAG,GAAsB,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;QAChD,MAAM,UAAU,GAAG,GAAG,CAAC,OAAO,CAAC,aAAa,CAAC;QAC7C,IAAI,CAAC,UAAU,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YACpD,OAAO,GAAG,CAAC;QACb,CAAC;QAID,IAAI,CAAC,UAAU,CAAC,YAAY,EAAE,CAAC;YAC7B,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,iBAAiB,UAAU,CAAC,IAAI,4EAA4E,CAAC,CAAC;YAC/H,GAAG,CAAC,OAAO,GAAG,IAAI,CAAC;YACnB,OAAO,GAAG,CAAC;QACb,CAAC;QAED,MAAM,iBAAiB,GAAG,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QACnD,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,iBAAiB,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QAC/E,MAAM,CAAC,QAAQ,EAAE,QAAQ,CAAC,GAAG,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAEpD,IAAI,QAAQ,KAAK,UAAU,CAAC,YAAY,IAAI,CAAC,CAAC,UAAU,CAAC,QAAQ,IAAI,CAAC,UAAU,CAAC,QAAQ,IAAI,QAAQ,KAAK,UAAU,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC;YAChI,GAAG,CAAC,GAAG,UAAU,CAAC,YAAY,UAAU,CAAC,GAAG,QAAQ,CAAC;YACrD,GAAG,CAAC,GAAG,UAAU,CAAC,YAAY,QAAQ,CAAC,GAAG,QAAQ,CAAC;YACnD,GAAG,CAAC,OAAO,GAAG,IAAI,CAAC;YACnB,OAAO,GAAG,CAAC;QACb,CAAC;QAED,OAAO,GAAG,CAAC;IACb,CAAC;IAED,KAAK,CAAC,kBAAkB,CAAC,GAAY,EAAE,UAA6B;QAClE,IAAI,GAAG,GAAsB,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;QAChD,MAAM,UAAU,GAAG,GAAG,CAAC,OAAO,CAAC,aAAa,CAAC;QAG7C,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC;YACvB,GAAG,CAAC,OAAO,GAAG,IAAI,CAAC;YACnB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,iBAAiB,UAAU,CAAC,IAAI,4EAA4E,CAAC,CAAC;YAC/H,OAAO,GAAG,CAAC;QACb,CAAC;QAED,IAAI,UAAU,CAAC,MAAM,IAAI,CAAC,UAAU,CAAC,YAAY,EAAE,CAAC;YAClD,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,mCAAmC,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC;YACzE,OAAO,GAAG,CAAC;QACb,CAAC;QAED,IAAI,UAAU,KAAK,UAAU,CAAC,MAAM,EAAE,CAAC;YACrC,GAAG,CAAC,GAAG,UAAU,CAAC,YAAY,OAAO,CAAC,GAAG,UAAU,CAAC;YACpD,GAAG,CAAC,OAAO,GAAG,IAAI,CAAC;YACnB,OAAO,GAAG,CAAC;QACb,CAAC;QAED,OAAO,GAAG,CAAC;IACb,CAAC;IAUD,KAAK,CAAC,UAAU,CAAC,IAA6B,EAAE,IAAoB;QAClE,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,MAAM;YAAE,OAAO,IAAI,CAAC;QAItC,IAAI,CAAC,IAAI,EAAE,IAAI;YAAE,OAAO,KAAK,CAAC;QAC9B,MAAM,UAAU,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,CAAC,CAAC;QACtE,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,uCAAuC,IAAI,CAAC,IAAI,yBAAyB,CAAC,CAAC;YAC5H,OAAO,KAAK,CAAC;QACf,CAAC;QACD,OAAO,IAAI,CAAC,mBAAmB,CAAC,UAAU,EAAE,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;IAChE,CAAC;CACF,CAAA;AArLY,wDAAsB;iCAAtB,sBAAsB;IADlC,IAAA,mBAAU,GAAE;IAMR,WAAA,IAAA,iBAAQ,GAAE,CAAA;IAAE,WAAA,IAAA,eAAM,EAAC,sCAAwB,CAAC,CAAA;IAC5C,WAAA,IAAA,eAAM,EAAC,6BAAqB,CAAC,CAAA;oDACD,wBAAU;GAP9B,sBAAsB,CAqLlC"}
@@ -5,6 +5,7 @@ import { BrokerService } from "../../broker";
5
5
  import { AppConfig, UtilsService } from "../../broker/services/utils.service";
6
6
  import { GatewayConfig, PathDefinition } from "../config/path-definition.config";
7
7
  import { HttpAuthHandlerService } from "./http-auth-handler.service";
8
+ import { GatewayMetricsHook } from "./metrics-hook";
8
9
  export declare class HttpHandlerService implements OnModuleInit {
9
10
  private readonly httpAdapterHost;
10
11
  private readonly broker;
@@ -12,11 +13,12 @@ export declare class HttpHandlerService implements OnModuleInit {
12
13
  private readonly httpAuthHandlerService;
13
14
  private readonly appConfig;
14
15
  private readonly gatewayConfig;
16
+ private readonly metricsHook?;
15
17
  private server;
16
18
  private dynamicRouter;
17
19
  private readonly logger;
18
20
  private readonly multer;
19
- constructor(httpAdapterHost: HttpAdapterHost, broker: BrokerService, utils: UtilsService, httpAuthHandlerService: HttpAuthHandlerService, appConfig: AppConfig, gatewayConfig: GatewayConfig);
21
+ constructor(httpAdapterHost: HttpAdapterHost, broker: BrokerService, utils: UtilsService, httpAuthHandlerService: HttpAuthHandlerService, appConfig: AppConfig, gatewayConfig: GatewayConfig, metricsHook?: GatewayMetricsHook);
20
22
  onModuleInit(): Promise<void>;
21
23
  reload(): Promise<number>;
22
24
  registerPath(path: PathDefinition, router?: Router): void;
@@ -21,15 +21,17 @@ const broker_1 = require("../../broker");
21
21
  const const_1 = require("../../broker/const");
22
22
  const utils_service_1 = require("../../broker/services/utils.service");
23
23
  const http_auth_handler_service_1 = require("./http-auth-handler.service");
24
+ const metrics_hook_1 = require("./metrics-hook");
24
25
  const multer = require("multer");
25
26
  let HttpHandlerService = HttpHandlerService_1 = class HttpHandlerService {
26
- constructor(httpAdapterHost, broker, utils, httpAuthHandlerService, appConfig, gatewayConfig) {
27
+ constructor(httpAdapterHost, broker, utils, httpAuthHandlerService, appConfig, gatewayConfig, metricsHook) {
27
28
  this.httpAdapterHost = httpAdapterHost;
28
29
  this.broker = broker;
29
30
  this.utils = utils;
30
31
  this.httpAuthHandlerService = httpAuthHandlerService;
31
32
  this.appConfig = appConfig;
32
33
  this.gatewayConfig = gatewayConfig;
34
+ this.metricsHook = metricsHook;
33
35
  this.dynamicRouter = null;
34
36
  this.logger = new common_1.Logger(HttpHandlerService_1.name);
35
37
  this.multer = multer({
@@ -95,20 +97,29 @@ let HttpHandlerService = HttpHandlerService_1 = class HttpHandlerService {
95
97
  throw new Error("Topic is required for path definition");
96
98
  if (!path.mode)
97
99
  throw new Error("Mode is required for path definition");
100
+ if (path.roles?.length && !path.auth) {
101
+ this.logger.warn(`Path '${path.name || path.path}' declares roles but no 'auth' provider; the role check cannot identify the caller and every request will be denied (403). Set 'auth' to enable the ACL.`);
102
+ }
103
+ if (path.auth && !this.httpAuthHandlerService.findProvider(path.auth)) {
104
+ this.logger.error(`Path '${path.name || path.path}' references unknown auth provider '${path.auth}'; requests will be denied (401). Check 'auth-providers'.`);
105
+ }
98
106
  const target = router ?? (this.dynamicRouter ?? (this.dynamicRouter = (0, express_1.Router)()));
99
107
  target[path.method.toLowerCase()](path.path, this.multer.any(), async (req, res) => {
100
108
  this.trackMetrics(req, res, path);
101
109
  const authData = await this.httpAuthHandlerService.processAuthData(req, path);
102
- if (path.auth && !authData?.success && path.allowAnonymous !== true) {
103
- res.status(401).json({ message: "Unauthorized" });
104
- this.logger.warn(`[${path.mode.toUpperCase()}] [${path.method.toUpperCase()}] '${path.path}' => ${path.topic} | UNAUTHORIZED '401'`);
105
- return;
106
- }
107
- if (!(await this.httpAuthHandlerService.checkRoles(authData, path))) {
108
- res.status(403).json({ message: "Forbidden" });
109
- this.logger.warn(`[${path.mode.toUpperCase()}] [${path.method.toUpperCase()}] '${path.path}' => ${path.topic} | FORBIDDEN '403'`);
110
- return;
110
+ if (path.allowAnonymous !== true) {
111
+ if (path.auth && !authData?.success) {
112
+ res.status(401).json({ message: "Unauthorized" });
113
+ this.logger.warn(`[${path.mode.toUpperCase()}] [${path.method.toUpperCase()}] '${path.path}' => ${path.topic} | UNAUTHORIZED '401'`);
114
+ return;
115
+ }
116
+ if (!(await this.httpAuthHandlerService.checkRoles(authData, path))) {
117
+ res.status(403).json({ message: "Forbidden" });
118
+ this.logger.warn(`[${path.mode.toUpperCase()}] [${path.method.toUpperCase()}] '${path.path}' => ${path.topic} | FORBIDDEN '403'`);
119
+ return;
120
+ }
111
121
  }
122
+ const { success: _authSuccess, ...authHeaders } = authData || {};
112
123
  const httpHeaders = this.httpHeaders(req, path);
113
124
  let data = req[path.dataSource] || req.body || {};
114
125
  if (path.dataSource === 'body') {
@@ -151,7 +162,7 @@ let HttpHandlerService = HttpHandlerService_1 = class HttpHandlerService {
151
162
  try {
152
163
  if (path.mode === "event") {
153
164
  try {
154
- await this.broker.publishMessage(path.topic, path.action, data, { ...authData, ...httpHeaders, "X-GTW-METHOD": req.method, "X-GTW-PATH": path.path });
165
+ await this.broker.publishMessage(path.topic, path.action, data, { ...httpHeaders, ...authHeaders, "X-GTW-METHOD": req.method, "X-GTW-PATH": path.path });
155
166
  res.status(path.successStatusCode || 202).setHeaders(headers).end();
156
167
  this.logger.log(`[${path.mode.toUpperCase()}] [${path.method.toUpperCase()}] '${path.path}' => ${path.topic} | PROCESSED 'EVENT'`);
157
168
  }
@@ -162,7 +173,7 @@ let HttpHandlerService = HttpHandlerService_1 = class HttpHandlerService {
162
173
  }
163
174
  else if (path.mode === "rpc") {
164
175
  try {
165
- const resp = await this.broker.requestData(path.topic, path.action, data, { ...authData, ...httpHeaders, "X-GTW-METHOD": req.method, "X-GTW-PATH": path.path }, path.timeout);
176
+ const resp = await this.broker.requestData(path.topic, path.action, data, { ...httpHeaders, ...authHeaders, "X-GTW-METHOD": req.method, "X-GTW-PATH": path.path }, path.timeout);
166
177
  if (resp) {
167
178
  if (path.redirect) {
168
179
  res.redirect(path.redirect, resp);
@@ -194,6 +205,9 @@ let HttpHandlerService = HttpHandlerService_1 = class HttpHandlerService {
194
205
  case "BadRequestError":
195
206
  res.status(400).json(this.utils.error2Object(error, this.appConfig.environment !== 'production'));
196
207
  break;
208
+ case "ConflictError":
209
+ res.status(409).json(this.utils.error2Object(error, this.appConfig.environment !== 'production'));
210
+ break;
197
211
  case "ForbiddenError":
198
212
  res.status(403).json(this.utils.error2Object(error, this.appConfig.environment !== 'production'));
199
213
  break;
@@ -230,21 +244,36 @@ let HttpHandlerService = HttpHandlerService_1 = class HttpHandlerService {
230
244
  }
231
245
  trackMetrics(req, res, path) {
232
246
  const sink = this.gatewayConfig.metrics;
233
- if (!sink?.topic || !sink?.action)
247
+ const hasBrokerSink = !!(sink?.topic && sink?.action);
248
+ if (!hasBrokerSink && !this.metricsHook)
234
249
  return;
235
250
  const startedAt = Date.now();
236
251
  res.once('finish', () => {
237
- const payload = {
252
+ const finishedAt = Date.now();
253
+ const point = {
254
+ ts: finishedAt,
238
255
  method: req.method,
239
256
  route: path.path,
240
257
  name: path.name,
241
258
  topic: path.topic,
242
259
  action: path.action,
260
+ mode: path.mode,
243
261
  status: res.statusCode,
244
- durationMs: Date.now() - startedAt,
262
+ durationMs: finishedAt - startedAt,
245
263
  };
246
- this.broker.publishMessage(sink.topic, sink.action, payload)
247
- .catch((error) => this.logger.debug(`[METRICS] track failed for '${path.path}': ${error?.message}`));
264
+ if (hasBrokerSink) {
265
+ this.broker.publishMessage(sink.topic, sink.action, point)
266
+ .catch((error) => this.logger.debug(`[METRICS] broker track failed for '${path.path}': ${error?.message}`));
267
+ }
268
+ if (this.metricsHook) {
269
+ try {
270
+ Promise.resolve(this.metricsHook.track(point))
271
+ .catch((error) => this.logger.debug(`[METRICS] hook failed for '${path.path}': ${error?.message}`));
272
+ }
273
+ catch (error) {
274
+ this.logger.debug(`[METRICS] hook threw for '${path.path}': ${error?.message}`);
275
+ }
276
+ }
248
277
  });
249
278
  }
250
279
  httpHeaders(req, path) {
@@ -271,9 +300,11 @@ exports.HttpHandlerService = HttpHandlerService = HttpHandlerService_1 = __decor
271
300
  (0, common_1.Injectable)(),
272
301
  __param(4, (0, common_1.Inject)(const_1.RLB_AMQP_APP_OPTIONS)),
273
302
  __param(5, (0, common_1.Inject)(const_1.RLB_AMQP_GATEWAY_OPTIONS)),
303
+ __param(6, (0, common_1.Optional)()),
304
+ __param(6, (0, common_1.Inject)(metrics_hook_1.RLB_GTW_METRICS_HOOK)),
274
305
  __metadata("design:paramtypes", [core_1.HttpAdapterHost,
275
306
  broker_1.BrokerService,
276
307
  utils_service_1.UtilsService,
277
- http_auth_handler_service_1.HttpAuthHandlerService, Object, Object])
308
+ http_auth_handler_service_1.HttpAuthHandlerService, Object, Object, Object])
278
309
  ], HttpHandlerService);
279
310
  //# sourceMappingURL=http-handler.service.js.map