UNPKG

rhea

Version:

reactive AMQP 1.0 library

749 lines (717 loc) 27 kB
/// <reference types="node" /> import { Session, Delivery } from "./session"; import { Sender, Receiver, link } from "./link"; import { NetConnectOpts, ListenOptions, Socket } from "net"; import { frames } from "./frames"; import { EventEmitter } from "events"; import { Container } from "./container"; import { ConnectionOptions as TlsConnectionOptions, PeerCertificate, TlsOptions } from "tls"; import { ConnectionError } from "./errors"; /** * Describes the signature of the event handler for any event emitted by rhea. * @type OnAmqpEvent * @param {EventContext} context The rhea event context. */ export type OnAmqpEvent = (context: EventContext) => void; /** * Defines the common set of properties that are applicable for a connection, session and a link (sender, receiver). * @interface EndpointOptions */ export interface EndpointOptions { /** * @property {string | string[]} [desired_capabilities] Extension capabilities the sender can use if the receiver supports them. */ desired_capabilities?: string | string[]; /** * @property {string | string[]} [offered_capabilities] Extension capabilities the sender supports. */ offered_capabilities?: string | string[]; /** * @property {object} [properties] Properties of the entity (connection, session, link) contain a set of fields * intended to provide more information about the entity. */ properties?: { [x: string]: any }; } export interface ConnectionDetails { /** * @property {string} host The host name. Default value: `"localhost"`. */ host: string; /** * @property {number} port The port number. Default value: `5672`. */ port: number; /** * @property {any} options The options object provided to connection_details(). */ options?: any; /** * @property {Function} connect The `connect` function of `"net"` or `"tls"` module. */ connect?: Function; /** * @property {string} [transport] - The transport option. */ transport?: "tls" | "ssl" | "tcp"; } /** * Defines the common options that can be provided for client and server connections. * @interface CommonConnectionOptions * @extends EndpointOptions */ interface CommonConnectionOptions extends EndpointOptions { /** * @property {string} [hostname] - The hostname presented in `open` frame, defaults to host. */ hostname?: string; /** * @property {string} [container_id] The id of the source container. If not provided then * this will be the id (a guid string) of the assocaited container object. When this property is * provided, it will be used in the `open` frame to let the peer know about the container id. * However, the associated container object would still be the same container object from * which the connection is being created. * * The `"container_id"` is how the peer will identify the 'container' the connection is being * established from. The container in AMQP terminology is roughly analogous to a process. * Using a different container id on connections from the same process would cause the peer to * treat them as coming from distinct processes. */ container_id?: string; /** * @property {string} [id] A unique name for the connection. If not provided then this will be * a string in the following format: "connection-<counter>". */ id?: string; /** * @property {number} [max_frame_size] The largest frame size that the sending peer * is able to accept on this connection. Default: 4294967295 */ max_frame_size?: number; /** * @property {number} [session_buffer_size] The connection sessions outgoing and incoming CircularBuffer size. * Default: 2048 */ session_buffer_size?: number | { incoming?: number, outgoing?: number }; /** * @property {number} [idle_time_out] The maximum period in milliseconds between activity * (frames) on the connection that is desired from the peer. The open frame carries the * idle-time-out field for this purpose. To avoid spurious timeouts, the value in idle_time_out * is set to be half of the peer’s actual timeout threshold. */ idle_time_out?: number; /** * @property {number} [channel_max] The highest channel number that can be used on the connection. */ channel_max?: number; /** * @property {string[]} [outgoing_locales] A list of the locales that the peer supports * for sending informational text. */ outgoing_locales?: string[]; /** * @property {string[]} [incoming_locales] A list of locales that the sending peer * permits for incoming informational text. This list is ordered in decreasing level of preference. */ incoming_locales?: string[]; /** * @property {SenderOptions} [sender_options] Default options that can be provided while creating any * sender link on this connection. These options will be overridden by the specific sender options * that will be provided while creating a sender. */ sender_options?: SenderOptions; /** * @property {ReceiverOptions} [receiver_options] Default options that can be provided while creating any * receiver link on this connection. These options will be overridden by the specific receiver options * that will be provided while creating a sender. */ receiver_options?: ReceiverOptions; } /** * Defines the common options that can be provided for client connections. * @interface TcpTransportOptions */ interface NetTransportOptions { /** * @property {string} [transport] - The transport option. This is ignored if connection_details is set. */ transport?: "tcp"; } /** * Defines the common options that can be provided for TLS client connections. * @interface TlsTransportOptions */ interface TlsTransportOptions { /** * @property {string} transport - The transport option to request TLS connection. This is ignored if connection_details is set. */ transport: "tls" | "ssl"; } /** * Defines the common options that can be provided for client connections. * @interface ClientConnectionOptions * @extends CommonConnectionOptions */ interface ClientConnectionOptions extends CommonConnectionOptions { /** * @property {string} [username] - The username. */ username?: string; /** * @property {string} [sasl_init_hostname] - The hostname for initialising sasl. */ sasl_init_hostname?: string; /** * @property {boolean} [reconnect] if true (default), the library will automatically attempt to * reconnect if disconnected. * - if false, automatic reconnect will be disabled * - if it is a numeric value, it is interpreted as the delay between * reconnect attempts (in milliseconds) */ reconnect?: boolean | number; /** * @property {number} [reconnect_limit] maximum number of reconnect attempts. * Applicable only when reconnect is true. */ reconnect_limit?: number; /** * @property {number} [initial_reconnect_delay] - Time to wait in milliseconds before * attempting to reconnect. Applicable only when reconnect is true or a number is * provided for reconnect. */ initial_reconnect_delay?: number; /** * @property {number} [max_reconnect_delay] - Maximum reconnect delay in milliseconds * before attempting to reconnect. Applicable only when reconnect is true. */ max_reconnect_delay?: number; /** * @property {string} [password] - The secret key to be used while establishing the connection. */ password?: string; /** * @property {Function} [connection_details] A function which if specified will be invoked to get the options * to use (e.g. this can be used to alternate between a set of different host/port combinations) */ connection_details?: (conn_established_counter: number) => ConnectionDetails; /** * @property {string[]} [non_fatal_errors] An array of error conditions which if received on connection close * from peer should not prevent reconnect (by default this only includes `"amqp:connection:forced"`). */ non_fatal_errors?: string[]; /** * @property {boolean} [all_errors_non_fatal] Determines if rhea's auto-reconnect should attempt reconnection on all fatal errors */ all_errors_non_fatal?: boolean; } type NetClientConnectionOptions = NetTransportOptions & ClientConnectionOptions & NetConnectOpts type TlsClientConnectionOptions = TlsTransportOptions & ClientConnectionOptions & TlsConnectionOptions export type ConnectionOptions = NetClientConnectionOptions | TlsClientConnectionOptions; /** `net.createServer` options that have no own type in @types/node@10.17.60 */ type NetOptions = { allowHalfOpen?: boolean, pauseOnConnect?: boolean } /** * Defines the options that can be provided while creating a server connection. */ type NetServerConnectionOptions = NetTransportOptions & CommonConnectionOptions & ListenOptions & NetOptions /** * Defines the options that can be provided while creating a TLS server connection. */ type TlsServerConnectionOptions = TlsTransportOptions & CommonConnectionOptions & ListenOptions & TlsOptions /** * Defines the options that can be provided while creating a server connection. */ export type ServerConnectionOptions = NetServerConnectionOptions | TlsServerConnectionOptions /** * Defines the common set of options that can be provided while creating a link (sender, receiver). * @interface LinkOptions * @extends EndpointOptions */ export interface LinkOptions extends EndpointOptions { /** * @property {string} [name] The name of the link. * This should be unique for the container. * If not specified a unqiue name is generated. */ name?: string; /** * @property {number} [snd_settle_mode] it specifies the sender settle mode with following possibile values: * - 0 - "unsettled" - The sender will send all deliveries initially unsettled to the receiver. * - 1 - "settled" - The sender will send all deliveries settled to the receiver. * - 2 - "mixed" - (default) The sender MAY send a mixture of settled and unsettled deliveries to the receiver. */ snd_settle_mode?: 0 | 1 | 2; /** * @property {number} [rcv_settle_mode] it specifies the receiver settle mode with following possibile values: * - 0 - "first" - The receiver will spontaneously settle all incoming transfers. * - 1 - "second" - The receiver will only settle after sending the disposition to the sender and receiving a * disposition indicating settlement of the delivery from the sender. */ rcv_settle_mode?: 0 | 1; /** * @property {number} [max_message_size] The maximum message size supported by the link endpoint. */ max_message_size?: number; } /** * Defines the options that can be provided while creating the source/target for a Sender or Receiver (link). * @interface BaseTerminusOptions */ export interface BaseTerminusOptions { /** * @property {number} [durable] It specifies what state of the terminus will be retained durably: * - the state of durable messages (unsettled_state value), * - only existence and configuration of the terminus (configuration value), or * - no state at all (none value); */ durable?: number; /** * @property {string} [expiry_policy] - The expiry policy of the terminus. Default value "session-end". */ expiry_policy?: string; /** * @property {boolean} [durable] - It specifies a request for the receiving peer * to dynamically create a node at the target/source. Default: false. */ dynamic?: boolean; /** * @property {object} [dynamic_node_properties] - Properties of the dynamically created node */ dynamic_node_properties?: Dictionary<any>; /** * @property {string | string []} [capabilities] The extension capabilities the sender supports/desires */ capabilities?: string | string[]; /** * @property {number} [timeout] The duration that an expiring terminus will be retained. */ timeout?: number; } /** * Defines the options that can be provided while creating the source for a Sender or Receiver (link). * @interface TerminusOptions * @extends BaseTerminusOptions */ export interface TerminusOptions extends BaseTerminusOptions { /** * @property {string} address - The AMQP address as target for this terminus. */ address: string; } /** * Defines the options that can be provided while creating the target for a Sender or Receiver (link). * @interface TargetTerminusOptions * @extends BaseTerminusOptions */ export interface TargetTerminusOptions extends BaseTerminusOptions { /** * @property {string} [address] - The AMQP address as target for this terminus. */ address?: string; } /** * Describes the source. * @interface Source * @extends TerminusOptions */ export interface Source extends TerminusOptions { /** * @property {string} [distribution_mode] The distribution mode of the link. * Valid values are: * - **move** - once successfully transferred over the link, the message will no longer be * available to other links from the same node. * - **copy** - once successfully transferred over the link, the message is still available * for other links from the same node. */ distribution_mode?: "move" | "copy"; /** * @property {object} [filter] - The filters to be added for the terminus. */ filter?: Dictionary<any>; /** * @property {any} [default_outcome] The default outcome for unsettled transfers. */ default_outcome?: any; /** * @property {string | string[]} [outcomes] The descriptors for the outcomes that can be chosen * on this link. */ outcomes?: string | string[]; } /** * Defines the options that can be set while creating the Receiver (link). * @interface ReceiverOptions * @extends LinkOptions */ export interface ReceiverOptions extends LinkOptions { /** * @property {object} [credit_window] A "prefetch" window controlling the flow of messages over * this receiver. Defaults to `1000` if not specified. A value of `0` can be used to * turn off automatic flow control and manage it directly. */ credit_window?: number; /** * @property {boolean} [autoaccept] Whether received messages should be automatically accepted. * Defaults to `true`. */ autoaccept?: boolean; /** * @property {object} source The source from which messages are received. */ source?: Source | string; /** * @property {object} [target] The target of a receiving link is the local identifier */ target?: TargetTerminusOptions | string; /** * @property {boolean} [autosettle] Whether received messages should be automatically settled * once the remote settles them. Defaults to `true`. */ autosettle?: boolean; } /** * Defines the options that can be set while creating the Sender (link). * @interface SenderOptions * @extends LinkOptions */ export interface SenderOptions extends LinkOptions { /** * @property {boolean} [autosettle] Whether sent messages should be automatically settled * once the peer settles them. Defaults to `true`. */ autosettle?: boolean; /** * @property {object} target - The target to which messages are sent. * * If the target is set to `{}` no target address will be associated with the sender; the peer * may use the `to` field on each individual message to handle it correctly in that case. * This is useful where maintaining or setting up a sender for each target address is * too burdensome. */ target?: TargetTerminusOptions | string; /** * @property {object} [source] The source of a sending link is the local identifier. */ source?: Source | string; } /** * Provides a Dictionary like structure <Key, Value> of Type T. * @interface Dictionary */ export interface Dictionary<T> { [key: string]: T; } /** * Map containing message attributes that will be held in the message header. * It conveys information about the message. This is the base interface. * @interface MessageAnnotations */ export interface MessageAnnotations { /** * @property {any} Any Supported message annotations. */ [x: string]: any; } /** * Describes the delivery annotations. It is used for delivery-specific non-standard * properties at the head of the message. It conveys information from the sending * peer to the receiving peer. This is the base interface for Delivery Annotations. * * @interface DeliveryAnnotations */ export interface DeliveryAnnotations { /** * @property {any} Any Supported delivery annotations. */ [x: string]: any; } /** * Describes the defined set of standard properties of the message. * @interface MessageProperties */ export interface MessageProperties { /** * @property {string | number | Buffer} [message_id] The application message identifier that * uniquely idenitifes a message. The user is responsible for making sure that this is unique in * the given context. Guids usually make a good fit. */ message_id?: string | number | Buffer; /** * @property {string} [reply_to] The address of the node to send replies to. */ reply_to?: string; /** * @property {string} [to] The address of the node the message is destined for. */ to?: string; /** * @property {string | number | Buffer} [correlation_id] The id that can be used to mark or * identify messages between clients. */ correlation_id?: string | number | Buffer; /** * @property {string} [content_type] MIME type for the message. */ content_type?: string; /** * @property {string} [content_encoding] The content-encoding property is used as a modifier to the content-type. * When present, its valueindicates what additional content encodings have been applied to the application-data. */ content_encoding?: string; /** * @property {number} [absolute_expiry_time] The time when this message is considered expired. */ absolute_expiry_time?: Date; /** * @property {number} [creation_time] The time this message was created. */ creation_time?: Date; /** * @property {string} [group_id] The group this message belongs to. */ group_id?: string; /** * @property {number} [group_sequence] The sequence number of this message with its group. */ group_sequence?: number; /** * @property {string} [reply_to_group_id] The group the reply message belongs to. */ reply_to_group_id?: string; /** * @property {string} [subject] A common field for summary information about the message * content and purpose. */ subject?: string; /** * @property {string} [user_id] The identity of the user responsible for producing the message. */ user_id?: string; } /** * Describes the defined set of standard header properties of the message. * @interface MessageHeader */ export interface MessageHeader { /** * @property {boolean} [first_acquirer] If this value is true, then this message has not been * acquired by any other link. Ifthis value is false, then this message MAY have previously * been acquired by another link or links. */ first_acquirer?: boolean; /** * @property {number} [delivery_count] The number of prior unsuccessful delivery attempts. */ delivery_count?: number; /** * @property {number} [ttl] time to live in ms. */ ttl?: number; /** * @property {boolean} [durable] Specifies durability requirements. */ durable?: boolean; /** * @property {number} [priority] The relative message priority. Higher numbers indicate higher * priority messages. */ priority?: number; } /** * Describes the footer section. It is used for details about the message or delivery * which can only be calculated or evaluated once the whole bare message has been * constructed or seen (for example message hashes, HMACs, signatures and encryption details). * * @interface MessageFooter */ export interface MessageFooter { /** * @property {any} Any Supported footer section */ [x: string]: any; } /** * Describes the AMQP message that is sent or received on the wire. * @interface Message * @extends MessageProperties * @extends MessageHeader */ export interface Message extends MessageProperties, MessageHeader { /** * @property {any} body The message body. */ body: any; /** * @property {MessageAnnotations} [message_annotations] A dictionary containing message attributes * that will be held in the message header */ message_annotations?: MessageAnnotations; /** * @property {Dictionary<any>} [application_properties] A dictionary containing application * specific message properties. */ application_properties?: Dictionary<any>; /** * @property {DeliveryAnnotations} [delivery_annotations] A dictionary used for delivery-specific * non-standard properties at the head of the message. */ delivery_annotations?: DeliveryAnnotations; /** * @property {MessageFooter} [footer] A dictionary used for the footer section of the message. */ footer?: MessageFooter; } /** * Defines the AMQP Connection context. This context is provided when you add an * event handler to any of the objects created by rhea. * @interface EventContext */ export interface EventContext { /** * @property {Connection} connection The amqp connection. */ connection: Connection; /** * @property {Container} container The amqp container */ container: Container; /** * @property {Session} [session] The amqp session link that was created on the amqp connection. */ session?: Session; /** * @property {Delivery} [delivery] The amqp delivery that is received after sending a message. */ delivery?: Delivery; /** * @property {AmqpMessage} [message] The amqp message that is received in the message event * handler when rhea emits a message event on a receiver. */ message?: Message; /** * @property {Receiver} [receiver] The amqp receiver link that was created on the amqp connection. */ receiver?: Receiver; /** * @property {Sender} [sender] The amqp sender link that was created on the amqp connection. */ sender?: Sender; /** * @property {Error | ConnectionError} [error] An optional error object. * - On `connection_error` event this property will be present. It will have the same information as * `connection.error` but the type will be `ConnectionError`. * - An error with SASL will be available through this property, but not through `connection.error` * (as the amqp connection was never established). * - On `disconnected` event the context will have an error property that will be of type * `Error` (or some subclass) as emitted by the underlying socket. * - The `session_error`, `sender_error` and `receiver_error` events will not have this (`error`) * property on the EventContext. */ error?: Error | ConnectionError; /** * @property {boolean} [reconnecting] The value is true if the library is attempting to automatically * reconnect and false if it has reached the reconnect limit. If reconnect has not been enabled * or if the connection is a tcp server, then the reconnecting property is undefined. This property * is used in conjunction with "disconnected" event. */ reconnecting?: boolean; } /** * Defines the amqp error object. * @interface AmqpError */ export interface AmqpError { /** * @property {string} [condition] Describes the error condition. */ condition?: string; /** * @property {string} [description] Describes any supplementary information that is not indicated * the error condition. */ description?: string; /** * @property {any} [info] Describes the information about the error condition. */ info?: any; /** * @property {any[]} [value] Describes the associated amqp value types. */ value?: any[]; } export declare interface Connection extends EventEmitter { [x: string]: any; options: ConnectionOptions; readonly container: Container; readonly hostname?: string; readonly container_id: string; readonly max_frame_size?: number; readonly idle_time_out?: number; readonly channel_max?: number; readonly properties?: { [x: string]: any }; readonly error?: AmqpError | Error; connect(): Connection; reconnect(): Connection; attach_sender(options?: SenderOptions | string): Sender; open_sender(options?: SenderOptions | string): Sender; attach_receiver(options?: ReceiverOptions | string): Receiver; open_receiver(options?: ReceiverOptions | string): Receiver; get_option(name: string, default_value: any): any; send(msg: Message): Delivery; get_error(): ConnectionError | undefined; open(): void; close(error?: AmqpError): void; is_open(): boolean; is_remote_open(): boolean; /** * Determines whether both local and remote endpoints are closed. * @returns {boolean} `true` - closed, `false` otherwise. */ is_closed(): boolean; create_session(session_buffer_size?: number | { incoming?: number, outgoing?: number }): Session; find_sender(filter: Function): Sender | undefined; find_receiver(filter: Function): Receiver | undefined; find_link(filter: Function): link | undefined; each_receiver(action: Function, filter?: Function): void; each_sender(action: Function, filter?: Function): void; each_link(action: Function, filter?: Function): void; on_open(frame: frames): void; on_close(frame: frames): void; get_peer_certificate(): PeerCertificate | undefined; get_tls_socket(): Socket | undefined; remove_session(session: Session): void; remove_all_sessions(): void; } export declare enum ConnectionEvents { /** * @property {string} connectionOpen Raised when the remote peer indicates the connection is open. */ connectionOpen = "connection_open", /** * @property {string} connectionClose Raised when the remote peer indicates the connection is closed. */ connectionClose = "connection_close", /** * @property {string} connectionError Raised when the remote peer indicates an error occurred on * the connection. */ connectionError = "connection_error", /** * @property {string} protocolError Raised when a protocol error is received on the underlying socket. */ protocolError = "protocol_error", /** * @property {string} error Raised when an error is received on the underlying socket. */ error = "error", /** * @property {string} disconnected Raised when the underlying tcp connection is lost. The context * has a reconnecting property which is true if the library is attempting to automatically reconnect * and false if it has reached the reconnect limit. If reconnect has not been enabled or if the connection * is a tcp server, then the reconnecting property is undefined. The context may also have an error * property giving some information about the reason for the disconnect. */ disconnected = "disconnected", /** * @property {string} settled Raised when the connection receives a disposition. */ settled = "settled" }