UNPKG

18 kBTypeScriptView Raw
1/*
2 * Copyright 2013-2021 The NATS Authors
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15export declare function connect(
16 opts?: ConnectionOptions,
17): Promise<NatsConnection>;
18
19export declare const Empty: Uint8Array;
20export declare enum Events {
21 Disconnect = "disconnect",
22 Reconnect = "reconnect",
23 Update = "update",
24 LDM = "ldm",
25 Error = "error"
26}
27export interface Status {
28 type: Events | DebugEvents;
29 data: string | ServersChanged | number;
30}
31export declare enum DebugEvents {
32 Reconnecting = "reconnecting",
33 PingTimer = "pingTimer",
34 StaleConnection = "staleConnection"
35}
36
37export interface NatsConnection {
38 info?: ServerInfo;
39 closed(): Promise<void | Error>;
40 close(): Promise<void>;
41 publish(subject: string, data?: Uint8Array, options?: PublishOptions): void;
42 subscribe(subject: string, opts?: SubscriptionOptions): Subscription;
43 request(subject: string, data?: Uint8Array, opts?: RequestOptions): Promise<Msg>;
44 flush(): Promise<void>;
45 drain(): Promise<void>;
46 isClosed(): boolean;
47 isDraining(): boolean;
48 getServer(): string;
49 status(): AsyncIterable<Status>;
50 stats(): Stats;
51 jetstreamManager(opts?: JetStreamOptions): Promise<JetStreamManager>;
52 jetstream(opts?: JetStreamOptions): JetStreamClient;
53}
54export interface ConnectionOptions {
55 authenticator?: Authenticator;
56 debug?: boolean;
57 ignoreClusterUpdates?: boolean;
58 inboxPrefix?: string;
59 maxPingOut?: number;
60 maxReconnectAttempts?: number;
61 name?: string;
62 noEcho?: boolean;
63 noRandomize?: boolean;
64 pass?: string;
65 pedantic?: boolean;
66 pingInterval?: number;
67 port?: number;
68 reconnect?: boolean;
69 reconnectDelayHandler?: () => number;
70 reconnectJitter?: number;
71 reconnectJitterTLS?: number;
72 reconnectTimeWait?: number;
73 servers?: Array<string> | string;
74 timeout?: number;
75 tls?: TlsOptions;
76 token?: string;
77 user?: string;
78 verbose?: boolean;
79 waitOnFirstConnect?: boolean;
80}
81export interface TlsOptions {
82 certFile?: string;
83 cert?: string;
84 caFile?: string;
85 ca?: string;
86 keyFile?: string;
87 key?: string;
88}
89export interface Msg {
90 subject: string;
91 sid: number;
92 reply?: string;
93 data: Uint8Array;
94 headers?: MsgHdrs;
95 respond(data?: Uint8Array, opts?: PublishOptions): boolean;
96}
97export interface SubOpts<T> {
98 queue?: string;
99 max?: number;
100 timeout?: number;
101 callback?: (err: NatsError | null, msg: T) => void;
102}
103export declare type SubscriptionOptions = SubOpts<Msg>;
104
105export interface ServerInfo {
106 "auth_required"?: boolean;
107 "client_id": number;
108 "client_ip"?: string;
109 cluster?: string;
110 "connect_urls"?: string[];
111 "git_commit"?: string;
112 go: string;
113 headers?: boolean;
114 host: string;
115 jetstream?: boolean;
116 ldm?: boolean;
117 "max_payload": number;
118 nonce?: string;
119 port: number;
120 proto: number;
121 "server_id": string;
122 "server_name": string;
123 "tls_available"?: boolean;
124 "tls_required"?: boolean;
125 "tls_verify"?: boolean;
126 version: string;
127}
128
129export interface ServersChanged {
130 readonly added: string[];
131 readonly deleted: string[];
132}
133export interface Sub<T> extends AsyncIterable<T> {
134 unsubscribe(max?: number): void;
135 drain(): Promise<void>;
136 isDraining(): boolean;
137 isClosed(): boolean;
138 callback(err: NatsError | null, msg: Msg): void;
139 getSubject(): string;
140 getReceived(): number;
141 getProcessed(): number;
142 getPending(): number;
143 getID(): number;
144 getMax(): number | undefined;
145}
146export declare type Subscription = Sub<Msg>;
147export interface RequestOptions {
148 timeout: number;
149 headers?: MsgHdrs;
150 noMux?: boolean;
151 reply?: string;
152}
153export interface PublishOptions {
154 reply?: string;
155 headers?: MsgHdrs;
156}
157
158export interface MsgHdrs extends Iterable<[string, string[]]> {
159 hasError: boolean;
160 status: string;
161 code: number;
162 get(k: string): string;
163 set(k: string, v: string): void;
164 append(k: string, v: string): void;
165 has(k: string): boolean;
166 values(k: string): string[];
167 delete(k: string): void;
168}
169export declare function headers(): MsgHdrs;
170
171export declare function createInbox(prefix?: string): string;
172
173export interface Authenticator {
174 (nonce?: string): Auth;
175}
176
177export declare type NoAuth = void;
178export interface TokenAuth {
179 auth_token: string;
180}
181export interface UserPass {
182 user: string;
183 pass?: string;
184}
185export interface NKeyAuth {
186 nkey: string;
187 sig: string;
188}
189export interface JwtAuth {
190 jwt: string;
191 nkey?: string;
192 sig?: string;
193}
194declare type Auth = NoAuth | TokenAuth | UserPass | NKeyAuth | JwtAuth;
195
196export declare function noAuthFn(): Authenticator;
197
198export declare function nkeyAuthenticator(
199 seed?: Uint8Array | (() => Uint8Array),
200): Authenticator;
201
202export declare function jwtAuthenticator(
203 ajwt: string | (() => string),
204 seed?: Uint8Array | (() => Uint8Array),
205): Authenticator;
206
207export declare function credsAuthenticator(creds: Uint8Array): Authenticator;
208
209export declare enum ErrorCode {
210 ApiError = "BAD API",
211 BadAuthentication = "BAD_AUTHENTICATION",
212 BadCreds = "BAD_CREDS",
213 BadHeader = "BAD_HEADER",
214 BadJson = "BAD_JSON",
215 BadPayload = "BAD_PAYLOAD",
216 BadSubject = "BAD_SUBJECT",
217 Cancelled = "CANCELLED",
218 ConnectionClosed = "CONNECTION_CLOSED",
219 ConnectionDraining = "CONNECTION_DRAINING",
220 ConnectionRefused = "CONNECTION_REFUSED",
221 ConnectionTimeout = "CONNECTION_TIMEOUT",
222 Disconnect = "DISCONNECT",
223 InvalidOption = "INVALID_OPTION",
224 InvalidPayload = "INVALID_PAYLOAD",
225 MaxPayloadExceeded = "MAX_PAYLOAD_EXCEEDED",
226 NoResponders = "503",
227 NotFunction = "NOT_FUNC",
228 RequestError = "REQUEST_ERROR",
229 ServerOptionNotAvailable = "SERVER_OPT_NA",
230 SubClosed = "SUB_CLOSED",
231 SubDraining = "SUB_DRAINING",
232 Timeout = "TIMEOUT",
233 Tls = "TLS",
234 Unknown = "UNKNOWN_ERROR",
235 WssRequired = "WSS_REQUIRED",
236 JetStreamInvalidAck = "JESTREAM_INVALID_ACK",
237 JetStream404NoMessages = "404",
238 JetStream408RequestTimeout = "408",
239 JetStream409MaxAckPendingExceeded = "409",
240 JetStreamNotEnabled = "503",
241 AuthorizationViolation = "AUTHORIZATION_VIOLATION",
242 AuthenticationExpired = "AUTHENTICATION_EXPIRED",
243 ProtocolError = "NATS_PROTOCOL_ERR",
244 PermissionsViolation = "PERMISSIONS_VIOLATION",
245}
246
247export declare interface NatsError extends Error {
248 name: string;
249 message: string;
250 code: string;
251 chainedError?: Error;
252}
253
254export interface Stats {
255 inBytes: number;
256 outBytes: number;
257 inMsgs: number;
258 outMsgs: number;
259}
260
261export interface Codec<T> {
262 encode(d: T): Uint8Array;
263 decode(a: Uint8Array): T;
264}
265export declare function StringCodec(): Codec<string>;
266export declare function JSONCodec<T = unknown>(): Codec<T>;
267
268export interface JetStreamOptions {
269 apiPrefix?: string;
270 timeout?: number;
271}
272export interface JetStreamManager {
273 consumers: ConsumerAPI;
274 streams: StreamAPI;
275 getAccountInfo(): Promise<JetStreamAccountStats>;
276 advisories(): AsyncIterable<Advisory>;
277}
278export interface PullOptions {
279 batch: number;
280 "no_wait": boolean;
281 expires: number;
282}
283export interface PubAck {
284 stream: string;
285 seq: number;
286 duplicate: boolean;
287 ack(): void;
288}
289export interface JetStreamPublishOptions {
290 msgID: string;
291 timeout: number;
292 ackWait: Nanos;
293 headers: MsgHdrs;
294 expect: Partial<{
295 lastMsgID: string;
296 streamName: string;
297 lastSequence: number;
298 }>;
299}
300export interface ConsumerInfoable {
301 consumerInfo(): Promise<ConsumerInfo>;
302}
303export interface Closed {
304 closed: Promise<void>;
305}
306export declare type JetStreamSubscription = Sub<JsMsg> & Destroyable & Closed & ConsumerInfoable;
307export declare type JetStreamSubscriptionOptions = TypedSubscriptionOptions<JsMsg>;
308export interface Pullable {
309 pull(opts?: Partial<PullOptions>): void;
310}
311export interface Destroyable {
312 destroy(): Promise<void>;
313}
314
315export interface Dispatcher<T> {
316 push(v: T): void;
317}
318export interface QueuedIterator<T> extends Dispatcher<T> {
319 [Symbol.asyncIterator](): AsyncIterator<T>;
320 stop(err?: Error): void;
321 getProcessed(): number;
322 getPending(): number;
323 getReceived(): number;
324}
325
326export declare type JetStreamPullSubscription = JetStreamSubscription & Pullable;
327export declare type JsMsgCallback = (err: NatsError | null, msg: JsMsg | null) => void;
328export interface JetStreamClient {
329 publish(subj: string, data?: Uint8Array, options?: Partial<JetStreamPublishOptions>): Promise<PubAck>;
330 pull(stream: string, durable: string): Promise<JsMsg>;
331 fetch(stream: string, durable: string, opts?: Partial<PullOptions>): QueuedIterator<JsMsg>;
332 pullSubscribe(subject: string, opts: ConsumerOptsBuilder | Partial<ConsumerOpts>): Promise<JetStreamPullSubscription>;
333 subscribe(subject: string, opts: ConsumerOptsBuilder | Partial<ConsumerOpts>): Promise<JetStreamSubscription>;
334}
335export interface ConsumerOpts {
336 config: Partial<ConsumerConfig>;
337 mack: boolean;
338 subQueue: string;
339 stream: string;
340 callbackFn?: JsMsgCallback;
341 name?: string;
342 max?: number;
343 debug?: boolean;
344}
345export declare function consumerOpts(): ConsumerOptsBuilder;
346
347export interface ConsumerOptsBuilder {
348 deliverTo(subject: string): void;
349 manualAck(): void;
350 durable(name: string): void;
351 deliverAll(): void;
352 deliverLast(): void;
353 deliverNew(): void;
354 startSequence(seq: number): void;
355 startTime(time: Date | Nanos): void;
356 ackNone(): void;
357 ackAll(): void;
358 ackExplicit(): void;
359 maxDeliver(max: number): void;
360 maxAckPending(max: number): void;
361 maxWaiting(max: number): void;
362 maxMessages(max: number): void;
363 callback(fn: JsMsgCallback): void;
364}
365export interface Lister<T> {
366 next(): Promise<T[]>;
367}
368export interface ConsumerAPI {
369 info(stream: string, consumer: string): Promise<ConsumerInfo>;
370 add(stream: string, cfg: Partial<ConsumerConfig>): Promise<ConsumerInfo>;
371 delete(stream: string, consumer: string): Promise<boolean>;
372 list(stream: string): Lister<ConsumerInfo>;
373}
374export interface StreamAPI {
375 info(stream: string): Promise<StreamInfo>;
376 add(cfg: Partial<StreamConfig>): Promise<StreamInfo>;
377 update(cfg: StreamConfig): Promise<StreamInfo>;
378 purge(stream: string): Promise<PurgeResponse>;
379 delete(stream: string): Promise<boolean>;
380 list(): Lister<StreamInfo>;
381 deleteMessage(stream: string, seq: number): Promise<boolean>;
382 getMessage(stream: string, seq: number): Promise<StoredMsg>;
383 find(subject: string): Promise<string>;
384}
385export interface JsMsg {
386 redelivered: boolean;
387 info: DeliveryInfo;
388 seq: number;
389 headers: MsgHdrs | undefined;
390 data: Uint8Array;
391 subject: string;
392 sid: number;
393 ack(): void;
394 nak(): void;
395 working(): void;
396 term(): void;
397 ackAck(): Promise<boolean>;
398}
399export interface DeliveryInfo {
400 stream: string;
401 consumer: string;
402 redeliveryCount: number;
403 streamSequence: number;
404 deliverySequence: number;
405 timestampNanos: number;
406 pending: number;
407 redelivered: boolean;
408}
409export interface StoredMsg {
410 subject: string;
411 seq: number;
412 header: MsgHdrs;
413 data: Uint8Array;
414 time: Date;
415}
416export interface Advisory {
417 kind: AdvisoryKind;
418 data: unknown;
419}
420export declare enum AdvisoryKind {
421 API = "api_audit",
422 StreamAction = "stream_action",
423 ConsumerAction = "consumer_action",
424 SnapshotCreate = "snapshot_create",
425 SnapshotComplete = "snapshot_complete",
426 RestoreCreate = "restore_create",
427 RestoreComplete = "restore_complete",
428 MaxDeliver = "max_deliver",
429 Terminated = "terminated",
430 Ack = "consumer_ack",
431 StreamLeaderElected = "stream_leader_elected",
432 StreamQuorumLost = "stream_quorum_lost",
433 ConsumerLeaderElected = "consumer_leader_elected",
434 ConsumerQuorumLost = "consumer_quorum_lost"
435}
436export declare type Nanos = number;
437export interface ApiError {
438 code: number;
439 description: string;
440}
441export interface ApiResponse {
442 type: string;
443 error?: ApiError;
444}
445export interface ApiPaged {
446 total: number;
447 offset: number;
448 limit: number;
449}
450export interface ApiPagedRequest {
451 offset: number;
452}
453export interface StreamInfo {
454 config: StreamConfig;
455 created: number;
456 state: StreamState;
457 cluster?: ClusterInfo;
458 mirror?: StreamSourceInfo;
459 sources?: StreamSourceInfo[];
460}
461export interface StreamConfig {
462 name: string;
463 subjects?: string[];
464 retention: RetentionPolicy;
465 "max_consumers": number;
466 "max_msgs": number;
467 "max_bytes": number;
468 discard?: DiscardPolicy;
469 "max_age": Nanos;
470 "max_msg_size"?: number;
471 storage: StorageType;
472 "num_replicas": number;
473 "no_ack"?: boolean;
474 "template_owner"?: string;
475 "duplicate_window"?: number;
476 placement?: Placement;
477 mirror?: StreamSource;
478 sources?: StreamSource[];
479}
480export interface StreamSource {
481 name: string;
482 "opt_start_seq": number;
483 "opt_start_time": string;
484 "filter_subject": string;
485}
486export interface Placement {
487 cluster: string;
488 tags: string[];
489}
490export declare enum RetentionPolicy {
491 Limits = "limits",
492 Interest = "interest",
493 Workqueue = "workqueue"
494}
495export declare enum DiscardPolicy {
496 Old = "old",
497 New = "new"
498}
499export declare enum StorageType {
500 File = "file",
501 Memory = "memory"
502}
503export declare enum DeliverPolicy {
504 All = "all",
505 Last = "last",
506 New = "new",
507 StartSequence = "by_start_sequence",
508 StartTime = "by_start_time"
509}
510export declare enum AckPolicy {
511 None = "none",
512 All = "all",
513 Explicit = "explicit",
514 NotSet = ""
515}
516export declare enum ReplayPolicy {
517 Instant = "instant",
518 Original = "original"
519}
520export interface StreamState {
521 messages: number;
522 bytes: number;
523 "first_seq": number;
524 "first_ts": number;
525 "last_seq": number;
526 "last_ts": string;
527 deleted: number[];
528 lost: LostStreamData;
529 "consumer_count": number;
530}
531export interface LostStreamData {
532 msgs: number;
533 bytes: number;
534}
535export interface ClusterInfo {
536 name?: string;
537 leader?: string;
538 replicas?: PeerInfo[];
539}
540export interface PeerInfo {
541 name: string;
542 current: boolean;
543 offline: boolean;
544 active: Nanos;
545 lag: number;
546}
547export interface StreamSourceInfo {
548 name: string;
549 lag: number;
550 active: Nanos;
551 error?: ApiError;
552}
553export interface PurgeResponse extends Success {
554 purged: number;
555}
556export interface CreateConsumerRequest {
557 "stream_name": string;
558 config: Partial<ConsumerConfig>;
559}
560export interface StreamMsgResponse extends ApiResponse {
561 message: {
562 subject: string;
563 seq: number;
564 data: string;
565 hdrs: string;
566 time: string;
567 };
568}
569export interface SequencePair {
570 "consumer_seq": number;
571 "stream_seq": number;
572}
573export interface ConsumerInfo {
574 "stream_name": string;
575 name: string;
576 created: number;
577 config: ConsumerConfig;
578 delivered: SequencePair;
579 "ack_floor": SequencePair;
580 "num_ack_pending": number;
581 "num_redelivered": number;
582 "num_waiting": number;
583 "num_pending": number;
584 cluster?: ClusterInfo;
585}
586export interface ConsumerListResponse extends ApiResponse, ApiPaged {
587 consumers: ConsumerInfo[];
588}
589export interface StreamListResponse extends ApiResponse, ApiPaged {
590 streams: StreamInfo[];
591}
592export interface Success {
593 success: boolean;
594}
595export declare type SuccessResponse = ApiResponse & Success;
596export interface MsgRequest {
597 seq: number;
598}
599export interface MsgDeleteRequest extends MsgRequest {
600 "no_erase"?: boolean;
601}
602export interface JetStreamAccountStats {
603 memory: number;
604 storage: number;
605 streams: number;
606 consumers: number;
607 api: JetStreamApiStats;
608 limits: AccountLimits;
609}
610export interface JetStreamApiStats {
611 total: number;
612 errors: number;
613}
614export interface AccountInfoResponse extends ApiResponse, JetStreamAccountStats {
615}
616export interface AccountLimits {
617 "max_memory": number;
618 "max_storage": number;
619 "max_streams": number;
620 "max_consumers": number;
621}
622export interface ConsumerConfig {
623 name: string;
624 "durable_name"?: string;
625 "deliver_subject"?: string;
626 "deliver_policy": DeliverPolicy;
627 "opt_start_seq"?: number;
628 "opt_start_time"?: string;
629 "ack_policy": AckPolicy;
630 "ack_wait"?: number;
631 "max_deliver"?: number;
632 "filter_subject"?: string;
633 "replay_policy": ReplayPolicy;
634 "rate_limit_bps"?: number;
635 "sample_freq"?: string;
636 "max_waiting"?: number;
637 "max_ack_pending"?: number;
638}
639export interface Consumer {
640 "stream_name": string;
641 config: ConsumerConfig;
642}
643export interface StreamNames {
644 streams: string[];
645}
646export interface StreamNameBySubject {
647 subject: string;
648}
649export interface NextRequest {
650 expires: number;
651 batch: number;
652 "no_wait": boolean;
653}
654
655export declare type MsgAdapter<T> = (
656 err: NatsError | null,
657 msg: Msg,
658) => [NatsError | null, T | null];
659/**
660 * Callback presented to the user with the converted type
661 */
662export declare type TypedCallback<T> = (
663 err: NatsError | null,
664 msg: T | null,
665) => void;
666export interface TypedSubscriptionOptions<T> extends SubOpts<T> {
667 adapter: MsgAdapter<T>;
668 callback?: TypedCallback<T>;
669 dispatchedFn?: DispatchedFn<T>;
670 cleanupFn?: (sub: Subscription, info?: unknown) => void;
671}
672
673export declare type DispatchedFn<T> = (data: T | null) => void;