@kronos-ts/rabbitmq 0.2.1 → 0.3.1

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/dist/query-bus.js CHANGED
@@ -1,18 +1,93 @@
1
+ import { applySubscriptionFilter, createUpdateHandler, runAfterCommitOrImmediately, runInNewUoW, } from "@kronos-ts/messaging";
1
2
  import { qualifiedNameToString } from "@kronos-ts/common";
2
- import { runInNewUoW } from "@kronos-ts/messaging";
3
3
  /**
4
4
  * Distributed query bus decorator.
5
5
  *
6
- * Direct request/reply queries (`query` + `subscribe`) route over RabbitMQ.
7
- * Subscription queries (`subscriptionQuery`, `subscribeToUpdates`, `emitUpdate`,
8
- * `completeSubscription*`) remain process-local and delegate to the local
9
- * segment distributing subscription-query update streams over RabbitMQ is
10
- * intentionally out of scope for this version (see rabbitmq-extension-plan.md).
6
+ * Direct request/reply queries (`query` + `subscribe`) route over the
7
+ * request/reply transport.
8
+ *
9
+ * Subscription queries use a distributed-mirror model. Every subscribe
10
+ * publishes a `claim` over the gossip fanout exchange so every instance
11
+ * learns about it; every unsubscribe publishes a `release`. Each instance
12
+ * keeps a cluster-wide `Map<subId, SubscriberRecord>` mirror.
13
+ *
14
+ * `emitUpdate` walks the mirror locally (it holds every cluster-wide
15
+ * subscriber's payload), applies the filter — function predicates work
16
+ * because evaluation happens colocated with the payload, not over the wire —
17
+ * and routes per-subscriber delivery via the registry. Local subs are
18
+ * dispatched in-process; remote subs receive a `DeliverEnvelope` on the
19
+ * owner's direct queue.
20
+ *
21
+ * The same model handles `completeSubscription` and
22
+ * `completeSubscriptionExceptionally`.
23
+ *
24
+ * Falls back to local-only behaviour when no `subscriberRegistry` is supplied.
11
25
  */
12
26
  export function createRabbitMqQueryBus(options) {
13
27
  const localHandlers = new Set();
14
- const { localSegment, transport, config } = options;
15
- return {
28
+ const { localSegment, transport, subscriberRegistry, config } = options;
29
+ // UpdateHandlers for subs owned BY this instance, keyed by subId.
30
+ const localOwnedHandlers = new Map();
31
+ function applyDelivery(envelope) {
32
+ const handler = localOwnedHandlers.get(envelope.subId);
33
+ if (!handler)
34
+ return;
35
+ if (envelope.kind === "update") {
36
+ if (!handler.active) {
37
+ localOwnedHandlers.delete(envelope.subId);
38
+ return;
39
+ }
40
+ const accepted = handler.offer(envelope.update);
41
+ if (!accepted) {
42
+ handler.completeExceptionally(new Error("Subscription query update buffer overflow"));
43
+ localOwnedHandlers.delete(envelope.subId);
44
+ }
45
+ }
46
+ else if (envelope.kind === "complete") {
47
+ handler.complete();
48
+ localOwnedHandlers.delete(envelope.subId);
49
+ }
50
+ else if (envelope.kind === "completeExceptionally") {
51
+ const error = Object.assign(new Error(envelope.error.message), {
52
+ name: envelope.error.name ?? "RemoteSubscriptionError",
53
+ });
54
+ handler.completeExceptionally(error);
55
+ localOwnedHandlers.delete(envelope.subId);
56
+ }
57
+ }
58
+ if (subscriberRegistry) {
59
+ subscriberRegistry.setDeliverHandler(applyDelivery);
60
+ }
61
+ function registerSubscription(message, bufferSize) {
62
+ const subId = message.identifier;
63
+ if (localOwnedHandlers.has(subId)) {
64
+ throw new Error(`Subscription query already registered for identifier "${subId}"`);
65
+ }
66
+ const handler = createUpdateHandler(message, bufferSize);
67
+ localOwnedHandlers.set(subId, handler);
68
+ if (subscriberRegistry) {
69
+ void subscriberRegistry
70
+ .claim({
71
+ subId,
72
+ queryName: qualifiedNameToString(message.name),
73
+ payload: message.payload,
74
+ })
75
+ .catch(() => { });
76
+ }
77
+ return handler;
78
+ }
79
+ function unregisterSubscription(message) {
80
+ const subId = message.identifier;
81
+ const existing = localOwnedHandlers.get(subId);
82
+ if (!existing)
83
+ return;
84
+ localOwnedHandlers.delete(subId);
85
+ existing.complete();
86
+ if (subscriberRegistry) {
87
+ void subscriberRegistry.release(subId).catch(() => { });
88
+ }
89
+ }
90
+ const bus = {
16
91
  async query(message) {
17
92
  const queryName = qualifiedNameToString(message.name);
18
93
  const preferLocal = config.queries.preferLocalHandlers && !config.queries.alwaysUseDistributedBus;
@@ -46,23 +121,112 @@ export function createRabbitMqQueryBus(options) {
46
121
  }
47
122
  });
48
123
  },
49
- // Subscription queries stay process-local — see the doc comment above.
50
124
  subscriptionQuery(message, bufferSize) {
51
- return localSegment.subscriptionQuery(message, bufferSize);
125
+ const updateHandler = registerSubscription(message, bufferSize);
126
+ const initialResult = bus.query(message);
127
+ return {
128
+ initialResult,
129
+ updates: updateHandler.iterable,
130
+ close: () => unregisterSubscription(message),
131
+ };
52
132
  },
53
133
  subscribeToUpdates(message, bufferSize) {
54
- return localSegment.subscribeToUpdates(message, bufferSize);
134
+ const updateHandler = registerSubscription(message, bufferSize);
135
+ return {
136
+ [Symbol.asyncIterator]: () => updateHandler.iterable[Symbol.asyncIterator](),
137
+ close: () => unregisterSubscription(message),
138
+ };
55
139
  },
56
- emitUpdate(queryName, filter, update) {
57
- return localSegment.emitUpdate(queryName, filter, update);
140
+ async emitUpdate(queryName, filter, update) {
141
+ runAfterCommitOrImmediately(() => {
142
+ if (subscriberRegistry) {
143
+ for (const record of subscriberRegistry.records()) {
144
+ if (record.queryName !== queryName)
145
+ continue;
146
+ if (!applySubscriptionFilter(filter, record.payload))
147
+ continue;
148
+ void subscriberRegistry
149
+ .deliver({ kind: "update", subId: record.subId, update })
150
+ .catch(() => { });
151
+ }
152
+ return;
153
+ }
154
+ // Local-only mode: filter and offer against the local subscriber set.
155
+ for (const [id, handler] of localOwnedHandlers) {
156
+ if (!handler.active) {
157
+ localOwnedHandlers.delete(id);
158
+ continue;
159
+ }
160
+ const handlerQueryName = qualifiedNameToString(handler.query.name);
161
+ if (handlerQueryName !== queryName)
162
+ continue;
163
+ if (!applySubscriptionFilter(filter, handler.query.payload))
164
+ continue;
165
+ const accepted = handler.offer(update);
166
+ if (!accepted) {
167
+ handler.completeExceptionally(new Error("Subscription query update buffer overflow"));
168
+ localOwnedHandlers.delete(id);
169
+ }
170
+ }
171
+ });
58
172
  },
59
- completeSubscription(queryName, filter) {
60
- return localSegment.completeSubscription(queryName, filter);
173
+ async completeSubscription(queryName, filter) {
174
+ runAfterCommitOrImmediately(() => {
175
+ if (subscriberRegistry) {
176
+ for (const record of subscriberRegistry.records()) {
177
+ if (record.queryName !== queryName)
178
+ continue;
179
+ if (filter && !applySubscriptionFilter(filter, record.payload))
180
+ continue;
181
+ void subscriberRegistry
182
+ .deliver({ kind: "complete", subId: record.subId })
183
+ .catch(() => { });
184
+ }
185
+ return;
186
+ }
187
+ for (const [id, handler] of localOwnedHandlers) {
188
+ const handlerQueryName = qualifiedNameToString(handler.query.name);
189
+ if (handlerQueryName !== queryName)
190
+ continue;
191
+ if (filter && !applySubscriptionFilter(filter, handler.query.payload))
192
+ continue;
193
+ handler.complete();
194
+ localOwnedHandlers.delete(id);
195
+ }
196
+ });
61
197
  },
62
- completeSubscriptionExceptionally(queryName, error, filter) {
63
- return localSegment.completeSubscriptionExceptionally(queryName, error, filter);
198
+ async completeSubscriptionExceptionally(queryName, error, filter) {
199
+ runAfterCommitOrImmediately(() => {
200
+ if (subscriberRegistry) {
201
+ const serialized = serializeError(error) ?? { message: String(error) };
202
+ for (const record of subscriberRegistry.records()) {
203
+ if (record.queryName !== queryName)
204
+ continue;
205
+ if (filter && !applySubscriptionFilter(filter, record.payload))
206
+ continue;
207
+ void subscriberRegistry
208
+ .deliver({
209
+ kind: "completeExceptionally",
210
+ subId: record.subId,
211
+ error: serialized,
212
+ })
213
+ .catch(() => { });
214
+ }
215
+ return;
216
+ }
217
+ for (const [id, handler] of localOwnedHandlers) {
218
+ const handlerQueryName = qualifiedNameToString(handler.query.name);
219
+ if (handlerQueryName !== queryName)
220
+ continue;
221
+ if (filter && !applySubscriptionFilter(filter, handler.query.payload))
222
+ continue;
223
+ handler.completeExceptionally(error);
224
+ localOwnedHandlers.delete(id);
225
+ }
226
+ });
64
227
  },
65
228
  };
229
+ return bus;
66
230
  }
67
231
  function serializeError(error) {
68
232
  if (error instanceof Error) {
@@ -1 +1 @@
1
- {"version":3,"file":"query-bus.js","sourceRoot":"","sources":["../src/query-bus.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"query-bus.js","sourceRoot":"","sources":["../src/query-bus.ts"],"names":[],"mappings":"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"}
@@ -41,10 +41,11 @@ export declare function resolveRabbitMqConfig(app: App, config: RabbitMqExtensio
41
41
  /**
42
42
  * RabbitMQ distributed messaging extension.
43
43
  *
44
- * Wraps the command and query buses with RabbitMQ-backed request/reply
45
- * transports. Both transports share a single broker connection, each taking
46
- * its own channel. Subscription queries remain process-local distributing
47
- * their update streams is out of scope for this version.
44
+ * Wraps the command and query buses with RabbitMQ-backed transports.
45
+ * Direct request/reply commands and queries share one channel each; a third
46
+ * channel hosts the subscription-query update broadcast (topic exchange plus
47
+ * an exclusive per-instance queue). All three share a single broker
48
+ * connection.
48
49
  */
49
50
  export declare function rabbitMq(config: RabbitMqExtensionConfig): (app: App) => void;
50
51
  //# sourceMappingURL=rabbitmq.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"rabbitmq.d.ts","sourceRoot":"","sources":["../src/rabbitmq.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AACzD,OAAO,EAAE,2BAA2B,EAAE,KAAK,sBAAsB,EAAE,MAAM,eAAe,CAAA;AAOxF,MAAM,WAAW,6BAA6B;IAC5C,8FAA8F;IAC9F,QAAQ,CAAC,mBAAmB,CAAC,EAAE,OAAO,CAAA;IACtC,qFAAqF;IACrF,QAAQ,CAAC,uBAAuB,CAAC,EAAE,OAAO,CAAA;IAC1C,0EAA0E;IAC1E,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAA;CACnC;AAED,MAAM,WAAW,2BAA2B;IAC1C,8FAA8F;IAC9F,QAAQ,CAAC,mBAAmB,CAAC,EAAE,OAAO,CAAA;IACtC,mFAAmF;IACnF,QAAQ,CAAC,uBAAuB,CAAC,EAAE,OAAO,CAAA;IAC1C,wEAAwE;IACxE,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAA;CACnC;AAED,MAAM,WAAW,mBAAmB;IAClC,4FAA4F;IAC5F,QAAQ,CAAC,UAAU,CAAC,EAAE,OAAO,CAAA;IAC7B,wDAAwD;IACxD,QAAQ,CAAC,kBAAkB,CAAC,EAAE,MAAM,CAAA;CACrC;AAED,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;IACpB,QAAQ,CAAC,QAAQ,CAAC,EAAE,sBAAsB,CAAA;IAC1C,QAAQ,CAAC,QAAQ,CAAC,EAAE,6BAA6B,CAAA;IACjD,QAAQ,CAAC,OAAO,CAAC,EAAE,2BAA2B,CAAA;IAC9C,QAAQ,CAAC,KAAK,CAAC,EAAE,mBAAmB,CAAA;CACrC;AAED,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,QAAQ,EAAE,cAAc,CAAA;IACjC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;IACpB,QAAQ,CAAC,QAAQ,EAAE,UAAU,CAAC,OAAO,2BAA2B,CAAC,CAAA;IACjE,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC,6BAA6B,CAAC,CAAA;IAC1D,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,2BAA2B,CAAC,CAAA;IACvD,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,mBAAmB,CAAC,CAAA;CAC9C;AAED,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,uBAAuB,GAAG,sBAAsB,CAoBvG;AAED;;;;;;;GAOG;AACH,wBAAgB,QAAQ,CAAC,MAAM,EAAE,uBAAuB,GAAG,CAAC,GAAG,EAAE,GAAG,KAAK,IAAI,CA6B5E"}
1
+ {"version":3,"file":"rabbitmq.d.ts","sourceRoot":"","sources":["../src/rabbitmq.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AACzD,OAAO,EAAE,2BAA2B,EAAE,KAAK,sBAAsB,EAAE,MAAM,eAAe,CAAA;AAQxF,MAAM,WAAW,6BAA6B;IAC5C,8FAA8F;IAC9F,QAAQ,CAAC,mBAAmB,CAAC,EAAE,OAAO,CAAA;IACtC,qFAAqF;IACrF,QAAQ,CAAC,uBAAuB,CAAC,EAAE,OAAO,CAAA;IAC1C,0EAA0E;IAC1E,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAA;CACnC;AAED,MAAM,WAAW,2BAA2B;IAC1C,8FAA8F;IAC9F,QAAQ,CAAC,mBAAmB,CAAC,EAAE,OAAO,CAAA;IACtC,mFAAmF;IACnF,QAAQ,CAAC,uBAAuB,CAAC,EAAE,OAAO,CAAA;IAC1C,wEAAwE;IACxE,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAA;CACnC;AAED,MAAM,WAAW,mBAAmB;IAClC,4FAA4F;IAC5F,QAAQ,CAAC,UAAU,CAAC,EAAE,OAAO,CAAA;IAC7B,wDAAwD;IACxD,QAAQ,CAAC,kBAAkB,CAAC,EAAE,MAAM,CAAA;CACrC;AAED,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;IACpB,QAAQ,CAAC,QAAQ,CAAC,EAAE,sBAAsB,CAAA;IAC1C,QAAQ,CAAC,QAAQ,CAAC,EAAE,6BAA6B,CAAA;IACjD,QAAQ,CAAC,OAAO,CAAC,EAAE,2BAA2B,CAAA;IAC9C,QAAQ,CAAC,KAAK,CAAC,EAAE,mBAAmB,CAAA;CACrC;AAED,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,QAAQ,EAAE,cAAc,CAAA;IACjC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;IACpB,QAAQ,CAAC,QAAQ,EAAE,UAAU,CAAC,OAAO,2BAA2B,CAAC,CAAA;IACjE,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC,6BAA6B,CAAC,CAAA;IAC1D,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,2BAA2B,CAAC,CAAA;IACvD,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,mBAAmB,CAAC,CAAA;CAC9C;AAED,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,uBAAuB,GAAG,sBAAsB,CAoBvG;AAED;;;;;;;;GAQG;AACH,wBAAgB,QAAQ,CAAC,MAAM,EAAE,uBAAuB,GAAG,CAAC,GAAG,EAAE,GAAG,KAAK,IAAI,CAiC5E"}
package/dist/rabbitmq.js CHANGED
@@ -3,6 +3,7 @@ import { createRabbitMqCommandBus } from "./command-bus.js";
3
3
  import { createRabbitMqQueryBus } from "./query-bus.js";
4
4
  import { AmqpRabbitMqCommandTransport } from "./amqp-command-transport.js";
5
5
  import { AmqpRabbitMqQueryTransport } from "./amqp-query-transport.js";
6
+ import { AmqpDistributedSubscriberRegistry } from "./distributed-subscriber-registry.js";
6
7
  import { createAmqpConnection } from "./connection.js";
7
8
  export function resolveRabbitMqConfig(app, config) {
8
9
  return {
@@ -28,10 +29,11 @@ export function resolveRabbitMqConfig(app, config) {
28
29
  /**
29
30
  * RabbitMQ distributed messaging extension.
30
31
  *
31
- * Wraps the command and query buses with RabbitMQ-backed request/reply
32
- * transports. Both transports share a single broker connection, each taking
33
- * its own channel. Subscription queries remain process-local distributing
34
- * their update streams is out of scope for this version.
32
+ * Wraps the command and query buses with RabbitMQ-backed transports.
33
+ * Direct request/reply commands and queries share one channel each; a third
34
+ * channel hosts the subscription-query update broadcast (topic exchange plus
35
+ * an exclusive per-instance queue). All three share a single broker
36
+ * connection.
35
37
  */
36
38
  export function rabbitMq(config) {
37
39
  return (app) => {
@@ -39,6 +41,7 @@ export function rabbitMq(config) {
39
41
  const connection = createAmqpConnection(resolved.url);
40
42
  const commandTransport = new AmqpRabbitMqCommandTransport(resolved, connection);
41
43
  const queryTransport = new AmqpRabbitMqQueryTransport(resolved, connection);
44
+ const subscriberRegistry = new AmqpDistributedSubscriberRegistry(resolved, connection);
42
45
  app.decorate("commandBus", (localSegment) => createRabbitMqCommandBus({
43
46
  localSegment,
44
47
  transport: commandTransport,
@@ -47,12 +50,15 @@ export function rabbitMq(config) {
47
50
  app.decorate("queryBus", (localSegment) => createRabbitMqQueryBus({
48
51
  localSegment,
49
52
  transport: queryTransport,
53
+ subscriberRegistry,
50
54
  config: resolved,
51
55
  }));
52
56
  app.onStart("connect", () => commandTransport.connect());
53
57
  app.onStart("connect", () => queryTransport.connect());
58
+ app.onStart("connect", () => subscriberRegistry.connect());
54
59
  app.onStop("connect", () => commandTransport.close());
55
60
  app.onStop("connect", () => queryTransport.close());
61
+ app.onStop("connect", () => subscriberRegistry.close());
56
62
  app.onStop("connect", () => connection.close());
57
63
  };
58
64
  }
@@ -1 +1 @@
1
- {"version":3,"file":"rabbitmq.js","sourceRoot":"","sources":["../src/rabbitmq.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"rabbitmq.js","sourceRoot":"","sources":["../src/rabbitmq.ts"],"names":[],"mappings":"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"}
@@ -4,15 +4,21 @@ export interface RabbitMqTopologyConfig {
4
4
  readonly prefix?: string;
5
5
  readonly commandsExchange?: string;
6
6
  readonly queriesExchange?: string;
7
+ readonly subscribersGossipExchange?: string;
8
+ readonly subscribersDirectExchange?: string;
7
9
  readonly durableQueues?: boolean;
8
10
  }
9
11
  export interface RabbitMqTopologyNames {
10
12
  readonly commandsExchange: string;
11
13
  readonly queriesExchange: string;
14
+ readonly subscribersGossipExchange: string;
15
+ readonly subscribersDirectExchange: string;
12
16
  commandRoutingKey(commandName: QualifiedName | string): string;
13
17
  commandQueue(commandName: QualifiedName | string): string;
14
18
  queryRoutingKey(queryName: QualifiedName | string): string;
15
19
  queryQueue(queryName: QualifiedName | string): string;
20
+ subscribersGossipQueue(): string;
21
+ subscribersDirectQueue(): string;
16
22
  commandReplyQueue(): string;
17
23
  queryReplyQueue(): string;
18
24
  }
@@ -1 +1 @@
1
- {"version":3,"file":"topology.d.ts","sourceRoot":"","sources":["../src/topology.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AACtD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAEpD,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAA;IAClC,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAA;IACjC,QAAQ,CAAC,aAAa,CAAC,EAAE,OAAO,CAAA;CACjC;AAED,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAA;IACjC,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAA;IAChC,iBAAiB,CAAC,WAAW,EAAE,aAAa,GAAG,MAAM,GAAG,MAAM,CAAA;IAC9D,YAAY,CAAC,WAAW,EAAE,aAAa,GAAG,MAAM,GAAG,MAAM,CAAA;IACzD,eAAe,CAAC,SAAS,EAAE,aAAa,GAAG,MAAM,GAAG,MAAM,CAAA;IAC1D,UAAU,CAAC,SAAS,EAAE,aAAa,GAAG,MAAM,GAAG,MAAM,CAAA;IACrD,iBAAiB,IAAI,MAAM,CAAA;IAC3B,eAAe,IAAI,MAAM,CAAA;CAC1B;AAED,wBAAgB,2BAA2B,CACzC,QAAQ,EAAE,cAAc,EACxB,MAAM,GAAE,sBAA2B,GAClC,qBAAqB,CA6BvB"}
1
+ {"version":3,"file":"topology.d.ts","sourceRoot":"","sources":["../src/topology.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AACtD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAEpD,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAA;IAClC,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAA;IACjC,QAAQ,CAAC,yBAAyB,CAAC,EAAE,MAAM,CAAA;IAC3C,QAAQ,CAAC,yBAAyB,CAAC,EAAE,MAAM,CAAA;IAC3C,QAAQ,CAAC,aAAa,CAAC,EAAE,OAAO,CAAA;CACjC;AAED,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAA;IACjC,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAA;IAChC,QAAQ,CAAC,yBAAyB,EAAE,MAAM,CAAA;IAC1C,QAAQ,CAAC,yBAAyB,EAAE,MAAM,CAAA;IAC1C,iBAAiB,CAAC,WAAW,EAAE,aAAa,GAAG,MAAM,GAAG,MAAM,CAAA;IAC9D,YAAY,CAAC,WAAW,EAAE,aAAa,GAAG,MAAM,GAAG,MAAM,CAAA;IACzD,eAAe,CAAC,SAAS,EAAE,aAAa,GAAG,MAAM,GAAG,MAAM,CAAA;IAC1D,UAAU,CAAC,SAAS,EAAE,aAAa,GAAG,MAAM,GAAG,MAAM,CAAA;IACrD,sBAAsB,IAAI,MAAM,CAAA;IAChC,sBAAsB,IAAI,MAAM,CAAA;IAChC,iBAAiB,IAAI,MAAM,CAAA;IAC3B,eAAe,IAAI,MAAM,CAAA;CAC1B;AAED,wBAAgB,2BAA2B,CACzC,QAAQ,EAAE,cAAc,EACxB,MAAM,GAAE,sBAA2B,GAClC,qBAAqB,CAyCvB"}
package/dist/topology.js CHANGED
@@ -4,9 +4,13 @@ export function createRabbitMqTopologyNames(identity, config = {}) {
4
4
  const instance = sanitizeSegment(identity.instanceId);
5
5
  const commandsExchange = config.commandsExchange ?? `${prefix}.commands`;
6
6
  const queriesExchange = config.queriesExchange ?? `${prefix}.queries`;
7
+ const subscribersGossipExchange = config.subscribersGossipExchange ?? `${prefix}.subscribers.gossip`;
8
+ const subscribersDirectExchange = config.subscribersDirectExchange ?? `${prefix}.subscribers.direct`;
7
9
  return {
8
10
  commandsExchange,
9
11
  queriesExchange,
12
+ subscribersGossipExchange,
13
+ subscribersDirectExchange,
10
14
  commandRoutingKey(commandName) {
11
15
  return messageName(commandName);
12
16
  },
@@ -19,6 +23,12 @@ export function createRabbitMqTopologyNames(identity, config = {}) {
19
23
  queryQueue(queryName) {
20
24
  return `${prefix}.queries.${service}.${sanitizeMessageName(messageName(queryName))}`;
21
25
  },
26
+ subscribersGossipQueue() {
27
+ return `${prefix}.subscribers.gossip.${service}.${instance}`;
28
+ },
29
+ subscribersDirectQueue() {
30
+ return `${prefix}.subscribers.direct.${service}.${instance}`;
31
+ },
22
32
  commandReplyQueue() {
23
33
  return `${prefix}.replies.${service}.${instance}`;
24
34
  },
@@ -1 +1 @@
1
- {"version":3,"file":"topology.js","sourceRoot":"","sources":["../src/topology.ts"],"names":[],"mappings":"AAqBA,MAAM,UAAU,2BAA2B,CACzC,QAAwB,EACxB,SAAiC,EAAE;IAEnC,MAAM,MAAM,GAAG,eAAe,CAAC,MAAM,CAAC,MAAM,IAAI,QAAQ,CAAC,CAAA;IACzD,MAAM,OAAO,GAAG,eAAe,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAA;IACrD,MAAM,QAAQ,GAAG,eAAe,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAA;IACrD,MAAM,gBAAgB,GAAG,MAAM,CAAC,gBAAgB,IAAI,GAAG,MAAM,WAAW,CAAA;IACxE,MAAM,eAAe,GAAG,MAAM,CAAC,eAAe,IAAI,GAAG,MAAM,UAAU,CAAA;IAErE,OAAO;QACL,gBAAgB;QAChB,eAAe;QACf,iBAAiB,CAAC,WAAW;YAC3B,OAAO,WAAW,CAAC,WAAW,CAAC,CAAA;QACjC,CAAC;QACD,YAAY,CAAC,WAAW;YACtB,OAAO,GAAG,MAAM,aAAa,OAAO,IAAI,mBAAmB,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC,EAAE,CAAA;QACzF,CAAC;QACD,eAAe,CAAC,SAAS;YACvB,OAAO,WAAW,CAAC,SAAS,CAAC,CAAA;QAC/B,CAAC;QACD,UAAU,CAAC,SAAS;YAClB,OAAO,GAAG,MAAM,YAAY,OAAO,IAAI,mBAAmB,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,EAAE,CAAA;QACtF,CAAC;QACD,iBAAiB;YACf,OAAO,GAAG,MAAM,YAAY,OAAO,IAAI,QAAQ,EAAE,CAAA;QACnD,CAAC;QACD,eAAe;YACb,OAAO,GAAG,MAAM,kBAAkB,OAAO,IAAI,QAAQ,EAAE,CAAA;QACzD,CAAC;KACF,CAAA;AACH,CAAC;AAED,SAAS,WAAW,CAAC,IAA4B;IAC/C,IAAI,OAAO,IAAI,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAA;IACzC,MAAM,KAAK,GAAG,IAA4E,CAAA;IAC1F,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,SAAS,CAAA;IAC3C,OAAO,KAAK,CAAC,SAAS,IAAI,KAAK,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,SAAS,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;AAChF,CAAC;AAED,SAAS,mBAAmB,CAAC,KAAa;IACxC,OAAO,KAAK,CAAC,OAAO,CAAC,kBAAkB,EAAE,GAAG,CAAC,CAAA;AAC/C,CAAC;AAED,SAAS,eAAe,CAAC,KAAa;IACpC,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAA;IAC5B,IAAI,CAAC,OAAO;QAAE,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAA;IAC5E,OAAO,mBAAmB,CAAC,OAAO,CAAC,CAAA;AACrC,CAAC"}
1
+ {"version":3,"file":"topology.js","sourceRoot":"","sources":["../src/topology.ts"],"names":[],"mappings":"AA2BA,MAAM,UAAU,2BAA2B,CACzC,QAAwB,EACxB,SAAiC,EAAE;IAEnC,MAAM,MAAM,GAAG,eAAe,CAAC,MAAM,CAAC,MAAM,IAAI,QAAQ,CAAC,CAAA;IACzD,MAAM,OAAO,GAAG,eAAe,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAA;IACrD,MAAM,QAAQ,GAAG,eAAe,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAA;IACrD,MAAM,gBAAgB,GAAG,MAAM,CAAC,gBAAgB,IAAI,GAAG,MAAM,WAAW,CAAA;IACxE,MAAM,eAAe,GAAG,MAAM,CAAC,eAAe,IAAI,GAAG,MAAM,UAAU,CAAA;IACrE,MAAM,yBAAyB,GAC7B,MAAM,CAAC,yBAAyB,IAAI,GAAG,MAAM,qBAAqB,CAAA;IACpE,MAAM,yBAAyB,GAC7B,MAAM,CAAC,yBAAyB,IAAI,GAAG,MAAM,qBAAqB,CAAA;IAEpE,OAAO;QACL,gBAAgB;QAChB,eAAe;QACf,yBAAyB;QACzB,yBAAyB;QACzB,iBAAiB,CAAC,WAAW;YAC3B,OAAO,WAAW,CAAC,WAAW,CAAC,CAAA;QACjC,CAAC;QACD,YAAY,CAAC,WAAW;YACtB,OAAO,GAAG,MAAM,aAAa,OAAO,IAAI,mBAAmB,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC,EAAE,CAAA;QACzF,CAAC;QACD,eAAe,CAAC,SAAS;YACvB,OAAO,WAAW,CAAC,SAAS,CAAC,CAAA;QAC/B,CAAC;QACD,UAAU,CAAC,SAAS;YAClB,OAAO,GAAG,MAAM,YAAY,OAAO,IAAI,mBAAmB,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,EAAE,CAAA;QACtF,CAAC;QACD,sBAAsB;YACpB,OAAO,GAAG,MAAM,uBAAuB,OAAO,IAAI,QAAQ,EAAE,CAAA;QAC9D,CAAC;QACD,sBAAsB;YACpB,OAAO,GAAG,MAAM,uBAAuB,OAAO,IAAI,QAAQ,EAAE,CAAA;QAC9D,CAAC;QACD,iBAAiB;YACf,OAAO,GAAG,MAAM,YAAY,OAAO,IAAI,QAAQ,EAAE,CAAA;QACnD,CAAC;QACD,eAAe;YACb,OAAO,GAAG,MAAM,kBAAkB,OAAO,IAAI,QAAQ,EAAE,CAAA;QACzD,CAAC;KACF,CAAA;AACH,CAAC;AAED,SAAS,WAAW,CAAC,IAA4B;IAC/C,IAAI,OAAO,IAAI,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAA;IACzC,MAAM,KAAK,GAAG,IAA4E,CAAA;IAC1F,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,SAAS,CAAA;IAC3C,OAAO,KAAK,CAAC,SAAS,IAAI,KAAK,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,SAAS,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;AAChF,CAAC;AAED,SAAS,mBAAmB,CAAC,KAAa;IACxC,OAAO,KAAK,CAAC,OAAO,CAAC,kBAAkB,EAAE,GAAG,CAAC,CAAA;AAC/C,CAAC;AAED,SAAS,eAAe,CAAC,KAAa;IACpC,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAA;IAC5B,IAAI,CAAC,OAAO;QAAE,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAA;IAC5E,OAAO,mBAAmB,CAAC,OAAO,CAAC,CAAA;AACrC,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kronos-ts/rabbitmq",
3
- "version": "0.2.1",
3
+ "version": "0.3.1",
4
4
  "description": "RabbitMQ extension for Kronos — distributed command and query transport.",
5
5
  "license": "Apache-2.0",
6
6
  "type": "module",