@open-rlb/nestjs-amqp 2.1.1 → 2.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (198) hide show
  1. package/package.json +6 -5
  2. package/schematics/add-auth-provider/index.d.ts +3 -0
  3. package/schematics/add-auth-provider/index.js +60 -0
  4. package/schematics/add-auth-provider/index.js.map +1 -0
  5. package/schematics/add-auth-provider/index.spec.ts +83 -0
  6. package/schematics/add-auth-provider/index.ts +83 -0
  7. package/schematics/add-auth-provider/schema.d.ts +18 -0
  8. package/schematics/add-auth-provider/schema.js +3 -0
  9. package/schematics/add-auth-provider/schema.js.map +1 -0
  10. package/schematics/add-auth-provider/schema.json +59 -0
  11. package/schematics/add-auth-provider/schema.ts +35 -0
  12. package/schematics/add-exchange/index.d.ts +3 -0
  13. package/schematics/add-exchange/index.js +49 -0
  14. package/schematics/add-exchange/index.js.map +1 -0
  15. package/schematics/add-exchange/index.spec.ts +65 -0
  16. package/schematics/add-exchange/index.ts +65 -0
  17. package/schematics/add-exchange/schema.d.ts +14 -0
  18. package/schematics/add-exchange/schema.js +3 -0
  19. package/schematics/add-exchange/schema.js.map +1 -0
  20. package/schematics/add-exchange/schema.json +50 -0
  21. package/schematics/add-exchange/schema.ts +26 -0
  22. package/schematics/add-exchange-binding/index.d.ts +3 -0
  23. package/schematics/add-exchange-binding/index.js +53 -0
  24. package/schematics/add-exchange-binding/index.js.map +1 -0
  25. package/schematics/add-exchange-binding/index.spec.ts +73 -0
  26. package/schematics/add-exchange-binding/index.ts +64 -0
  27. package/schematics/add-exchange-binding/schema.d.ts +8 -0
  28. package/schematics/add-exchange-binding/schema.js +3 -0
  29. package/schematics/add-exchange-binding/schema.js.map +1 -0
  30. package/schematics/add-exchange-binding/schema.json +36 -0
  31. package/schematics/add-exchange-binding/schema.ts +14 -0
  32. package/schematics/add-gateway/index.d.ts +4 -0
  33. package/schematics/add-gateway/index.js +105 -0
  34. package/schematics/add-gateway/index.js.map +1 -0
  35. package/schematics/add-gateway/index.spec.ts +163 -0
  36. package/schematics/add-gateway/index.ts +141 -0
  37. package/schematics/add-gateway/paths.d.ts +12 -0
  38. package/schematics/add-gateway/paths.js +87 -0
  39. package/schematics/add-gateway/paths.js.map +1 -0
  40. package/schematics/add-gateway/paths.ts +103 -0
  41. package/schematics/add-gateway/schema.d.ts +13 -0
  42. package/schematics/add-gateway/schema.js +3 -0
  43. package/schematics/add-gateway/schema.js.map +1 -0
  44. package/schematics/add-gateway/schema.json +63 -0
  45. package/schematics/add-gateway/schema.ts +24 -0
  46. package/schematics/add-gateway/wiring.d.ts +14 -0
  47. package/schematics/add-gateway/wiring.js +102 -0
  48. package/schematics/add-gateway/wiring.js.map +1 -0
  49. package/schematics/add-gateway/wiring.ts +115 -0
  50. package/schematics/add-metrics-topic/index.d.ts +3 -0
  51. package/schematics/add-metrics-topic/index.js +31 -0
  52. package/schematics/add-metrics-topic/index.js.map +1 -0
  53. package/schematics/add-metrics-topic/index.spec.ts +79 -0
  54. package/schematics/add-metrics-topic/index.ts +49 -0
  55. package/schematics/add-metrics-topic/schema.d.ts +10 -0
  56. package/schematics/add-metrics-topic/schema.js +3 -0
  57. package/schematics/add-metrics-topic/schema.js.map +1 -0
  58. package/schematics/add-metrics-topic/schema.json +48 -0
  59. package/schematics/add-metrics-topic/schema.ts +18 -0
  60. package/schematics/add-queue/index.d.ts +3 -0
  61. package/schematics/add-queue/index.js +48 -0
  62. package/schematics/add-queue/index.js.map +1 -0
  63. package/schematics/add-queue/index.spec.ts +75 -0
  64. package/schematics/add-queue/index.ts +74 -0
  65. package/schematics/add-queue/schema.d.ts +17 -0
  66. package/schematics/add-queue/schema.js +3 -0
  67. package/schematics/add-queue/schema.js.map +1 -0
  68. package/schematics/add-queue/schema.json +54 -0
  69. package/schematics/add-queue/schema.ts +32 -0
  70. package/schematics/add-reply-queue/index.d.ts +3 -0
  71. package/schematics/add-reply-queue/index.js +26 -0
  72. package/schematics/add-reply-queue/index.js.map +1 -0
  73. package/schematics/add-reply-queue/index.spec.ts +69 -0
  74. package/schematics/add-reply-queue/index.ts +33 -0
  75. package/schematics/add-reply-queue/schema.d.ts +6 -0
  76. package/schematics/add-reply-queue/schema.js +3 -0
  77. package/schematics/add-reply-queue/schema.js.map +1 -0
  78. package/schematics/add-reply-queue/schema.json +28 -0
  79. package/schematics/add-reply-queue/schema.ts +10 -0
  80. package/schematics/add-route/index.d.ts +3 -0
  81. package/schematics/add-route/index.js +57 -0
  82. package/schematics/add-route/index.js.map +1 -0
  83. package/schematics/add-route/index.spec.ts +75 -0
  84. package/schematics/add-route/index.ts +74 -0
  85. package/schematics/add-route/schema.d.ts +22 -0
  86. package/schematics/add-route/schema.js +3 -0
  87. package/schematics/add-route/schema.js.map +1 -0
  88. package/schematics/add-route/schema.json +74 -0
  89. package/schematics/add-route/schema.ts +43 -0
  90. package/schematics/add-topic/index.d.ts +3 -0
  91. package/schematics/add-topic/index.js +69 -0
  92. package/schematics/add-topic/index.js.map +1 -0
  93. package/schematics/add-topic/index.spec.ts +100 -0
  94. package/schematics/add-topic/index.ts +104 -0
  95. package/schematics/add-topic/schema.d.ts +18 -0
  96. package/schematics/add-topic/schema.js +3 -0
  97. package/schematics/add-topic/schema.js.map +1 -0
  98. package/schematics/add-topic/schema.json +63 -0
  99. package/schematics/add-topic/schema.ts +34 -0
  100. package/schematics/add-ws-event/index.d.ts +3 -0
  101. package/schematics/add-ws-event/index.js +53 -0
  102. package/schematics/add-ws-event/index.js.map +1 -0
  103. package/schematics/add-ws-event/index.spec.ts +85 -0
  104. package/schematics/add-ws-event/index.ts +72 -0
  105. package/schematics/add-ws-event/schema.d.ts +17 -0
  106. package/schematics/add-ws-event/schema.js +3 -0
  107. package/schematics/add-ws-event/schema.js.map +1 -0
  108. package/schematics/add-ws-event/schema.json +53 -0
  109. package/schematics/add-ws-event/schema.ts +33 -0
  110. package/schematics/collection.json +81 -1
  111. package/schematics/configure-broker/index.d.ts +3 -0
  112. package/schematics/configure-broker/index.js +41 -0
  113. package/schematics/configure-broker/index.js.map +1 -0
  114. package/schematics/configure-broker/index.spec.ts +62 -0
  115. package/schematics/configure-broker/index.ts +51 -0
  116. package/schematics/configure-broker/schema.d.ts +11 -0
  117. package/schematics/configure-broker/schema.js +3 -0
  118. package/schematics/configure-broker/schema.js.map +1 -0
  119. package/schematics/configure-broker/schema.json +47 -0
  120. package/schematics/configure-broker/schema.ts +20 -0
  121. package/schematics/enable-load-config/index.d.ts +3 -0
  122. package/schematics/enable-load-config/index.js +32 -0
  123. package/schematics/enable-load-config/index.js.map +1 -0
  124. package/schematics/enable-load-config/index.spec.ts +61 -0
  125. package/schematics/enable-load-config/index.ts +39 -0
  126. package/schematics/enable-load-config/schema.d.ts +8 -0
  127. package/schematics/enable-load-config/schema.js +3 -0
  128. package/schematics/enable-load-config/schema.js.map +1 -0
  129. package/schematics/enable-load-config/schema.json +36 -0
  130. package/schematics/enable-load-config/schema.ts +14 -0
  131. package/schematics/enable-retry/index.d.ts +3 -0
  132. package/schematics/enable-retry/index.js +51 -0
  133. package/schematics/enable-retry/index.js.map +1 -0
  134. package/schematics/enable-retry/index.spec.ts +73 -0
  135. package/schematics/enable-retry/index.ts +62 -0
  136. package/schematics/enable-retry/schema.d.ts +13 -0
  137. package/schematics/enable-retry/schema.js +3 -0
  138. package/schematics/enable-retry/schema.js.map +1 -0
  139. package/schematics/enable-retry/schema.json +64 -0
  140. package/schematics/enable-retry/schema.ts +24 -0
  141. package/schematics/enable-route-discovery/index.d.ts +3 -0
  142. package/schematics/enable-route-discovery/index.js +36 -0
  143. package/schematics/enable-route-discovery/index.js.map +1 -0
  144. package/schematics/enable-route-discovery/index.spec.ts +55 -0
  145. package/schematics/enable-route-discovery/index.ts +48 -0
  146. package/schematics/enable-route-discovery/schema.d.ts +9 -0
  147. package/schematics/enable-route-discovery/schema.js +3 -0
  148. package/schematics/enable-route-discovery/schema.js.map +1 -0
  149. package/schematics/enable-route-discovery/schema.json +44 -0
  150. package/schematics/enable-route-discovery/schema.ts +16 -0
  151. package/schematics/harden-gateway/index.d.ts +3 -0
  152. package/schematics/harden-gateway/index.js +93 -0
  153. package/schematics/harden-gateway/index.js.map +1 -0
  154. package/schematics/harden-gateway/index.spec.ts +105 -0
  155. package/schematics/harden-gateway/index.ts +108 -0
  156. package/schematics/harden-gateway/schema.d.ts +11 -0
  157. package/schematics/harden-gateway/schema.js +3 -0
  158. package/schematics/harden-gateway/schema.js.map +1 -0
  159. package/schematics/harden-gateway/schema.json +47 -0
  160. package/schematics/harden-gateway/schema.ts +20 -0
  161. package/schematics/nest-add/index.js +55 -832
  162. package/schematics/nest-add/index.js.map +1 -1
  163. package/schematics/nest-add/index.spec.ts +73 -0
  164. package/schematics/nest-add/index.ts +76 -917
  165. package/schematics/nest-add/init.schema.d.ts +1 -0
  166. package/schematics/nest-add/init.schema.ts +3 -0
  167. package/schematics/nest-add/schema.json +4 -43
  168. package/schematics/set-connection-name/index.d.ts +3 -0
  169. package/schematics/set-connection-name/index.js +34 -0
  170. package/schematics/set-connection-name/index.js.map +1 -0
  171. package/schematics/set-connection-name/index.spec.ts +48 -0
  172. package/schematics/set-connection-name/index.ts +42 -0
  173. package/schematics/set-connection-name/schema.d.ts +5 -0
  174. package/schematics/set-connection-name/schema.js +3 -0
  175. package/schematics/set-connection-name/schema.js.map +1 -0
  176. package/schematics/set-connection-name/schema.json +24 -0
  177. package/schematics/set-connection-name/schema.ts +8 -0
  178. package/schematics/utils/broker-yaml.util.d.ts +53 -0
  179. package/schematics/utils/broker-yaml.util.js +91 -0
  180. package/schematics/utils/broker-yaml.util.js.map +1 -0
  181. package/schematics/utils/broker-yaml.util.ts +172 -0
  182. package/schematics/utils/nest-wiring.util.d.ts +30 -0
  183. package/schematics/utils/nest-wiring.util.js +170 -0
  184. package/schematics/utils/nest-wiring.util.js.map +1 -0
  185. package/schematics/utils/nest-wiring.util.ts +211 -0
  186. package/schematics/utils/schematic-prompt.util.d.ts +7 -0
  187. package/schematics/utils/schematic-prompt.util.js +57 -0
  188. package/schematics/utils/schematic-prompt.util.js.map +1 -0
  189. package/schematics/utils/schematic-prompt.util.ts +82 -0
  190. package/schematics/utils/yaml-config.util.d.ts +22 -0
  191. package/schematics/utils/yaml-config.util.js +119 -0
  192. package/schematics/utils/yaml-config.util.js.map +1 -0
  193. package/schematics/utils/yaml-config.util.ts +167 -0
  194. /package/schematics/{nest-add → add-gateway}/files/acl/src/cache/in-memory-acl-store.ts +0 -0
  195. /package/schematics/{nest-add → add-gateway}/files/acl/src/modules/database/repository/acl.repository.ts +0 -0
  196. /package/schematics/{nest-add → add-gateway}/files/db-core/src/modules/database/repository/in-memory-collection.ts +0 -0
  197. /package/schematics/{nest-add → add-gateway}/files/gateway-admin/src/modules/database/repository/gateway.repository.ts +0 -0
  198. /package/schematics/{nest-add → add-gateway}/files/gateway-admin/src/modules/database/repository/route-sync.repository.ts +0 -0
@@ -0,0 +1,141 @@
1
+ import { apply, chain, MergeStrategy, mergeWith, move, noop, Rule, SchematicContext, Tree, url } from '@angular-devkit/schematics';
2
+ import { normalize } from 'path';
3
+ import { ensureExchange, ensureQueue, ensureTopic } from '../utils/broker-yaml.util';
4
+ import { addDeps, configureMainForGateway, createConfigLoader, wireAppModule } from '../utils/nest-wiring.util';
5
+ import { findConfigYaml, readConfigDoc, setIn, upsertSeqItemByKey, writeConfigDoc } from '../utils/yaml-config.util';
6
+ import { aclManagementPaths, adminManagementPaths } from './paths';
7
+ import { AddGatewayOptions } from './schema';
8
+ import { GwFeatures, importLines, libSymbols, moduleEntries } from './wiring';
9
+
10
+ /**
11
+ * `add-gateway` — promote a plain microservice into a working gateway. It edits config.yaml (drop
12
+ * publisher route-discovery; declare the acl/admin/control + route-sync infra; seed the `gateway:`
13
+ * section AND its management routes) AND wires the app: AppModule (Broker/Proxy/Http/Acl/GatewayAdmin
14
+ * modules), main.ts (rawBody + WsAdapter), the config loader, in-memory repositories, and package.json
15
+ * deps. Every step is idempotent, so re-running (or running on an already-partly-wired app) is safe.
16
+ */
17
+ export function main(options: AddGatewayOptions): Rule {
18
+ const r = resolveFlags(options);
19
+ return chain([
20
+ // Config edits + TypeScript wiring (directly unit-testable — no engine/url source needed).
21
+ configAndWireRule(options),
22
+ // In-memory starter repositories referenced by the wiring (Overwrite = idempotent re-copy).
23
+ copyAsset('db-core'),
24
+ r.acl ? copyAsset('acl') : noop(),
25
+ r.anyAdmin ? copyAsset('gateway-admin') : noop(),
26
+ ]);
27
+ }
28
+
29
+ interface Resolved {
30
+ exchange: string;
31
+ aclQueue: string;
32
+ adminQueue: string;
33
+ controlTopic: string;
34
+ routeExchange: string;
35
+ routeQueue: string;
36
+ acl: boolean;
37
+ admin: boolean;
38
+ routeReception: boolean;
39
+ anyAdmin: boolean;
40
+ features: GwFeatures;
41
+ }
42
+
43
+ function resolveFlags(options: AddGatewayOptions): Resolved {
44
+ const exchange = options.exchange || 'rlb';
45
+ const aclQueue = options.aclQueue || 'rlb-acl';
46
+ const adminQueue = options.adminQueue || 'rlb-gateway-admin';
47
+ const controlTopic = options.controlTopic || 'rlb-gateway-control';
48
+ const routeExchange = options.routeExchange || 'rlb-route-discovery';
49
+ const routeQueue = options.routeQueue || 'rlb-route-sync';
50
+ const acl = options.acl ?? true;
51
+ const admin = options.admin ?? true;
52
+ const routeReception = options.routeReception ?? true;
53
+ const anyAdmin = admin || routeReception;
54
+ const features: GwFeatures = { acl, admin, routeReception, routeExchange, routeQueue };
55
+ return { exchange, aclQueue, adminQueue, controlTopic, routeExchange, routeQueue, acl, admin, routeReception, anyAdmin, features };
56
+ }
57
+
58
+ /** The config.yaml edits + config-loader/AppModule/main.ts/package.json wiring — everything except the
59
+ * url()-based asset copy, so it can be invoked directly against a Tree in unit tests. */
60
+ export function configAndWireRule(options: AddGatewayOptions): Rule {
61
+ return (tree: Tree, context: SchematicContext) => {
62
+ const r = resolveFlags(options);
63
+ const opts = { overwrite: options.overwrite };
64
+ const configPath = findConfigYaml(tree, options.config);
65
+ const { doc, existed } = readConfigDoc(tree, configPath);
66
+ if (!existed) context.logger.info(`[rlb-amqp] ${configPath} not found — creating it.`);
67
+
68
+ // 1. A gateway consumes routes, it does not publish its own → drop publisher route-discovery.
69
+ if (doc.hasIn(['broker', 'routeDiscovery'])) {
70
+ doc.deleteIn(['broker', 'routeDiscovery']);
71
+ context.logger.info('[rlb-amqp] removed broker.routeDiscovery (a gateway consumes routes, it does not publish its own).');
72
+ }
73
+
74
+ // 2. Main exchange backing the acl/admin queues.
75
+ ensureExchange(doc, { name: r.exchange, type: 'direct' }, opts);
76
+
77
+ // 3. ACL infra — topic name is FIXED 'rlb-acl' (decorator-bound in the lib).
78
+ if (r.acl) {
79
+ ensureQueue(doc, { name: r.aclQueue, exchange: r.exchange, routingKey: r.aclQueue, durable: true }, opts);
80
+ ensureTopic(doc, { name: 'rlb-acl', mode: 'rpc', queue: r.aclQueue, exchange: r.exchange, routingKey: r.aclQueue }, opts);
81
+ }
82
+
83
+ // 4. Gateway-admin infra — 'rlb-gateway-admin' is decorator-bound; controlTopic is a broadcast.
84
+ if (r.anyAdmin) {
85
+ ensureQueue(doc, { name: r.adminQueue, exchange: r.exchange, routingKey: r.adminQueue, durable: true }, opts);
86
+ ensureTopic(doc, { name: 'rlb-gateway-admin', mode: 'rpc', queue: r.adminQueue, exchange: r.exchange, routingKey: r.adminQueue }, opts);
87
+ ensureTopic(doc, { name: r.controlTopic, mode: 'broadcast', exchange: r.exchange, routingKey: r.controlTopic }, opts);
88
+ }
89
+
90
+ // 5. Consumer-side route-sync infra (fanout exchange + durable sync queue).
91
+ if (r.routeReception) {
92
+ ensureExchange(doc, { name: r.routeExchange, type: 'fanout' }, opts);
93
+ ensureQueue(doc, { name: r.routeQueue, exchange: r.routeExchange, durable: true }, opts);
94
+ }
95
+
96
+ // 6. gateway: section — set each key ONLY if absent, so user edits are never clobbered.
97
+ if (!doc.hasIn(['gateway', 'events'])) setIn(doc, ['gateway', 'events'], []);
98
+ if (!doc.hasIn(['gateway', 'ws'])) setIn(doc, ['gateway', 'ws'], { heartbeatIntervalMs: 30000 });
99
+ if (r.anyAdmin) {
100
+ if (!doc.hasIn(['gateway', 'reloadTopic'])) setIn(doc, ['gateway', 'reloadTopic'], r.controlTopic);
101
+ if (!doc.hasIn(['gateway', 'metrics'])) setIn(doc, ['gateway', 'metrics'], { topic: 'rlb-gateway-admin', action: 'gw-metrics-track' });
102
+ if (!doc.hasIn(['gateway', 'loadConfig'])) setIn(doc, ['gateway', 'loadConfig'], { paths: { topic: 'rlb-gateway-admin', action: 'gw-path-export' } });
103
+ }
104
+
105
+ // 7. Management routes so the wired ACL / gateway-admin modules are reachable over HTTP.
106
+ if (!doc.hasIn(['gateway', 'paths'])) setIn(doc, ['gateway', 'paths'], []);
107
+ const paths = [...(r.acl ? aclManagementPaths() : []), ...(r.anyAdmin ? adminManagementPaths(r.controlTopic) : [])];
108
+ for (const p of paths) upsertSeqItemByKey(doc, ['gateway', 'paths'], 'name', p as unknown as Record<string, unknown>, opts);
109
+
110
+ writeConfigDoc(tree, configPath, doc);
111
+
112
+ // 8. TypeScript wiring: config loader, AppModule modules, main.ts, package.json deps.
113
+ createConfigLoader(tree);
114
+ const modulePath = wireAppModule(tree, {
115
+ libSymbols: libSymbols(r.features),
116
+ importLines: importLines(r.features),
117
+ entries: moduleEntries(r.features),
118
+ });
119
+ if (!modulePath) {
120
+ context.logger.warn('[rlb-amqp] app.module.ts not found — module wiring skipped. Wire Broker/Proxy/Http' + (r.acl ? '/Acl' : '') + (r.anyAdmin ? '/GatewayAdmin' : '') + ' modules manually.');
121
+ }
122
+ if (!configureMainForGateway(tree)) {
123
+ context.logger.warn('[rlb-amqp] main.ts not found — enable rawBody + WsAdapter manually.');
124
+ }
125
+ addDeps(tree, {
126
+ '@nestjs/config': '^4.0.4',
127
+ 'js-yaml': '^4.1.0',
128
+ '@nestjs/axios': '^4.0.1',
129
+ '@nestjs/platform-ws': '^11.0.1',
130
+ '@nestjs/websockets': '^11.0.1',
131
+ ws: '^8.21.0',
132
+ });
133
+
134
+ return tree;
135
+ };
136
+ }
137
+
138
+ /** Copy a static in-memory-repository asset tree under ./files/<name> to the project root. */
139
+ function copyAsset(name: string): Rule {
140
+ return mergeWith(apply(url(`./files/${name}`), [move(normalize('.'))]), MergeStrategy.Overwrite);
141
+ }
@@ -0,0 +1,12 @@
1
+ export interface GatewayPath {
2
+ name: string;
3
+ method: string;
4
+ path: string;
5
+ dataSource: string;
6
+ topic: string;
7
+ action: string;
8
+ mode: string;
9
+ headers?: Record<string, string>;
10
+ }
11
+ export declare function aclManagementPaths(): GatewayPath[];
12
+ export declare function adminManagementPaths(controlTopic: string): GatewayPath[];
@@ -0,0 +1,87 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.aclManagementPaths = aclManagementPaths;
4
+ exports.adminManagementPaths = adminManagementPaths;
5
+ function aclManagementPaths() {
6
+ const rpc = (name, method, path, dataSource, action) => ({
7
+ name,
8
+ method,
9
+ path,
10
+ dataSource,
11
+ topic: 'rlb-acl',
12
+ action,
13
+ mode: 'rpc',
14
+ });
15
+ return [
16
+ rpc('acl-action-list', 'GET', '/acl/actions', 'query', 'acl-action-list'),
17
+ rpc('acl-action-get', 'GET', '/acl/actions/get', 'query', 'acl-action-get'),
18
+ rpc('acl-action-upsert', 'PUT', '/acl/actions', 'body', 'acl-action-update'),
19
+ rpc('acl-action-delete', 'DELETE', '/acl/actions', 'body', 'acl-action-delete'),
20
+ rpc('acl-action-search', 'GET', '/acl/actions/search', 'query', 'acl-action-search'),
21
+ rpc('acl-role-list', 'GET', '/acl/roles', 'query', 'acl-role-list'),
22
+ rpc('acl-role-get', 'GET', '/acl/roles/get', 'query', 'acl-role-get'),
23
+ rpc('acl-role-upsert', 'PUT', '/acl/roles', 'body', 'acl-role-update'),
24
+ rpc('acl-role-delete', 'DELETE', '/acl/roles', 'body', 'acl-role-delete'),
25
+ rpc('acl-role-search', 'GET', '/acl/roles/search', 'query', 'acl-role-search'),
26
+ rpc('acl-grant', 'POST', '/acl/grants', 'body', 'acl-grant'),
27
+ rpc('acl-revoke', 'DELETE', '/acl/grants', 'body', 'acl-revoke'),
28
+ rpc('acl-grant-search', 'GET', '/acl/grants/search', 'query', 'acl-grant-search'),
29
+ rpc('acl-check-action', 'GET', '/acl/check', 'query', 'acl-check-action'),
30
+ rpc('acl-list-resources-by-user', 'GET', '/acl/resources', 'query', 'acl-list-resources-by-user'),
31
+ ];
32
+ }
33
+ function adminManagementPaths(controlTopic) {
34
+ const rpc = (name, method, path, dataSource, action) => ({
35
+ name,
36
+ method,
37
+ path,
38
+ dataSource,
39
+ topic: 'rlb-gateway-admin',
40
+ action,
41
+ mode: 'rpc',
42
+ });
43
+ return [
44
+ rpc('health', 'GET', '/health', 'query', 'gw-health'),
45
+ rpc('gw-path-create', 'POST', '/admin/paths', 'body', 'gw-path-create'),
46
+ rpc('gw-path-list', 'GET', '/admin/paths', 'query', 'gw-path-list'),
47
+ rpc('gw-path-search', 'GET', '/admin/paths/search', 'query', 'gw-path-search'),
48
+ rpc('gw-path-export', 'GET', '/admin/paths/export', 'query', 'gw-path-export'),
49
+ rpc('gw-path-update', 'PUT', '/admin/paths', 'body', 'gw-path-update'),
50
+ rpc('gw-path-get', 'GET', '/admin/paths/get', 'query', 'gw-path-get'),
51
+ rpc('gw-path-delete', 'DELETE', '/admin/paths', 'body', 'gw-path-delete'),
52
+ rpc('gw-route-log-list', 'GET', '/admin/route-log', 'query', 'gw-route-log-list'),
53
+ rpc('gw-route-log-search', 'GET', '/admin/route-log/search', 'query', 'gw-route-log-search'),
54
+ rpc('gw-auth-list', 'GET', '/admin/auth', 'query', 'gw-auth-list'),
55
+ rpc('gw-auth-search', 'GET', '/admin/auth/search', 'query', 'gw-auth-search'),
56
+ rpc('gw-auth-upsert', 'PUT', '/admin/auth', 'body', 'gw-auth-update'),
57
+ rpc('gw-auth-get', 'GET', '/admin/auth/get', 'query', 'gw-auth-get'),
58
+ rpc('gw-auth-delete', 'DELETE', '/admin/auth', 'body', 'gw-auth-delete'),
59
+ rpc('gw-metrics-get', 'GET', '/admin/metrics', 'query', 'gw-metrics-get'),
60
+ rpc('gw-metrics-series', 'GET', '/admin/metrics/series', 'query', 'gw-metrics-series'),
61
+ rpc('gw-metrics-points', 'GET', '/admin/metrics/points', 'query', 'gw-metrics-points'),
62
+ rpc('gw-metrics-summary', 'GET', '/admin/metrics/summary', 'query', 'gw-metrics-summary'),
63
+ {
64
+ name: 'gw-metrics-prometheus',
65
+ method: 'GET',
66
+ path: '/admin/metrics/prometheus',
67
+ dataSource: 'query',
68
+ topic: 'rlb-gateway-admin',
69
+ action: 'gw-metrics-prometheus',
70
+ mode: 'rpc',
71
+ headers: { 'Content-Type': 'text/plain; version=0.0.4' },
72
+ },
73
+ rpc('gw-metrics-rollups', 'GET', '/admin/metrics/rollups', 'query', 'gw-metrics-rollups'),
74
+ {
75
+ name: 'gw-metrics-track',
76
+ method: 'POST',
77
+ path: '/admin/metrics/track',
78
+ dataSource: 'body',
79
+ topic: 'rlb-gateway-admin',
80
+ action: 'gw-metrics-track',
81
+ mode: 'event',
82
+ },
83
+ { name: 'gw-reload', method: 'POST', path: '/admin/reload', dataSource: 'body', topic: controlTopic, action: 'gw-reload', mode: 'event' },
84
+ { name: 'gw-auth-reload', method: 'POST', path: '/admin/auth/reload', dataSource: 'body', topic: controlTopic, action: 'gw-auth-reload', mode: 'event' },
85
+ ];
86
+ }
87
+ //# sourceMappingURL=paths.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paths.js","sourceRoot":"","sources":["../../../libs/rlb-nestjs-amqp/src/schematics/add-gateway/paths.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,103 @@
1
+ /**
2
+ * The management HTTP routes a gateway exposes so the ACL and gateway-admin RPC surfaces are
3
+ * reachable over HTTP. Seeded into `gateway.paths[]` (idempotent upsert by `name`) so the wired
4
+ * AclModule / GatewayAdminModule are actually usable — a gateway with the modules but no routes
5
+ * is inert. Name-keyed resources use PUT-upsert (no POST); `acl-grant`/`acl-revoke` are the exception.
6
+ */
7
+
8
+ export interface GatewayPath {
9
+ name: string;
10
+ method: string;
11
+ path: string;
12
+ dataSource: string;
13
+ topic: string;
14
+ action: string;
15
+ mode: string;
16
+ headers?: Record<string, string>;
17
+ }
18
+
19
+ /** ACL management + check routes (topic `rlb-acl`). */
20
+ export function aclManagementPaths(): GatewayPath[] {
21
+ const rpc = (name: string, method: string, path: string, dataSource: string, action: string): GatewayPath => ({
22
+ name,
23
+ method,
24
+ path,
25
+ dataSource,
26
+ topic: 'rlb-acl',
27
+ action,
28
+ mode: 'rpc',
29
+ });
30
+ return [
31
+ rpc('acl-action-list', 'GET', '/acl/actions', 'query', 'acl-action-list'),
32
+ rpc('acl-action-get', 'GET', '/acl/actions/get', 'query', 'acl-action-get'),
33
+ rpc('acl-action-upsert', 'PUT', '/acl/actions', 'body', 'acl-action-update'),
34
+ rpc('acl-action-delete', 'DELETE', '/acl/actions', 'body', 'acl-action-delete'),
35
+ rpc('acl-action-search', 'GET', '/acl/actions/search', 'query', 'acl-action-search'),
36
+ rpc('acl-role-list', 'GET', '/acl/roles', 'query', 'acl-role-list'),
37
+ rpc('acl-role-get', 'GET', '/acl/roles/get', 'query', 'acl-role-get'),
38
+ rpc('acl-role-upsert', 'PUT', '/acl/roles', 'body', 'acl-role-update'),
39
+ rpc('acl-role-delete', 'DELETE', '/acl/roles', 'body', 'acl-role-delete'),
40
+ rpc('acl-role-search', 'GET', '/acl/roles/search', 'query', 'acl-role-search'),
41
+ rpc('acl-grant', 'POST', '/acl/grants', 'body', 'acl-grant'),
42
+ rpc('acl-revoke', 'DELETE', '/acl/grants', 'body', 'acl-revoke'),
43
+ rpc('acl-grant-search', 'GET', '/acl/grants/search', 'query', 'acl-grant-search'),
44
+ rpc('acl-check-action', 'GET', '/acl/check', 'query', 'acl-check-action'),
45
+ rpc('acl-list-resources-by-user', 'GET', '/acl/resources', 'query', 'acl-list-resources-by-user'),
46
+ ];
47
+ }
48
+
49
+ /** Gateway-admin routes (topic `rlb-gateway-admin`; the two reloads publish on `controlTopic`). */
50
+ export function adminManagementPaths(controlTopic: string): GatewayPath[] {
51
+ const rpc = (name: string, method: string, path: string, dataSource: string, action: string): GatewayPath => ({
52
+ name,
53
+ method,
54
+ path,
55
+ dataSource,
56
+ topic: 'rlb-gateway-admin',
57
+ action,
58
+ mode: 'rpc',
59
+ });
60
+ return [
61
+ rpc('health', 'GET', '/health', 'query', 'gw-health'),
62
+ rpc('gw-path-create', 'POST', '/admin/paths', 'body', 'gw-path-create'),
63
+ rpc('gw-path-list', 'GET', '/admin/paths', 'query', 'gw-path-list'),
64
+ rpc('gw-path-search', 'GET', '/admin/paths/search', 'query', 'gw-path-search'),
65
+ rpc('gw-path-export', 'GET', '/admin/paths/export', 'query', 'gw-path-export'),
66
+ rpc('gw-path-update', 'PUT', '/admin/paths', 'body', 'gw-path-update'),
67
+ rpc('gw-path-get', 'GET', '/admin/paths/get', 'query', 'gw-path-get'),
68
+ rpc('gw-path-delete', 'DELETE', '/admin/paths', 'body', 'gw-path-delete'),
69
+ rpc('gw-route-log-list', 'GET', '/admin/route-log', 'query', 'gw-route-log-list'),
70
+ rpc('gw-route-log-search', 'GET', '/admin/route-log/search', 'query', 'gw-route-log-search'),
71
+ rpc('gw-auth-list', 'GET', '/admin/auth', 'query', 'gw-auth-list'),
72
+ rpc('gw-auth-search', 'GET', '/admin/auth/search', 'query', 'gw-auth-search'),
73
+ rpc('gw-auth-upsert', 'PUT', '/admin/auth', 'body', 'gw-auth-update'),
74
+ rpc('gw-auth-get', 'GET', '/admin/auth/get', 'query', 'gw-auth-get'),
75
+ rpc('gw-auth-delete', 'DELETE', '/admin/auth', 'body', 'gw-auth-delete'),
76
+ rpc('gw-metrics-get', 'GET', '/admin/metrics', 'query', 'gw-metrics-get'),
77
+ rpc('gw-metrics-series', 'GET', '/admin/metrics/series', 'query', 'gw-metrics-series'),
78
+ rpc('gw-metrics-points', 'GET', '/admin/metrics/points', 'query', 'gw-metrics-points'),
79
+ rpc('gw-metrics-summary', 'GET', '/admin/metrics/summary', 'query', 'gw-metrics-summary'),
80
+ {
81
+ name: 'gw-metrics-prometheus',
82
+ method: 'GET',
83
+ path: '/admin/metrics/prometheus',
84
+ dataSource: 'query',
85
+ topic: 'rlb-gateway-admin',
86
+ action: 'gw-metrics-prometheus',
87
+ mode: 'rpc',
88
+ headers: { 'Content-Type': 'text/plain; version=0.0.4' },
89
+ },
90
+ rpc('gw-metrics-rollups', 'GET', '/admin/metrics/rollups', 'query', 'gw-metrics-rollups'),
91
+ {
92
+ name: 'gw-metrics-track',
93
+ method: 'POST',
94
+ path: '/admin/metrics/track',
95
+ dataSource: 'body',
96
+ topic: 'rlb-gateway-admin',
97
+ action: 'gw-metrics-track',
98
+ mode: 'event',
99
+ },
100
+ { name: 'gw-reload', method: 'POST', path: '/admin/reload', dataSource: 'body', topic: controlTopic, action: 'gw-reload', mode: 'event' },
101
+ { name: 'gw-auth-reload', method: 'POST', path: '/admin/auth/reload', dataSource: 'body', topic: controlTopic, action: 'gw-auth-reload', mode: 'event' },
102
+ ];
103
+ }
@@ -0,0 +1,13 @@
1
+ export interface AddGatewayOptions {
2
+ exchange?: string;
3
+ aclQueue?: string;
4
+ adminQueue?: string;
5
+ controlTopic?: string;
6
+ routeExchange?: string;
7
+ routeQueue?: string;
8
+ acl?: boolean;
9
+ admin?: boolean;
10
+ routeReception?: boolean;
11
+ overwrite?: boolean;
12
+ config?: string;
13
+ }
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../../libs/rlb-nestjs-amqp/src/schematics/add-gateway/schema.ts"],"names":[],"mappings":""}
@@ -0,0 +1,63 @@
1
+ {
2
+ "$schema": "http://json-schema.org/schema",
3
+ "$id": "SchematicsRlbAmqpAddGateway",
4
+ "title": "Promote a microservice config to a gateway (config.yaml only)",
5
+ "type": "object",
6
+ "properties": {
7
+ "exchange": {
8
+ "type": "string",
9
+ "default": "rlb",
10
+ "description": "Main AMQP exchange backing the acl/admin queues."
11
+ },
12
+ "aclQueue": {
13
+ "type": "string",
14
+ "default": "rlb-acl",
15
+ "description": "Queue backing the fixed rlb-acl topic."
16
+ },
17
+ "adminQueue": {
18
+ "type": "string",
19
+ "default": "rlb-gateway-admin",
20
+ "description": "Queue backing the fixed rlb-gateway-admin topic."
21
+ },
22
+ "controlTopic": {
23
+ "type": "string",
24
+ "default": "rlb-gateway-control",
25
+ "description": "Broadcast control/reload topic name."
26
+ },
27
+ "routeExchange": {
28
+ "type": "string",
29
+ "default": "rlb-route-discovery",
30
+ "description": "Route-discovery fanout exchange (consumer side)."
31
+ },
32
+ "routeQueue": {
33
+ "type": "string",
34
+ "default": "rlb-route-sync",
35
+ "description": "Route-sync durable queue (consumer side)."
36
+ },
37
+ "acl": {
38
+ "type": "boolean",
39
+ "default": true,
40
+ "description": "Include ACL infra (rlb-acl topic/queue)."
41
+ },
42
+ "admin": {
43
+ "type": "boolean",
44
+ "default": true,
45
+ "description": "Include gateway-admin infra (rlb-gateway-admin topic/queue + control topic)."
46
+ },
47
+ "routeReception": {
48
+ "type": "boolean",
49
+ "default": true,
50
+ "description": "Consume routes auto-published by microservices (route-sync infra)."
51
+ },
52
+ "overwrite": {
53
+ "type": "boolean",
54
+ "default": false,
55
+ "description": "Update entries that already exist (default: leave them untouched)."
56
+ },
57
+ "config": {
58
+ "type": "string",
59
+ "description": "Path to config.yaml (default: auto-detected)."
60
+ }
61
+ },
62
+ "required": []
63
+ }
@@ -0,0 +1,24 @@
1
+ export interface AddGatewayOptions {
2
+ /** Main AMQP exchange backing the acl/admin queues. Default: 'rlb'. */
3
+ exchange?: string;
4
+ /** Queue backing the fixed rlb-acl topic. Default: 'rlb-acl'. */
5
+ aclQueue?: string;
6
+ /** Queue backing the fixed rlb-gateway-admin topic. Default: 'rlb-gateway-admin'. */
7
+ adminQueue?: string;
8
+ /** Broadcast control/reload topic name. Default: 'rlb-gateway-control'. */
9
+ controlTopic?: string;
10
+ /** Route-discovery fanout exchange (consumer side). Default: 'rlb-route-discovery'. */
11
+ routeExchange?: string;
12
+ /** Route-sync durable queue (consumer side). Default: 'rlb-route-sync'. */
13
+ routeQueue?: string;
14
+ /** Include ACL infra (rlb-acl topic/queue). Default: true. */
15
+ acl?: boolean;
16
+ /** Include gateway-admin infra (rlb-gateway-admin topic/queue + control topic). Default: true. */
17
+ admin?: boolean;
18
+ /** Consume routes auto-published by microservices (route-sync infra). Default: true. */
19
+ routeReception?: boolean;
20
+ /** Update entries that already exist (default: leave them untouched). */
21
+ overwrite?: boolean;
22
+ /** Path to config.yaml (default: auto-detected, typically config/config.yaml). */
23
+ config?: string;
24
+ }
@@ -0,0 +1,14 @@
1
+ import { WireEntry } from '../utils/nest-wiring.util';
2
+ export interface GwFeatures {
3
+ acl: boolean;
4
+ admin: boolean;
5
+ routeReception: boolean;
6
+ routeExchange: string;
7
+ routeQueue: string;
8
+ }
9
+ export declare function libSymbols(f: GwFeatures): string[];
10
+ export declare function importLines(f: GwFeatures): {
11
+ line: string;
12
+ marker: string;
13
+ }[];
14
+ export declare function moduleEntries(f: GwFeatures): WireEntry[];
@@ -0,0 +1,102 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.libSymbols = libSymbols;
4
+ exports.importLines = importLines;
5
+ exports.moduleEntries = moduleEntries;
6
+ const nest_wiring_util_1 = require("../utils/nest-wiring.util");
7
+ function libSymbols(f) {
8
+ const s = ['AppConfig', 'BrokerModule', 'BrokerTopic', 'GatewayConfig', 'HandlerAuthConfig', 'ProxyModule', 'RabbitMQConfig'];
9
+ if (f.acl)
10
+ s.push('AclActionRepository', 'AclGrantRepository', 'AclModule', 'AclRoleRepository', 'AclService', 'RLB_ACL_CACHE_STORE', 'RLB_GTW_ACL_ROLE_SERVICE');
11
+ if (f.admin || f.routeReception)
12
+ s.push('AuthProviderRepository', 'GatewayAdminModule', 'HttpMetricRepository', 'HttpPathRepository', 'RouteSyncLogRepository');
13
+ if (f.admin)
14
+ s.push('RLB_GTW_AUTH_PROVIDER_SOURCE');
15
+ return s;
16
+ }
17
+ function importLines(f) {
18
+ const lines = [
19
+ { line: `import { ConfigModule, ConfigService } from '@nestjs/config';`, marker: '@nestjs/config' },
20
+ { line: `import yamlConfig from './config/config.loader';`, marker: './config/config.loader' },
21
+ { line: `import { HttpModule } from '@nestjs/axios';`, marker: '@nestjs/axios' },
22
+ ];
23
+ if (f.acl) {
24
+ lines.push({ line: `import { InMemoryAclActionRepository, InMemoryAclGrantRepository, InMemoryAclRoleRepository } from './modules/database/repository/acl.repository';`, marker: './modules/database/repository/acl.repository' });
25
+ lines.push({ line: `import { InMemoryAclStore } from './cache/in-memory-acl-store';`, marker: './cache/in-memory-acl-store' });
26
+ }
27
+ if (f.admin || f.routeReception) {
28
+ lines.push({ line: `import { InMemoryAuthProviderRepository, InMemoryHttpMetricRepository, InMemoryHttpPathRepository } from './modules/database/repository/gateway.repository';`, marker: './modules/database/repository/gateway.repository' });
29
+ lines.push({ line: `import { InMemoryRouteSyncLogRepository } from './modules/database/repository/route-sync.repository';`, marker: './modules/database/repository/route-sync.repository' });
30
+ }
31
+ return lines;
32
+ }
33
+ const GATEWAY_SENTINEL = 'ProxyModule.forRootAsync';
34
+ function moduleEntries(f) {
35
+ const entries = [
36
+ (0, nest_wiring_util_1.configModuleEntry)(),
37
+ (0, nest_wiring_util_1.brokerModuleEntry)(),
38
+ { code: `HttpModule`, sentinel: GATEWAY_SENTINEL },
39
+ { code: proxyForRootAsync(f), sentinel: GATEWAY_SENTINEL },
40
+ ];
41
+ if (f.acl)
42
+ entries.push({ code: aclForRoot(), sentinel: 'AclModule.forRoot' });
43
+ if (f.admin || f.routeReception)
44
+ entries.push({ code: gatewayAdminForRoot(f), sentinel: 'GatewayAdminModule.forRoot' });
45
+ return entries;
46
+ }
47
+ function proxyForRootAsync(f) {
48
+ const provs = [];
49
+ if (f.acl)
50
+ provs.push(` // Action-gated paths resolve the caller's identity via AclService (in-process, no broker hop).
51
+ { provide: RLB_GTW_ACL_ROLE_SERVICE, useExisting: AclService },`);
52
+ if (f.admin)
53
+ provs.push(` // DB auth-provider source for the runtime registry; activated by a deliberate gw-auth-reload.
54
+ { provide: RLB_GTW_AUTH_PROVIDER_SOURCE, useExisting: InMemoryAuthProviderRepository },`);
55
+ const providers = provs.length ? `[\n${provs.join('\n')}\n ]` : `[]`;
56
+ return `ProxyModule.forRootAsync({
57
+ imports: [ConfigModule],
58
+ inject: [ConfigService],
59
+ useFactory: (configService: ConfigService) => ({
60
+ authOptions: configService.get<HandlerAuthConfig[]>('auth-providers'),
61
+ gatewayOptions: configService.get<GatewayConfig>('gateway'),
62
+ }),
63
+ providers: ${providers},
64
+ })`;
65
+ }
66
+ function aclForRoot() {
67
+ return `AclModule.forRoot(
68
+ [
69
+ InMemoryAclActionRepository,
70
+ { provide: AclActionRepository, useExisting: InMemoryAclActionRepository },
71
+ InMemoryAclRoleRepository,
72
+ { provide: AclRoleRepository, useExisting: InMemoryAclRoleRepository },
73
+ InMemoryAclGrantRepository,
74
+ { provide: AclGrantRepository, useExisting: InMemoryAclGrantRepository },
75
+ InMemoryAclStore,
76
+ { provide: RLB_ACL_CACHE_STORE, useExisting: InMemoryAclStore },
77
+ ],
78
+ { cache: { ramTtlMs: 30000, l2TtlSec: 600 } },
79
+ )`;
80
+ }
81
+ function gatewayAdminForRoot(f) {
82
+ const options = f.routeReception
83
+ ? `,
84
+ {
85
+ // Consumer-side route-discovery — names MUST match the publishers' broker.routeDiscovery.
86
+ routeDiscovery: { exchange: '${f.routeExchange}', queue: '${f.routeQueue}' },
87
+ }`
88
+ : '';
89
+ return `GatewayAdminModule.forRoot(
90
+ [
91
+ InMemoryHttpPathRepository,
92
+ { provide: HttpPathRepository, useExisting: InMemoryHttpPathRepository },
93
+ InMemoryAuthProviderRepository,
94
+ { provide: AuthProviderRepository, useExisting: InMemoryAuthProviderRepository },
95
+ InMemoryHttpMetricRepository,
96
+ { provide: HttpMetricRepository, useExisting: InMemoryHttpMetricRepository },
97
+ InMemoryRouteSyncLogRepository,
98
+ { provide: RouteSyncLogRepository, useExisting: InMemoryRouteSyncLogRepository },
99
+ ]${options},
100
+ )`;
101
+ }
102
+ //# sourceMappingURL=wiring.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wiring.js","sourceRoot":"","sources":["../../../libs/rlb-nestjs-amqp/src/schematics/add-gateway/wiring.ts"],"names":[],"mappings":"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"}