@horizon-republic/nestjs-jetstream 2.2.0 → 2.3.2

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 (161) hide show
  1. package/README.md +129 -80
  2. package/dist/index.cjs +2068 -0
  3. package/dist/index.cjs.map +1 -0
  4. package/dist/index.d.cts +995 -0
  5. package/dist/index.d.ts +995 -13
  6. package/dist/index.js +2068 -39
  7. package/dist/index.js.map +1 -1
  8. package/package.json +29 -19
  9. package/dist/client/index.d.ts +0 -3
  10. package/dist/client/index.d.ts.map +0 -1
  11. package/dist/client/index.js +0 -9
  12. package/dist/client/index.js.map +0 -1
  13. package/dist/client/jetstream.client.d.ts +0 -76
  14. package/dist/client/jetstream.client.d.ts.map +0 -1
  15. package/dist/client/jetstream.client.js +0 -325
  16. package/dist/client/jetstream.client.js.map +0 -1
  17. package/dist/client/jetstream.record.d.ts +0 -55
  18. package/dist/client/jetstream.record.d.ts.map +0 -1
  19. package/dist/client/jetstream.record.js +0 -84
  20. package/dist/client/jetstream.record.js.map +0 -1
  21. package/dist/codec/index.d.ts +0 -2
  22. package/dist/codec/index.d.ts.map +0 -1
  23. package/dist/codec/index.js +0 -6
  24. package/dist/codec/index.js.map +0 -1
  25. package/dist/codec/json.codec.d.ts +0 -20
  26. package/dist/codec/json.codec.d.ts.map +0 -1
  27. package/dist/codec/json.codec.js +0 -30
  28. package/dist/codec/json.codec.js.map +0 -1
  29. package/dist/connection/connection.provider.d.ts +0 -50
  30. package/dist/connection/connection.provider.d.ts.map +0 -1
  31. package/dist/connection/connection.provider.js +0 -141
  32. package/dist/connection/connection.provider.js.map +0 -1
  33. package/dist/connection/index.d.ts +0 -2
  34. package/dist/connection/index.d.ts.map +0 -1
  35. package/dist/connection/index.js +0 -6
  36. package/dist/connection/index.js.map +0 -1
  37. package/dist/context/index.d.ts +0 -2
  38. package/dist/context/index.d.ts.map +0 -1
  39. package/dist/context/index.js +0 -6
  40. package/dist/context/index.js.map +0 -1
  41. package/dist/context/rpc.context.d.ts +0 -35
  42. package/dist/context/rpc.context.d.ts.map +0 -1
  43. package/dist/context/rpc.context.js +0 -44
  44. package/dist/context/rpc.context.js.map +0 -1
  45. package/dist/health/index.d.ts +0 -3
  46. package/dist/health/index.d.ts.map +0 -1
  47. package/dist/health/index.js +0 -6
  48. package/dist/health/index.js.map +0 -1
  49. package/dist/health/jetstream.health-indicator.d.ts +0 -47
  50. package/dist/health/jetstream.health-indicator.d.ts.map +0 -1
  51. package/dist/health/jetstream.health-indicator.js +0 -85
  52. package/dist/health/jetstream.health-indicator.js.map +0 -1
  53. package/dist/hooks/event-bus.d.ts +0 -31
  54. package/dist/hooks/event-bus.d.ts.map +0 -1
  55. package/dist/hooks/event-bus.js +0 -79
  56. package/dist/hooks/event-bus.js.map +0 -1
  57. package/dist/hooks/index.d.ts +0 -2
  58. package/dist/hooks/index.d.ts.map +0 -1
  59. package/dist/hooks/index.js +0 -6
  60. package/dist/hooks/index.js.map +0 -1
  61. package/dist/index.d.ts.map +0 -1
  62. package/dist/interfaces/client.interface.d.ts +0 -14
  63. package/dist/interfaces/client.interface.d.ts.map +0 -1
  64. package/dist/interfaces/client.interface.js +0 -3
  65. package/dist/interfaces/client.interface.js.map +0 -1
  66. package/dist/interfaces/codec.interface.d.ts +0 -28
  67. package/dist/interfaces/codec.interface.d.ts.map +0 -1
  68. package/dist/interfaces/codec.interface.js +0 -3
  69. package/dist/interfaces/codec.interface.js.map +0 -1
  70. package/dist/interfaces/hooks.interface.d.ts +0 -71
  71. package/dist/interfaces/hooks.interface.d.ts.map +0 -1
  72. package/dist/interfaces/hooks.interface.js +0 -16
  73. package/dist/interfaces/hooks.interface.js.map +0 -1
  74. package/dist/interfaces/index.d.ts +0 -8
  75. package/dist/interfaces/index.d.ts.map +0 -1
  76. package/dist/interfaces/index.js +0 -6
  77. package/dist/interfaces/index.js.map +0 -1
  78. package/dist/interfaces/options.interface.d.ts +0 -142
  79. package/dist/interfaces/options.interface.d.ts.map +0 -1
  80. package/dist/interfaces/options.interface.js +0 -3
  81. package/dist/interfaces/options.interface.js.map +0 -1
  82. package/dist/interfaces/routing.interface.d.ts +0 -15
  83. package/dist/interfaces/routing.interface.d.ts.map +0 -1
  84. package/dist/interfaces/routing.interface.js +0 -3
  85. package/dist/interfaces/routing.interface.js.map +0 -1
  86. package/dist/interfaces/stream.interface.d.ts +0 -5
  87. package/dist/interfaces/stream.interface.d.ts.map +0 -1
  88. package/dist/interfaces/stream.interface.js +0 -3
  89. package/dist/interfaces/stream.interface.js.map +0 -1
  90. package/dist/jetstream.constants.d.ts +0 -58
  91. package/dist/jetstream.constants.d.ts.map +0 -1
  92. package/dist/jetstream.constants.js +0 -168
  93. package/dist/jetstream.constants.js.map +0 -1
  94. package/dist/jetstream.module.d.ts +0 -89
  95. package/dist/jetstream.module.d.ts.map +0 -1
  96. package/dist/jetstream.module.js +0 -410
  97. package/dist/jetstream.module.js.map +0 -1
  98. package/dist/server/core-rpc.server.d.ts +0 -31
  99. package/dist/server/core-rpc.server.d.ts.map +0 -1
  100. package/dist/server/core-rpc.server.js +0 -95
  101. package/dist/server/core-rpc.server.js.map +0 -1
  102. package/dist/server/index.d.ts +0 -5
  103. package/dist/server/index.d.ts.map +0 -1
  104. package/dist/server/index.js +0 -16
  105. package/dist/server/index.js.map +0 -1
  106. package/dist/server/infrastructure/consumer.provider.d.ts +0 -36
  107. package/dist/server/infrastructure/consumer.provider.d.ts.map +0 -1
  108. package/dist/server/infrastructure/consumer.provider.js +0 -123
  109. package/dist/server/infrastructure/consumer.provider.js.map +0 -1
  110. package/dist/server/infrastructure/index.d.ts +0 -4
  111. package/dist/server/infrastructure/index.d.ts.map +0 -1
  112. package/dist/server/infrastructure/index.js +0 -10
  113. package/dist/server/infrastructure/index.js.map +0 -1
  114. package/dist/server/infrastructure/message.provider.d.ts +0 -46
  115. package/dist/server/infrastructure/message.provider.d.ts.map +0 -1
  116. package/dist/server/infrastructure/message.provider.js +0 -100
  117. package/dist/server/infrastructure/message.provider.js.map +0 -1
  118. package/dist/server/infrastructure/stream.provider.d.ts +0 -38
  119. package/dist/server/infrastructure/stream.provider.d.ts.map +0 -1
  120. package/dist/server/infrastructure/stream.provider.js +0 -109
  121. package/dist/server/infrastructure/stream.provider.js.map +0 -1
  122. package/dist/server/routing/event.router.d.ts +0 -56
  123. package/dist/server/routing/event.router.d.ts.map +0 -1
  124. package/dist/server/routing/event.router.js +0 -132
  125. package/dist/server/routing/event.router.js.map +0 -1
  126. package/dist/server/routing/index.d.ts +0 -5
  127. package/dist/server/routing/index.d.ts.map +0 -1
  128. package/dist/server/routing/index.js +0 -10
  129. package/dist/server/routing/index.js.map +0 -1
  130. package/dist/server/routing/pattern-registry.d.ts +0 -39
  131. package/dist/server/routing/pattern-registry.d.ts.map +0 -1
  132. package/dist/server/routing/pattern-registry.js +0 -116
  133. package/dist/server/routing/pattern-registry.js.map +0 -1
  134. package/dist/server/routing/rpc.router.d.ts +0 -37
  135. package/dist/server/routing/rpc.router.d.ts.map +0 -1
  136. package/dist/server/routing/rpc.router.js +0 -121
  137. package/dist/server/routing/rpc.router.js.map +0 -1
  138. package/dist/server/strategy.d.ts +0 -55
  139. package/dist/server/strategy.d.ts.map +0 -1
  140. package/dist/server/strategy.js +0 -113
  141. package/dist/server/strategy.js.map +0 -1
  142. package/dist/shutdown/index.d.ts +0 -2
  143. package/dist/shutdown/index.d.ts.map +0 -1
  144. package/dist/shutdown/index.js +0 -6
  145. package/dist/shutdown/index.js.map +0 -1
  146. package/dist/shutdown/shutdown.manager.d.ts +0 -27
  147. package/dist/shutdown/shutdown.manager.d.ts.map +0 -1
  148. package/dist/shutdown/shutdown.manager.js +0 -45
  149. package/dist/shutdown/shutdown.manager.js.map +0 -1
  150. package/dist/utils/index.d.ts +0 -3
  151. package/dist/utils/index.d.ts.map +0 -1
  152. package/dist/utils/index.js +0 -8
  153. package/dist/utils/index.js.map +0 -1
  154. package/dist/utils/serialize-error.d.ts +0 -10
  155. package/dist/utils/serialize-error.d.ts.map +0 -1
  156. package/dist/utils/serialize-error.js +0 -21
  157. package/dist/utils/serialize-error.js.map +0 -1
  158. package/dist/utils/unwrap-result.d.ts +0 -15
  159. package/dist/utils/unwrap-result.d.ts.map +0 -1
  160. package/dist/utils/unwrap-result.js +0 -49
  161. package/dist/utils/unwrap-result.js.map +0 -1
@@ -1,132 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.EventRouter = void 0;
4
- const common_1 = require("@nestjs/common");
5
- const rxjs_1 = require("rxjs");
6
- const context_1 = require("../../context");
7
- const interfaces_1 = require("../../interfaces");
8
- /**
9
- * Routes incoming event messages (workqueue and broadcast) to NestJS handlers.
10
- *
11
- * Delivery semantics (at-least-once):
12
- * - Handler executes first
13
- * - Success -> ack (message consumed)
14
- * - Handler error -> nak (NATS redelivers, up to `max_deliver` times)
15
- * - Dead letter (max_deliver reached) -> onDeadLetter hook -> term or nak
16
- * - Decode error -> term (no retry for malformed payloads)
17
- * - No handler found -> term (configuration error)
18
- *
19
- * Both workqueue and broadcast use the same ack/nak semantics.
20
- * Each durable consumer tracks delivery independently, so a nak from
21
- * one broadcast consumer does not affect others.
22
- *
23
- * Handlers must be idempotent — NATS may redeliver on failure or timeout.
24
- */
25
- class EventRouter {
26
- constructor(messageProvider, patternRegistry, codec, eventBus, deadLetterConfig) {
27
- this.messageProvider = messageProvider;
28
- this.patternRegistry = patternRegistry;
29
- this.codec = codec;
30
- this.eventBus = eventBus;
31
- this.deadLetterConfig = deadLetterConfig;
32
- this.logger = new common_1.Logger('Jetstream:EventRouter');
33
- this.subscriptions = [];
34
- }
35
- /** Start routing event and broadcast messages to handlers. */
36
- start() {
37
- this.subscribeToStream(this.messageProvider.events$, 'workqueue');
38
- this.subscribeToStream(this.messageProvider.broadcasts$, 'broadcast');
39
- }
40
- /** Stop routing and unsubscribe from all streams. */
41
- destroy() {
42
- for (const sub of this.subscriptions) {
43
- sub.unsubscribe();
44
- }
45
- this.subscriptions.length = 0;
46
- }
47
- /** Subscribe to a message stream and route each message. */
48
- subscribeToStream(stream$, label) {
49
- const subscription = stream$
50
- .pipe((0, rxjs_1.mergeMap)((msg) => this.handle(msg)), (0, rxjs_1.catchError)((err, caught) => {
51
- this.logger.error(`Unexpected error in ${label} event router`, err);
52
- return caught;
53
- }))
54
- .subscribe();
55
- this.subscriptions.push(subscription);
56
- }
57
- /** Handle a single event message: decode -> execute handler -> ack/nak. */
58
- handle(msg) {
59
- const handler = this.patternRegistry.getHandler(msg.subject);
60
- if (!handler) {
61
- msg.term(`No handler for event: ${msg.subject}`);
62
- this.logger.error(`No handler for event subject: ${msg.subject}`);
63
- return rxjs_1.EMPTY;
64
- }
65
- let data;
66
- try {
67
- data = this.codec.decode(msg.data);
68
- }
69
- catch (err) {
70
- msg.term('Decode error');
71
- this.logger.error(`Decode error for ${msg.subject}:`, err);
72
- return rxjs_1.EMPTY;
73
- }
74
- this.eventBus.emit(interfaces_1.TransportEvent.MessageRouted, msg.subject, 'event');
75
- const ctx = new context_1.RpcContext([msg]);
76
- return (0, rxjs_1.from)(this.executeHandler(handler, data, ctx, msg));
77
- }
78
- /** Execute handler, then ack on success or nak/dead-letter on failure. */
79
- async executeHandler(handler, data, ctx, msg) {
80
- try {
81
- const result = await handler(data, ctx);
82
- if ((0, rxjs_1.isObservable)(result)) {
83
- await (0, rxjs_1.lastValueFrom)(result, { defaultValue: undefined });
84
- }
85
- msg.ack();
86
- }
87
- catch (err) {
88
- this.logger.error(`Event handler error (${msg.subject}):`, err);
89
- if (this.isDeadLetter(msg)) {
90
- await this.handleDeadLetter(msg, data, err);
91
- }
92
- else {
93
- msg.nak();
94
- }
95
- }
96
- }
97
- /** Check if the message has exhausted all delivery attempts. */
98
- isDeadLetter(msg) {
99
- if (!this.deadLetterConfig)
100
- return false;
101
- const maxDeliver = this.deadLetterConfig.maxDeliverByStream.get(msg.info.stream);
102
- if (maxDeliver === undefined)
103
- return false;
104
- return msg.info.deliveryCount >= maxDeliver;
105
- }
106
- /** Handle a dead letter: invoke callback, then term or nak based on result. */
107
- async handleDeadLetter(msg, data, error) {
108
- const info = {
109
- subject: msg.subject,
110
- data,
111
- headers: msg.headers,
112
- error,
113
- deliveryCount: msg.info.deliveryCount,
114
- stream: msg.info.stream,
115
- streamSequence: msg.info.streamSequence,
116
- timestamp: new Date(msg.info.timestampNanos / 1_000_000).toISOString(),
117
- };
118
- this.eventBus.emit(interfaces_1.TransportEvent.DeadLetter, info);
119
- if (!this.deadLetterConfig)
120
- return;
121
- try {
122
- await this.deadLetterConfig.onDeadLetter(info);
123
- msg.term('Dead letter processed');
124
- }
125
- catch (hookErr) {
126
- this.logger.error(`onDeadLetter callback failed for ${msg.subject}, nak for retry:`, hookErr);
127
- msg.nak();
128
- }
129
- }
130
- }
131
- exports.EventRouter = EventRouter;
132
- //# sourceMappingURL=event.router.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"event.router.js","sourceRoot":"","sources":["../../../src/server/routing/event.router.ts"],"names":[],"mappings":"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"}
@@ -1,5 +0,0 @@
1
- export { PatternRegistry } from './pattern-registry';
2
- export { EventRouter } from './event.router';
3
- export type { DeadLetterConfig } from './event.router';
4
- export { RpcRouter } from './rpc.router';
5
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/server/routing/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAErD,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAE7C,YAAY,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAEvD,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC"}
@@ -1,10 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.RpcRouter = exports.EventRouter = exports.PatternRegistry = void 0;
4
- var pattern_registry_1 = require("./pattern-registry");
5
- Object.defineProperty(exports, "PatternRegistry", { enumerable: true, get: function () { return pattern_registry_1.PatternRegistry; } });
6
- var event_router_1 = require("./event.router");
7
- Object.defineProperty(exports, "EventRouter", { enumerable: true, get: function () { return event_router_1.EventRouter; } });
8
- var rpc_router_1 = require("./rpc.router");
9
- Object.defineProperty(exports, "RpcRouter", { enumerable: true, get: function () { return rpc_router_1.RpcRouter; } });
10
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/server/routing/index.ts"],"names":[],"mappings":";;;AAAA,uDAAqD;AAA5C,mHAAA,eAAe,OAAA;AAExB,+CAA6C;AAApC,2GAAA,WAAW,OAAA;AAIpB,2CAAyC;AAAhC,uGAAA,SAAS,OAAA"}
@@ -1,39 +0,0 @@
1
- import { MessageHandler } from '@nestjs/microservices';
2
- import type { JetstreamModuleOptions, PatternsByKind } from '../../interfaces';
3
- /**
4
- * Registry mapping NATS subjects to NestJS message handlers.
5
- *
6
- * Handles subject normalization and categorization:
7
- * - Detects broadcast handlers via `extras.broadcast` metadata
8
- * - Normalizes full NATS subjects back to user-facing patterns
9
- * - Provides lists of patterns by category for stream/consumer setup
10
- */
11
- export declare class PatternRegistry {
12
- private readonly options;
13
- private readonly logger;
14
- private readonly registry;
15
- constructor(options: JetstreamModuleOptions);
16
- /**
17
- * Register all handlers from the NestJS strategy.
18
- *
19
- * @param handlers Map of pattern -> MessageHandler from `Server.getHandlers()`.
20
- */
21
- registerHandlers(handlers: Map<string, MessageHandler>): void;
22
- /** Find handler for a full NATS subject. */
23
- getHandler(subject: string): MessageHandler | null;
24
- /** Get all registered broadcast patterns (for consumer filter_subject setup). */
25
- getBroadcastPatterns(): string[];
26
- /** Check if any broadcast handlers are registered. */
27
- hasBroadcastHandlers(): boolean;
28
- /** Check if any RPC (command) handlers are registered. */
29
- hasRpcHandlers(): boolean;
30
- /** Check if any workqueue event handlers are registered. */
31
- hasEventHandlers(): boolean;
32
- /** Get patterns grouped by kind. */
33
- getPatternsByKind(): PatternsByKind;
34
- /** Normalize a full NATS subject back to the user-facing pattern. */
35
- normalizeSubject(subject: string): string;
36
- /** Log a summary of all registered handlers. */
37
- private logSummary;
38
- }
39
- //# sourceMappingURL=pattern-registry.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"pattern-registry.d.ts","sourceRoot":"","sources":["../../../src/server/routing/pattern-registry.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAEvD,OAAO,KAAK,EAAE,sBAAsB,EAAE,cAAc,EAAqB,MAAM,kBAAkB,CAAC;AAGlG;;;;;;;GAOG;AACH,qBAAa,eAAe;IAIP,OAAO,CAAC,QAAQ,CAAC,OAAO;IAH3C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA2C;IAClE,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAwC;gBAE7B,OAAO,EAAE,sBAAsB;IAEnE;;;;OAIG;IACI,gBAAgB,CAAC,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,cAAc,CAAC,GAAG,IAAI;IAyCpE,4CAA4C;IACrC,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,cAAc,GAAG,IAAI;IAIzD,iFAAiF;IAC1E,oBAAoB,IAAI,MAAM,EAAE;IAMvC,sDAAsD;IAC/C,oBAAoB,IAAI,OAAO;IAItC,0DAA0D;IACnD,cAAc,IAAI,OAAO;IAIhC,4DAA4D;IACrD,gBAAgB,IAAI,OAAO;IAIlC,oCAAoC;IAC7B,iBAAiB,IAAI,cAAc;IAc1C,qEAAqE;IAC9D,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM;IAahD,gDAAgD;IAChD,OAAO,CAAC,UAAU;CAOnB"}
@@ -1,116 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.PatternRegistry = void 0;
4
- const common_1 = require("@nestjs/common");
5
- const jetstream_constants_1 = require("../../jetstream.constants");
6
- /**
7
- * Registry mapping NATS subjects to NestJS message handlers.
8
- *
9
- * Handles subject normalization and categorization:
10
- * - Detects broadcast handlers via `extras.broadcast` metadata
11
- * - Normalizes full NATS subjects back to user-facing patterns
12
- * - Provides lists of patterns by category for stream/consumer setup
13
- */
14
- class PatternRegistry {
15
- constructor(options) {
16
- this.options = options;
17
- this.logger = new common_1.Logger('Jetstream:PatternRegistry');
18
- this.registry = new Map();
19
- }
20
- /**
21
- * Register all handlers from the NestJS strategy.
22
- *
23
- * @param handlers Map of pattern -> MessageHandler from `Server.getHandlers()`.
24
- */
25
- registerHandlers(handlers) {
26
- const serviceName = this.options.name;
27
- for (const [pattern, handler] of handlers) {
28
- const isEvent = handler.isEventHandler ?? false;
29
- const isBroadcast = !!handler.extras?.broadcast;
30
- // Build the full NATS subject this handler should receive
31
- let fullSubject;
32
- if (isBroadcast) {
33
- fullSubject = (0, jetstream_constants_1.buildBroadcastSubject)(pattern);
34
- }
35
- else if (isEvent) {
36
- fullSubject = (0, jetstream_constants_1.buildSubject)(serviceName, 'ev', pattern);
37
- }
38
- else {
39
- fullSubject = (0, jetstream_constants_1.buildSubject)(serviceName, 'cmd', pattern);
40
- }
41
- this.registry.set(fullSubject, {
42
- handler,
43
- pattern,
44
- isEvent,
45
- isBroadcast,
46
- });
47
- let kind;
48
- if (isBroadcast) {
49
- kind = 'broadcast';
50
- }
51
- else if (isEvent) {
52
- kind = 'event';
53
- }
54
- else {
55
- kind = 'rpc';
56
- }
57
- this.logger.debug(`Registered ${kind}: ${pattern} -> ${fullSubject}`);
58
- }
59
- this.logSummary();
60
- }
61
- /** Find handler for a full NATS subject. */
62
- getHandler(subject) {
63
- return this.registry.get(subject)?.handler ?? null;
64
- }
65
- /** Get all registered broadcast patterns (for consumer filter_subject setup). */
66
- getBroadcastPatterns() {
67
- return Array.from(this.registry.values())
68
- .filter((r) => r.isBroadcast)
69
- .map((r) => `broadcast.${r.pattern}`);
70
- }
71
- /** Check if any broadcast handlers are registered. */
72
- hasBroadcastHandlers() {
73
- return Array.from(this.registry.values()).some((r) => r.isBroadcast);
74
- }
75
- /** Check if any RPC (command) handlers are registered. */
76
- hasRpcHandlers() {
77
- return Array.from(this.registry.values()).some((r) => !r.isEvent && !r.isBroadcast);
78
- }
79
- /** Check if any workqueue event handlers are registered. */
80
- hasEventHandlers() {
81
- return Array.from(this.registry.values()).some((r) => r.isEvent && !r.isBroadcast);
82
- }
83
- /** Get patterns grouped by kind. */
84
- getPatternsByKind() {
85
- const events = [];
86
- const commands = [];
87
- const broadcasts = [];
88
- for (const entry of this.registry.values()) {
89
- if (entry.isBroadcast)
90
- broadcasts.push(entry.pattern);
91
- else if (entry.isEvent)
92
- events.push(entry.pattern);
93
- else
94
- commands.push(entry.pattern);
95
- }
96
- return { events, commands, broadcasts };
97
- }
98
- /** Normalize a full NATS subject back to the user-facing pattern. */
99
- normalizeSubject(subject) {
100
- const name = (0, jetstream_constants_1.internalName)(this.options.name);
101
- const prefixes = [`${name}.cmd.`, `${name}.ev.`, 'broadcast.'];
102
- for (const prefix of prefixes) {
103
- if (subject.startsWith(prefix)) {
104
- return subject.slice(prefix.length);
105
- }
106
- }
107
- return subject;
108
- }
109
- /** Log a summary of all registered handlers. */
110
- logSummary() {
111
- const { events, commands, broadcasts } = this.getPatternsByKind();
112
- this.logger.log(`Registered handlers: ${commands.length} RPC, ${events.length} events, ${broadcasts.length} broadcasts`);
113
- }
114
- }
115
- exports.PatternRegistry = PatternRegistry;
116
- //# sourceMappingURL=pattern-registry.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"pattern-registry.js","sourceRoot":"","sources":["../../../src/server/routing/pattern-registry.ts"],"names":[],"mappings":"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"}
@@ -1,37 +0,0 @@
1
- import { ConnectionProvider } from '../../connection';
2
- import { EventBus } from '../../hooks';
3
- import type { Codec } from '../../interfaces';
4
- import { MessageProvider } from '../infrastructure/message.provider';
5
- import { PatternRegistry } from './pattern-registry';
6
- /**
7
- * Routes RPC command messages in JetStream mode.
8
- *
9
- * Delivery semantics:
10
- * - Handler must complete within timeout (default: 3 min)
11
- * - Success -> publish response to ReplyTo -> ack
12
- * - Handler error -> publish error to ReplyTo -> term (no redelivery)
13
- * - Timeout -> no response -> term
14
- * - No handler / decode error -> term immediately
15
- *
16
- * Nak is never used for RPC — prevents duplicate side effects.
17
- */
18
- export declare class RpcRouter {
19
- private readonly messageProvider;
20
- private readonly patternRegistry;
21
- private readonly connection;
22
- private readonly codec;
23
- private readonly eventBus;
24
- private readonly logger;
25
- private readonly timeout;
26
- private subscription;
27
- constructor(messageProvider: MessageProvider, patternRegistry: PatternRegistry, connection: ConnectionProvider, codec: Codec, eventBus: EventBus, timeout?: number);
28
- /** Start routing command messages to handlers. */
29
- start(): void;
30
- /** Stop routing and unsubscribe. */
31
- destroy(): void;
32
- /** Handle a single RPC command message. */
33
- private handle;
34
- /** Execute handler, publish response, settle message. */
35
- private executeHandler;
36
- }
37
- //# sourceMappingURL=rpc.router.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"rpc.router.d.ts","sourceRoot":"","sources":["../../../src/server/routing/rpc.router.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAEtD,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAEvC,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAI9C,OAAO,EAAE,eAAe,EAAE,MAAM,oCAAoC,CAAC;AACrE,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAErD;;;;;;;;;;;GAWG;AACH,qBAAa,SAAS;IAMlB,OAAO,CAAC,QAAQ,CAAC,eAAe;IAChC,OAAO,CAAC,QAAQ,CAAC,eAAe;IAChC,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,QAAQ;IAT3B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAqC;IAC5D,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,YAAY,CAA6B;gBAG9B,eAAe,EAAE,eAAe,EAChC,eAAe,EAAE,eAAe,EAChC,UAAU,EAAE,kBAAkB,EAC9B,KAAK,EAAE,KAAK,EACZ,QAAQ,EAAE,QAAQ,EACnC,OAAO,CAAC,EAAE,MAAM;IAKlB,kDAAkD;IAC3C,KAAK,IAAI,IAAI;IAYpB,oCAAoC;IAC7B,OAAO,IAAI,IAAI;IAKtB,2CAA2C;IAC3C,OAAO,CAAC,MAAM;IAiCd,yDAAyD;YAC3C,cAAc;CAqD7B"}
@@ -1,121 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.RpcRouter = void 0;
4
- const common_1 = require("@nestjs/common");
5
- const nats_1 = require("nats");
6
- const rxjs_1 = require("rxjs");
7
- const context_1 = require("../../context");
8
- const interfaces_1 = require("../../interfaces");
9
- const jetstream_constants_1 = require("../../jetstream.constants");
10
- const utils_1 = require("../../utils");
11
- /**
12
- * Routes RPC command messages in JetStream mode.
13
- *
14
- * Delivery semantics:
15
- * - Handler must complete within timeout (default: 3 min)
16
- * - Success -> publish response to ReplyTo -> ack
17
- * - Handler error -> publish error to ReplyTo -> term (no redelivery)
18
- * - Timeout -> no response -> term
19
- * - No handler / decode error -> term immediately
20
- *
21
- * Nak is never used for RPC — prevents duplicate side effects.
22
- */
23
- class RpcRouter {
24
- constructor(messageProvider, patternRegistry, connection, codec, eventBus, timeout) {
25
- this.messageProvider = messageProvider;
26
- this.patternRegistry = patternRegistry;
27
- this.connection = connection;
28
- this.codec = codec;
29
- this.eventBus = eventBus;
30
- this.logger = new common_1.Logger('Jetstream:RpcRouter');
31
- this.subscription = null;
32
- this.timeout = timeout ?? jetstream_constants_1.DEFAULT_JETSTREAM_RPC_TIMEOUT;
33
- }
34
- /** Start routing command messages to handlers. */
35
- start() {
36
- this.subscription = this.messageProvider.commands$
37
- .pipe((0, rxjs_1.mergeMap)((msg) => this.handle(msg)), (0, rxjs_1.catchError)((err, caught) => {
38
- this.logger.error('Unexpected error in RPC router', err);
39
- return caught;
40
- }))
41
- .subscribe();
42
- }
43
- /** Stop routing and unsubscribe. */
44
- destroy() {
45
- this.subscription?.unsubscribe();
46
- this.subscription = null;
47
- }
48
- /** Handle a single RPC command message. */
49
- handle(msg) {
50
- const handler = this.patternRegistry.getHandler(msg.subject);
51
- if (!handler) {
52
- msg.term(`No handler for RPC: ${msg.subject}`);
53
- this.logger.error(`No handler for RPC subject: ${msg.subject}`);
54
- return rxjs_1.EMPTY;
55
- }
56
- const replyTo = msg.headers?.get(jetstream_constants_1.JetstreamHeader.ReplyTo);
57
- const correlationId = msg.headers?.get(jetstream_constants_1.JetstreamHeader.CorrelationId);
58
- if (!replyTo || !correlationId) {
59
- msg.term('Missing required headers (reply-to or correlation-id)');
60
- this.logger.error(`Missing headers for RPC: ${msg.subject}`);
61
- return rxjs_1.EMPTY;
62
- }
63
- let data;
64
- try {
65
- data = this.codec.decode(msg.data);
66
- }
67
- catch (err) {
68
- msg.term('Decode error');
69
- this.logger.error(`Decode error for RPC ${msg.subject}:`, err);
70
- return rxjs_1.EMPTY;
71
- }
72
- this.eventBus.emit(interfaces_1.TransportEvent.MessageRouted, msg.subject, 'rpc');
73
- return (0, rxjs_1.from)(this.executeHandler(handler, data, msg, replyTo, correlationId));
74
- }
75
- /** Execute handler, publish response, settle message. */
76
- async executeHandler(handler, data, msg, replyTo, correlationId) {
77
- const nc = await this.connection.getConnection();
78
- const ctx = new context_1.RpcContext([msg]);
79
- const hdrs = (0, nats_1.headers)();
80
- hdrs.set(jetstream_constants_1.JetstreamHeader.CorrelationId, correlationId);
81
- let settled = false;
82
- // Race handler against timeout
83
- const timeoutId = setTimeout(() => {
84
- if (settled)
85
- return;
86
- settled = true;
87
- this.logger.error(`RPC timeout (${this.timeout}ms): ${msg.subject}`);
88
- this.eventBus.emit(interfaces_1.TransportEvent.RpcTimeout, msg.subject, correlationId);
89
- msg.term('Handler timeout');
90
- }, this.timeout);
91
- try {
92
- const result = await (0, utils_1.unwrapResult)(handler(data, ctx));
93
- // settled may be set by the setTimeout callback above (async race)
94
- // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
95
- if (settled)
96
- return;
97
- settled = true;
98
- clearTimeout(timeoutId);
99
- // Publish success response
100
- nc.publish(replyTo, this.codec.encode(result), { headers: hdrs });
101
- msg.ack();
102
- }
103
- catch (err) {
104
- if (settled)
105
- return;
106
- settled = true;
107
- clearTimeout(timeoutId);
108
- // Publish error response with x-error header
109
- try {
110
- hdrs.set(jetstream_constants_1.JetstreamHeader.Error, 'true');
111
- nc.publish(replyTo, this.codec.encode((0, utils_1.serializeError)(err)), { headers: hdrs });
112
- }
113
- catch (encodeErr) {
114
- this.logger.error(`Failed to encode RPC error for ${msg.subject}`, encodeErr);
115
- }
116
- msg.term(`Handler error: ${msg.subject}`);
117
- }
118
- }
119
- }
120
- exports.RpcRouter = RpcRouter;
121
- //# sourceMappingURL=rpc.router.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"rpc.router.js","sourceRoot":"","sources":["../../../src/server/routing/rpc.router.ts"],"names":[],"mappings":"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"}
@@ -1,55 +0,0 @@
1
- import { CustomTransportStrategy, Server } from '@nestjs/microservices';
2
- import { ConnectionProvider } from '../connection';
3
- import type { JetstreamModuleOptions } from '../interfaces';
4
- import { CoreRpcServer } from './core-rpc.server';
5
- import { ConsumerProvider, MessageProvider, StreamProvider } from './infrastructure';
6
- import { EventRouter, PatternRegistry, RpcRouter } from './routing';
7
- /**
8
- * NestJS custom transport strategy for NATS JetStream.
9
- *
10
- * Coordinates all server-side providers:
11
- * 1. Registers handlers from NestJS into PatternRegistry
12
- * 2. Creates required streams and consumers
13
- * 3. Starts message consumption and routing
14
- * 4. Handles Core or JetStream RPC based on configuration
15
- *
16
- * All dependencies are injected via the NestJS DI container.
17
- */
18
- export declare class JetstreamStrategy extends Server implements CustomTransportStrategy {
19
- private readonly options;
20
- private readonly connection;
21
- private readonly patternRegistry;
22
- private readonly streamProvider;
23
- private readonly consumerProvider;
24
- private readonly messageProvider;
25
- private readonly eventRouter;
26
- private readonly rpcRouter;
27
- private readonly coreRpcServer;
28
- readonly transportId: symbol;
29
- private readonly listeners;
30
- constructor(options: JetstreamModuleOptions, connection: ConnectionProvider, patternRegistry: PatternRegistry, streamProvider: StreamProvider, consumerProvider: ConsumerProvider, messageProvider: MessageProvider, eventRouter: EventRouter, rpcRouter: RpcRouter, coreRpcServer: CoreRpcServer);
31
- /**
32
- * Start the transport: register handlers, create infrastructure, begin consumption.
33
- *
34
- * Called by NestJS when `connectMicroservice()` is used, or internally by the module.
35
- */
36
- listen(callback: () => void): Promise<void>;
37
- /** Gracefully stop the transport. */
38
- close(): void;
39
- /**
40
- * Register event listener (required by Server base class).
41
- *
42
- * Stores callbacks for potential use. Primary lifecycle events
43
- * are routed through EventBus.
44
- */
45
- on(event: string, callback: Function): void;
46
- /** Unwrap the underlying NATS connection. */
47
- unwrap<T>(): T;
48
- /** Access the pattern registry (for module-level introspection). */
49
- getPatternRegistry(): PatternRegistry;
50
- /** Determine which JetStream stream kinds are needed. */
51
- private resolveStreamKinds;
52
- private isCoreRpcMode;
53
- private isJetStreamRpcMode;
54
- }
55
- //# sourceMappingURL=strategy.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"strategy.d.ts","sourceRoot":"","sources":["../../src/server/strategy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAExE,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,KAAK,EAAE,sBAAsB,EAAc,MAAM,eAAe,CAAC;AAExE,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AACrF,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAEpE;;;;;;;;;;GAUG;AACH,qBAAa,iBAAkB,SAAQ,MAAO,YAAW,uBAAuB;IAM5E,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B,OAAO,CAAC,QAAQ,CAAC,eAAe;IAChC,OAAO,CAAC,QAAQ,CAAC,cAAc;IAC/B,OAAO,CAAC,QAAQ,CAAC,gBAAgB;IACjC,OAAO,CAAC,QAAQ,CAAC,eAAe;IAChC,OAAO,CAAC,QAAQ,CAAC,WAAW;IAC5B,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,aAAa;IAbhC,SAAgB,WAAW,SAAiC;IAE5D,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAiC;gBAGxC,OAAO,EAAE,sBAAsB,EAC/B,UAAU,EAAE,kBAAkB,EAC9B,eAAe,EAAE,eAAe,EAChC,cAAc,EAAE,cAAc,EAC9B,gBAAgB,EAAE,gBAAgB,EAClC,eAAe,EAAE,eAAe,EAChC,WAAW,EAAE,WAAW,EACxB,SAAS,EAAE,SAAS,EACpB,aAAa,EAAE,aAAa;IAK/C;;;;OAIG;IACU,MAAM,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAoCxD,qCAAqC;IAC9B,KAAK,IAAI,IAAI;IAOpB;;;;;OAKG;IAEI,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,GAAG,IAAI;IAOlD,6CAA6C;IACtC,MAAM,CAAC,CAAC,KAAK,CAAC;IAIrB,oEAAoE;IAC7D,kBAAkB,IAAI,eAAe;IAI5C,yDAAyD;IACzD,OAAO,CAAC,kBAAkB;IAkB1B,OAAO,CAAC,aAAa;IAIrB,OAAO,CAAC,kBAAkB;CAG3B"}