@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
package/dist/index.d.ts CHANGED
@@ -1,13 +1,995 @@
1
- export { JetstreamModule } from './jetstream.module';
2
- export { TransportEvent } from './interfaces';
3
- export type { Codec, DeadLetterInfo, JetstreamFeatureOptions, JetstreamModuleAsyncOptions, JetstreamModuleOptions, RpcConfig, StreamConsumerOverrides, TransportHooks, } from './interfaces';
4
- export { JetstreamClient } from './client';
5
- export { JetstreamRecord, JetstreamRecordBuilder } from './client';
6
- export { JsonCodec } from './codec';
7
- export { RpcContext } from './context';
8
- export { JetstreamHealthIndicator } from './health';
9
- export type { JetstreamHealthStatus } from './health';
10
- export { getClientToken, JetstreamHeader, JETSTREAM_CODEC, JETSTREAM_CONNECTION, JETSTREAM_EVENT_BUS, JETSTREAM_OPTIONS, nanos, } from './jetstream.constants';
11
- export { EventBus } from './hooks';
12
- export { JetstreamStrategy } from './server';
13
- //# sourceMappingURL=index.d.ts.map
1
+ import { ModuleMetadata, FactoryProvider, Type, Logger, OnApplicationShutdown, DynamicModule } from '@nestjs/common';
2
+ import { MsgHdrs, StreamConfig, ConsumerConfig, ConnectionOptions, NatsConnection, Status, JetStreamManager, ConsumerInfo, JsMsg, Msg } from 'nats';
3
+ import { MessageHandler, Server, CustomTransportStrategy, ClientProxy, ReadPacket, WritePacket, BaseRpcContext } from '@nestjs/microservices';
4
+ import { Observable } from 'rxjs';
5
+
6
+ /**
7
+ * Codec interface for encoding and decoding message payloads.
8
+ *
9
+ * Implementations handle serialization between application objects and
10
+ * binary data transmitted over NATS. The transport uses a single global
11
+ * codec all messages (RPC and events) share the same format.
12
+ *
13
+ * @example
14
+ * ```typescript
15
+ * import { encode, decode } from '@msgpack/msgpack';
16
+ *
17
+ * class MsgPackCodec implements Codec {
18
+ * encode(data: unknown): Uint8Array {
19
+ * return encode(data);
20
+ * }
21
+ * decode(data: Uint8Array): unknown {
22
+ * return decode(data);
23
+ * }
24
+ * }
25
+ * ```
26
+ */
27
+ interface Codec {
28
+ /** Serialize application data to binary for NATS transmission. */
29
+ encode(data: unknown): Uint8Array;
30
+ /** Deserialize binary NATS payload back to application data. */
31
+ decode(data: Uint8Array): unknown;
32
+ }
33
+
34
+ declare enum TransportEvent {
35
+ Connect = "connect",
36
+ Disconnect = "disconnect",
37
+ Reconnect = "reconnect",
38
+ Error = "error",
39
+ RpcTimeout = "rpcTimeout",
40
+ MessageRouted = "messageRouted",
41
+ ShutdownStart = "shutdownStart",
42
+ ShutdownComplete = "shutdownComplete",
43
+ DeadLetter = "deadLetter"
44
+ }
45
+ /**
46
+ * Hook callbacks for transport lifecycle and operational events.
47
+ *
48
+ * Each hook has a default implementation that logs via NestJS Logger.
49
+ * Providing a custom hook replaces the default for that specific event.
50
+ * Hooks that are not overridden continue using the Logger fallback.
51
+ *
52
+ * @example
53
+ * ```typescript
54
+ * JetstreamModule.forRoot({
55
+ * hooks: {
56
+ * [TransportEvent.Error]: (error, context) => sentry.captureException(error),
57
+ * [TransportEvent.RpcTimeout]: (subject) => metrics.increment('rpc.timeout'),
58
+ * },
59
+ * })
60
+ * ```
61
+ */
62
+ interface TransportHooks {
63
+ /** Fired when NATS connection is established. */
64
+ [TransportEvent.Connect](server: string): void;
65
+ /** Fired when NATS connection is lost. */
66
+ [TransportEvent.Disconnect](): void;
67
+ /** Fired when NATS connection is re-established after a disconnect. */
68
+ [TransportEvent.Reconnect](server: string): void;
69
+ /** Fired on any transport-level error. */
70
+ [TransportEvent.Error](error: Error, context?: string): void;
71
+ /** Fired when an RPC handler exceeds its timeout. */
72
+ [TransportEvent.RpcTimeout](subject: string, correlationId: string): void;
73
+ /** Fired after a message is successfully routed to its handler. */
74
+ [TransportEvent.MessageRouted](subject: string, kind: 'rpc' | 'event'): void;
75
+ /** Fired at the start of the graceful shutdown sequence. */
76
+ [TransportEvent.ShutdownStart](): void;
77
+ /** Fired after graceful shutdown completes. */
78
+ [TransportEvent.ShutdownComplete](): void;
79
+ /** Fired when a message exhausts all delivery attempts (dead letter). */
80
+ [TransportEvent.DeadLetter](info: DeadLetterInfo): void;
81
+ }
82
+ /**
83
+ * Context passed to the onDeadLetter callback when a message exhausts all delivery attempts.
84
+ */
85
+ interface DeadLetterInfo {
86
+ /** The NATS subject the message was published to. */
87
+ subject: string;
88
+ /** Decoded message payload. */
89
+ data: unknown;
90
+ /** Message headers (raw NATS MsgHdrs). */
91
+ headers: MsgHdrs | undefined;
92
+ /** The error that caused the last handler failure. */
93
+ error: unknown;
94
+ /** How many times this message was delivered. */
95
+ deliveryCount: number;
96
+ /** The stream this message belongs to. */
97
+ stream: string;
98
+ /** The stream sequence number. */
99
+ streamSequence: number;
100
+ /** ISO timestamp of the message (derived from msg.info.timestampNanos). */
101
+ timestamp: string;
102
+ }
103
+
104
+ /**
105
+ * RPC transport configuration.
106
+ *
107
+ * Discriminated union on `mode`:
108
+ * - `'core'` — NATS native request/reply. Lowest latency.
109
+ * - `'jetstream'` — Commands persisted in JetStream. Responses via Core NATS inbox.
110
+ *
111
+ * When `mode` is `'core'`, only `timeout` is available.
112
+ * When `mode` is `'jetstream'`, additional stream/consumer overrides are exposed.
113
+ */
114
+ type RpcConfig = {
115
+ mode: 'core';
116
+ /** Request timeout in ms. Default: 30_000. */
117
+ timeout?: number;
118
+ } | {
119
+ mode: 'jetstream';
120
+ /** Handler timeout in ms. Default: 180_000 (3 min). */
121
+ timeout?: number;
122
+ /** Raw NATS StreamConfig overrides for the command stream. */
123
+ stream?: Partial<StreamConfig>;
124
+ /** Raw NATS ConsumerConfig overrides for the command consumer. */
125
+ consumer?: Partial<ConsumerConfig>;
126
+ };
127
+ /** Overrides for JetStream stream and consumer configuration. */
128
+ interface StreamConsumerOverrides {
129
+ stream?: Partial<StreamConfig>;
130
+ consumer?: Partial<ConsumerConfig>;
131
+ }
132
+ /**
133
+ * Root module configuration for `JetstreamModule.forRoot()`.
134
+ *
135
+ * Minimal usage requires only `name` and `servers`.
136
+ * All other fields have production-ready defaults.
137
+ */
138
+ interface JetstreamModuleOptions {
139
+ /** Service name. Used for stream/consumer/subject naming. */
140
+ name: string;
141
+ /** NATS server URLs. */
142
+ servers: string[];
143
+ /**
144
+ * Global message codec.
145
+ * @default JsonCodec
146
+ */
147
+ codec?: Codec;
148
+ /**
149
+ * RPC transport mode and configuration.
150
+ * @default { mode: 'core' }
151
+ */
152
+ rpc?: RpcConfig;
153
+ /**
154
+ * Enable consumer infrastructure (streams, consumers, message routing).
155
+ * Set to `false` for publisher-only services (e.g., API gateways).
156
+ * @default true
157
+ */
158
+ consumer?: boolean;
159
+ /** Workqueue event stream/consumer overrides. */
160
+ events?: StreamConsumerOverrides;
161
+ /** Broadcast event stream/consumer overrides. */
162
+ broadcast?: StreamConsumerOverrides;
163
+ /**
164
+ * Transport lifecycle hook handlers.
165
+ * Unset hooks fall back to NestJS Logger.
166
+ */
167
+ hooks?: Partial<TransportHooks>;
168
+ /**
169
+ * Async callback invoked when an event message exhausts all delivery attempts.
170
+ * Called before msg.term(). If it throws, the message is nak'd for retry.
171
+ *
172
+ * Use this to persist dead letters to an external store (DB, S3, another queue).
173
+ * The NATS connection is available via `JETSTREAM_CONNECTION` token in forRootAsync.
174
+ *
175
+ * @example
176
+ * ```typescript
177
+ * JetstreamModule.forRootAsync({
178
+ * name: 'my-service',
179
+ * imports: [DlqModule],
180
+ * inject: [DlqService, JETSTREAM_CONNECTION],
181
+ * useFactory: (dlqService, connection) => ({
182
+ * servers: ['nats://localhost:4222'],
183
+ * onDeadLetter: async (info) => {
184
+ * await dlqService.persist(info);
185
+ * },
186
+ * }),
187
+ * })
188
+ * ```
189
+ */
190
+ onDeadLetter?(info: DeadLetterInfo): Promise<void>;
191
+ /**
192
+ * Graceful shutdown timeout in ms.
193
+ * Handlers exceeding this are abandoned.
194
+ * @default 10_000
195
+ */
196
+ shutdownTimeout?: number;
197
+ /**
198
+ * Raw NATS ConnectionOptions pass-through for advanced connection config.
199
+ * Allows setting tls, auth, reconnect behavior, maxReconnectAttempts, etc.
200
+ * Merged with `name` and `servers` — those take precedence.
201
+ */
202
+ connectionOptions?: Partial<ConnectionOptions>;
203
+ }
204
+ /** Options for `JetstreamModule.forFeature()`. */
205
+ interface JetstreamFeatureOptions {
206
+ /** Target service name for subject construction. */
207
+ name: string;
208
+ /**
209
+ * Override the global codec for this client.
210
+ * Falls back to the root codec from `forRoot()` when omitted.
211
+ */
212
+ codec?: Codec;
213
+ }
214
+ /**
215
+ * Async configuration for `JetstreamModule.forRootAsync()`.
216
+ *
217
+ * Supports three patterns: `useFactory`, `useExisting`, `useClass`.
218
+ */
219
+ type JetstreamModuleAsyncOptions = {
220
+ /** Service name — required upfront for DI token generation. */
221
+ name: string;
222
+ /** Additional module imports (e.g., ConfigModule). */
223
+ imports?: ModuleMetadata['imports'];
224
+ } & ({
225
+ useFactory(...args: unknown[]): Promise<Omit<JetstreamModuleOptions, 'name'>> | Omit<JetstreamModuleOptions, 'name'>;
226
+ inject?: FactoryProvider['inject'];
227
+ useExisting?: never;
228
+ useClass?: never;
229
+ } | {
230
+ useExisting: Type<Omit<JetstreamModuleOptions, 'name'>>;
231
+ useFactory?: never;
232
+ inject?: never;
233
+ useClass?: never;
234
+ } | {
235
+ useClass: Type<Omit<JetstreamModuleOptions, 'name'>>;
236
+ useFactory?: never;
237
+ inject?: never;
238
+ useExisting?: never;
239
+ });
240
+
241
+ /** Identifies a JetStream stream/consumer kind. */
242
+ type StreamKind = 'ev' | 'cmd' | 'broadcast';
243
+
244
+ /** Grouped pattern lists by stream kind. */
245
+ interface PatternsByKind {
246
+ events: string[];
247
+ commands: string[];
248
+ broadcasts: string[];
249
+ }
250
+
251
+ /**
252
+ * Central event bus for transport lifecycle notifications.
253
+ *
254
+ * Dispatches events to user-provided hooks or falls back to
255
+ * the NestJS Logger for each event type independently.
256
+ *
257
+ * @example
258
+ * ```typescript
259
+ * const bus = new EventBus(logger, {
260
+ * [TransportEvent.Error]: (err) => sentry.captureException(err),
261
+ * });
262
+ *
263
+ * bus.emit(TransportEvent.Error, new Error('timeout'), 'rpc-router');
264
+ * // → calls sentry, not logger
265
+ *
266
+ * bus.emit(TransportEvent.Connect, 'nats://localhost:4222');
267
+ * // → calls logger.log (no custom hook for connect)
268
+ * ```
269
+ */
270
+ declare class EventBus {
271
+ private readonly hooks;
272
+ private readonly logger;
273
+ constructor(logger: Logger, hooks?: Partial<TransportHooks>);
274
+ /** Emit a lifecycle event. Dispatches to custom hook or Logger fallback. */
275
+ emit<K extends keyof TransportHooks>(event: K, ...args: Parameters<TransportHooks[K]>): void;
276
+ /** Default Logger-based handlers for each event type. */
277
+ private defaultHandler;
278
+ }
279
+
280
+ /**
281
+ * Manages the lifecycle of a single NATS connection shared across the application.
282
+ *
283
+ * Provides both Promise-based and Observable-based access to the connection:
284
+ * - `connect()` / `getConnection()` — async/await for one-time setup
285
+ * - `nc$` — cached observable (shareReplay) for reactive consumers
286
+ * - `status$` — live connection status event stream
287
+ *
288
+ * One instance per application, created by `JetstreamModule.forRoot()`.
289
+ */
290
+ declare class ConnectionProvider {
291
+ private readonly options;
292
+ private readonly eventBus;
293
+ /** Cached observable that replays the established connection to new subscribers. */
294
+ readonly nc$: Observable<NatsConnection>;
295
+ /** Live stream of connection status events (no replay). */
296
+ readonly status$: Observable<Status>;
297
+ private readonly logger;
298
+ private connection;
299
+ private connectionPromise;
300
+ private jsmInstance;
301
+ constructor(options: JetstreamModuleOptions, eventBus: EventBus);
302
+ /**
303
+ * Establish NATS connection. Idempotent — returns cached connection on subsequent calls.
304
+ *
305
+ * @throws Error if connection is refused (fail fast).
306
+ */
307
+ getConnection(): Promise<NatsConnection>;
308
+ /**
309
+ * Get JetStream manager. Cached after first call.
310
+ */
311
+ getJetStreamManager(): Promise<JetStreamManager>;
312
+ /** Direct access to the raw NATS connection (assumes already connected). */
313
+ get unwrap(): NatsConnection | null;
314
+ /**
315
+ * Gracefully shut down the connection.
316
+ *
317
+ * Sequence: drain → wait for close. Falls back to force-close on error.
318
+ */
319
+ shutdown(): Promise<void>;
320
+ /** Internal: establish the physical connection with reconnect monitoring. */
321
+ private establish;
322
+ /** Subscribe to connection status events and emit hooks. */
323
+ private monitorStatus;
324
+ }
325
+
326
+ /**
327
+ * Registry mapping NATS subjects to NestJS message handlers.
328
+ *
329
+ * Handles subject normalization and categorization:
330
+ * - Detects broadcast handlers via `extras.broadcast` metadata
331
+ * - Normalizes full NATS subjects back to user-facing patterns
332
+ * - Provides lists of patterns by category for stream/consumer setup
333
+ */
334
+ declare class PatternRegistry {
335
+ private readonly options;
336
+ private readonly logger;
337
+ private readonly registry;
338
+ constructor(options: JetstreamModuleOptions);
339
+ /**
340
+ * Register all handlers from the NestJS strategy.
341
+ *
342
+ * @param handlers Map of pattern -> MessageHandler from `Server.getHandlers()`.
343
+ */
344
+ registerHandlers(handlers: Map<string, MessageHandler>): void;
345
+ /** Find handler for a full NATS subject. */
346
+ getHandler(subject: string): MessageHandler | null;
347
+ /** Get all registered broadcast patterns (for consumer filter_subject setup). */
348
+ getBroadcastPatterns(): string[];
349
+ /** Check if any broadcast handlers are registered. */
350
+ hasBroadcastHandlers(): boolean;
351
+ /** Check if any RPC (command) handlers are registered. */
352
+ hasRpcHandlers(): boolean;
353
+ /** Check if any workqueue event handlers are registered. */
354
+ hasEventHandlers(): boolean;
355
+ /** Get patterns grouped by kind. */
356
+ getPatternsByKind(): PatternsByKind;
357
+ /** Normalize a full NATS subject back to the user-facing pattern. */
358
+ normalizeSubject(subject: string): string;
359
+ /** Log a summary of all registered handlers. */
360
+ private logSummary;
361
+ }
362
+
363
+ /**
364
+ * Handles RPC via NATS Core request/reply pattern.
365
+ *
366
+ * Subscribes to `{service}.cmd.>` with a queue group for load balancing.
367
+ * Each request is processed and replied to directly via `msg.respond()`.
368
+ *
369
+ * This is the default RPC mode — lowest latency, no persistence overhead.
370
+ */
371
+ declare class CoreRpcServer {
372
+ private readonly options;
373
+ private readonly connection;
374
+ private readonly patternRegistry;
375
+ private readonly codec;
376
+ private readonly eventBus;
377
+ private readonly logger;
378
+ private subscription;
379
+ constructor(options: JetstreamModuleOptions, connection: ConnectionProvider, patternRegistry: PatternRegistry, codec: Codec, eventBus: EventBus);
380
+ /** Start listening for RPC requests on the command subject. */
381
+ start(): Promise<void>;
382
+ /** Stop listening and clean up the subscription. */
383
+ stop(): void;
384
+ /** Handle an incoming Core NATS request. */
385
+ private handleRequest;
386
+ /** Send an error response back to the caller with x-error header. */
387
+ private respondWithError;
388
+ }
389
+
390
+ /**
391
+ * Manages JetStream stream lifecycle: creation, updates, and idempotent ensures.
392
+ *
393
+ * Creates up to three stream types depending on configuration:
394
+ * - **Event stream** — workqueue events (always, when consumer enabled)
395
+ * - **Command stream** — RPC commands (only in jetstream RPC mode)
396
+ * - **Broadcast stream** — fan-out events (only if broadcast handlers exist)
397
+ *
398
+ * All operations are idempotent: safe to call on every startup and reconnection.
399
+ */
400
+ declare class StreamProvider {
401
+ private readonly options;
402
+ private readonly connection;
403
+ private readonly logger;
404
+ constructor(options: JetstreamModuleOptions, connection: ConnectionProvider);
405
+ /**
406
+ * Ensure all required streams exist with correct configuration.
407
+ *
408
+ * @param kinds Which stream kinds to create. Determined by the module based
409
+ * on RPC mode and registered handler patterns.
410
+ */
411
+ ensureStreams(kinds: StreamKind[]): Promise<void>;
412
+ /** Get the stream name for a given kind. */
413
+ getStreamName(kind: StreamKind): string;
414
+ /** Get the subjects pattern for a given kind. */
415
+ getSubjects(kind: StreamKind): string[];
416
+ /** Ensure a single stream exists, creating or updating as needed. */
417
+ private ensureStream;
418
+ /** Build the full stream config by merging defaults with user overrides. */
419
+ private buildConfig;
420
+ /** Get default config for a stream kind. */
421
+ private getDefaults;
422
+ /** Get user-provided overrides for a stream kind. */
423
+ private getOverrides;
424
+ }
425
+
426
+ /** Options for dead letter queue handling. */
427
+ interface DeadLetterConfig {
428
+ /**
429
+ * Map of stream name -> max_deliver value.
430
+ * Used to detect when a message from a given stream has exhausted all delivery attempts.
431
+ */
432
+ maxDeliverByStream: Map<string, number>;
433
+ /** Async callback invoked when a message exhausts all deliveries. */
434
+ onDeadLetter(info: DeadLetterInfo): Promise<void>;
435
+ }
436
+ /**
437
+ * Routes incoming event messages (workqueue and broadcast) to NestJS handlers.
438
+ *
439
+ * Delivery semantics (at-least-once):
440
+ * - Handler executes first
441
+ * - Success -> ack (message consumed)
442
+ * - Handler error -> nak (NATS redelivers, up to `max_deliver` times)
443
+ * - Dead letter (max_deliver reached) -> onDeadLetter hook -> term or nak
444
+ * - Decode error -> term (no retry for malformed payloads)
445
+ * - No handler found -> term (configuration error)
446
+ *
447
+ * Both workqueue and broadcast use the same ack/nak semantics.
448
+ * Each durable consumer tracks delivery independently, so a nak from
449
+ * one broadcast consumer does not affect others.
450
+ *
451
+ * Handlers must be idempotent — NATS may redeliver on failure or timeout.
452
+ */
453
+ declare class EventRouter {
454
+ private readonly messageProvider;
455
+ private readonly patternRegistry;
456
+ private readonly codec;
457
+ private readonly eventBus;
458
+ private readonly deadLetterConfig?;
459
+ private readonly logger;
460
+ private readonly subscriptions;
461
+ constructor(messageProvider: MessageProvider, patternRegistry: PatternRegistry, codec: Codec, eventBus: EventBus, deadLetterConfig?: DeadLetterConfig | undefined);
462
+ /** Start routing event and broadcast messages to handlers. */
463
+ start(): void;
464
+ /** Stop routing and unsubscribe from all streams. */
465
+ destroy(): void;
466
+ /** Subscribe to a message stream and route each message. */
467
+ private subscribeToStream;
468
+ /** Handle a single event message: decode -> execute handler -> ack/nak. */
469
+ private handle;
470
+ /** Execute handler, then ack on success or nak/dead-letter on failure. */
471
+ private executeHandler;
472
+ /** Check if the message has exhausted all delivery attempts. */
473
+ private isDeadLetter;
474
+ /** Handle a dead letter: invoke callback, then term or nak based on result. */
475
+ private handleDeadLetter;
476
+ }
477
+
478
+ /**
479
+ * Routes RPC command messages in JetStream mode.
480
+ *
481
+ * Delivery semantics:
482
+ * - Handler must complete within timeout (default: 3 min)
483
+ * - Success -> ack -> publish response to ReplyTo (publish failure does not affect ack)
484
+ * - Handler error -> publish error to ReplyTo -> term (no redelivery)
485
+ * - Timeout -> no response -> term
486
+ * - No handler / decode error -> term immediately
487
+ *
488
+ * Nak is never used for RPC — prevents duplicate side effects.
489
+ */
490
+ declare class RpcRouter {
491
+ private readonly messageProvider;
492
+ private readonly patternRegistry;
493
+ private readonly connection;
494
+ private readonly codec;
495
+ private readonly eventBus;
496
+ private readonly logger;
497
+ private readonly timeout;
498
+ private subscription;
499
+ constructor(messageProvider: MessageProvider, patternRegistry: PatternRegistry, connection: ConnectionProvider, codec: Codec, eventBus: EventBus, timeout?: number);
500
+ /** Start routing command messages to handlers. */
501
+ start(): void;
502
+ /** Stop routing and unsubscribe. */
503
+ destroy(): void;
504
+ /** Handle a single RPC command message. */
505
+ private handle;
506
+ /** Execute handler, publish response, settle message. */
507
+ private executeHandler;
508
+ }
509
+
510
+ /**
511
+ * Manages JetStream consumer lifecycle: creation and idempotent ensures.
512
+ *
513
+ * Creates durable pull-based consumers that survive restarts.
514
+ * Consumer configuration is merged from defaults and user overrides.
515
+ */
516
+ declare class ConsumerProvider {
517
+ private readonly options;
518
+ private readonly connection;
519
+ private readonly streamProvider;
520
+ private readonly patternRegistry;
521
+ private readonly logger;
522
+ constructor(options: JetstreamModuleOptions, connection: ConnectionProvider, streamProvider: StreamProvider, patternRegistry: PatternRegistry);
523
+ /**
524
+ * Ensure consumers exist for the specified kinds.
525
+ *
526
+ * @returns Map of kind -> ConsumerInfo for downstream use.
527
+ */
528
+ ensureConsumers(kinds: StreamKind[]): Promise<Map<StreamKind, ConsumerInfo>>;
529
+ /** Get the consumer name for a given kind. */
530
+ getConsumerName(kind: StreamKind): string;
531
+ /** Ensure a single consumer exists, creating if needed. */
532
+ private ensureConsumer;
533
+ /** Build consumer config by merging defaults with user overrides. */
534
+ private buildConfig;
535
+ /** Get default config for a consumer kind. */
536
+ private getDefaults;
537
+ /** Get user-provided overrides for a consumer kind. */
538
+ private getOverrides;
539
+ }
540
+
541
+ /**
542
+ * Manages pull-based message consumption from JetStream consumers.
543
+ *
544
+ * Uses `defer()` + `repeat()` pattern for self-healing: when the async
545
+ * iterator completes (e.g., NATS restart), the consumer automatically
546
+ * re-establishes after a short delay.
547
+ *
548
+ * Emits messages to kind-specific RxJS subjects for downstream routing.
549
+ */
550
+ declare class MessageProvider {
551
+ private readonly connection;
552
+ private readonly eventBus;
553
+ private readonly logger;
554
+ private readonly destroy$;
555
+ private readonly activeIterators;
556
+ private readonly eventMessages$;
557
+ private readonly commandMessages$;
558
+ private readonly broadcastMessages$;
559
+ constructor(connection: ConnectionProvider, eventBus: EventBus);
560
+ /** Observable stream of workqueue event messages. */
561
+ get events$(): Observable<JsMsg>;
562
+ /** Observable stream of RPC command messages (jetstream mode). */
563
+ get commands$(): Observable<JsMsg>;
564
+ /** Observable stream of broadcast event messages. */
565
+ get broadcasts$(): Observable<JsMsg>;
566
+ /**
567
+ * Start consuming messages from the given consumer infos.
568
+ *
569
+ * Each consumer gets an independent self-healing flow.
570
+ * Call `destroy()` to stop all consumers.
571
+ */
572
+ start(consumers: Map<StreamKind, ConsumerInfo>): void;
573
+ /** Stop all consumer flows and complete all subjects. */
574
+ destroy(): void;
575
+ /** Create a self-healing consumer flow for a specific kind. */
576
+ private createFlow;
577
+ /** Single iteration: get consumer -> pull messages -> emit to subject. */
578
+ private consumeOnce;
579
+ /** Get the target subject for a consumer kind. */
580
+ private getTargetSubject;
581
+ }
582
+
583
+ /**
584
+ * NestJS custom transport strategy for NATS JetStream.
585
+ *
586
+ * Coordinates all server-side providers:
587
+ * 1. Registers handlers from NestJS into PatternRegistry
588
+ * 2. Creates required streams and consumers
589
+ * 3. Starts message consumption and routing
590
+ * 4. Handles Core or JetStream RPC based on configuration
591
+ *
592
+ * All dependencies are injected via the NestJS DI container.
593
+ */
594
+ declare class JetstreamStrategy extends Server implements CustomTransportStrategy {
595
+ private readonly options;
596
+ private readonly connection;
597
+ private readonly patternRegistry;
598
+ private readonly streamProvider;
599
+ private readonly consumerProvider;
600
+ private readonly messageProvider;
601
+ private readonly eventRouter;
602
+ private readonly rpcRouter;
603
+ private readonly coreRpcServer;
604
+ readonly transportId: symbol;
605
+ private readonly listeners;
606
+ private started;
607
+ constructor(options: JetstreamModuleOptions, connection: ConnectionProvider, patternRegistry: PatternRegistry, streamProvider: StreamProvider, consumerProvider: ConsumerProvider, messageProvider: MessageProvider, eventRouter: EventRouter, rpcRouter: RpcRouter, coreRpcServer: CoreRpcServer);
608
+ /**
609
+ * Start the transport: register handlers, create infrastructure, begin consumption.
610
+ *
611
+ * Called by NestJS when `connectMicroservice()` is used, or internally by the module.
612
+ */
613
+ listen(callback: () => void): Promise<void>;
614
+ /** Gracefully stop the transport. */
615
+ close(): void;
616
+ /**
617
+ * Register event listener (required by Server base class).
618
+ *
619
+ * Stores callbacks for client use. Primary lifecycle events
620
+ * are routed through EventBus.
621
+ */
622
+ on(event: string, callback: Function): void;
623
+ /** Unwrap the underlying NATS connection. */
624
+ unwrap<T>(): T;
625
+ /** Access the pattern registry (for module-level introspection). */
626
+ getPatternRegistry(): PatternRegistry;
627
+ /** Determine which JetStream stream kinds are needed. */
628
+ private resolveStreamKinds;
629
+ private isCoreRpcMode;
630
+ private isJetStreamRpcMode;
631
+ }
632
+
633
+ /**
634
+ * Orchestrates graceful transport shutdown.
635
+ *
636
+ * Shutdown sequence:
637
+ * 1. Emit onShutdownStart hook
638
+ * 2. Stop accepting new messages (close subscriptions, stop consumers)
639
+ * 3. Wait for in-flight handlers to complete (up to timeout)
640
+ * 4. Drain and close NATS connection
641
+ * 5. Emit onShutdownComplete hook
642
+ */
643
+ declare class ShutdownManager {
644
+ private readonly connection;
645
+ private readonly eventBus;
646
+ private readonly timeout;
647
+ private readonly logger;
648
+ constructor(connection: ConnectionProvider, eventBus: EventBus, timeout: number);
649
+ /**
650
+ * Execute the full shutdown sequence.
651
+ *
652
+ * @param strategy Optional strategy to close (stops consumers and subscriptions).
653
+ */
654
+ shutdown(strategy?: JetstreamStrategy): Promise<void>;
655
+ }
656
+
657
+ /**
658
+ * Root module for the NestJS JetStream transport.
659
+ *
660
+ * - `forRoot()` / `forRootAsync()` — registers once in AppModule.
661
+ * Creates shared NATS connection, codec, event bus, and optionally
662
+ * the consumer infrastructure.
663
+ *
664
+ * - `forFeature()` — registers in feature modules.
665
+ * Creates a lightweight client proxy targeting a specific service.
666
+ *
667
+ * @example
668
+ * ```typescript
669
+ * // AppModule — global setup
670
+ * @Module({
671
+ * imports: [
672
+ * JetstreamModule.forRoot({
673
+ * name: 'orders',
674
+ * servers: ['nats://localhost:4222'],
675
+ * }),
676
+ * ],
677
+ * })
678
+ * export class AppModule {}
679
+ *
680
+ * // Feature module — per-service clients
681
+ * @Module({
682
+ * imports: [
683
+ * JetstreamModule.forFeature({ name: 'users' }),
684
+ * JetstreamModule.forFeature({ name: 'payments' }),
685
+ * ],
686
+ * })
687
+ * export class OrdersModule {}
688
+ * ```
689
+ */
690
+ declare class JetstreamModule implements OnApplicationShutdown {
691
+ private readonly shutdownManager?;
692
+ private readonly strategy?;
693
+ constructor(shutdownManager?: ShutdownManager | undefined, strategy?: (JetstreamStrategy | null) | undefined);
694
+ /**
695
+ * Register the JetStream transport globally.
696
+ *
697
+ * Creates a shared NATS connection, codec, event bus, and optionally
698
+ * the full consumer infrastructure (streams, consumers, routers).
699
+ *
700
+ * @param options Module configuration.
701
+ * @returns Dynamic module ready to be imported.
702
+ */
703
+ static forRoot(options: JetstreamModuleOptions): DynamicModule;
704
+ /**
705
+ * Register the JetStream transport globally with async configuration.
706
+ *
707
+ * Supports `useFactory`, `useExisting`, and `useClass` patterns
708
+ * for loading configuration from ConfigService, environment, etc.
709
+ *
710
+ * @param asyncOptions Async configuration.
711
+ * @returns Dynamic module ready to be imported.
712
+ */
713
+ static forRootAsync(asyncOptions: JetstreamModuleAsyncOptions): DynamicModule;
714
+ /**
715
+ * Register a lightweight client proxy for a target service.
716
+ *
717
+ * Reuses the shared NATS connection from `forRoot()`.
718
+ * Import in each feature module that needs to communicate with a specific service.
719
+ *
720
+ * @param options Feature options with target service name.
721
+ * @returns Dynamic module with the client provider.
722
+ */
723
+ static forFeature(options: JetstreamFeatureOptions): DynamicModule;
724
+ /** Create all providers for synchronous forRoot(). */
725
+ /**
726
+ * Build a map of stream name -> max_deliver for dead letter detection.
727
+ * Each stream kind (ev, broadcast) has its own consumer config with potentially
728
+ * different max_deliver values.
729
+ */
730
+ private static buildMaxDeliverMap;
731
+ private static createCoreProviders;
732
+ /** Create providers that depend on JETSTREAM_OPTIONS (shared by sync and async). */
733
+ private static createCoreDependentProviders;
734
+ /** Create async options provider from useFactory/useExisting/useClass. */
735
+ private static createAsyncOptionsProvider;
736
+ /**
737
+ * Gracefully shut down the transport on application termination.
738
+ */
739
+ onApplicationShutdown(): Promise<void>;
740
+ }
741
+
742
+ /**
743
+ * NestJS ClientProxy implementation for the JetStream transport.
744
+ *
745
+ * Supports two operational modes:
746
+ * - **Core mode** (default): Uses `nc.request()` for RPC, `nc.publish()` for events.
747
+ * - **JetStream mode**: Uses `js.publish()` for RPC commands + inbox for responses.
748
+ *
749
+ * Events always go through JetStream publish for guaranteed delivery.
750
+ * The mode only affects RPC (request/reply) behavior.
751
+ *
752
+ * Clients are lightweight — they share the NATS connection from `forRoot()`.
753
+ */
754
+ declare class JetstreamClient extends ClientProxy {
755
+ private readonly rootOptions;
756
+ private readonly connection;
757
+ private readonly codec;
758
+ private readonly eventBus;
759
+ private readonly logger;
760
+ /** Target service name this client sends messages to. */
761
+ private readonly targetName;
762
+ /** Shared inbox for JetStream-mode RPC responses. */
763
+ private inbox;
764
+ private inboxSubscription;
765
+ /** Pending JetStream-mode RPC callbacks, keyed by correlation ID. */
766
+ private readonly pendingMessages;
767
+ /** Pending JetStream-mode RPC timeouts, keyed by correlation ID. */
768
+ private readonly pendingTimeouts;
769
+ /** Subscription to connection status events for disconnect handling. */
770
+ private statusSubscription;
771
+ constructor(rootOptions: JetstreamModuleOptions, targetServiceName: string, connection: ConnectionProvider, codec: Codec, eventBus: EventBus);
772
+ /** Establish connection. Called automatically by NestJS on first use. */
773
+ connect(): Promise<NatsConnection>;
774
+ /** Clean up resources. */
775
+ close(): Promise<void>;
776
+ /** Direct access to the raw NATS connection. */
777
+ unwrap<T = NatsConnection>(): T;
778
+ /**
779
+ * Publish a fire-and-forget event to JetStream.
780
+ *
781
+ * Events are published to either the workqueue stream or broadcast stream
782
+ * depending on the subject prefix.
783
+ */
784
+ protected dispatchEvent<T = unknown>(packet: ReadPacket): Promise<T>;
785
+ /**
786
+ * Publish an RPC command and register callback for response.
787
+ *
788
+ * Core mode: uses nc.request() with timeout.
789
+ * JetStream mode: publishes to stream + waits for inbox response.
790
+ */
791
+ protected publish(packet: ReadPacket, callback: (p: WritePacket) => void): () => void;
792
+ /** Core mode: nc.request() with timeout. */
793
+ private publishCoreRpc;
794
+ /** JetStream mode: publish to stream + wait for inbox response. */
795
+ private publishJetStreamRpc;
796
+ /** Fail-fast all pending JetStream RPC callbacks on connection loss. */
797
+ private handleDisconnect;
798
+ /** Reject all pending RPC callbacks, clear timeouts, and tear down inbox. */
799
+ private rejectPendingRpcs;
800
+ /** Setup shared inbox subscription for JetStream RPC responses. */
801
+ private setupInbox;
802
+ /** Route an inbox reply to the matching pending callback. */
803
+ private routeInboxReply;
804
+ /** Build event subject — workqueue or broadcast. */
805
+ private buildEventSubject;
806
+ /** Build NATS headers merging custom headers with transport headers. */
807
+ private buildHeaders;
808
+ /** Extract data, headers, and timeout from raw packet data or JetstreamRecord. */
809
+ private extractRecordData;
810
+ private isCoreRpcMode;
811
+ private isJetStreamRpcMode;
812
+ private getRpcTimeout;
813
+ }
814
+
815
+ /**
816
+ * Immutable message record for JetStream transport.
817
+ *
818
+ * Compatible with NestJS record builder pattern (like RmqRecord, NatsRecord).
819
+ * Pass as the second argument to `client.send()` or `client.emit()`.
820
+ *
821
+ * @example
822
+ * ```typescript
823
+ * const record = new JetstreamRecordBuilder({ id: 1 })
824
+ * .setHeader('x-tenant', 'acme')
825
+ * .setTimeout(5000)
826
+ * .build();
827
+ *
828
+ * client.send('get.user', record);
829
+ * ```
830
+ */
831
+ declare class JetstreamRecord<TData = unknown> {
832
+ readonly data: TData;
833
+ readonly headers: ReadonlyMap<string, string>;
834
+ readonly timeout?: number | undefined;
835
+ constructor(data: TData, headers: ReadonlyMap<string, string>, timeout?: number | undefined);
836
+ }
837
+ /**
838
+ * Fluent builder for constructing JetstreamRecord instances.
839
+ *
840
+ * Protected headers (`correlation-id`, `reply-to`, `error`) cannot be
841
+ * set by the user — attempting to do so throws an error at build time.
842
+ */
843
+ declare class JetstreamRecordBuilder<TData = unknown> {
844
+ private data;
845
+ private readonly headers;
846
+ private timeout;
847
+ constructor(data?: TData);
848
+ /** Set the message payload. */
849
+ setData(data: TData): this;
850
+ /**
851
+ * Set a single custom header.
852
+ *
853
+ * @throws Error if the header name is reserved by the transport.
854
+ */
855
+ setHeader(key: string, value: string): this;
856
+ /**
857
+ * Set multiple custom headers at once.
858
+ *
859
+ * @throws Error if any header name is reserved by the transport.
860
+ */
861
+ setHeaders(headers: Record<string, string>): this;
862
+ /** Set RPC request timeout in milliseconds. */
863
+ setTimeout(ms: number): this;
864
+ /** Build the immutable JetstreamRecord. */
865
+ build(): JetstreamRecord<TData>;
866
+ /** Validate that a header key is not reserved. */
867
+ private validateHeaderKey;
868
+ }
869
+
870
+ /**
871
+ * Default JSON codec wrapping the nats.js JSONCodec.
872
+ *
873
+ * Serializes to/from JSON using the native NATS implementation
874
+ * which handles `TextEncoder`/`TextDecoder` internally.
875
+ *
876
+ * @example
877
+ * ```typescript
878
+ * const codec = new JsonCodec();
879
+ * const bytes = codec.encode({ hello: 'world' });
880
+ * const data = codec.decode(bytes); // { hello: 'world' }
881
+ * ```
882
+ */
883
+ declare class JsonCodec implements Codec {
884
+ private readonly inner;
885
+ encode(data: unknown): Uint8Array;
886
+ decode(data: Uint8Array): unknown;
887
+ }
888
+
889
+ type NatsMessage = JsMsg | Msg;
890
+ /**
891
+ * Execution context for RPC and event handlers.
892
+ *
893
+ * Provides convenient accessors for the NATS message, subject,
894
+ * and headers without needing to interact with the raw message directly.
895
+ *
896
+ * @example
897
+ * ```typescript
898
+ * @MessagePattern('get.user')
899
+ * getUser(data: GetUserDto, @Ctx() ctx: RpcContext) {
900
+ * const traceId = ctx.getHeader('x-trace-id');
901
+ * const subject = ctx.getSubject();
902
+ * return this.userService.findOne(data.id);
903
+ * }
904
+ * ```
905
+ */
906
+ declare class RpcContext extends BaseRpcContext<[NatsMessage]> {
907
+ /** Get the underlying NATS message (JsMsg for JetStream, Msg for Core). */
908
+ getMessage(): NatsMessage;
909
+ /** Get the NATS subject this message was published to. */
910
+ getSubject(): string;
911
+ /** Get all NATS message headers, or undefined if none are present. */
912
+ getHeaders(): MsgHdrs | undefined;
913
+ /** Get a single header value by key. Returns undefined if the header or headers object is missing. */
914
+ getHeader(key: string): string | undefined;
915
+ /** Type guard: narrows getMessage() return type to JsMsg when true. */
916
+ isJetStream(): this is RpcContext & {
917
+ getMessage(): JsMsg;
918
+ };
919
+ }
920
+
921
+ /**
922
+ * Health status returned by `check()`.
923
+ */
924
+ interface JetstreamHealthStatus {
925
+ connected: boolean;
926
+ server: string | null;
927
+ /** Round-trip latency in ms (null if disconnected). */
928
+ latency: number | null;
929
+ }
930
+ /**
931
+ * Health indicator result compatible with @nestjs/terminus.
932
+ *
933
+ * Follows the Terminus convention: returns status object on success,
934
+ * throws on failure. Works with Terminus out of the box — no wrapper needed:
935
+ *
936
+ * @example
937
+ * ```typescript
938
+ * // With Terminus
939
+ * this.health.check([() => this.jetstream.isHealthy()])
940
+ *
941
+ * // Standalone
942
+ * const status = await this.jetstream.check();
943
+ * ```
944
+ */
945
+ declare class JetstreamHealthIndicator {
946
+ private readonly connection;
947
+ private readonly logger;
948
+ constructor(connection: ConnectionProvider);
949
+ /**
950
+ * Plain health status check.
951
+ *
952
+ * Returns the current connection status without throwing.
953
+ * Use this for custom health endpoints or monitoring integrations.
954
+ */
955
+ check(): Promise<JetstreamHealthStatus>;
956
+ /**
957
+ * Terminus-compatible health check.
958
+ *
959
+ * Returns `{ [key]: { status: 'up', ... } }` on success.
960
+ * Throws an error with `{ [key]: { status: 'down', ... } }` on failure.
961
+ *
962
+ * @param key Health indicator key (default: 'jetstream')
963
+ */
964
+ isHealthy(key?: string): Promise<Record<string, Record<string, unknown>>>;
965
+ }
966
+
967
+ /** Token for the resolved JetstreamModuleOptions. */
968
+ declare const JETSTREAM_OPTIONS: unique symbol;
969
+ /** Token for the shared ConnectionProvider instance. */
970
+ declare const JETSTREAM_CONNECTION: unique symbol;
971
+ /** Token for the global Codec instance. */
972
+ declare const JETSTREAM_CODEC: unique symbol;
973
+ /** Token for the EventBus instance. */
974
+ declare const JETSTREAM_EVENT_BUS: unique symbol;
975
+ /**
976
+ * Generate a unique injection token for a forFeature client.
977
+ * This is what users inject with `@Inject('service-name')`.
978
+ */
979
+ declare const getClientToken: (name: string) => string;
980
+ /** Convert milliseconds to nanoseconds (NATS JetStream format). */
981
+ declare const nanos: (ms: number) => number;
982
+ /** NATS headers managed by the transport. Users cannot overwrite these. */
983
+ declare enum JetstreamHeader {
984
+ CorrelationId = "x-correlation-id",
985
+ ReplyTo = "x-reply-to",
986
+ Subject = "x-subject",
987
+ CallerName = "x-caller-name",
988
+ RequestId = "x-request-id",
989
+ TraceId = "x-trace-id",
990
+ SpanId = "x-span-id",
991
+ /** Set to 'true' on error responses so the client can distinguish success from failure. */
992
+ Error = "x-error"
993
+ }
994
+
995
+ export { type Codec, type DeadLetterInfo, EventBus, JETSTREAM_CODEC, JETSTREAM_CONNECTION, JETSTREAM_EVENT_BUS, JETSTREAM_OPTIONS, JetstreamClient, type JetstreamFeatureOptions, JetstreamHeader, JetstreamHealthIndicator, type JetstreamHealthStatus, JetstreamModule, type JetstreamModuleAsyncOptions, type JetstreamModuleOptions, JetstreamRecord, JetstreamRecordBuilder, JetstreamStrategy, JsonCodec, type RpcConfig, RpcContext, type StreamConsumerOverrides, TransportEvent, type TransportHooks, getClientToken, nanos };