UNPKG

rapid-mq

Version:

A simple and fast RabbitMQ client for Node.js

266 lines (254 loc) 9.99 kB
import * as amqp from 'amqplib'; import { EventEmitter } from 'stream'; /** * RapidEncoder Interface and Default Implementation * Provides methods to encode and decode messages for network transmission. */ interface RapidEncoder { /** * Encodes a message to be sent over the network. * @param message - The message to encode. * @return {Promise<Buffer>} - The encoded message as a Buffer. */ encode(message: unknown, exchange: string, topic: string): Promise<Buffer>; /** * Decodes a message received from the network. * @param data - The data to decode. * @return {Promise<unknown>} - The decoded message. */ decode(data: Buffer, exchange: string, topic: string): Promise<unknown>; } /** * DefaultRapidEncoder provides a basic implementation of RapidEncoder. * It encodes messages as JSON strings and decodes them back to their original form. */ declare class DefaultRapidEncoder implements RapidEncoder { encode(message: unknown): Promise<Buffer>; decode(data: Buffer): Promise<unknown>; } /** * RapidConnector - Handles connection management to RabbitMQ for the rapid-mq package. * Provides methods to connect, disconnect, and access the underlying connection. */ /** * Options for creating a RapidConnector instance. */ interface RapidConnectorOptions { /** The RabbitMQ connection URL (e.g., amqp://user:pass@host:port/vhost) */ url: string; /** Unique application identifier for this connector */ appId: string; /** Optional encoder for message serialization */ encoder?: RapidEncoder; } /** * RapidConnector provides a simple interface to manage a RabbitMQ connection. */ declare class RapidConnector { private options; private _url; private _appId; private _connection; private _isConnected; private _encoder; private _initPromise?; /** * Constructs a new RapidConnector. * @param options - Configuration options for the connector. * @throws {Error} If url or appId is not provided. */ constructor(options: RapidConnectorOptions); /** * Establishes a connection to RabbitMQ. * If already connected, this method does nothing. * @throws {Error} If the connection fails. */ connect(): Promise<void>; /** * Closes the RabbitMQ connection if it is open. * If not connected, this method does nothing. * @throws {Error} If closing the connection fails. */ disconnect(): Promise<void>; /** * Returns the active RabbitMQ connection. * @throws {Error} If the connection is not established. */ get connection(): amqp.ChannelModel; /** * Indicates whether the connector is currently connected to RabbitMQ. */ get connected(): boolean; /** * Returns the application ID associated with this connector. */ get appId(): string; get encoder(): RapidEncoder; } interface MessagerOptions { /** The RapidConnector instance to use for RabbitMQ connection */ connector: RapidConnector; /** (Optional) Name of the exchange to use for messaging */ exchangeName?: string; /** (Optional) Name of the queue to use for messaging */ durable?: boolean; /** (Optional) Whether the queue should be durable */ exclusive?: boolean; } declare class Messager { protected _connector: RapidConnector; protected _exchangeName: string; protected _durable: boolean; protected _exclusive: boolean; constructor(_connector: RapidConnector, _exchangeName: string, _durable: boolean, _exclusive: boolean); get connector(): RapidConnector; get exchangeName(): string; } /** * PubSubMessager - Implements the publish/subscribe messaging pattern for RabbitMQ. * Part of the rapid-mq package. */ /** * Options for PubSubMessager. */ interface PubSubMessagerOptions extends MessagerOptions { /** * Logical group for consumers. */ appGroup: string; } /** * PubSubMessager - A class that implements the publish/subscribe messaging pattern using RabbitMQ. * It allows publishing messages to a topic and subscribing to messages from a topic. */ declare class PubSubMessager extends Messager { private _appGroup; private _channel; private _initPromise?; constructor(options: PubSubMessagerOptions); /** * The logical group for consumers. */ get appGroup(): string; /** * Prepare the messager for use by establishing a connection and creating a channel. * This method must be called before using the publish or subscribe methods. * @throws {Error} If the connection is not established. */ initialize(): Promise<void>; /** * Publish a message to a specific topic. * @param topic - The topic to publish the message to. * @param message - The message to publish. It can be any serializable object. * @param ttl - Optional time-to-live for the message in milliseconds. * @returns {boolean} - Returns true if the message was published successfully. * @throws {Error} - Throws an error if the channel is not initialized or if publishing fails. */ publish(topic: string, message: unknown, ttl?: number): Promise<boolean>; /** * Subscribe to a topic and process incoming messages with the provided callback. * @param topic - The topic to subscribe to. * @param callback - The function to call when a message is received. * @returns {Promise<void>} - Resolves when the subscription is set up. * @throws {Error} - Throws an error if the channel is not initialized. */ subscribe(topic: string, callback: (message: unknown) => void): Promise<void>; } /** * RpcMessager - Implements the request/response (RPC) messaging pattern for RabbitMQ. * Allows sending RPC calls and serving RPC methods with automatic correlation and timeout handling. */ /** * Options for creating an RpcMessager instance. */ interface RpcMessagerOptions extends MessagerOptions { /** (Optional) Timeout in seconds for RPC calls. Defaults to 5 seconds. */ timeoutInSec?: number; /** (Optional) EventEmitter instance for handling RPC responses. Defaults to a new EventEmitter. */ emitter?: EventEmitter; } /** * RpcMessager provides methods to make RPC calls and serve RPC endpoints using RabbitMQ. */ declare class RpcMessager extends Messager { private _timeout; private _channel; private _responseQueue; private _emitter; private _initPromise?; /** * Constructs a new RpcMessager. * @param options - Configuration options for the messager. * @throws {Error} If connector is not provided. */ constructor(options: RpcMessagerOptions); /** * Initializes the RpcMessager by creating a channel, asserting the exchange, * and setting up a consumer for the reply-to queue. * @throws {Error} If the connection is not established. */ initialize(): Promise<void>; /** * Makes an RPC call to a remote method. * @param method - The name of the remote method (routing key). * @param args - Arguments to pass to the remote method. * @returns Promise<T> - Resolves with the response from the server. * @throws {Error} If the channel is not initialized or if the call times out. */ call<T>(method: string, ...args: unknown[]): Promise<T>; /** * Registers a server (handler) for an RPC method. * @param method - The name of the method to serve (routing key). * @param callback - The function to handle incoming RPC requests. * @returns Promise<void> * @throws {Error} If the channel is not initialized. */ server(method: string, callback: (...args: unknown[]) => Promise<unknown> | unknown): Promise<void>; } /** * DirectMessager - A class for sending and receiving messages directly using RabbitMQ. * It allows sending messages to a specific consumer and listening for messages on a queue. */ /** * Options for DirectMessager. */ interface DirectMessagerOptions extends MessagerOptions { /** Unique consumer tag for identifying the consumer. */ consumerTag: string; } /** * DirectMessager - A class that implements direct messaging using RabbitMQ. * It allows sending messages to a specific consumer and listening for messages on a queue. */ declare class DirectMessager extends Messager { private _consumerTag; private _channel; private _initPromise?; constructor(options: DirectMessagerOptions); /** * The unique consumer tag for identifying the consumer. */ get consumerTag(): string; /** * Prepare the messager for use by establishing a connection and creating a channel. * This method must be called before using the publish or subscribe methods. */ initialize(): Promise<void>; /** * Send a message to a specific consumer. * @param sendTo - The consumer tag or queue name to send the message to. * @param message - The message to send. * @param ttl - Optional time-to-live for the message in milliseconds. * @returns {boolean} - A boolean true if the message was sent successfully, false otherwise. * @throws {Error} - Throws an error if the channel is not initialized or if publishing fails. */ send(sendTo: string, message: unknown, ttl?: number): Promise<boolean>; /** * Listen for messages on the consumer tag. * @param callback - A callback function that will be called with the received message. * @returns {Promise<void>} - A promise that resolves when the listener is set up. * @throws {Error} - Throws an error if the channel is not initialized. */ listen(callback: (message: unknown) => void): Promise<void>; } export { DefaultRapidEncoder, DirectMessager, type DirectMessagerOptions, PubSubMessager, type PubSubMessagerOptions, RapidConnector, type RapidConnectorOptions, type RapidEncoder, RpcMessager, type RpcMessagerOptions };