nats.do 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,444 @@
1
+ export { E as Env } from './env-Ds3wIkQg.js';
2
+
3
+ /**
4
+ * Core NATS Types
5
+ *
6
+ * Implements types compatible with the nats.js library.
7
+ */
8
+ interface ConnectionOptions {
9
+ servers: string | string[];
10
+ name?: string;
11
+ token?: string;
12
+ user?: string;
13
+ pass?: string;
14
+ timeout?: number;
15
+ reconnect?: boolean;
16
+ maxReconnectAttempts?: number;
17
+ reconnectTimeWait?: number;
18
+ }
19
+ interface MsgHdrs {
20
+ get(key: string): string | undefined;
21
+ set(key: string, value: string): void;
22
+ append(key: string, value: string): void;
23
+ has(key: string): boolean;
24
+ delete(key: string): void;
25
+ keys(): IterableIterator<string>;
26
+ values(key: string): string[];
27
+ code?: number;
28
+ description?: string;
29
+ }
30
+ declare function createHeaders(): MsgHdrs;
31
+ interface Msg {
32
+ subject: string;
33
+ data: Uint8Array;
34
+ sid: number;
35
+ reply?: string;
36
+ headers?: MsgHdrs;
37
+ respond(data?: Uint8Array, opts?: PublishOptions): boolean;
38
+ string(): string;
39
+ json<T = unknown>(): T;
40
+ }
41
+ interface PublishOptions {
42
+ reply?: string;
43
+ headers?: MsgHdrs;
44
+ }
45
+ interface SubscriptionOptions {
46
+ queue?: string;
47
+ max?: number;
48
+ callback?: (err: Error | null, msg: Msg) => void;
49
+ timeout?: number;
50
+ }
51
+ interface RequestOptions {
52
+ timeout?: number;
53
+ headers?: MsgHdrs;
54
+ noMux?: boolean;
55
+ }
56
+ interface Subscription extends AsyncIterable<Msg> {
57
+ getSubject(): string;
58
+ unsubscribe(max?: number): void;
59
+ drain(): Promise<void>;
60
+ isClosed(): boolean;
61
+ getReceived(): number;
62
+ getMax(): number | undefined;
63
+ }
64
+ interface QueuedIterator<T> extends AsyncIterator<T> {
65
+ [Symbol.asyncIterator](): AsyncIterator<T>;
66
+ stop(): void;
67
+ }
68
+ type StatusType = 'disconnect' | 'reconnecting' | 'reconnect' | 'update' | 'ldm' | 'error';
69
+ interface Status {
70
+ type: StatusType;
71
+ data?: string | Error | {
72
+ added?: string[];
73
+ deleted?: string[];
74
+ };
75
+ }
76
+ interface ServerInfo {
77
+ server_id: string;
78
+ server_name: string;
79
+ version: string;
80
+ proto: number;
81
+ host: string;
82
+ port: number;
83
+ max_payload: number;
84
+ jetstream?: boolean;
85
+ client_id?: number;
86
+ client_ip?: string;
87
+ }
88
+ interface NatsConnection {
89
+ publish(subject: string, data?: Uint8Array, opts?: PublishOptions): void;
90
+ subscribe(subject: string, opts?: SubscriptionOptions): Subscription;
91
+ request(subject: string, data?: Uint8Array, opts?: RequestOptions): Promise<Msg>;
92
+ flush(): Promise<void>;
93
+ drain(): Promise<void>;
94
+ close(): Promise<void>;
95
+ closed(): Promise<void | Error>;
96
+ status(): AsyncIterable<Status>;
97
+ isClosed(): boolean;
98
+ isDraining(): boolean;
99
+ getServer(): string;
100
+ info?: ServerInfo;
101
+ }
102
+ interface Codec<T> {
103
+ encode(data: T): Uint8Array;
104
+ decode(data: Uint8Array): T;
105
+ }
106
+ declare function StringCodec(): Codec<string>;
107
+ declare function JSONCodec<T = unknown>(): Codec<T>;
108
+ declare const Empty: Uint8Array;
109
+
110
+ /**
111
+ * JetStream Types
112
+ *
113
+ * Implements types compatible with @nats-io/jetstream library.
114
+ */
115
+ type RetentionPolicy = 'limits' | 'interest' | 'workqueue';
116
+ type StorageType = 'file' | 'memory';
117
+ type DiscardPolicy = 'old' | 'new';
118
+ type AckPolicy = 'none' | 'all' | 'explicit';
119
+ type DeliverPolicy = 'all' | 'last' | 'new' | 'by_start_sequence' | 'by_start_time' | 'last_per_subject';
120
+ type ReplayPolicy = 'instant' | 'original';
121
+ interface StreamConfig {
122
+ name: string;
123
+ subjects: string[];
124
+ description?: string;
125
+ retention?: RetentionPolicy;
126
+ storage?: StorageType;
127
+ max_msgs?: number;
128
+ max_bytes?: number;
129
+ max_age?: number;
130
+ max_msg_size?: number;
131
+ max_msgs_per_subject?: number;
132
+ max_consumers?: number;
133
+ discard?: DiscardPolicy;
134
+ discard_new_per_subject?: boolean;
135
+ duplicate_window?: number;
136
+ num_replicas?: number;
137
+ deny_delete?: boolean;
138
+ deny_purge?: boolean;
139
+ allow_rollup_hdrs?: boolean;
140
+ allow_direct?: boolean;
141
+ mirror_direct?: boolean;
142
+ sealed?: boolean;
143
+ placement?: {
144
+ cluster?: string;
145
+ tags?: string[];
146
+ };
147
+ mirror?: {
148
+ name: string;
149
+ opt_start_seq?: number;
150
+ opt_start_time?: string;
151
+ filter_subject?: string;
152
+ };
153
+ sources?: Array<{
154
+ name: string;
155
+ opt_start_seq?: number;
156
+ opt_start_time?: string;
157
+ filter_subject?: string;
158
+ }>;
159
+ republish?: {
160
+ src: string;
161
+ dest: string;
162
+ headers_only?: boolean;
163
+ };
164
+ subject_transform?: {
165
+ src: string;
166
+ dest: string;
167
+ };
168
+ }
169
+ declare function defaultStreamConfig(name: string): StreamConfig;
170
+ interface StreamState {
171
+ messages: number;
172
+ bytes: number;
173
+ first_seq: number;
174
+ first_ts?: string;
175
+ last_seq: number;
176
+ last_ts?: string;
177
+ consumer_count: number;
178
+ num_deleted?: number;
179
+ num_subjects?: number;
180
+ subjects?: Record<string, number>;
181
+ }
182
+ interface StreamInfo {
183
+ config: StreamConfig;
184
+ state: StreamState;
185
+ created: string;
186
+ cluster?: {
187
+ name?: string;
188
+ leader?: string;
189
+ replicas?: Array<{
190
+ name: string;
191
+ current: boolean;
192
+ active: number;
193
+ lag: number;
194
+ }>;
195
+ };
196
+ mirror?: {
197
+ name: string;
198
+ lag: number;
199
+ active: number;
200
+ };
201
+ sources?: Array<{
202
+ name: string;
203
+ lag: number;
204
+ active: number;
205
+ }>;
206
+ }
207
+ interface ConsumerConfig {
208
+ name?: string;
209
+ durable_name?: string;
210
+ description?: string;
211
+ deliver_policy?: DeliverPolicy;
212
+ opt_start_seq?: number;
213
+ opt_start_time?: string;
214
+ ack_policy: AckPolicy;
215
+ ack_wait?: number;
216
+ max_deliver?: number;
217
+ filter_subject?: string;
218
+ filter_subjects?: string[];
219
+ replay_policy?: ReplayPolicy;
220
+ rate_limit_bps?: number;
221
+ sample_freq?: string;
222
+ max_waiting?: number;
223
+ max_ack_pending?: number;
224
+ headers_only?: boolean;
225
+ max_batch?: number;
226
+ max_expires?: number;
227
+ max_bytes?: number;
228
+ inactive_threshold?: number;
229
+ backoff?: number[];
230
+ num_replicas?: number;
231
+ mem_storage?: boolean;
232
+ metadata?: Record<string, string>;
233
+ }
234
+ declare function defaultConsumerConfig(): ConsumerConfig;
235
+ interface SequencePair {
236
+ consumer_seq: number;
237
+ stream_seq: number;
238
+ }
239
+ interface ConsumerInfo {
240
+ stream_name: string;
241
+ name: string;
242
+ config: ConsumerConfig;
243
+ created: string;
244
+ delivered: SequencePair;
245
+ ack_floor: SequencePair;
246
+ num_ack_pending: number;
247
+ num_redelivered: number;
248
+ num_waiting: number;
249
+ num_pending: number;
250
+ cluster?: {
251
+ name?: string;
252
+ leader?: string;
253
+ };
254
+ push_bound?: boolean;
255
+ }
256
+ interface PubAck {
257
+ stream: string;
258
+ seq: number;
259
+ duplicate?: boolean;
260
+ domain?: string;
261
+ }
262
+ interface JsMsgInfo {
263
+ stream: string;
264
+ consumer: string;
265
+ delivered: number;
266
+ streamSequence: number;
267
+ consumerSequence: number;
268
+ timestampNanos: bigint;
269
+ pending: number;
270
+ redelivered: boolean;
271
+ redeliveryCount?: number;
272
+ }
273
+ interface JsMsg {
274
+ subject: string;
275
+ data: Uint8Array;
276
+ headers?: MsgHdrs;
277
+ seq: number;
278
+ info: JsMsgInfo;
279
+ ack(): void;
280
+ nak(delay?: number): void;
281
+ working(): void;
282
+ term(reason?: string): void;
283
+ ackAck(): Promise<boolean>;
284
+ string?(): string;
285
+ json?<T = unknown>(): T;
286
+ }
287
+ interface PullOptions {
288
+ max_messages?: number;
289
+ max_bytes?: number;
290
+ expires?: number;
291
+ idle_heartbeat?: number;
292
+ batch?: number;
293
+ no_wait?: boolean;
294
+ }
295
+ interface ConsumeOptions {
296
+ max_messages?: number;
297
+ max_bytes?: number;
298
+ expires?: number;
299
+ idle_heartbeat?: number;
300
+ callback?: (msg: JsMsg) => void | Promise<void>;
301
+ }
302
+ interface ConsumerMessages extends AsyncIterable<JsMsg> {
303
+ close(): Promise<void>;
304
+ stop(): Promise<void>;
305
+ }
306
+ interface Stream {
307
+ info(cached?: boolean): Promise<StreamInfo>;
308
+ getMessage(query: {
309
+ seq?: number;
310
+ last_by_subj?: string;
311
+ next_by_subj?: string;
312
+ }): Promise<StoredMsg | null>;
313
+ deleteMessage(seq: number, erase?: boolean): Promise<boolean>;
314
+ }
315
+ interface StoredMsg {
316
+ subject: string;
317
+ data: Uint8Array;
318
+ headers?: MsgHdrs;
319
+ seq: number;
320
+ time: string;
321
+ }
322
+ interface Consumer {
323
+ info(cached?: boolean): Promise<ConsumerInfo>;
324
+ consume(opts?: ConsumeOptions): Promise<ConsumerMessages>;
325
+ fetch(opts?: PullOptions): Promise<ConsumerMessages>;
326
+ delete(): Promise<boolean>;
327
+ }
328
+ interface PurgeResponse {
329
+ success: boolean;
330
+ purged: number;
331
+ }
332
+ interface StreamsAPI {
333
+ add(config: StreamConfig): Promise<StreamInfo>;
334
+ update(config: StreamConfig): Promise<StreamInfo>;
335
+ delete(stream: string): Promise<boolean>;
336
+ get(stream: string): Promise<Stream>;
337
+ list(): AsyncIterable<StreamInfo>;
338
+ info(stream: string): Promise<StreamInfo>;
339
+ names(): AsyncIterable<string>;
340
+ purge(stream: string, opts?: {
341
+ filter?: string;
342
+ seq?: number;
343
+ keep?: number;
344
+ }): Promise<PurgeResponse>;
345
+ }
346
+ interface ConsumersAPI {
347
+ add(stream: string, config: ConsumerConfig): Promise<ConsumerInfo>;
348
+ update(stream: string, config: ConsumerConfig): Promise<ConsumerInfo>;
349
+ delete(stream: string, consumer: string): Promise<boolean>;
350
+ list(stream: string): AsyncIterable<ConsumerInfo>;
351
+ info(stream: string, consumer: string): Promise<ConsumerInfo>;
352
+ }
353
+ interface JetStreamManager {
354
+ streams: StreamsAPI;
355
+ consumers: ConsumersAPI;
356
+ }
357
+ interface ConsumersAccessor {
358
+ get(stream: string, consumer: string): Promise<Consumer>;
359
+ }
360
+ interface StreamsAccessor {
361
+ get(stream: string): Promise<Stream>;
362
+ }
363
+ interface JetStreamPublishOptions {
364
+ msgID?: string;
365
+ expect?: {
366
+ lastMsgID?: string;
367
+ lastSequence?: number;
368
+ lastSubjectSequence?: number;
369
+ streamName?: string;
370
+ };
371
+ headers?: MsgHdrs;
372
+ timeout?: number;
373
+ }
374
+ interface JetStreamClient {
375
+ publish(subject: string, data?: Uint8Array, opts?: JetStreamPublishOptions): Promise<PubAck>;
376
+ consumers: ConsumersAccessor;
377
+ streams: StreamsAccessor;
378
+ }
379
+
380
+ /**
381
+ * RPC Types
382
+ *
383
+ * JSON-RPC 2.0 types for NatDO communication.
384
+ */
385
+ type RpcId = string | number;
386
+ interface RpcRequest {
387
+ jsonrpc: '2.0';
388
+ method: string;
389
+ params?: Record<string, unknown> | unknown[];
390
+ id: RpcId;
391
+ }
392
+ interface RpcNotification {
393
+ jsonrpc: '2.0';
394
+ method: string;
395
+ params?: Record<string, unknown> | unknown[];
396
+ }
397
+ interface RpcError {
398
+ code: number;
399
+ message: string;
400
+ data?: unknown;
401
+ }
402
+ interface RpcResponse {
403
+ jsonrpc: '2.0';
404
+ result?: unknown;
405
+ error?: RpcError;
406
+ id: RpcId | null;
407
+ }
408
+ type RpcBatchRequest = Array<RpcRequest | RpcNotification>;
409
+ type RpcBatchResponse = RpcResponse[];
410
+ declare const RPC_ERROR_CODES: {
411
+ readonly PARSE_ERROR: -32700;
412
+ readonly INVALID_REQUEST: -32600;
413
+ readonly METHOD_NOT_FOUND: -32601;
414
+ readonly INVALID_PARAMS: -32602;
415
+ readonly INTERNAL_ERROR: -32603;
416
+ readonly STREAM_NOT_FOUND: -32001;
417
+ readonly CONSUMER_NOT_FOUND: -32002;
418
+ readonly NO_RESPONDERS: -32003;
419
+ readonly TIMEOUT: -32004;
420
+ readonly MESSAGE_NOT_FOUND: -32005;
421
+ readonly STREAM_EXISTS: -32006;
422
+ readonly CONSUMER_EXISTS: -32007;
423
+ readonly INVALID_SUBJECT: -32008;
424
+ readonly PERMISSION_DENIED: -32009;
425
+ readonly MAX_PAYLOAD_EXCEEDED: -32010;
426
+ readonly DUPLICATE_MESSAGE: -32011;
427
+ readonly STREAM_SEALED: -32012;
428
+ readonly CONSUMER_DELETED: -32013;
429
+ };
430
+ declare function isRpcError(response: RpcResponse): response is RpcResponse & {
431
+ error: RpcError;
432
+ };
433
+ declare function isRpcSuccess(response: RpcResponse): response is RpcResponse & {
434
+ result: unknown;
435
+ };
436
+ declare function createRpcRequest(method: string, opts?: {
437
+ params?: Record<string, unknown> | unknown[];
438
+ id?: RpcId;
439
+ }): RpcRequest;
440
+ declare function createRpcError(code: number, message: string, id?: RpcId | null, data?: unknown): RpcResponse;
441
+ declare function createRpcSuccess(result: unknown, id: RpcId): RpcResponse;
442
+ declare function resetRequestIdCounter(): void;
443
+
444
+ export { type AckPolicy, type Codec, type ConnectionOptions, type ConsumeOptions, type Consumer, type ConsumerConfig, type ConsumerInfo, type ConsumerMessages, type ConsumersAPI, type ConsumersAccessor, type DeliverPolicy, type DiscardPolicy, Empty, JSONCodec, type JetStreamClient, type JetStreamManager, type JetStreamPublishOptions, type JsMsg, type JsMsgInfo, type Msg, type MsgHdrs, type NatsConnection, type PubAck, type PublishOptions, type PullOptions, type PurgeResponse, type QueuedIterator, RPC_ERROR_CODES, type ReplayPolicy, type RequestOptions, type RetentionPolicy, type RpcBatchRequest, type RpcBatchResponse, type RpcError, type RpcId, type RpcNotification, type RpcRequest, type RpcResponse, type SequencePair, type ServerInfo, type Status, type StatusType, type StorageType, type StoredMsg, type Stream, type StreamConfig, type StreamInfo, type StreamState, type StreamsAPI, type StreamsAccessor, StringCodec, type Subscription, type SubscriptionOptions, createHeaders, createRpcError, createRpcRequest, createRpcSuccess, defaultConsumerConfig, defaultStreamConfig, isRpcError, isRpcSuccess, resetRequestIdCounter };
package/dist/types.js ADDED
@@ -0,0 +1,155 @@
1
+ // src/types/nats.ts
2
+ var MsgHdrsImpl = class {
3
+ headers = /* @__PURE__ */ new Map();
4
+ code;
5
+ description;
6
+ get(key) {
7
+ const values = this.headers.get(key.toLowerCase());
8
+ return values?.[0];
9
+ }
10
+ set(key, value) {
11
+ this.headers.set(key.toLowerCase(), [value]);
12
+ }
13
+ append(key, value) {
14
+ const lowerKey = key.toLowerCase();
15
+ const existing = this.headers.get(lowerKey) || [];
16
+ existing.push(value);
17
+ this.headers.set(lowerKey, existing);
18
+ }
19
+ has(key) {
20
+ return this.headers.has(key.toLowerCase());
21
+ }
22
+ delete(key) {
23
+ this.headers.delete(key.toLowerCase());
24
+ }
25
+ *keys() {
26
+ yield* this.headers.keys();
27
+ }
28
+ values(key) {
29
+ return this.headers.get(key.toLowerCase()) || [];
30
+ }
31
+ };
32
+ function createHeaders() {
33
+ return new MsgHdrsImpl();
34
+ }
35
+ function StringCodec() {
36
+ const encoder = new TextEncoder();
37
+ const decoder = new TextDecoder();
38
+ return {
39
+ encode(data) {
40
+ return encoder.encode(data);
41
+ },
42
+ decode(data) {
43
+ return decoder.decode(data);
44
+ }
45
+ };
46
+ }
47
+ function JSONCodec() {
48
+ const sc = StringCodec();
49
+ return {
50
+ encode(data) {
51
+ return sc.encode(JSON.stringify(data));
52
+ },
53
+ decode(data) {
54
+ return JSON.parse(sc.decode(data));
55
+ }
56
+ };
57
+ }
58
+ var Empty = new Uint8Array(0);
59
+
60
+ // src/types/jetstream.ts
61
+ function defaultStreamConfig(name) {
62
+ return {
63
+ name,
64
+ subjects: [],
65
+ retention: "limits",
66
+ storage: "file",
67
+ max_msgs: -1,
68
+ max_bytes: -1,
69
+ max_age: 0,
70
+ max_msg_size: -1,
71
+ max_consumers: -1,
72
+ discard: "old",
73
+ duplicate_window: 2 * 60 * 1e9,
74
+ // 2 minutes in nanos
75
+ num_replicas: 1,
76
+ deny_delete: false,
77
+ deny_purge: false
78
+ };
79
+ }
80
+ function defaultConsumerConfig() {
81
+ return {
82
+ ack_policy: "explicit",
83
+ deliver_policy: "all",
84
+ replay_policy: "instant",
85
+ ack_wait: 30 * 1e9,
86
+ // 30 seconds in nanos
87
+ max_deliver: -1,
88
+ max_ack_pending: 1e3,
89
+ max_waiting: 512
90
+ };
91
+ }
92
+
93
+ // src/types/rpc.ts
94
+ var RPC_ERROR_CODES = {
95
+ // Standard JSON-RPC errors
96
+ PARSE_ERROR: -32700,
97
+ INVALID_REQUEST: -32600,
98
+ METHOD_NOT_FOUND: -32601,
99
+ INVALID_PARAMS: -32602,
100
+ INTERNAL_ERROR: -32603,
101
+ // NATS-specific error codes (-32001 to -32099)
102
+ STREAM_NOT_FOUND: -32001,
103
+ CONSUMER_NOT_FOUND: -32002,
104
+ NO_RESPONDERS: -32003,
105
+ TIMEOUT: -32004,
106
+ MESSAGE_NOT_FOUND: -32005,
107
+ STREAM_EXISTS: -32006,
108
+ CONSUMER_EXISTS: -32007,
109
+ INVALID_SUBJECT: -32008,
110
+ PERMISSION_DENIED: -32009,
111
+ MAX_PAYLOAD_EXCEEDED: -32010,
112
+ DUPLICATE_MESSAGE: -32011,
113
+ STREAM_SEALED: -32012,
114
+ CONSUMER_DELETED: -32013
115
+ };
116
+ function isRpcError(response) {
117
+ return "error" in response && response.error !== void 0;
118
+ }
119
+ function isRpcSuccess(response) {
120
+ return !isRpcError(response);
121
+ }
122
+ var requestIdCounter = 0;
123
+ function createRpcRequest(method, opts) {
124
+ return {
125
+ jsonrpc: "2.0",
126
+ method,
127
+ ...opts?.params && { params: opts.params },
128
+ id: opts?.id ?? ++requestIdCounter
129
+ };
130
+ }
131
+ function createRpcError(code, message, id, data) {
132
+ return {
133
+ jsonrpc: "2.0",
134
+ error: {
135
+ code,
136
+ message,
137
+ ...data !== void 0 && { data }
138
+ },
139
+ id: id ?? null
140
+ };
141
+ }
142
+ function createRpcSuccess(result, id) {
143
+ return {
144
+ jsonrpc: "2.0",
145
+ result,
146
+ id
147
+ };
148
+ }
149
+ function resetRequestIdCounter() {
150
+ requestIdCounter = 0;
151
+ }
152
+
153
+ export { Empty, JSONCodec, RPC_ERROR_CODES, StringCodec, createHeaders, createRpcError, createRpcRequest, createRpcSuccess, defaultConsumerConfig, defaultStreamConfig, isRpcError, isRpcSuccess, resetRequestIdCounter };
154
+ //# sourceMappingURL=types.js.map
155
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/types/nats.ts","../src/types/jetstream.ts","../src/types/rpc.ts"],"names":[],"mappings":"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","file":"types.js","sourcesContent":["/**\n * Core NATS Types\n *\n * Implements types compatible with the nats.js library.\n */\n\n// Connection options for NatDO\nexport interface ConnectionOptions {\n servers: string | string[]\n name?: string\n token?: string\n user?: string\n pass?: string\n timeout?: number\n reconnect?: boolean\n maxReconnectAttempts?: number\n reconnectTimeWait?: number\n}\n\n// Message headers interface\nexport interface MsgHdrs {\n get(key: string): string | undefined\n set(key: string, value: string): void\n append(key: string, value: string): void\n has(key: string): boolean\n delete(key: string): void\n keys(): IterableIterator<string>\n values(key: string): string[]\n code?: number\n description?: string\n}\n\n// Create headers implementation\nclass MsgHdrsImpl implements MsgHdrs {\n private readonly headers: Map<string, string[]> = new Map()\n code?: number\n description?: string\n\n get(key: string): string | undefined {\n const values = this.headers.get(key.toLowerCase())\n return values?.[0]\n }\n\n set(key: string, value: string): void {\n this.headers.set(key.toLowerCase(), [value])\n }\n\n append(key: string, value: string): void {\n const lowerKey = key.toLowerCase()\n const existing = this.headers.get(lowerKey) || []\n existing.push(value)\n this.headers.set(lowerKey, existing)\n }\n\n has(key: string): boolean {\n return this.headers.has(key.toLowerCase())\n }\n\n delete(key: string): void {\n this.headers.delete(key.toLowerCase())\n }\n\n *keys(): IterableIterator<string> {\n yield* this.headers.keys()\n }\n\n values(key: string): string[] {\n return this.headers.get(key.toLowerCase()) || []\n }\n}\n\nexport function createHeaders(): MsgHdrs {\n return new MsgHdrsImpl()\n}\n\n// Message interface\nexport interface Msg {\n subject: string\n data: Uint8Array\n sid: number\n reply?: string\n headers?: MsgHdrs\n respond(data?: Uint8Array, opts?: PublishOptions): boolean\n string(): string\n json<T = unknown>(): T\n}\n\n// Publish options\nexport interface PublishOptions {\n reply?: string\n headers?: MsgHdrs\n}\n\n// Subscription options\nexport interface SubscriptionOptions {\n queue?: string\n max?: number\n callback?: (err: Error | null, msg: Msg) => void\n timeout?: number\n}\n\n// Request options\nexport interface RequestOptions {\n timeout?: number\n headers?: MsgHdrs\n noMux?: boolean\n}\n\n// Subscription interface\nexport interface Subscription extends AsyncIterable<Msg> {\n getSubject(): string\n unsubscribe(max?: number): void\n drain(): Promise<void>\n isClosed(): boolean\n getReceived(): number\n getMax(): number | undefined\n}\n\n// Queued iterator for async message consumption\nexport interface QueuedIterator<T> extends AsyncIterator<T> {\n [Symbol.asyncIterator](): AsyncIterator<T>\n stop(): void\n}\n\n// Status types\nexport type StatusType =\n | 'disconnect'\n | 'reconnecting'\n | 'reconnect'\n | 'update'\n | 'ldm'\n | 'error'\n\n// Status event\nexport interface Status {\n type: StatusType\n data?: string | Error | { added?: string[]; deleted?: string[] }\n}\n\n// Server info\nexport interface ServerInfo {\n server_id: string\n server_name: string\n version: string\n proto: number\n host: string\n port: number\n max_payload: number\n jetstream?: boolean\n client_id?: number\n client_ip?: string\n}\n\n// NATS Connection interface\nexport interface NatsConnection {\n publish(subject: string, data?: Uint8Array, opts?: PublishOptions): void\n subscribe(subject: string, opts?: SubscriptionOptions): Subscription\n request(\n subject: string,\n data?: Uint8Array,\n opts?: RequestOptions\n ): Promise<Msg>\n flush(): Promise<void>\n drain(): Promise<void>\n close(): Promise<void>\n closed(): Promise<void | Error>\n status(): AsyncIterable<Status>\n isClosed(): boolean\n isDraining(): boolean\n getServer(): string\n info?: ServerInfo\n}\n\n// Codec interface\nexport interface Codec<T> {\n encode(data: T): Uint8Array\n decode(data: Uint8Array): T\n}\n\n// String codec\nexport function StringCodec(): Codec<string> {\n const encoder = new TextEncoder()\n const decoder = new TextDecoder()\n return {\n encode(data: string): Uint8Array {\n return encoder.encode(data)\n },\n decode(data: Uint8Array): string {\n return decoder.decode(data)\n },\n }\n}\n\n// JSON codec\nexport function JSONCodec<T = unknown>(): Codec<T> {\n const sc = StringCodec()\n return {\n encode(data: T): Uint8Array {\n return sc.encode(JSON.stringify(data))\n },\n decode(data: Uint8Array): T {\n return JSON.parse(sc.decode(data))\n },\n }\n}\n\n// Empty payload constant\nexport const Empty: Uint8Array = new Uint8Array(0)\n","/**\n * JetStream Types\n *\n * Implements types compatible with @nats-io/jetstream library.\n */\n\n// Policy types\nexport type RetentionPolicy = 'limits' | 'interest' | 'workqueue'\nexport type StorageType = 'file' | 'memory'\nexport type DiscardPolicy = 'old' | 'new'\nexport type AckPolicy = 'none' | 'all' | 'explicit'\nexport type DeliverPolicy =\n | 'all'\n | 'last'\n | 'new'\n | 'by_start_sequence'\n | 'by_start_time'\n | 'last_per_subject'\nexport type ReplayPolicy = 'instant' | 'original'\n\n// Stream configuration\nexport interface StreamConfig {\n name: string\n subjects: string[]\n description?: string\n retention?: RetentionPolicy\n storage?: StorageType\n max_msgs?: number\n max_bytes?: number\n max_age?: number // nanoseconds\n max_msg_size?: number\n max_msgs_per_subject?: number\n max_consumers?: number\n discard?: DiscardPolicy\n discard_new_per_subject?: boolean\n duplicate_window?: number // nanoseconds\n num_replicas?: number\n deny_delete?: boolean\n deny_purge?: boolean\n allow_rollup_hdrs?: boolean\n allow_direct?: boolean\n mirror_direct?: boolean\n sealed?: boolean\n placement?: {\n cluster?: string\n tags?: string[]\n }\n mirror?: {\n name: string\n opt_start_seq?: number\n opt_start_time?: string\n filter_subject?: string\n }\n sources?: Array<{\n name: string\n opt_start_seq?: number\n opt_start_time?: string\n filter_subject?: string\n }>\n republish?: {\n src: string\n dest: string\n headers_only?: boolean\n }\n subject_transform?: {\n src: string\n dest: string\n }\n}\n\n// Default stream config helper\nexport function defaultStreamConfig(name: string): StreamConfig {\n return {\n name,\n subjects: [],\n retention: 'limits',\n storage: 'file',\n max_msgs: -1,\n max_bytes: -1,\n max_age: 0,\n max_msg_size: -1,\n max_consumers: -1,\n discard: 'old',\n duplicate_window: 2 * 60 * 1_000_000_000, // 2 minutes in nanos\n num_replicas: 1,\n deny_delete: false,\n deny_purge: false,\n }\n}\n\n// Stream state\nexport interface StreamState {\n messages: number\n bytes: number\n first_seq: number\n first_ts?: string\n last_seq: number\n last_ts?: string\n consumer_count: number\n num_deleted?: number\n num_subjects?: number\n subjects?: Record<string, number>\n}\n\n// Stream info\nexport interface StreamInfo {\n config: StreamConfig\n state: StreamState\n created: string\n cluster?: {\n name?: string\n leader?: string\n replicas?: Array<{\n name: string\n current: boolean\n active: number\n lag: number\n }>\n }\n mirror?: {\n name: string\n lag: number\n active: number\n }\n sources?: Array<{\n name: string\n lag: number\n active: number\n }>\n}\n\n// Consumer configuration\nexport interface ConsumerConfig {\n name?: string\n durable_name?: string\n description?: string\n deliver_policy?: DeliverPolicy\n opt_start_seq?: number\n opt_start_time?: string\n ack_policy: AckPolicy\n ack_wait?: number // nanoseconds\n max_deliver?: number\n filter_subject?: string\n filter_subjects?: string[]\n replay_policy?: ReplayPolicy\n rate_limit_bps?: number\n sample_freq?: string\n max_waiting?: number\n max_ack_pending?: number\n headers_only?: boolean\n max_batch?: number\n max_expires?: number // nanoseconds\n max_bytes?: number\n inactive_threshold?: number // nanoseconds\n backoff?: number[] // nanoseconds\n num_replicas?: number\n mem_storage?: boolean\n metadata?: Record<string, string>\n}\n\n// Default consumer config helper\nexport function defaultConsumerConfig(): ConsumerConfig {\n return {\n ack_policy: 'explicit',\n deliver_policy: 'all',\n replay_policy: 'instant',\n ack_wait: 30 * 1_000_000_000, // 30 seconds in nanos\n max_deliver: -1,\n max_ack_pending: 1000,\n max_waiting: 512,\n }\n}\n\n// Sequence pair for consumer tracking\nexport interface SequencePair {\n consumer_seq: number\n stream_seq: number\n}\n\n// Consumer info\nexport interface ConsumerInfo {\n stream_name: string\n name: string\n config: ConsumerConfig\n created: string\n delivered: SequencePair\n ack_floor: SequencePair\n num_ack_pending: number\n num_redelivered: number\n num_waiting: number\n num_pending: number\n cluster?: {\n name?: string\n leader?: string\n }\n push_bound?: boolean\n}\n\n// Publish acknowledgment\nexport interface PubAck {\n stream: string\n seq: number\n duplicate?: boolean\n domain?: string\n}\n\n// JetStream message info\nexport interface JsMsgInfo {\n stream: string\n consumer: string\n delivered: number\n streamSequence: number\n consumerSequence: number\n timestampNanos: bigint\n pending: number\n redelivered: boolean\n redeliveryCount?: number\n}\n\n// JetStream message\nexport interface JsMsg {\n subject: string\n data: Uint8Array\n headers?: import('./nats').MsgHdrs\n seq: number\n info: JsMsgInfo\n ack(): void\n nak(delay?: number): void\n working(): void\n term(reason?: string): void\n ackAck(): Promise<boolean>\n string?(): string\n json?<T = unknown>(): T\n}\n\n// Pull options for fetch\nexport interface PullOptions {\n max_messages?: number\n max_bytes?: number\n expires?: number // milliseconds\n idle_heartbeat?: number // milliseconds\n batch?: number\n no_wait?: boolean\n}\n\n// Consume options\nexport interface ConsumeOptions {\n max_messages?: number\n max_bytes?: number\n expires?: number\n idle_heartbeat?: number\n callback?: (msg: JsMsg) => void | Promise<void>\n}\n\n// Consumer messages iterator\nexport interface ConsumerMessages extends AsyncIterable<JsMsg> {\n close(): Promise<void>\n stop(): Promise<void>\n}\n\n// Stream interface\nexport interface Stream {\n info(cached?: boolean): Promise<StreamInfo>\n getMessage(query: {\n seq?: number\n last_by_subj?: string\n next_by_subj?: string\n }): Promise<StoredMsg | null>\n deleteMessage(seq: number, erase?: boolean): Promise<boolean>\n}\n\n// Stored message\nexport interface StoredMsg {\n subject: string\n data: Uint8Array\n headers?: import('./nats').MsgHdrs\n seq: number\n time: string\n}\n\n// Consumer interface\nexport interface Consumer {\n info(cached?: boolean): Promise<ConsumerInfo>\n consume(opts?: ConsumeOptions): Promise<ConsumerMessages>\n fetch(opts?: PullOptions): Promise<ConsumerMessages>\n delete(): Promise<boolean>\n}\n\n// Purge response\nexport interface PurgeResponse {\n success: boolean\n purged: number\n}\n\n// Streams API\nexport interface StreamsAPI {\n add(config: StreamConfig): Promise<StreamInfo>\n update(config: StreamConfig): Promise<StreamInfo>\n delete(stream: string): Promise<boolean>\n get(stream: string): Promise<Stream>\n list(): AsyncIterable<StreamInfo>\n info(stream: string): Promise<StreamInfo>\n names(): AsyncIterable<string>\n purge(stream: string, opts?: { filter?: string; seq?: number; keep?: number }): Promise<PurgeResponse>\n}\n\n// Consumers API\nexport interface ConsumersAPI {\n add(stream: string, config: ConsumerConfig): Promise<ConsumerInfo>\n update(stream: string, config: ConsumerConfig): Promise<ConsumerInfo>\n delete(stream: string, consumer: string): Promise<boolean>\n list(stream: string): AsyncIterable<ConsumerInfo>\n info(stream: string, consumer: string): Promise<ConsumerInfo>\n}\n\n// JetStream manager\nexport interface JetStreamManager {\n streams: StreamsAPI\n consumers: ConsumersAPI\n}\n\n// Consumers accessor for JetStreamClient\nexport interface ConsumersAccessor {\n get(stream: string, consumer: string): Promise<Consumer>\n}\n\n// Streams accessor for JetStreamClient\nexport interface StreamsAccessor {\n get(stream: string): Promise<Stream>\n}\n\n// JetStream publish options\nexport interface JetStreamPublishOptions {\n msgID?: string\n expect?: {\n lastMsgID?: string\n lastSequence?: number\n lastSubjectSequence?: number\n streamName?: string\n }\n headers?: import('./nats').MsgHdrs\n timeout?: number\n}\n\n// JetStream client\nexport interface JetStreamClient {\n publish(\n subject: string,\n data?: Uint8Array,\n opts?: JetStreamPublishOptions\n ): Promise<PubAck>\n consumers: ConsumersAccessor\n streams: StreamsAccessor\n}\n","/**\n * RPC Types\n *\n * JSON-RPC 2.0 types for NatDO communication.\n */\n\n// Request ID type\nexport type RpcId = string | number\n\n// RPC Request\nexport interface RpcRequest {\n jsonrpc: '2.0'\n method: string\n params?: Record<string, unknown> | unknown[]\n id: RpcId\n}\n\n// RPC Notification (no id)\nexport interface RpcNotification {\n jsonrpc: '2.0'\n method: string\n params?: Record<string, unknown> | unknown[]\n}\n\n// RPC Error\nexport interface RpcError {\n code: number\n message: string\n data?: unknown\n}\n\n// RPC Response\nexport interface RpcResponse {\n jsonrpc: '2.0'\n result?: unknown\n error?: RpcError\n id: RpcId | null\n}\n\n// Batch types\nexport type RpcBatchRequest = Array<RpcRequest | RpcNotification>\nexport type RpcBatchResponse = RpcResponse[]\n\n// Standard JSON-RPC 2.0 error codes\nexport const RPC_ERROR_CODES = {\n // Standard JSON-RPC errors\n PARSE_ERROR: -32700,\n INVALID_REQUEST: -32600,\n METHOD_NOT_FOUND: -32601,\n INVALID_PARAMS: -32602,\n INTERNAL_ERROR: -32603,\n\n // NATS-specific error codes (-32001 to -32099)\n STREAM_NOT_FOUND: -32001,\n CONSUMER_NOT_FOUND: -32002,\n NO_RESPONDERS: -32003,\n TIMEOUT: -32004,\n MESSAGE_NOT_FOUND: -32005,\n STREAM_EXISTS: -32006,\n CONSUMER_EXISTS: -32007,\n INVALID_SUBJECT: -32008,\n PERMISSION_DENIED: -32009,\n MAX_PAYLOAD_EXCEEDED: -32010,\n DUPLICATE_MESSAGE: -32011,\n STREAM_SEALED: -32012,\n CONSUMER_DELETED: -32013,\n} as const\n\n// Type guard for error responses\nexport function isRpcError(response: RpcResponse): response is RpcResponse & { error: RpcError } {\n return 'error' in response && response.error !== undefined\n}\n\n// Type guard for success responses\nexport function isRpcSuccess(response: RpcResponse): response is RpcResponse & { result: unknown } {\n return !isRpcError(response)\n}\n\n// Request ID counter for auto-incrementing IDs\nlet requestIdCounter = 0\n\n// Create RPC request helper\nexport function createRpcRequest(\n method: string,\n opts?: { params?: Record<string, unknown> | unknown[]; id?: RpcId }\n): RpcRequest {\n return {\n jsonrpc: '2.0',\n method,\n ...(opts?.params && { params: opts.params }),\n id: opts?.id ?? ++requestIdCounter,\n }\n}\n\n// Create RPC error response helper\nexport function createRpcError(\n code: number,\n message: string,\n id?: RpcId | null,\n data?: unknown\n): RpcResponse {\n return {\n jsonrpc: '2.0',\n error: {\n code,\n message,\n ...(data !== undefined && { data }),\n },\n id: id ?? null,\n }\n}\n\n// Create RPC success response helper\nexport function createRpcSuccess(result: unknown, id: RpcId): RpcResponse {\n return {\n jsonrpc: '2.0',\n result,\n id,\n }\n}\n\n// Reset request ID counter (for testing)\nexport function resetRequestIdCounter(): void {\n requestIdCounter = 0\n}\n"]}