runmq 1.3.0 → 1.4.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.
- package/README.md +20 -2
- package/dist/index.cjs +314 -59
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +27 -1
- package/dist/index.d.ts +27 -1
- package/dist/index.js +314 -59
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/core/exceptions/RunMQException.ts","../src/core/clients/RabbitMQClientAdapter.ts","../src/core/exceptions/Exceptions.ts","../src/core/clients/RabbitMQClientChannel.ts","../src/core/utils/RunMQUtils.ts","../src/core/constants/index.ts","../src/core/message/RabbitMQMessage.ts","../src/core/consumer/processors/RunMQSucceededMessageAcknowledgerProcessor.ts","../src/core/consumer/processors/RunMQFailedMessageRejecterProcessor.ts","../src/core/consumer/ConsumerCreatorUtils.ts","../src/core/consumer/processors/RunMQRetriesCheckerProcessor.ts","../src/core/consumer/processors/RunMQFailureLoggerProcessor.ts","../src/core/consumer/processors/RunMQBaseProcessor.ts","../src/core/consumer/processors/RunMQExceptionLoggerProcessor.ts","../src/core/message/RunMQMessage.ts","../src/core/serializers/deserializer/validation/AjvSchemaValidator.ts","../src/core/serializers/deserializer/validation/ValidatorFactory.ts","../src/core/serializers/deserializer/DefaultDeserializer.ts","../src/core/publisher/producers/RunMQFailureLoggerProducer.ts","../src/core/publisher/producers/RunMQBaseProducer.ts","../src/core/serializers/DefaultSerializer.ts","../src/core/publisher/RunMQPublisherCreator.ts","../src/core/management/RabbitMQManagementClient.ts","../src/core/management/Policies/RabbitMQMessageTTLPolicy.ts","../src/core/management/Policies/RunMQTTLPolicyManager.ts","../src/core/consumer/RunMQConsumerCreator.ts","../src/core/consumer/ConsumerConfiguration.ts","../src/core/logging/RunMQConsoleLogger.ts","../src/core/message/RabbitMQMessageProperties.ts","../src/core/RunMQ.ts"],"sourcesContent":["export {RunMQ} from \"./core/RunMQ\";\nexport {\n RunMQConnectionConfig,\n SchemaFailureStrategy,\n SchemaType,\n RunMQProcessorConfiguration,\n MessageSchema,\n RunMQMessageContent,\n RunMQMessageMetaContent,\n RabbitMQManagementConfig,\n} from \"./types\";\n\nexport {RunMQLogger} from \"./core/logging/RunMQLogger\";","import {Exceptions} from \"@src/core/exceptions/Exceptions\";\n\nexport class RunMQException extends Error {\n constructor(public exception: Exceptions, public details: Record<string, string | number | Record<string, unknown>>) {\n super(`RunMQ Exception: ${exception}`);\n }\n}","import {Connection, Channel} from \"rabbitmq-client\";\nimport {RunMQException} from \"@src/core/exceptions/RunMQException\";\nimport {Exceptions} from \"@src/core/exceptions/Exceptions\";\nimport {AMQPChannel, AMQPClient, RunMQConnectionConfig} from \"@src/types\";\nimport {RabbitMQClientChannel} from \"@src/core/clients/RabbitMQClientChannel\";\n\n/**\n * AMQPClient implementation using rabbitmq-client library.\n * Leverages built-in reconnection, retry, and robustness features.\n */\nexport class RabbitMQClientAdapter implements AMQPClient {\n private connection: Connection | undefined;\n private defaultChannel: AMQPChannel | undefined;\n private isConnected: boolean = false;\n private acquiredChannels: Channel[] = [];\n\n constructor(private config: RunMQConnectionConfig) {}\n\n public async connect(): Promise<Connection> {\n try {\n if (this.connection && this.isConnected) {\n return this.connection;\n }\n\n // Close any existing connection that might be in a bad state\n if (this.connection) {\n try {\n await this.connection.close();\n } catch {\n // Ignore close errors\n }\n this.connection = undefined;\n }\n\n this.connection = new Connection({\n url: this.config.url,\n // Disable automatic retries - we handle retries at RunMQ level\n retryLow: 100,\n retryHigh: 200,\n connectionTimeout: 5000,\n });\n\n // Set up event handlers before waiting for connection\n this.connection.on('error', (err) => {\n console.error('RabbitMQ connection error:', err);\n this.isConnected = false;\n });\n\n this.connection.on('connection', () => {\n this.isConnected = true;\n });\n\n this.connection.on('connection.blocked', (reason) => {\n console.warn('RabbitMQ connection blocked:', reason);\n });\n\n this.connection.on('connection.unblocked', () => {\n console.info('RabbitMQ connection unblocked');\n });\n\n // Wait for connection with timeout\n // The second parameter (true) disables auto-close on timeout\n await this.connection.onConnect(5000, true);\n this.isConnected = true;\n\n return this.connection;\n } catch (error) {\n this.isConnected = false;\n // Clean up the connection on failure\n if (this.connection) {\n try {\n this.connection.close();\n } catch {\n // Ignore\n }\n this.connection = undefined;\n }\n throw new RunMQException(\n Exceptions.CONNECTION_NOT_ESTABLISHED,\n {\n error: error instanceof Error ? error.message : JSON.stringify(error)\n }\n );\n }\n }\n\n public async getChannel(): Promise<AMQPChannel> {\n const connection = await this.connect();\n const rawChannel = await connection.acquire();\n // Track the channel so we can close it on disconnect\n this.acquiredChannels.push(rawChannel);\n return new RabbitMQClientChannel(rawChannel);\n }\n\n public async getDefaultChannel(): Promise<AMQPChannel> {\n if (!this.defaultChannel) {\n this.defaultChannel = await this.getChannel();\n }\n return this.defaultChannel;\n }\n\n public async disconnect(): Promise<void> {\n // Reset state first\n const conn = this.connection;\n const channels = this.acquiredChannels;\n\n this.connection = undefined;\n this.defaultChannel = undefined;\n this.isConnected = false;\n this.acquiredChannels = [];\n\n // Close all acquired channels first\n for (const channel of channels) {\n try {\n if (channel.active) {\n await channel.close();\n }\n } catch {\n // Ignore errors - channel might already be closed\n }\n }\n\n // Now close the connection\n if (conn) {\n try {\n await conn.close();\n } catch {\n // Ignore errors - connection might already be closed\n }\n }\n }\n\n public isActive(): boolean {\n return this.connection !== undefined && this.isConnected;\n }\n}\n\n","export class Exceptions {\n public static EXCEEDING_CONNECTION_ATTEMPTS = 'EXCEEDING_CONNECTION_ATTEMPTS';\n public static CONNECTION_NOT_ESTABLISHED = 'CONNECTION_NOT_ESTABLISHED';\n public static NOT_INITIALIZED = 'NOT_INITIALIZED';\n public static INVALID_MESSAGE_FORMAT = 'MESSAGE_SHOULD_BE_VALID_RECORD';\n public static UNSUPPORTED_SCHEMA = 'UNSUPPORTED_SCHEMA';\n public static FAILURE_TO_DEFINE_TTL_POLICY = 'FAILURE_TO_DEFINE_TTL_POLICY';\n}","import type {Channel, AsyncMessage} from \"rabbitmq-client\";\nimport {\n AMQPChannel,\n AMQPConsumeInfo,\n AMQPConsumeOptions,\n AMQPExchangeInfo,\n AMQPExchangeOptions,\n AMQPPublishOptions,\n AMQPQueueInfo,\n AMQPQueueOptions,\n ConsumeMessage\n} from \"@src/types\";\n\n/**\n * Wrapper around rabbitmq-client Channel that implements the AMQPChannel interface.\n * Provides a library-agnostic abstraction over channel operations.\n */\nexport class RabbitMQClientChannel implements AMQPChannel {\n constructor(private readonly channel: Channel) {}\n\n async assertQueue(queue: string, options?: AMQPQueueOptions): Promise<AMQPQueueInfo> {\n const args: Record<string, any> = {};\n if (options?.deadLetterExchange) args['x-dead-letter-exchange'] = options.deadLetterExchange;\n if (options?.deadLetterRoutingKey) args['x-dead-letter-routing-key'] = options.deadLetterRoutingKey;\n if (options?.messageTtl) args['x-message-ttl'] = options.messageTtl;\n if (options?.arguments) Object.assign(args, options.arguments);\n\n const result = await this.channel.queueDeclare({\n queue,\n durable: options?.durable,\n exclusive: options?.exclusive,\n autoDelete: options?.autoDelete,\n arguments: Object.keys(args).length > 0 ? args : undefined,\n });\n return {\n queue: result.queue,\n messageCount: result.messageCount,\n consumerCount: result.consumerCount,\n };\n }\n\n async checkQueue(queue: string): Promise<AMQPQueueInfo> {\n const result = await this.channel.queueDeclare({\n queue,\n passive: true,\n });\n return {\n queue: result.queue,\n messageCount: result.messageCount,\n consumerCount: result.consumerCount,\n };\n }\n\n async deleteQueue(queue: string, options?: { ifUnused?: boolean; ifEmpty?: boolean }): Promise<{ messageCount: number }> {\n const result = await this.channel.queueDelete({\n queue,\n ifUnused: options?.ifUnused,\n ifEmpty: options?.ifEmpty,\n });\n return {\n messageCount: result.messageCount,\n };\n }\n\n async assertExchange(exchange: string, type: string, options?: AMQPExchangeOptions): Promise<AMQPExchangeInfo> {\n const args: Record<string, any> = {};\n if (options?.alternateExchange) args['alternate-exchange'] = options.alternateExchange;\n if (options?.arguments) Object.assign(args, options.arguments);\n\n await this.channel.exchangeDeclare({\n exchange,\n type,\n durable: options?.durable,\n internal: options?.internal,\n autoDelete: options?.autoDelete,\n arguments: Object.keys(args).length > 0 ? args : undefined,\n });\n return {\n exchange,\n };\n }\n\n async checkExchange(exchange: string): Promise<AMQPExchangeInfo> {\n await this.channel.exchangeDeclare({\n exchange,\n passive: true,\n });\n return {\n exchange,\n };\n }\n\n async deleteExchange(exchange: string, options?: { ifUnused?: boolean }): Promise<void> {\n await this.channel.exchangeDelete({\n exchange,\n ifUnused: options?.ifUnused,\n });\n }\n\n async bindQueue(queue: string, source: string, pattern: string, args?: Record<string, any>): Promise<void> {\n await this.channel.queueBind({\n queue,\n exchange: source,\n routingKey: pattern,\n arguments: args,\n });\n }\n\n publish(exchange: string, routingKey: string, content: Buffer, options?: AMQPPublishOptions): boolean {\n this.channel.basicPublish({\n exchange,\n routingKey,\n correlationId: options?.correlationId,\n messageId: options?.messageId,\n headers: options?.headers,\n durable: options?.persistent,\n expiration: options?.expiration?.toString(),\n contentType: options?.contentType,\n contentEncoding: options?.contentEncoding,\n priority: options?.priority,\n replyTo: options?.replyTo,\n timestamp: options?.timestamp,\n type: options?.type,\n userId: options?.userId,\n appId: options?.appId,\n }, content);\n return true;\n }\n\n async consume(\n queue: string,\n onMessage: (msg: ConsumeMessage | null) => void,\n options?: AMQPConsumeOptions\n ): Promise<AMQPConsumeInfo> {\n const result = await this.channel.basicConsume({\n queue,\n consumerTag: options?.consumerTag,\n noLocal: options?.noLocal,\n noAck: options?.noAck,\n exclusive: options?.exclusive,\n arguments: options?.arguments,\n }, (msg: AsyncMessage) => {\n // Convert rabbitmq-client message format to our ConsumeMessage format\n const body = msg.body;\n const content = Buffer.isBuffer(body) ? body :\n typeof body === 'string' ? Buffer.from(body) :\n Buffer.from(JSON.stringify(body));\n\n const consumeMessage: ConsumeMessage = {\n content,\n fields: {\n consumerTag: msg.consumerTag,\n deliveryTag: msg.deliveryTag,\n redelivered: msg.redelivered,\n exchange: msg.exchange,\n routingKey: msg.routingKey,\n },\n properties: {\n contentType: msg.contentType,\n contentEncoding: msg.contentEncoding,\n headers: msg.headers || {},\n deliveryMode: msg.durable ? 2 : 1,\n priority: msg.priority,\n correlationId: msg.correlationId,\n replyTo: msg.replyTo,\n expiration: msg.expiration,\n messageId: msg.messageId,\n timestamp: msg.timestamp,\n type: msg.type,\n userId: msg.userId,\n appId: msg.appId,\n },\n };\n onMessage(consumeMessage);\n });\n return {\n consumerTag: result.consumerTag,\n };\n }\n\n ack(message: ConsumeMessage, allUpTo?: boolean): void {\n this.channel.basicAck({\n deliveryTag: message.fields.deliveryTag,\n multiple: allUpTo,\n });\n }\n\n nack(message: ConsumeMessage, allUpTo?: boolean, requeue?: boolean): void {\n this.channel.basicNack({\n deliveryTag: message.fields.deliveryTag,\n multiple: allUpTo,\n requeue,\n });\n }\n\n async prefetch(count: number, global?: boolean): Promise<void> {\n await this.channel.basicQos({\n prefetchCount: count,\n global,\n });\n }\n\n async close(): Promise<void> {\n await this.channel.close();\n }\n}\n\n","import {randomUUID} from 'crypto';\nimport {RunMQException} from \"@src/core/exceptions/RunMQException\";\nimport {Exceptions} from \"@src/core/exceptions/Exceptions\";\n\nexport class RunMQUtils {\n public static delay(ms: number): Promise<void> {\n return new Promise(resolve => setTimeout(resolve, ms));\n }\n\n public static generateUUID(): string {\n return randomUUID();\n }\n\n public static assertRecord(message: unknown): asserts message is Record<string, any> {\n if (typeof message !== 'object' || message === null || Array.isArray(message)) {\n throw new RunMQException(Exceptions.INVALID_MESSAGE_FORMAT, {});\n }\n }\n\n public static escapeRegExp(string: string): string {\n return string.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n }\n}","const RUNMQ_PREFIX = \"_runmq_\"\nexport const Constants = {\n ROUTER_EXCHANGE_NAME: RUNMQ_PREFIX + \"router\",\n DEAD_LETTER_ROUTER_EXCHANGE_NAME: RUNMQ_PREFIX + \"dead_letter_router\",\n RETRY_DELAY_QUEUE_PREFIX: RUNMQ_PREFIX + \"retry_delay_\",\n DLQ_QUEUE_PREFIX: RUNMQ_PREFIX + \"dlq_\",\n MESSAGE_TTL_OPERATOR_POLICY_PREFIX: RUNMQ_PREFIX + \"message_ttl_operator_policy\",\n}\n\nexport const DEFAULTS = {\n RECONNECT_DELAY: 5000,\n MAX_RECONNECT_ATTEMPTS: 5,\n PREFETCH_COUNT: 1,\n PROCESSING_ATTEMPTS: 1,\n PROCESSING_RETRY_DELAY: 1000,\n}","import {RunMQUtils} from \"@src/core/utils/RunMQUtils\";\nimport {RabbitMQMessageProperties} from \"@src/core/message/RabbitMQMessageProperties\";\nimport {AMQPMessage} from \"@src/core/message/AmqpMessage\";\nimport {AMQPChannel} from \"@src/types\";\n\nexport class RabbitMQMessage {\n constructor(\n readonly message: any,\n readonly id: string = RunMQUtils.generateUUID(),\n readonly correlationId: string = RunMQUtils.generateUUID(),\n readonly channel: AMQPChannel,\n readonly amqpMessage: AMQPMessage = null,\n readonly headers: Record<string, any> = {}) {\n }\n\n /**\n * Acknowledges the message.\n */\n ack(): void {\n if (this.amqpMessage) {\n this.channel.ack(this.amqpMessage);\n }\n }\n\n /**\n * Negatively acknowledges the message.\n * @param requeue - Whether to requeue the message (default: false)\n */\n nack(requeue: boolean = false): void {\n if (this.amqpMessage) {\n this.channel.nack(this.amqpMessage, false, requeue);\n }\n }\n\n static from(\n messageData: Record<string, any>,\n channel: AMQPChannel,\n props: RabbitMQMessageProperties,\n amqpMessage: AMQPMessage = null\n ): RabbitMQMessage {\n return new RabbitMQMessage(\n messageData,\n props.id,\n props.correlationId,\n channel,\n amqpMessage,\n {}\n );\n }\n}","import {RunMQConsumer} from \"@src/types\";\nimport {RabbitMQMessage} from \"@src/core/message/RabbitMQMessage\";\n\nexport class RunMQSucceededMessageAcknowledgerProcessor implements RunMQConsumer {\n constructor(private consumer: RunMQConsumer) {\n }\n\n public async consume(message: RabbitMQMessage) {\n const result = await this.consumer.consume(message);\n if (result) {\n message.ack();\n }\n return result;\n }\n}","import {RunMQConsumer} from \"@src/types\";\nimport {RabbitMQMessage} from \"@src/core/message/RabbitMQMessage\";\n\nexport class RunMQFailedMessageRejecterProcessor implements RunMQConsumer {\n constructor(private consumer: RunMQConsumer) {\n }\n\n public async consume(message: RabbitMQMessage): Promise<boolean> {\n try {\n return await this.consumer.consume(message);\n } catch {\n message.nack(false);\n return false;\n }\n }\n}","import {Constants} from \"@src/core/constants\";\n\nexport class ConsumerCreatorUtils {\n static getDLQTopicName(topic: string): string {\n return Constants.DLQ_QUEUE_PREFIX + topic;\n }\n static getRetryDelayTopicName(topic: string): string {\n return Constants.RETRY_DELAY_QUEUE_PREFIX + topic;\n }\n\n static getMessageTTLPolicyName(topic: string): string {\n return Constants.MESSAGE_TTL_OPERATOR_POLICY_PREFIX + topic;\n }\n}","import {RunMQConsumer, RunMQProcessorConfiguration, RunMQPublisher} from \"@src/types\";\nimport {RabbitMQMessage} from \"@src/core/message/RabbitMQMessage\";\nimport {RunMQLogger} from \"@src/core/logging/RunMQLogger\";\nimport {ConsumerCreatorUtils} from \"@src/core/consumer/ConsumerCreatorUtils\";\nimport {DEFAULTS} from \"@src/core/constants\";\n\nexport class RunMQRetriesCheckerProcessor implements RunMQConsumer {\n private readonly maxAttempts: number = this.config.attempts ?? DEFAULTS.PROCESSING_ATTEMPTS;\n\n constructor(\n private readonly consumer: RunMQConsumer,\n private readonly config: RunMQProcessorConfiguration,\n private readonly DLQPublisher: RunMQPublisher,\n private readonly logger: RunMQLogger,\n ) {\n }\n\n public async consume(message: RabbitMQMessage): Promise<boolean> {\n try {\n return await this.consumer.consume(message);\n } catch (e: unknown) {\n if (this.hasReachedMaxRetries(message)) {\n this.logMaxRetriesReached(message);\n this.moveToFinalDeadLetter(message);\n this.acknowledgeMessage(message);\n return false;\n }\n throw e;\n }\n }\n\n private hasReachedMaxRetries(message: RabbitMQMessage): boolean {\n const rejectedCount = this.getRejectionCount(message);\n return rejectedCount >= this.maxAttempts;\n }\n\n private logMaxRetriesReached(message: RabbitMQMessage) {\n this.logger.error(\n `Message reached maximum attempts. Moving to dead-letter queue.`, {\n message: message.message,\n attempts: this.getRejectionCount(message),\n max: this.maxAttempts,\n }\n );\n }\n\n private moveToFinalDeadLetter(message: RabbitMQMessage) {\n this.DLQPublisher.publish(ConsumerCreatorUtils.getDLQTopicName(this.config.name), message)\n }\n\n private acknowledgeMessage(message: RabbitMQMessage) {\n try {\n message.ack();\n } catch (e) {\n const error = new Error(\"A message acknowledge failed after publishing to final dead letter\");\n this.logger.error(error.message, {cause: e instanceof Error ? e.message : String(e)});\n throw error;\n }\n }\n\n private getRejectionCount(message: RabbitMQMessage): number {\n const xDeath = message.headers?.[\"x-death\"];\n if (!Array.isArray(xDeath)) return 1;\n const deathRecord = xDeath.filter(entry => entry && entry.reason == 'rejected')[0];\n return deathRecord ? deathRecord.count + 1 : 1;\n }\n}","import {RunMQConsumer} from \"@src/types\";\nimport {RabbitMQMessage} from \"@src/core/message/RabbitMQMessage\";\nimport {RunMQLogger} from \"@src/core/logging/RunMQLogger\";\n\nexport class RunMQFailureLoggerProcessor implements RunMQConsumer {\n constructor(private consumer: RunMQConsumer, private logger: RunMQLogger) {\n }\n\n public async consume(message: RabbitMQMessage) {\n try {\n return await this.consumer.consume(message);\n } catch (e) {\n this.logger.error('Message processing failed', {\n message: message.message,\n },\n e instanceof Error ? e.stack : undefined);\n throw e;\n }\n }\n}","import {RunMQConsumer, RunMQProcessorConfiguration} from \"@src/types\";\nimport {RunMQMessage} from \"@src/core/message/RunMQMessage\";\nimport {RabbitMQMessage} from \"@src/core/message/RabbitMQMessage\";\nimport {DefaultDeserializer} from \"@src/core/serializers/deserializer/DefaultDeserializer\";\n\nexport class RunMQBaseProcessor<T> implements RunMQConsumer {\n constructor(private handler: (message: RunMQMessage<T>) => Promise<void>,\n private processorConfig: RunMQProcessorConfiguration,\n private serializer: DefaultDeserializer<T>\n ) {\n }\n\n public async consume(message: RabbitMQMessage): Promise<boolean> {\n const rabbitMQMessage = this.serializer.deserialize(message.message, this.processorConfig);\n await this.handler(rabbitMQMessage as RunMQMessage<T>);\n return true;\n }\n}","import {RunMQConsumer} from \"@src/types\";\nimport {RabbitMQMessage} from \"@src/core/message/RabbitMQMessage\";\nimport {RunMQLogger} from \"@src/core/logging/RunMQLogger\";\n\nexport class RunMQExceptionLoggerProcessor implements RunMQConsumer {\n constructor(private consumer: RunMQConsumer, private logger: RunMQLogger) {}\n\n public async consume(message: RabbitMQMessage) {\n try {\n return await this.consumer.consume(message);\n } catch (e: unknown) {\n if (e instanceof Error) {\n this.logger.error(e.message, e.stack);\n throw e;\n } else {\n const errorString = JSON.stringify(e);\n this.logger.error(errorString);\n throw new Error(errorString);\n }\n }\n }\n}","import {RunMQMessageContent, RunMQMessageMetaContent} from \"@src/types\";\n\nexport class RunMQMessage<T = any> implements RunMQMessageContent<T> {\n public static isValid(obj: any) {\n if (typeof obj === \"object\" && obj !== null) {\n return 'message' in obj && 'meta' in obj &&\n typeof obj.message === 'object' && obj.message !== null &&\n Array.isArray(obj.message) === false &&\n typeof obj.meta === 'object' && obj.meta !== null &&\n 'id' in obj.meta &&\n 'correlationId' in obj.meta &&\n 'publishedAt' in obj.meta &&\n typeof obj.meta.id === 'string' &&\n typeof obj.meta.correlationId === 'string' &&\n typeof obj.meta.publishedAt === 'number';\n }\n return false;\n }\n\n\n readonly message: T;\n\n readonly meta: RunMQMessageMeta;\n\n constructor(message: T, meta: RunMQMessageMeta) {\n this.message = message;\n this.meta = meta;\n }\n}\n\nexport class RunMQMessageMeta implements RunMQMessageMetaContent {\n readonly id: string;\n readonly publishedAt: number;\n readonly correlationId: string;\n\n constructor(id: string, publishedAt: number, correlationId: string) {\n this.id = id;\n this.correlationId = correlationId;\n this.publishedAt = publishedAt;\n }\n}","import Ajv, {JSONSchemaType, ValidateFunction} from \"ajv\";\nimport {SchemaValidator} from \"@src/core/serializers/deserializer/validation/SchemaValidator\";\n\nexport class AjvSchemaValidator<T> implements SchemaValidator<JSONSchemaType<T>> {\n private readonly ajv: Ajv;\n private lastValidator: ValidateFunction<T> | null = null;\n\n constructor() {\n this.ajv = new Ajv({\n allErrors: true,\n verbose: true,\n strict: true\n });\n }\n\n validate(schema: JSONSchemaType<T>, data: unknown): boolean {\n this.lastValidator = this.ajv.compile<T>(schema);\n return this.lastValidator(data);\n }\n\n getError(): string | null {\n if (!this.lastValidator || !this.lastValidator.errors) {\n return null;\n }\n return JSON.stringify(this.lastValidator.errors);\n }\n}","import {SchemaType} from \"@src/types\";\nimport {SchemaValidator} from \"@src/core/serializers/deserializer/validation/SchemaValidator\";\nimport {AjvSchemaValidator} from \"@src/core/serializers/deserializer/validation/AjvSchemaValidator\";\nimport {RunMQException} from \"@src/core/exceptions/RunMQException\";\nimport {Exceptions} from \"@src/core/exceptions/Exceptions\";\n\nconst validatorCache: Map<SchemaType, SchemaValidator<any>> = new Map();\n\nexport function getValidator<T>(schemaType: SchemaType): SchemaValidator<any> {\n const cached = validatorCache.get(schemaType);\n if (cached) {\n return cached;\n }\n\n let validator: SchemaValidator<any>;\n\n switch (schemaType) {\n case 'ajv':\n validator = new AjvSchemaValidator<T>();\n break;\n default:\n throw new RunMQException(Exceptions.UNSUPPORTED_SCHEMA, {schemaType});\n }\n\n validatorCache.set(schemaType, validator);\n return validator;\n}","import {Deserializer} from \"@src/core/serializers/deserializer/Deserializer\";\nimport {RunMQMessage, RunMQMessageMeta} from \"@src/core/message/RunMQMessage\";\nimport {RunMQProcessorConfiguration} from \"@src/types\";\nimport {getValidator} from \"@src/core/serializers/deserializer/validation/ValidatorFactory\";\n\nexport class DeserializationError extends Error {\n constructor(message: string, public readonly cause?: unknown) {\n super(message);\n this.name = 'DeserializationError';\n }\n}\n\nexport class RunMQSchemaValidationError extends Error {\n constructor(message: string, public readonly error?: string) {\n super(message);\n this.name = 'ValidationError';\n }\n}\n\nexport class DefaultDeserializer<T> implements Deserializer<RunMQMessage<T>> {\n deserialize(data: string, processorConfig: RunMQProcessorConfiguration): RunMQMessage<T> {\n if (!data) {\n throw new DeserializationError('Input must be a non-empty string');\n }\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(data);\n } catch (error) {\n throw new DeserializationError(\n `Failed to parse JSON: ${error instanceof Error ? error.message : 'Unknown error'}`,\n error\n );\n }\n\n if (!RunMQMessage.isValid(parsed)) {\n throw new RunMQSchemaValidationError(\n 'Invalid message format: not valid RunMQMessage structure'\n );\n }\n\n const typedParsed = parsed as {\n message: unknown;\n meta: { id: string; correlationId: string, publishedAt: number }\n };\n\n if (processorConfig.messageSchema) {\n const {type, schema} = processorConfig.messageSchema;\n const validator = getValidator<T>(type);\n\n if (!validator.validate(schema, typedParsed.message)) {\n throw new RunMQSchemaValidationError(\n 'Message validation failed against schema',\n validator.getError() || undefined\n );\n }\n }\n\n const message = typedParsed.message as T;\n\n return new RunMQMessage<T>(\n message,\n new RunMQMessageMeta(\n typedParsed.meta.id,\n typedParsed.meta.publishedAt,\n typedParsed.meta.correlationId\n )\n );\n }\n}","import {RunMQPublisher} from \"@src/types\";\nimport {RunMQLogger} from \"@src/core/logging/RunMQLogger\";\nimport {RabbitMQMessage} from \"@src/core/message/RabbitMQMessage\";\n\nexport class RunMQFailureLoggerProducer implements RunMQPublisher {\n constructor(private producer: RunMQPublisher, private logger: RunMQLogger) {\n }\n\n publish(topic: string, message: RabbitMQMessage): void {\n try {\n this.producer.publish(topic, message);\n } catch (e) {\n this.logger.error('Message publishing failed', {\n message: message,\n error: e instanceof Error ? e.message : JSON.stringify(e),\n stack: e instanceof Error ? e.stack : undefined,\n });\n throw e;\n }\n }\n}","import {RunMQPublisher} from \"@src/types\";\nimport {Constants} from \"@src/core/constants\";\nimport {RabbitMQMessage} from \"@src/core/message/RabbitMQMessage\";\nimport {RunMQMessage, RunMQMessageMeta} from \"@src/core/message/RunMQMessage\";\nimport {Serializer} from \"@src/core/serializers/Serializer\";\n\nexport class RunMQBaseProducer implements RunMQPublisher {\n constructor(private serializer: Serializer, private exchange = Constants.ROUTER_EXCHANGE_NAME) {\n }\n\n publish(topic: string, message: RabbitMQMessage): void {\n const runMQMessage = new RunMQMessage(\n message.message,\n new RunMQMessageMeta(\n message.id,\n Date.now(),\n message.correlationId,\n ));\n const serialized = this.serializer.serialize(runMQMessage);\n message.channel.publish(this.exchange, topic, Buffer.from(serialized), {\n correlationId: message.correlationId,\n messageId: message.id,\n headers: message.headers,\n });\n }\n}","import {Serializer} from \"@src/core/serializers/Serializer\";\nimport {RunMQMessage} from \"@src/core/message/RunMQMessage\";\n\nexport class SerializationError extends Error {\n constructor(message: string, public readonly cause?: unknown) {\n super(message);\n this.name = 'SerializationError';\n }\n}\n\nexport class DefaultSerializer implements Serializer {\n serialize(data: RunMQMessage) {\n try {\n return JSON.stringify(data);\n } catch (error) {\n throw new SerializationError(\n `Failed to serialize message: ${error instanceof Error ? error.message : 'Unknown error'}`,\n error\n );\n }\n }\n}","import {RunMQLogger} from \"@src/core/logging/RunMQLogger\";\nimport {RunMQPublisher} from \"@src/types\";\nimport {RunMQFailureLoggerProducer} from \"@src/core/publisher/producers/RunMQFailureLoggerProducer\";\nimport {RunMQBaseProducer} from \"@src/core/publisher/producers/RunMQBaseProducer\";\nimport {DefaultSerializer} from \"@src/core/serializers/DefaultSerializer\";\nimport {Constants} from \"@src/core/constants\";\n\nexport class RunMQPublisherCreator {\n constructor(\n private logger: RunMQLogger) {\n }\n\n public createPublisher(exchange = Constants.ROUTER_EXCHANGE_NAME): RunMQPublisher {\n return new RunMQFailureLoggerProducer(\n new RunMQBaseProducer(new DefaultSerializer(), exchange),\n this.logger\n );\n }\n}","import {RunMQLogger} from \"@src/core/logging/RunMQLogger\";\nimport {RabbitMQManagementConfig} from \"@src\";\nimport {RabbitMQOperatorPolicy} from \"@src/types\";\n\nexport class RabbitMQManagementClient {\n constructor(\n private config: RabbitMQManagementConfig,\n private logger: RunMQLogger\n ) {}\n\n private getAuthHeader(): string {\n const credentials = Buffer.from(`${this.config.username}:${this.config.password}`).toString('base64');\n return `Basic ${credentials}`;\n }\n\n public async createOrUpdateOperatorPolicy(vhost: string, policy: RabbitMQOperatorPolicy): Promise<boolean> {\n try {\n const url = `${this.config.url}/api/operator-policies/${vhost}/${encodeURIComponent(policy.name)}`;\n \n const response = await fetch(url, {\n method: 'PUT',\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': this.getAuthHeader()\n },\n body: JSON.stringify({\n pattern: policy.pattern,\n definition: policy.definition,\n priority: policy.priority || 0,\n \"apply-to\": policy[\"apply-to\"]\n })\n });\n\n if (!response.ok) {\n const error = await response.text();\n this.logger.error(`Failed to create operator policy: ${response.status} - ${error}`);\n return false;\n }\n\n this.logger.info(`Successfully set operator policy: ${policy.name}`);\n return true;\n } catch (error) {\n this.logger.error(`Error creating operator policy: ${error}`);\n return false;\n }\n }\n\n public async getOperatorPolicy(vhost: string, policyName: string): Promise<RabbitMQOperatorPolicy | null> {\n try {\n const url = `${this.config.url}/api/operator-policies/${vhost}/${encodeURIComponent(policyName)}`;\n \n const response = await fetch(url, {\n method: 'GET',\n headers: {\n 'Authorization': this.getAuthHeader()\n }\n });\n\n if (!response.ok) {\n if (response.status === 404) {\n return null;\n }\n const error = await response.text();\n this.logger.error(`Failed to get operator policy: ${response.status} - ${error}`);\n return null;\n }\n\n return await response.json();\n } catch (error) {\n this.logger.error(`Error getting operator policy: ${error}`);\n return null;\n }\n }\n\n public async deleteOperatorPolicy(vhost: string, policyName: string): Promise<boolean> {\n try {\n const url = `${this.config.url}/api/operator-policies/${vhost}/${encodeURIComponent(policyName)}`;\n \n const response = await fetch(url, {\n method: 'DELETE',\n headers: {\n 'Authorization': this.getAuthHeader()\n }\n });\n\n if (!response.ok && response.status !== 404) {\n const error = await response.text();\n this.logger.error(`Failed to delete operator policy: ${response.status} - ${error}`);\n return false;\n }\n\n this.logger.info(`Successfully deleted operator policy: ${policyName}`);\n return true;\n } catch (error) {\n this.logger.error(`Error deleting operator policy: ${error}`);\n return false;\n }\n }\n\n public async checkManagementPluginEnabled(): Promise<boolean> {\n try {\n const url = `${this.config.url}/api/overview`;\n \n const response = await fetch(url, {\n method: 'GET',\n headers: {\n 'Authorization': this.getAuthHeader()\n }\n });\n\n return response.ok;\n } catch (error) {\n this.logger.warn(`Management plugin not accessible: ${error}`);\n return false;\n }\n }\n}","import {RabbitMQOperatorPolicy} from \"@src/types\";\nimport {RunMQUtils} from \"@src/core/utils/RunMQUtils\";\nimport {ConsumerCreatorUtils} from \"@src/core/consumer/ConsumerCreatorUtils\";\n\nexport class RabbitMQMessageTTLPolicy {\n static createFor(queueName: string, ttl: number): RabbitMQOperatorPolicy {\n return {\n name: ConsumerCreatorUtils.getMessageTTLPolicyName(queueName),\n pattern: RunMQUtils.escapeRegExp(queueName),\n definition: {\n \"message-ttl\": ttl\n },\n \"apply-to\": \"queues\",\n priority: 1000\n }\n }\n}","import {RabbitMQManagementClient} from \"@src/core/management/RabbitMQManagementClient\";\nimport {RunMQLogger} from \"@src/core/logging/RunMQLogger\";\nimport {DEFAULTS} from \"@src/core/constants\";\nimport {RabbitMQManagementConfig} from \"@src\";\nimport {RabbitMQMessageTTLPolicy} from \"@src/core/management/Policies/RabbitMQMessageTTLPolicy\";\n\nexport class RunMQTTLPolicyManager {\n private readonly managementClient: RabbitMQManagementClient | null = null;\n private isManagementPluginEnabled = false;\n\n constructor(\n private logger: RunMQLogger,\n private managementConfig?: RabbitMQManagementConfig\n ) {\n if (this.managementConfig) {\n this.managementClient = new RabbitMQManagementClient(this.managementConfig, this.logger);\n }\n }\n\n public async initialize(): Promise<void> {\n if (!this.managementClient) {\n this.logger.warn(\"Management client not configured\");\n return;\n }\n\n this.isManagementPluginEnabled = await this.managementClient.checkManagementPluginEnabled();\n\n if (!this.isManagementPluginEnabled) {\n this.logger.warn(\"RabbitMQ management plugin is not enabled\");\n } else {\n this.logger.info(\"RabbitMQ management plugin is enabled\");\n }\n }\n\n public async apply(\n queueName: string,\n ttl?: number,\n vhost: string = \"%2F\"\n ): Promise<boolean> {\n const actualTTL = ttl ?? DEFAULTS.PROCESSING_RETRY_DELAY;\n\n if (this.isManagementPluginEnabled && this.managementClient) {\n const success = await this.managementClient.createOrUpdateOperatorPolicy(\n vhost,\n RabbitMQMessageTTLPolicy.createFor(queueName, actualTTL)\n );\n\n if (success) {\n return true\n }\n }\n return false;\n }\n\n\n public async cleanup(queueName: string, vhost: string = \"%2F\"): Promise<void> {\n if (this.isManagementPluginEnabled && this.managementClient) {\n const policyName = `ttl-policy-${queueName}`;\n await this.managementClient.deleteOperatorPolicy(vhost, policyName);\n }\n }\n}","import {ConsumerConfiguration} from \"@src/core/consumer/ConsumerConfiguration\";\nimport {Constants, DEFAULTS} from \"@src/core/constants\";\nimport {RabbitMQMessage} from \"@src/core/message/RabbitMQMessage\";\nimport {\n RunMQSucceededMessageAcknowledgerProcessor\n} from \"@src/core/consumer/processors/RunMQSucceededMessageAcknowledgerProcessor\";\nimport {RunMQFailedMessageRejecterProcessor} from \"@src/core/consumer/processors/RunMQFailedMessageRejecterProcessor\";\nimport {RunMQRetriesCheckerProcessor} from \"@src/core/consumer/processors/RunMQRetriesCheckerProcessor\";\nimport {RunMQFailureLoggerProcessor} from \"@src/core/consumer/processors/RunMQFailureLoggerProcessor\";\nimport {RunMQBaseProcessor} from \"@src/core/consumer/processors/RunMQBaseProcessor\";\nimport {RunMQExceptionLoggerProcessor} from \"@src/core/consumer/processors/RunMQExceptionLoggerProcessor\";\nimport {RunMQLogger} from \"@src/core/logging/RunMQLogger\";\nimport {DefaultDeserializer} from \"@src/core/serializers/deserializer/DefaultDeserializer\";\nimport {ConsumerCreatorUtils} from \"@src/core/consumer/ConsumerCreatorUtils\";\nimport {RunMQPublisherCreator} from \"@src/core/publisher/RunMQPublisherCreator\";\nimport {AMQPChannel, AMQPClient, RabbitMQManagementConfig} from \"@src/types\";\nimport {RunMQTTLPolicyManager} from \"@src/core/management/Policies/RunMQTTLPolicyManager\";\nimport {RunMQException} from \"@src/core/exceptions/RunMQException\";\nimport {Exceptions} from \"@src/core/exceptions/Exceptions\";\n\nexport class RunMQConsumerCreator {\n private ttlPolicyManager: RunMQTTLPolicyManager;\n\n constructor(\n private client: AMQPClient,\n private logger: RunMQLogger,\n managementConfig?: RabbitMQManagementConfig\n ) {\n this.ttlPolicyManager = new RunMQTTLPolicyManager(logger, managementConfig);\n }\n\n public async createConsumer<T>(consumerConfiguration: ConsumerConfiguration<T>) {\n await this.ttlPolicyManager.initialize();\n await this.assertQueues<T>(consumerConfiguration);\n await this.bindQueues<T>(consumerConfiguration);\n for (let i = 0; i < consumerConfiguration.processorConfig.consumersCount; i++) {\n await this.runProcessor<T>(consumerConfiguration);\n }\n }\n\n\n private async runProcessor<T>(consumerConfiguration: ConsumerConfiguration<T>): Promise<void> {\n const consumerChannel = await this.getProcessorChannel();\n const DLQPublisher = new RunMQPublisherCreator(this.logger).createPublisher(Constants.DEAD_LETTER_ROUTER_EXCHANGE_NAME);\n\n await consumerChannel.prefetch(DEFAULTS.PREFETCH_COUNT);\n await consumerChannel.consume(consumerConfiguration.processorConfig.name, async (msg) => {\n if (msg) {\n const rabbitmqMessage = new RabbitMQMessage(\n msg.content.toString(),\n msg.properties.messageId,\n msg.properties.correlationId,\n consumerChannel,\n msg,\n msg.properties.headers,\n )\n return new RunMQExceptionLoggerProcessor(\n new RunMQSucceededMessageAcknowledgerProcessor(\n new RunMQFailedMessageRejecterProcessor(\n new RunMQRetriesCheckerProcessor(\n new RunMQFailureLoggerProcessor(\n new RunMQBaseProcessor<T>(\n consumerConfiguration.processor,\n consumerConfiguration.processorConfig,\n new DefaultDeserializer<T>()\n ),\n this.logger\n ),\n consumerConfiguration.processorConfig,\n DLQPublisher,\n this.logger\n )\n )\n ), this.logger).consume(rabbitmqMessage)\n }\n });\n }\n\n\n private async assertQueues<T>(consumerConfiguration: ConsumerConfiguration<T>) {\n const defaultChannel = await this.client.getDefaultChannel();\n\n await defaultChannel.assertQueue(consumerConfiguration.processorConfig.name, {\n durable: true,\n deadLetterExchange: Constants.DEAD_LETTER_ROUTER_EXCHANGE_NAME,\n deadLetterRoutingKey: consumerConfiguration.processorConfig.name\n });\n await defaultChannel.assertQueue(ConsumerCreatorUtils.getDLQTopicName(consumerConfiguration.processorConfig.name), {\n durable: true,\n deadLetterExchange: Constants.ROUTER_EXCHANGE_NAME,\n deadLetterRoutingKey: consumerConfiguration.processorConfig.name\n });\n\n const retryDelayQueueName = ConsumerCreatorUtils.getRetryDelayTopicName(consumerConfiguration.processorConfig.name);\n const messageDelay = consumerConfiguration.processorConfig.attemptsDelay ?? DEFAULTS.PROCESSING_RETRY_DELAY\n\n\n const policiesForTTL = consumerConfiguration.processorConfig.usePoliciesForDelay ?? false;\n if (!policiesForTTL) {\n await defaultChannel.assertQueue(retryDelayQueueName, {\n durable: true,\n deadLetterExchange: Constants.ROUTER_EXCHANGE_NAME,\n messageTtl: messageDelay,\n });\n return;\n }\n\n const result = await this.ttlPolicyManager.apply(\n retryDelayQueueName,\n messageDelay\n );\n if (result) {\n await defaultChannel.assertQueue(retryDelayQueueName, {\n durable: true,\n deadLetterExchange: Constants.ROUTER_EXCHANGE_NAME\n });\n return;\n }\n throw new RunMQException(\n Exceptions.FAILURE_TO_DEFINE_TTL_POLICY,\n {\n error: \"Failed to apply TTL policy to queue: \" + retryDelayQueueName\n }\n );\n }\n\n\n private async bindQueues<T>(consumerConfiguration: ConsumerConfiguration<T>) {\n const defaultChannel = await this.client.getDefaultChannel();\n\n await defaultChannel.bindQueue(\n consumerConfiguration.processorConfig.name,\n Constants.ROUTER_EXCHANGE_NAME,\n consumerConfiguration.topic\n );\n await defaultChannel.bindQueue(\n consumerConfiguration.processorConfig.name,\n Constants.ROUTER_EXCHANGE_NAME,\n consumerConfiguration.processorConfig.name\n );\n await defaultChannel.bindQueue(\n ConsumerCreatorUtils.getRetryDelayTopicName(consumerConfiguration.processorConfig.name),\n Constants.DEAD_LETTER_ROUTER_EXCHANGE_NAME,\n consumerConfiguration.processorConfig.name\n );\n await defaultChannel.bindQueue(\n ConsumerCreatorUtils.getDLQTopicName(consumerConfiguration.processorConfig.name),\n Constants.DEAD_LETTER_ROUTER_EXCHANGE_NAME,\n ConsumerCreatorUtils.getDLQTopicName(consumerConfiguration.processorConfig.name)\n );\n }\n\n private async getProcessorChannel(): Promise<AMQPChannel> {\n return await this.client.getChannel()\n }\n}","import {RunMQProcessorConfiguration} from \"@src/types\";\nimport {RunMQMessage} from \"@src/core/message/RunMQMessage\";\n\nexport class ConsumerConfiguration<T> {\n constructor(\n readonly topic: string,\n readonly processorConfig: RunMQProcessorConfiguration,\n readonly processor: (message: RunMQMessage<T>) => Promise<void>) {\n }\n}","import {RunMQLogger} from \"@src/core/logging/RunMQLogger\";\n\nexport class RunMQConsoleLogger implements RunMQLogger {\n readonly prefix = '[RunMQ] - ';\n\n log(message: string): void {\n console.log(this.formatMessage(message));\n }\n\n error(message: string, ...optionalParams: any[]): void {\n console.error(this.formatMessage(message), ...optionalParams);\n }\n\n warn(message: string, ...optionalParams: any[]): void {\n console.warn(this.formatMessage(message), ...optionalParams);\n }\n\n info(message: string, ...optionalParams: any[]): void {\n console.info(this.formatMessage(message), ...optionalParams);\n }\n\n debug(message: string, ...optionalParams: any[]): void {\n console.debug(this.formatMessage(message), ...optionalParams);\n }\n\n verbose(message: string, ...optionalParams: any[]): void {\n console.debug(this.formatMessage(message), ...optionalParams);\n }\n\n private formatMessage(message: string): string {\n return `${this.prefix} ${message}`;\n }\n}","export class RabbitMQMessageProperties {\n constructor(\n readonly id: string,\n readonly correlationId: string,\n ) {\n }\n}","import {RunMQProcessorConfiguration, RunMQConnectionConfig, RunMQPublisher, RunMQMessageContent, AMQPChannel} from \"@src/types\";\nimport {RunMQException} from \"@src/core/exceptions/RunMQException\";\nimport {RabbitMQClientAdapter} from \"@src/core/clients/RabbitMQClientAdapter\";\nimport {Exceptions} from \"@src/core/exceptions/Exceptions\";\nimport {RunMQUtils} from \"@src/core/utils/RunMQUtils\";\nimport {Constants, DEFAULTS} from \"@src/core/constants\";\nimport {RunMQConsumerCreator} from \"@src/core/consumer/RunMQConsumerCreator\";\nimport {ConsumerConfiguration} from \"@src/core/consumer/ConsumerConfiguration\";\nimport {RunMQLogger} from \"@src/core/logging/RunMQLogger\";\nimport {RunMQConsoleLogger} from \"@src/core/logging/RunMQConsoleLogger\";\nimport {RunMQPublisherCreator} from \"@src/core/publisher/RunMQPublisherCreator\";\nimport {RabbitMQMessage} from \"@src/core/message/RabbitMQMessage\";\nimport {RabbitMQMessageProperties} from \"@src/core/message/RabbitMQMessageProperties\";\n\nexport class RunMQ {\n private readonly client: RabbitMQClientAdapter;\n private readonly config: RunMQConnectionConfig;\n private publisher: RunMQPublisher | undefined\n private readonly logger: RunMQLogger\n private retryAttempts: number = 0;\n private defaultChannel: AMQPChannel | undefined;\n\n private constructor(config: RunMQConnectionConfig, logger: RunMQLogger) {\n this.logger = logger;\n this.config = {\n ...config,\n reconnectDelay: config.reconnectDelay ?? DEFAULTS.RECONNECT_DELAY,\n maxReconnectAttempts: config.maxReconnectAttempts ?? DEFAULTS.MAX_RECONNECT_ATTEMPTS,\n };\n this.client = new RabbitMQClientAdapter(this.config);\n }\n\n /**\n * Starts the RunMQ instance by establishing a connection to RabbitMQ and initializing necessary components.\n * @param config The configuration for the RunMQ connection @see RunMQConnectionConfig\n * @param logger (Optional) A custom logger implementing the RunMQLogger interface; if not provided, a default console logger will be used\n * @returns A promise that resolves to the initialized RunMQ instance\n */\n public static async start(config: RunMQConnectionConfig, logger: RunMQLogger = new RunMQConsoleLogger): Promise<RunMQ> {\n const instance = new RunMQ(config, logger);\n await instance.connectWithRetry();\n await instance.initialize();\n return instance;\n }\n\n /**\n * Processes messages from the specified topic using the provided processor function and configuration.\n * @param topic The name of the topic to process messages from, it should match the name used during publishing\n * @param config The configuration for the message processor @see RunMQProcessorConfiguration\n * @param processor The function that will process the incoming messages\n */\n public async process<T = Record<string, never>>(topic: string, config: RunMQProcessorConfiguration, processor: (message: RunMQMessageContent<T>) => Promise<void>) {\n const consumer = new RunMQConsumerCreator(this.client, this.logger, this.config.management);\n await consumer.createConsumer<T>(new ConsumerConfiguration(topic, config, processor))\n }\n\n /**\n * Publishes a message to the specified topic with an optional correlation ID\n * @param topic The name of the topic to publish the message to\n * @param message The message payload to be published\n * @param correlationId (Optional) A unique identifier for correlating messages; if not provided, a new UUID will be generated\n */\n public publish(topic: string, message: Record<string, any>, correlationId: string = RunMQUtils.generateUUID()): void {\n if (!this.publisher || !this.defaultChannel) {\n throw new RunMQException(Exceptions.NOT_INITIALIZED, {});\n }\n RunMQUtils.assertRecord(message);\n this.publisher.publish(topic,\n RabbitMQMessage.from(\n message,\n this.defaultChannel,\n new RabbitMQMessageProperties(RunMQUtils.generateUUID(), correlationId)\n )\n );\n this.logger.info(`Published message`, {\n topic,\n correlationId,\n message,\n });\n }\n\n /**\n * Disconnects from RabbitMQ, handling any errors that may occur during the disconnection process.\n */\n public async disconnect(): Promise<void> {\n try {\n await this.client.disconnect();\n } catch (error) {\n throw new RunMQException(\n Exceptions.CONNECTION_NOT_ESTABLISHED,\n {\n error: error instanceof Error ? error.message : String(error)\n }\n );\n }\n }\n\n /**\n * Checks if the connection is currently active.\n */\n public isActive(): boolean {\n return this.client.isActive();\n }\n\n private async connectWithRetry(): Promise<void> {\n const maxAttempts = this.config.maxReconnectAttempts!;\n const delay = this.config.reconnectDelay!;\n\n while (this.retryAttempts < maxAttempts) {\n try {\n await this.client.connect();\n this.logger.log('Successfully connected to RabbitMQ');\n this.retryAttempts = 0;\n return;\n } catch (error) {\n this.retryAttempts++;\n console.log(this.logger);\n this.logger.error(`Connection attempt ${this.retryAttempts}/${maxAttempts} failed:`, error);\n\n if (this.retryAttempts >= maxAttempts) {\n throw new RunMQException(\n Exceptions.EXCEEDING_CONNECTION_ATTEMPTS,\n {\n attempts: maxAttempts,\n error: error instanceof Error ? error.message : String(error)\n }\n );\n }\n\n this.logger.error(`Retrying in ${delay}ms...`);\n await RunMQUtils.delay(delay);\n }\n }\n }\n\n private async initialize(): Promise<void> {\n this.defaultChannel = await this.client.getDefaultChannel();\n await this.defaultChannel.assertExchange(Constants.ROUTER_EXCHANGE_NAME, 'direct', {durable: true});\n await this.defaultChannel.assertExchange(Constants.DEAD_LETTER_ROUTER_EXCHANGE_NAME, 'direct', {durable: true});\n this.publisher = new RunMQPublisherCreator(this.logger).createPublisher();\n }\n}"],"mappings":"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","names":["_a","_a","Ajv","_a","_a"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/core/exceptions/RunMQException.ts","../src/core/clients/RabbitMQClientAdapter.ts","../src/core/exceptions/Exceptions.ts","../src/core/clients/RabbitMQClientChannel.ts","../src/core/logging/RunMQConsoleLogger.ts","../src/core/utils/RunMQUtils.ts","../src/core/constants/index.ts","../src/core/message/RabbitMQMessage.ts","../src/core/consumer/processors/RunMQSucceededMessageAcknowledgerProcessor.ts","../src/core/consumer/processors/RunMQFailedMessageRejecterProcessor.ts","../src/core/message/RunMQMessage.ts","../src/core/consumer/ConsumerCreatorUtils.ts","../src/core/consumer/processors/RunMQRetriesCheckerProcessor.ts","../src/core/consumer/processors/RunMQFailureLoggerProcessor.ts","../src/core/consumer/processors/RunMQBaseProcessor.ts","../src/core/consumer/processors/RunMQExceptionLoggerProcessor.ts","../src/core/serializers/deserializer/validation/AjvSchemaValidator.ts","../src/core/serializers/deserializer/validation/ValidatorFactory.ts","../src/core/serializers/deserializer/DefaultDeserializer.ts","../src/core/publisher/producers/RunMQFailureLoggerProducer.ts","../src/core/publisher/producers/RunMQBaseProducer.ts","../src/core/serializers/DefaultSerializer.ts","../src/core/publisher/RunMQPublisherCreator.ts","../src/core/management/RabbitMQManagementClient.ts","../src/core/management/Policies/RabbitMQMessageTTLPolicy.ts","../src/core/management/Policies/RunMQTTLPolicyManager.ts","../src/core/management/Policies/RunMQQueueMetadata.ts","../src/core/management/Policies/RabbitMQMetadata.ts","../src/core/management/Policies/RunMQMetadataManager.ts","../src/core/consumer/RunMQConsumerCreator.ts","../src/core/consumer/ConsumerConfiguration.ts","../src/core/message/RabbitMQMessageProperties.ts","../src/core/RunMQ.ts"],"sourcesContent":["export {RunMQ} from \"./core/RunMQ\";\nexport {\n RunMQConnectionConfig,\n SchemaFailureStrategy,\n SchemaType,\n RunMQProcessorConfiguration,\n MessageSchema,\n RunMQMessageContent,\n RunMQMessageMetaContent,\n RabbitMQManagementConfig,\n} from \"./types\";\n\nexport {RunMQLogger} from \"./core/logging/RunMQLogger\";\n\nexport {RunMQQueueMetadata} from \"./core/management/Policies/RunMQQueueMetadata\";\n","import {Exceptions} from \"@src/core/exceptions/Exceptions\";\n\nexport class RunMQException extends Error {\n constructor(public exception: Exceptions, public details: Record<string, string | number | Record<string, unknown>>) {\n super(`RunMQ Exception: ${exception}`);\n }\n}","import {Connection, Channel} from \"rabbitmq-client\";\nimport {RunMQException} from \"@src/core/exceptions/RunMQException\";\nimport {Exceptions} from \"@src/core/exceptions/Exceptions\";\nimport {AMQPChannel, AMQPClient, RunMQConnectionConfig} from \"@src/types\";\nimport {RabbitMQClientChannel} from \"@src/core/clients/RabbitMQClientChannel\";\nimport {RunMQLogger} from \"@src\";\nimport {RunMQConsoleLogger} from \"@src/core/logging/RunMQConsoleLogger\";\n\n/**\n * AMQPClient implementation using rabbitmq-client library.\n * Leverages built-in reconnection, retry, and robustness features.\n */\nexport class RabbitMQClientAdapter implements AMQPClient {\n private connection: Connection | undefined;\n private defaultChannel: AMQPChannel | undefined;\n private isConnected: boolean = false;\n private acquiredChannels: Channel[] = [];\n\n constructor(private config: RunMQConnectionConfig, private logger: RunMQLogger = new RunMQConsoleLogger()) {\n }\n\n public async connect(): Promise<Connection> {\n try {\n if (this.connection && this.isConnected) {\n return this.connection;\n }\n\n // Close any existing connection that might be in a bad state\n if (this.connection) {\n try {\n await this.connection.close();\n } catch {\n // Ignore close errors\n }\n this.connection = undefined;\n }\n\n this.connection = new Connection({\n url: this.config.url,\n // Disable automatic retries - we handle retries at RunMQ level\n retryLow: 100,\n retryHigh: 200,\n connectionTimeout: 5000,\n });\n\n // Set up event handlers before waiting for connection\n this.connection.on('error', (err) => {\n this.logger.error('RabbitMQ connection error:', {error: err});\n this.isConnected = false;\n });\n\n this.connection.on('connection', () => {\n this.isConnected = true;\n });\n\n this.connection.on('connection.blocked', (reason) => {\n this.logger.warn('RabbitMQ connection blocked:', {reason: reason});\n });\n\n this.connection.on('connection.unblocked', () => {\n this.logger.info('RabbitMQ connection unblocked');\n });\n\n // Wait for connection with timeout\n // The second parameter (true) disables auto-close on timeout\n await this.connection.onConnect(5000, true);\n this.isConnected = true;\n\n return this.connection;\n } catch (error) {\n this.isConnected = false;\n // Clean up the connection on failure\n if (this.connection) {\n try {\n this.connection.close();\n } catch {\n // Ignore\n }\n this.connection = undefined;\n }\n throw new RunMQException(\n Exceptions.CONNECTION_NOT_ESTABLISHED,\n {\n error: error instanceof Error ? error.message : JSON.stringify(error)\n }\n );\n }\n }\n\n public async getChannel(): Promise<AMQPChannel> {\n const connection = await this.connect();\n const rawChannel = await connection.acquire();\n // Track the channel so we can close it on disconnect\n this.acquiredChannels.push(rawChannel);\n return new RabbitMQClientChannel(rawChannel);\n }\n\n public async getDefaultChannel(): Promise<AMQPChannel> {\n if (!this.defaultChannel) {\n this.defaultChannel = await this.getChannel();\n }\n return this.defaultChannel;\n }\n\n public async disconnect(): Promise<void> {\n // Reset state first\n const conn = this.connection;\n const channels = this.acquiredChannels;\n\n this.connection = undefined;\n this.defaultChannel = undefined;\n this.isConnected = false;\n this.acquiredChannels = [];\n\n // Close all acquired channels first\n for (const channel of channels) {\n try {\n if (channel.active) {\n await channel.close();\n }\n } catch {\n // Ignore errors - channel might already be closed\n }\n }\n\n // Now close the connection\n if (conn) {\n try {\n await conn.close();\n } catch {\n // Ignore errors - connection might already be closed\n }\n }\n }\n\n public isActive(): boolean {\n return this.connection !== undefined && this.isConnected;\n }\n}\n\n","export class Exceptions {\n public static EXCEEDING_CONNECTION_ATTEMPTS = 'EXCEEDING_CONNECTION_ATTEMPTS';\n public static CONNECTION_NOT_ESTABLISHED = 'CONNECTION_NOT_ESTABLISHED';\n public static NOT_INITIALIZED = 'NOT_INITIALIZED';\n public static INVALID_MESSAGE_FORMAT = 'MESSAGE_SHOULD_BE_VALID_RECORD';\n public static UNSUPPORTED_SCHEMA = 'UNSUPPORTED_SCHEMA';\n public static FAILURE_TO_DEFINE_TTL_POLICY = 'FAILURE_TO_DEFINE_TTL_POLICY';\n}","import type {Channel, AsyncMessage} from \"rabbitmq-client\";\nimport {\n AMQPChannel,\n AMQPConsumeInfo,\n AMQPConsumeOptions,\n AMQPExchangeInfo,\n AMQPExchangeOptions,\n AMQPPublishOptions,\n AMQPQueueInfo,\n AMQPQueueOptions,\n ConsumeMessage\n} from \"@src/types\";\n\n/**\n * Wrapper around rabbitmq-client Channel that implements the AMQPChannel interface.\n * Provides a library-agnostic abstraction over channel operations.\n */\nexport class RabbitMQClientChannel implements AMQPChannel {\n constructor(private readonly channel: Channel) {}\n\n async assertQueue(queue: string, options?: AMQPQueueOptions): Promise<AMQPQueueInfo> {\n const args: Record<string, any> = {};\n if (options?.deadLetterExchange) args['x-dead-letter-exchange'] = options.deadLetterExchange;\n if (options?.deadLetterRoutingKey) args['x-dead-letter-routing-key'] = options.deadLetterRoutingKey;\n if (options?.messageTtl) args['x-message-ttl'] = options.messageTtl;\n if (options?.arguments) Object.assign(args, options.arguments);\n\n const result = await this.channel.queueDeclare({\n queue,\n durable: options?.durable,\n exclusive: options?.exclusive,\n autoDelete: options?.autoDelete,\n arguments: Object.keys(args).length > 0 ? args : undefined,\n });\n return {\n queue: result.queue,\n messageCount: result.messageCount,\n consumerCount: result.consumerCount,\n };\n }\n\n async checkQueue(queue: string): Promise<AMQPQueueInfo> {\n const result = await this.channel.queueDeclare({\n queue,\n passive: true,\n });\n return {\n queue: result.queue,\n messageCount: result.messageCount,\n consumerCount: result.consumerCount,\n };\n }\n\n async deleteQueue(queue: string, options?: { ifUnused?: boolean; ifEmpty?: boolean }): Promise<{ messageCount: number }> {\n const result = await this.channel.queueDelete({\n queue,\n ifUnused: options?.ifUnused,\n ifEmpty: options?.ifEmpty,\n });\n return {\n messageCount: result.messageCount,\n };\n }\n\n async assertExchange(exchange: string, type: string, options?: AMQPExchangeOptions): Promise<AMQPExchangeInfo> {\n const args: Record<string, any> = {};\n if (options?.alternateExchange) args['alternate-exchange'] = options.alternateExchange;\n if (options?.arguments) Object.assign(args, options.arguments);\n\n await this.channel.exchangeDeclare({\n exchange,\n type,\n durable: options?.durable,\n internal: options?.internal,\n autoDelete: options?.autoDelete,\n arguments: Object.keys(args).length > 0 ? args : undefined,\n });\n return {\n exchange,\n };\n }\n\n async checkExchange(exchange: string): Promise<AMQPExchangeInfo> {\n await this.channel.exchangeDeclare({\n exchange,\n passive: true,\n });\n return {\n exchange,\n };\n }\n\n async deleteExchange(exchange: string, options?: { ifUnused?: boolean }): Promise<void> {\n await this.channel.exchangeDelete({\n exchange,\n ifUnused: options?.ifUnused,\n });\n }\n\n async bindQueue(queue: string, source: string, pattern: string, args?: Record<string, any>): Promise<void> {\n await this.channel.queueBind({\n queue,\n exchange: source,\n routingKey: pattern,\n arguments: args,\n });\n }\n\n publish(exchange: string, routingKey: string, content: Buffer, options?: AMQPPublishOptions): boolean {\n this.channel.basicPublish({\n exchange,\n routingKey,\n correlationId: options?.correlationId,\n messageId: options?.messageId,\n headers: options?.headers,\n durable: options?.persistent,\n expiration: options?.expiration?.toString(),\n contentType: options?.contentType,\n contentEncoding: options?.contentEncoding,\n priority: options?.priority,\n replyTo: options?.replyTo,\n timestamp: options?.timestamp,\n type: options?.type,\n userId: options?.userId,\n appId: options?.appId,\n }, content);\n return true;\n }\n\n async consume(\n queue: string,\n onMessage: (msg: ConsumeMessage | null) => void,\n options?: AMQPConsumeOptions\n ): Promise<AMQPConsumeInfo> {\n const result = await this.channel.basicConsume({\n queue,\n consumerTag: options?.consumerTag,\n noLocal: options?.noLocal,\n noAck: options?.noAck,\n exclusive: options?.exclusive,\n arguments: options?.arguments,\n }, (msg: AsyncMessage) => {\n // Convert rabbitmq-client message format to our ConsumeMessage format\n const body = msg.body;\n const content = Buffer.isBuffer(body) ? body :\n typeof body === 'string' ? Buffer.from(body) :\n Buffer.from(JSON.stringify(body));\n\n const consumeMessage: ConsumeMessage = {\n content,\n fields: {\n consumerTag: msg.consumerTag,\n deliveryTag: msg.deliveryTag,\n redelivered: msg.redelivered,\n exchange: msg.exchange,\n routingKey: msg.routingKey,\n },\n properties: {\n contentType: msg.contentType,\n contentEncoding: msg.contentEncoding,\n headers: msg.headers || {},\n deliveryMode: msg.durable ? 2 : 1,\n priority: msg.priority,\n correlationId: msg.correlationId,\n replyTo: msg.replyTo,\n expiration: msg.expiration,\n messageId: msg.messageId,\n timestamp: msg.timestamp,\n type: msg.type,\n userId: msg.userId,\n appId: msg.appId,\n },\n };\n onMessage(consumeMessage);\n });\n return {\n consumerTag: result.consumerTag,\n };\n }\n\n ack(message: ConsumeMessage, allUpTo?: boolean): void {\n this.channel.basicAck({\n deliveryTag: message.fields.deliveryTag,\n multiple: allUpTo,\n });\n }\n\n nack(message: ConsumeMessage, allUpTo?: boolean, requeue?: boolean): void {\n this.channel.basicNack({\n deliveryTag: message.fields.deliveryTag,\n multiple: allUpTo,\n requeue,\n });\n }\n\n async prefetch(count: number, global?: boolean): Promise<void> {\n await this.channel.basicQos({\n prefetchCount: count,\n global,\n });\n }\n\n async close(): Promise<void> {\n await this.channel.close();\n }\n}\n\n","import {RunMQLogger} from \"@src/core/logging/RunMQLogger\";\n\nexport class RunMQConsoleLogger implements RunMQLogger {\n readonly prefix = '[RunMQ] - ';\n\n log(message: string): void {\n console.log(this.formatMessage(message));\n }\n\n error(message: string, ...optionalParams: any[]): void {\n console.error(this.formatMessage(message), ...optionalParams);\n }\n\n warn(message: string, ...optionalParams: any[]): void {\n console.warn(this.formatMessage(message), ...optionalParams);\n }\n\n info(message: string, ...optionalParams: any[]): void {\n console.info(this.formatMessage(message), ...optionalParams);\n }\n\n debug(message: string, ...optionalParams: any[]): void {\n console.debug(this.formatMessage(message), ...optionalParams);\n }\n\n verbose(message: string, ...optionalParams: any[]): void {\n console.debug(this.formatMessage(message), ...optionalParams);\n }\n\n private formatMessage(message: string): string {\n return `${this.prefix} ${message}`;\n }\n}","import {randomUUID} from 'crypto';\nimport {RunMQException} from \"@src/core/exceptions/RunMQException\";\nimport {Exceptions} from \"@src/core/exceptions/Exceptions\";\n\nexport class RunMQUtils {\n public static delay(ms: number): Promise<void> {\n return new Promise(resolve => setTimeout(resolve, ms));\n }\n\n public static generateUUID(): string {\n return randomUUID();\n }\n\n public static assertRecord(message: unknown): asserts message is Record<string, any> {\n if (typeof message !== 'object' || message === null || Array.isArray(message)) {\n throw new RunMQException(Exceptions.INVALID_MESSAGE_FORMAT, {});\n }\n }\n\n public static escapeRegExp(string: string): string {\n return string.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n }\n}","const RUNMQ_PREFIX = \"_runmq_\"\nexport const Constants = {\n ROUTER_EXCHANGE_NAME: RUNMQ_PREFIX + \"router\",\n DEAD_LETTER_ROUTER_EXCHANGE_NAME: RUNMQ_PREFIX + \"dead_letter_router\",\n RETRY_DELAY_QUEUE_PREFIX: RUNMQ_PREFIX + \"retry_delay_\",\n DLQ_QUEUE_PREFIX: RUNMQ_PREFIX + \"dlq_\",\n MESSAGE_TTL_OPERATOR_POLICY_PREFIX: RUNMQ_PREFIX + \"message_ttl_operator_policy\",\n METADATA_STORE_PREFIX: RUNMQ_PREFIX + \"metadata_\",\n}\n\nexport const DEFAULTS = {\n RECONNECT_DELAY: 5000,\n MAX_RECONNECT_ATTEMPTS: 5,\n PREFETCH_COUNT: 1,\n PROCESSING_ATTEMPTS: 1,\n PROCESSING_RETRY_DELAY: 1000,\n}","import {RunMQUtils} from \"@src/core/utils/RunMQUtils\";\nimport {RabbitMQMessageProperties} from \"@src/core/message/RabbitMQMessageProperties\";\nimport {AMQPMessage} from \"@src/core/message/AmqpMessage\";\nimport {AMQPChannel} from \"@src/types\";\n\nexport class RabbitMQMessage {\n constructor(\n readonly message: any,\n readonly id: string = RunMQUtils.generateUUID(),\n readonly correlationId: string = RunMQUtils.generateUUID(),\n readonly channel: AMQPChannel,\n readonly amqpMessage: AMQPMessage = null,\n readonly headers: Record<string, any> = {}) {\n }\n\n /**\n * Acknowledges the message.\n */\n ack(): void {\n if (this.amqpMessage) {\n this.channel.ack(this.amqpMessage);\n }\n }\n\n /**\n * Negatively acknowledges the message.\n * @param requeue - Whether to requeue the message (default: false)\n */\n nack(requeue: boolean = false): void {\n if (this.amqpMessage) {\n this.channel.nack(this.amqpMessage, false, requeue);\n }\n }\n\n static from(\n messageData: Record<string, any>,\n channel: AMQPChannel,\n props: RabbitMQMessageProperties,\n amqpMessage: AMQPMessage = null\n ): RabbitMQMessage {\n return new RabbitMQMessage(\n messageData,\n props.id,\n props.correlationId,\n channel,\n amqpMessage,\n {}\n );\n }\n}","import {RunMQConsumer} from \"@src/types\";\nimport {RabbitMQMessage} from \"@src/core/message/RabbitMQMessage\";\n\nexport class RunMQSucceededMessageAcknowledgerProcessor implements RunMQConsumer {\n constructor(private consumer: RunMQConsumer) {\n }\n\n public async consume(message: RabbitMQMessage) {\n const result = await this.consumer.consume(message);\n if (result) {\n message.ack();\n }\n return result;\n }\n}","import {RunMQConsumer} from \"@src/types\";\nimport {RabbitMQMessage} from \"@src/core/message/RabbitMQMessage\";\n\nexport class RunMQFailedMessageRejecterProcessor implements RunMQConsumer {\n constructor(private consumer: RunMQConsumer) {\n }\n\n public async consume(message: RabbitMQMessage): Promise<boolean> {\n try {\n return await this.consumer.consume(message);\n } catch {\n message.nack(false);\n return false;\n }\n }\n}","import {RunMQMessageContent, RunMQMessageMetaContent} from \"@src/types\";\n\nexport class RunMQMessage<T = any> implements RunMQMessageContent<T> {\n public static isValid(obj: any) {\n if (typeof obj === \"object\" && obj !== null) {\n return 'message' in obj && 'meta' in obj &&\n typeof obj.message === 'object' && obj.message !== null &&\n Array.isArray(obj.message) === false &&\n typeof obj.meta === 'object' && obj.meta !== null &&\n 'id' in obj.meta &&\n 'correlationId' in obj.meta &&\n 'publishedAt' in obj.meta &&\n typeof obj.meta.id === 'string' &&\n typeof obj.meta.correlationId === 'string' &&\n typeof obj.meta.publishedAt === 'number';\n }\n return false;\n }\n\n\n readonly message: T;\n\n readonly meta: RunMQMessageMeta;\n\n constructor(message: T, meta: RunMQMessageMeta) {\n this.message = message;\n this.meta = meta;\n }\n}\n\nexport class RunMQMessageMeta implements RunMQMessageMetaContent {\n readonly id: string;\n readonly publishedAt: number;\n readonly correlationId: string;\n\n constructor(id: string, publishedAt: number, correlationId: string) {\n this.id = id;\n this.correlationId = correlationId;\n this.publishedAt = publishedAt;\n }\n}","import {Constants} from \"@src/core/constants\";\n\nexport class ConsumerCreatorUtils {\n static getDLQTopicName(topic: string): string {\n return Constants.DLQ_QUEUE_PREFIX + topic;\n }\n static getRetryDelayTopicName(topic: string): string {\n return Constants.RETRY_DELAY_QUEUE_PREFIX + topic;\n }\n\n static getMessageTTLPolicyName(topic: string): string {\n return Constants.MESSAGE_TTL_OPERATOR_POLICY_PREFIX + topic;\n }\n}","import {RunMQConsumer, RunMQProcessorConfiguration, RunMQPublisher} from \"@src/types\";\nimport {RabbitMQMessage} from \"@src/core/message/RabbitMQMessage\";\nimport {RunMQMessage} from \"@src/core/message/RunMQMessage\";\nimport {RunMQLogger} from \"@src/core/logging/RunMQLogger\";\nimport {ConsumerCreatorUtils} from \"@src/core/consumer/ConsumerCreatorUtils\";\nimport {DEFAULTS} from \"@src/core/constants\";\n\nexport class RunMQRetriesCheckerProcessor implements RunMQConsumer {\n private readonly maxAttempts: number = this.config.attempts ?? DEFAULTS.PROCESSING_ATTEMPTS;\n\n constructor(\n private readonly consumer: RunMQConsumer,\n private readonly config: RunMQProcessorConfiguration,\n private readonly DLQPublisher: RunMQPublisher,\n private readonly logger: RunMQLogger,\n ) {\n }\n\n public async consume(message: RabbitMQMessage): Promise<boolean> {\n try {\n return await this.consumer.consume(message);\n } catch (e: unknown) {\n if (this.hasReachedMaxRetries(message)) {\n this.logMaxRetriesReached(message);\n this.moveToFinalDeadLetter(message);\n this.acknowledgeMessage(message);\n return false;\n }\n throw e;\n }\n }\n\n private hasReachedMaxRetries(message: RabbitMQMessage): boolean {\n const rejectedCount = this.getRejectionCount(message);\n return rejectedCount >= this.maxAttempts;\n }\n\n private logMaxRetriesReached(message: RabbitMQMessage) {\n this.logger.error(\n `Message reached maximum attempts. Moving to dead-letter queue.`, {\n message: message.message,\n attempts: this.getRejectionCount(message),\n max: this.maxAttempts,\n }\n );\n }\n\n private moveToFinalDeadLetter(message: RabbitMQMessage) {\n const originalPayload = this.extractOriginalPayload(message);\n const dlqMessage = new RabbitMQMessage(\n originalPayload,\n message.id,\n message.correlationId,\n message.channel,\n message.amqpMessage,\n message.headers\n );\n this.DLQPublisher.publish(ConsumerCreatorUtils.getDLQTopicName(this.config.name), dlqMessage)\n }\n\n private extractOriginalPayload(message: RabbitMQMessage): any {\n if (typeof message.message === 'string') {\n try {\n const parsed = JSON.parse(message.message);\n if (RunMQMessage.isValid(parsed)) {\n return parsed.message;\n }\n } catch {\n // Not valid JSON, use as-is\n }\n }\n return message.message;\n }\n\n private acknowledgeMessage(message: RabbitMQMessage) {\n try {\n message.ack();\n } catch (e) {\n const error = new Error(\"A message acknowledge failed after publishing to final dead letter\");\n this.logger.error(error.message, {cause: e instanceof Error ? e.message : String(e)});\n throw error;\n }\n }\n\n private getRejectionCount(message: RabbitMQMessage): number {\n const xDeath = message.headers?.[\"x-death\"];\n if (!Array.isArray(xDeath)) return 1;\n const deathRecord = xDeath.filter(entry => entry && entry.reason == 'rejected')[0];\n return deathRecord ? deathRecord.count + 1 : 1;\n }\n}","import {RunMQConsumer} from \"@src/types\";\nimport {RabbitMQMessage} from \"@src/core/message/RabbitMQMessage\";\nimport {RunMQLogger} from \"@src/core/logging/RunMQLogger\";\n\nexport class RunMQFailureLoggerProcessor implements RunMQConsumer {\n constructor(private consumer: RunMQConsumer, private logger: RunMQLogger) {\n }\n\n public async consume(message: RabbitMQMessage) {\n try {\n return await this.consumer.consume(message);\n } catch (e) {\n this.logger.error('Message processing failed', {\n message: message.message,\n },\n e instanceof Error ? e.stack : undefined);\n throw e;\n }\n }\n}","import {RunMQConsumer, RunMQProcessorConfiguration} from \"@src/types\";\nimport {RunMQMessage} from \"@src/core/message/RunMQMessage\";\nimport {RabbitMQMessage} from \"@src/core/message/RabbitMQMessage\";\nimport {DefaultDeserializer} from \"@src/core/serializers/deserializer/DefaultDeserializer\";\n\nexport class RunMQBaseProcessor<T> implements RunMQConsumer {\n constructor(private handler: (message: RunMQMessage<T>) => Promise<void>,\n private processorConfig: RunMQProcessorConfiguration,\n private serializer: DefaultDeserializer<T>\n ) {\n }\n\n public async consume(message: RabbitMQMessage): Promise<boolean> {\n const rabbitMQMessage = this.serializer.deserialize(message.message, this.processorConfig);\n await this.handler(rabbitMQMessage as RunMQMessage<T>);\n return true;\n }\n}","import {RunMQConsumer} from \"@src/types\";\nimport {RabbitMQMessage} from \"@src/core/message/RabbitMQMessage\";\nimport {RunMQLogger} from \"@src/core/logging/RunMQLogger\";\n\nexport class RunMQExceptionLoggerProcessor implements RunMQConsumer {\n constructor(private consumer: RunMQConsumer, private logger: RunMQLogger) {}\n\n public async consume(message: RabbitMQMessage) {\n try {\n return await this.consumer.consume(message);\n } catch (e: unknown) {\n if (e instanceof Error) {\n this.logger.error(e.message, e.stack);\n throw e;\n } else {\n const errorString = JSON.stringify(e);\n this.logger.error(errorString);\n throw new Error(errorString);\n }\n }\n }\n}","import Ajv, {JSONSchemaType, ValidateFunction} from \"ajv\";\nimport {SchemaValidator} from \"@src/core/serializers/deserializer/validation/SchemaValidator\";\n\nexport class AjvSchemaValidator<T> implements SchemaValidator<JSONSchemaType<T>> {\n private readonly ajv: Ajv;\n private lastValidator: ValidateFunction<T> | null = null;\n\n constructor() {\n this.ajv = new Ajv({\n allErrors: true,\n verbose: true,\n strict: true\n });\n }\n\n validate(schema: JSONSchemaType<T>, data: unknown): boolean {\n this.lastValidator = this.ajv.compile<T>(schema);\n return this.lastValidator(data);\n }\n\n getError(): string | null {\n if (!this.lastValidator || !this.lastValidator.errors) {\n return null;\n }\n return JSON.stringify(this.lastValidator.errors);\n }\n}","import {SchemaType} from \"@src/types\";\nimport {SchemaValidator} from \"@src/core/serializers/deserializer/validation/SchemaValidator\";\nimport {AjvSchemaValidator} from \"@src/core/serializers/deserializer/validation/AjvSchemaValidator\";\nimport {RunMQException} from \"@src/core/exceptions/RunMQException\";\nimport {Exceptions} from \"@src/core/exceptions/Exceptions\";\n\nconst validatorCache: Map<SchemaType, SchemaValidator<any>> = new Map();\n\nexport function getValidator<T>(schemaType: SchemaType): SchemaValidator<any> {\n const cached = validatorCache.get(schemaType);\n if (cached) {\n return cached;\n }\n\n let validator: SchemaValidator<any>;\n\n switch (schemaType) {\n case 'ajv':\n validator = new AjvSchemaValidator<T>();\n break;\n default:\n throw new RunMQException(Exceptions.UNSUPPORTED_SCHEMA, {schemaType});\n }\n\n validatorCache.set(schemaType, validator);\n return validator;\n}","import {Deserializer} from \"@src/core/serializers/deserializer/Deserializer\";\nimport {RunMQMessage, RunMQMessageMeta} from \"@src/core/message/RunMQMessage\";\nimport {RunMQProcessorConfiguration} from \"@src/types\";\nimport {getValidator} from \"@src/core/serializers/deserializer/validation/ValidatorFactory\";\n\nexport class DeserializationError extends Error {\n constructor(message: string, public readonly cause?: unknown) {\n super(message);\n this.name = 'DeserializationError';\n }\n}\n\nexport class RunMQSchemaValidationError extends Error {\n constructor(message: string, public readonly error?: string) {\n super(message);\n this.name = 'ValidationError';\n }\n}\n\nexport class DefaultDeserializer<T> implements Deserializer<RunMQMessage<T>> {\n deserialize(data: string, processorConfig: RunMQProcessorConfiguration): RunMQMessage<T> {\n if (!data) {\n throw new DeserializationError('Input must be a non-empty string');\n }\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(data);\n } catch (error) {\n throw new DeserializationError(\n `Failed to parse JSON: ${error instanceof Error ? error.message : 'Unknown error'}`,\n error\n );\n }\n\n if (!RunMQMessage.isValid(parsed)) {\n throw new RunMQSchemaValidationError(\n 'Invalid message format: not valid RunMQMessage structure'\n );\n }\n\n const typedParsed = parsed as {\n message: unknown;\n meta: { id: string; correlationId: string, publishedAt: number }\n };\n\n if (processorConfig.messageSchema) {\n const {type, schema} = processorConfig.messageSchema;\n const validator = getValidator<T>(type);\n\n if (!validator.validate(schema, typedParsed.message)) {\n throw new RunMQSchemaValidationError(\n 'Message validation failed against schema',\n validator.getError() || undefined\n );\n }\n }\n\n const message = typedParsed.message as T;\n\n return new RunMQMessage<T>(\n message,\n new RunMQMessageMeta(\n typedParsed.meta.id,\n typedParsed.meta.publishedAt,\n typedParsed.meta.correlationId\n )\n );\n }\n}","import {RunMQPublisher} from \"@src/types\";\nimport {RunMQLogger} from \"@src/core/logging/RunMQLogger\";\nimport {RabbitMQMessage} from \"@src/core/message/RabbitMQMessage\";\n\nexport class RunMQFailureLoggerProducer implements RunMQPublisher {\n constructor(private producer: RunMQPublisher, private logger: RunMQLogger) {\n }\n\n publish(topic: string, message: RabbitMQMessage): void {\n try {\n this.producer.publish(topic, message);\n } catch (e) {\n this.logger.error('Message publishing failed', {\n message: message,\n error: e instanceof Error ? e.message : JSON.stringify(e),\n stack: e instanceof Error ? e.stack : undefined,\n });\n throw e;\n }\n }\n}","import {RunMQPublisher} from \"@src/types\";\nimport {Constants} from \"@src/core/constants\";\nimport {RabbitMQMessage} from \"@src/core/message/RabbitMQMessage\";\nimport {RunMQMessage, RunMQMessageMeta} from \"@src/core/message/RunMQMessage\";\nimport {Serializer} from \"@src/core/serializers/Serializer\";\n\nexport class RunMQBaseProducer implements RunMQPublisher {\n constructor(private serializer: Serializer, private exchange = Constants.ROUTER_EXCHANGE_NAME) {\n }\n\n publish(topic: string, message: RabbitMQMessage): void {\n const runMQMessage = new RunMQMessage(\n message.message,\n new RunMQMessageMeta(\n message.id,\n Date.now(),\n message.correlationId,\n ));\n const serialized = this.serializer.serialize(runMQMessage);\n message.channel.publish(this.exchange, topic, Buffer.from(serialized), {\n correlationId: message.correlationId,\n messageId: message.id,\n headers: message.headers,\n });\n }\n}","import {Serializer} from \"@src/core/serializers/Serializer\";\nimport {RunMQMessage} from \"@src/core/message/RunMQMessage\";\n\nexport class SerializationError extends Error {\n constructor(message: string, public readonly cause?: unknown) {\n super(message);\n this.name = 'SerializationError';\n }\n}\n\nexport class DefaultSerializer implements Serializer {\n serialize(data: RunMQMessage) {\n try {\n return JSON.stringify(data);\n } catch (error) {\n throw new SerializationError(\n `Failed to serialize message: ${error instanceof Error ? error.message : 'Unknown error'}`,\n error\n );\n }\n }\n}","import {RunMQLogger} from \"@src/core/logging/RunMQLogger\";\nimport {RunMQPublisher} from \"@src/types\";\nimport {RunMQFailureLoggerProducer} from \"@src/core/publisher/producers/RunMQFailureLoggerProducer\";\nimport {RunMQBaseProducer} from \"@src/core/publisher/producers/RunMQBaseProducer\";\nimport {DefaultSerializer} from \"@src/core/serializers/DefaultSerializer\";\nimport {Constants} from \"@src/core/constants\";\n\nexport class RunMQPublisherCreator {\n constructor(\n private logger: RunMQLogger) {\n }\n\n public createPublisher(exchange = Constants.ROUTER_EXCHANGE_NAME): RunMQPublisher {\n return new RunMQFailureLoggerProducer(\n new RunMQBaseProducer(new DefaultSerializer(), exchange),\n this.logger\n );\n }\n}","import {RunMQLogger} from \"@src/core/logging/RunMQLogger\";\nimport {RabbitMQManagementConfig} from \"@src\";\nimport {RabbitMQOperatorPolicy} from \"@src/types\";\n\nexport class RabbitMQManagementClient {\n constructor(\n private config: RabbitMQManagementConfig,\n private logger: RunMQLogger\n ) {}\n\n private getAuthHeader(): string {\n const credentials = Buffer.from(`${this.config.username}:${this.config.password}`).toString('base64');\n return `Basic ${credentials}`;\n }\n\n public async createOrUpdateOperatorPolicy(vhost: string, policy: RabbitMQOperatorPolicy): Promise<boolean> {\n try {\n const url = `${this.config.url}/api/operator-policies/${vhost}/${encodeURIComponent(policy.name)}`;\n\n const response = await fetch(url, {\n method: 'PUT',\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': this.getAuthHeader()\n },\n body: JSON.stringify({\n pattern: policy.pattern,\n definition: policy.definition,\n priority: policy.priority || 0,\n \"apply-to\": policy[\"apply-to\"]\n })\n });\n\n if (!response.ok) {\n const error = await response.text();\n this.logger.error(`Failed to create operator policy: ${response.status} - ${error}`);\n return false;\n }\n\n this.logger.info(`Successfully set operator policy: ${policy.name}`);\n return true;\n } catch (error) {\n this.logger.error(`Error creating operator policy: ${error}`);\n return false;\n }\n }\n\n public async getOperatorPolicy(vhost: string, policyName: string): Promise<RabbitMQOperatorPolicy | null> {\n try {\n const url = `${this.config.url}/api/operator-policies/${vhost}/${encodeURIComponent(policyName)}`;\n\n const response = await fetch(url, {\n method: 'GET',\n headers: {\n 'Authorization': this.getAuthHeader()\n }\n });\n\n if (!response.ok) {\n if (response.status === 404) {\n return null;\n }\n const error = await response.text();\n this.logger.error(`Failed to get operator policy: ${response.status} - ${error}`);\n return null;\n }\n\n return await response.json();\n } catch (error) {\n this.logger.error(`Error getting operator policy: ${error}`);\n return null;\n }\n }\n\n public async deleteOperatorPolicy(vhost: string, policyName: string): Promise<boolean> {\n try {\n const url = `${this.config.url}/api/operator-policies/${vhost}/${encodeURIComponent(policyName)}`;\n\n const response = await fetch(url, {\n method: 'DELETE',\n headers: {\n 'Authorization': this.getAuthHeader()\n }\n });\n\n if (!response.ok && response.status !== 404) {\n const error = await response.text();\n this.logger.error(`Failed to delete operator policy: ${response.status} - ${error}`);\n return false;\n }\n\n this.logger.info(`Successfully deleted operator policy: ${policyName}`);\n return true;\n } catch (error) {\n this.logger.error(`Error deleting operator policy: ${error}`);\n return false;\n }\n }\n\n public async checkManagementPluginEnabled(): Promise<boolean> {\n try {\n const url = `${this.config.url}/api/overview`;\n\n const response = await fetch(url, {\n method: 'GET',\n headers: {\n 'Authorization': this.getAuthHeader()\n }\n });\n\n return response.ok;\n } catch (error) {\n this.logger.warn(`Management plugin not accessible: ${error}`);\n return false;\n }\n }\n\n /**\n * Creates or updates a RabbitMQ parameter.\n * Parameters are custom key-value stores that can hold any JSON data.\n *\n * @param name - The parameter name\n * @param value - The parameter value (any JSON-serializable object)\n */\n public async setParameter<T>(\n name: string,\n value: T\n ): Promise<boolean> {\n try {\n const url = `${this.config.url}/api/global-parameters/${encodeURIComponent(name)}`;\n\n const response = await fetch(url, {\n method: 'PUT',\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': this.getAuthHeader()\n },\n body: JSON.stringify({value})\n });\n\n if (!response.ok) {\n const error = await response.text();\n this.logger.error(`Failed to set parameter ${name}: ${response.status} - ${error}`);\n return false;\n }\n\n this.logger.info(`Successfully set parameter: ${name}`);\n return true;\n } catch (error) {\n this.logger.error(`Error setting parameter: ${error}`);\n return false;\n }\n }\n\n /**\n * Gets a RabbitMQ parameter.\n *\n * @param name - The parameter name\n */\n public async getParameter<T>(\n name: string\n ): Promise<T | null> {\n try {\n const url = `${this.config.url}/api/global-parameters/${encodeURIComponent(name)}`;\n\n const response = await fetch(url, {\n method: 'GET',\n headers: {\n 'Authorization': this.getAuthHeader()\n }\n });\n\n if (!response.ok) {\n if (response.status === 404) {\n return null;\n }\n const error = await response.text();\n this.logger.error(`Failed to get parameter ${name}: ${response.status} - ${error}`);\n return null;\n }\n\n const data = await response.json();\n return data.value as T;\n } catch (error) {\n this.logger.error(`Error getting parameter: ${error}`);\n return null;\n }\n }\n\n /**\n * Deletes a RabbitMQ parameter.\n *\n * @param name - The parameter name\n */\n public async deleteParameter(\n name: string\n ): Promise<boolean> {\n try {\n const url = `${this.config.url}/api/global-parameters/${encodeURIComponent(name)}`;\n\n const response = await fetch(url, {\n method: 'DELETE',\n headers: {\n 'Authorization': this.getAuthHeader()\n }\n });\n\n if (!response.ok && response.status !== 404) {\n const error = await response.text();\n this.logger.error(`Failed to delete parameter ${name}: ${response.status} - ${error}`);\n return false;\n }\n\n this.logger.info(`Successfully deleted parameter: ${name}`);\n return true;\n } catch (error) {\n this.logger.error(`Error deleting parameter: ${error}`);\n return false;\n }\n }\n}","import {RabbitMQOperatorPolicy} from \"@src/types\";\nimport {RunMQUtils} from \"@src/core/utils/RunMQUtils\";\nimport {ConsumerCreatorUtils} from \"@src/core/consumer/ConsumerCreatorUtils\";\n\nexport class RabbitMQMessageTTLPolicy {\n static createFor(queueName: string, ttl: number): RabbitMQOperatorPolicy {\n return {\n name: ConsumerCreatorUtils.getMessageTTLPolicyName(queueName),\n pattern: RunMQUtils.escapeRegExp(queueName),\n definition: {\n \"message-ttl\": ttl\n },\n \"apply-to\": \"queues\",\n priority: 1000\n }\n }\n}","import {RabbitMQManagementClient} from \"@src/core/management/RabbitMQManagementClient\";\nimport {RunMQLogger} from \"@src/core/logging/RunMQLogger\";\nimport {DEFAULTS} from \"@src/core/constants\";\nimport {RabbitMQManagementConfig} from \"@src\";\nimport {RabbitMQMessageTTLPolicy} from \"@src/core/management/Policies/RabbitMQMessageTTLPolicy\";\n\nexport class RunMQTTLPolicyManager {\n private readonly managementClient: RabbitMQManagementClient | null = null;\n private isManagementPluginEnabled = false;\n\n constructor(\n private logger: RunMQLogger,\n private managementConfig?: RabbitMQManagementConfig\n ) {\n if (this.managementConfig) {\n this.managementClient = new RabbitMQManagementClient(this.managementConfig, this.logger);\n }\n }\n\n public async initialize(): Promise<void> {\n if (this.isManagementPluginEnabled) {\n return;\n }\n if (!this.managementClient) {\n this.logger.warn(\"Management client not configured\");\n return;\n }\n\n this.isManagementPluginEnabled = await this.managementClient.checkManagementPluginEnabled();\n\n if (!this.isManagementPluginEnabled) {\n this.logger.warn(\"RabbitMQ management plugin is not enabled\");\n } else {\n this.logger.info(\"RabbitMQ management plugin is enabled\");\n }\n }\n\n public async apply(\n queueName: string,\n ttl?: number,\n vhost: string = \"%2F\"\n ): Promise<boolean> {\n const actualTTL = ttl ?? DEFAULTS.PROCESSING_RETRY_DELAY;\n\n if (this.isManagementPluginEnabled && this.managementClient) {\n const success = await this.managementClient.createOrUpdateOperatorPolicy(\n vhost,\n RabbitMQMessageTTLPolicy.createFor(queueName, actualTTL)\n );\n\n if (success) {\n return true\n }\n }\n return false;\n }\n\n\n public async cleanup(queueName: string, vhost: string = \"%2F\"): Promise<void> {\n if (this.isManagementPluginEnabled && this.managementClient) {\n const policyName = `ttl-policy-${queueName}`;\n await this.managementClient.deleteOperatorPolicy(vhost, policyName);\n }\n }\n}","/**\n * Metadata stored for each RunMQ-managed queue.\n * This metadata is stored as a RabbitMQ operator policy with lowest priority.\n */\nexport interface RunMQQueueMetadata {\n /**\n * Schema version of the metadata object.\n * Used for future migrations if metadata structure changes.\n */\n version: number;\n\n /**\n * Maximum number of retry attempts before message goes to DLQ.\n */\n maxRetries: number;\n\n /**\n * ISO 8601 timestamp when the metadata was first created.\n */\n createdAt: string;\n\n /**\n * ISO 8601 timestamp when the metadata was last updated.\n * Only present if metadata has been updated after creation.\n */\n updatedAt?: string;\n}\n\n/**\n * Current version of the metadata schema.\n * Increment this when making breaking changes to RunMQQueueMetadata.\n */\nexport const METADATA_SCHEMA_VERSION = 0;\n\n","import {Constants} from \"@src/core/constants\";\nimport {METADATA_SCHEMA_VERSION, RunMQQueueMetadata} from \"@src/core/management/Policies/RunMQQueueMetadata\";\n\n/**\n * Creates metadata objects for storing queue configuration.\n * Uses RabbitMQ parameters API for storage, which allows custom JSON data.\n */\nexport class RabbitMQMetadata {\n /**\n * Creates metadata for a queue.\n * @param maxRetries - Maximum retry attempts configured for the queue\n * @param existingMetadata - Optional existing metadata to preserve createdAt\n * @returns RunMQQueueMetadata object\n */\n static createMetadataFor(\n maxRetries: number,\n existingMetadata?: RunMQQueueMetadata\n ): RunMQQueueMetadata {\n const now = new Date().toISOString();\n\n return {\n version: METADATA_SCHEMA_VERSION,\n maxRetries,\n createdAt: existingMetadata?.createdAt ?? now,\n ...(existingMetadata ? { updatedAt: now } : {})\n };\n }\n\n /**\n * Gets the parameter name for a given queue.\n */\n static getParameterName(queueName: string): string {\n return Constants.METADATA_STORE_PREFIX + queueName;\n }\n}\n\n","import {RabbitMQManagementClient} from \"@src/core/management/RabbitMQManagementClient\";\nimport {RunMQLogger} from \"@src/core/logging/RunMQLogger\";\nimport {RabbitMQManagementConfig} from \"@src\";\nimport {RabbitMQMetadata} from \"@src/core/management/Policies/RabbitMQMetadata\";\nimport {RunMQQueueMetadata} from \"@src/core/management/Policies/RunMQQueueMetadata\";\n\n/**\n * Manages metadata for RunMQ queues.\n * Stores queue configuration metadata using RabbitMQ parameters API.\n */\nexport class RunMQMetadataManager {\n private readonly managementClient: RabbitMQManagementClient | null = null;\n private isManagementPluginEnabled = false;\n\n constructor(\n private logger: RunMQLogger,\n private managementConfig?: RabbitMQManagementConfig\n ) {\n if (this.managementConfig) {\n this.managementClient = new RabbitMQManagementClient(this.managementConfig, this.logger);\n }\n }\n\n /**\n * Initialize the manager by checking if management plugin is available.\n */\n public async initialize(): Promise<void> {\n if (this.isManagementPluginEnabled) {\n return;\n }\n if (!this.managementClient) {\n this.logger.warn(\"Management client not configured - metadata storage disabled\");\n return;\n }\n\n this.isManagementPluginEnabled = await this.managementClient.checkManagementPluginEnabled();\n\n if (!this.isManagementPluginEnabled) {\n this.logger.warn(\"RabbitMQ management plugin is not enabled - metadata storage disabled\");\n } else {\n this.logger.info(\"RunMQ metadata storage initialized\");\n }\n }\n\n /**\n * Store or update metadata for a queue.\n * If metadata already exists, preserves createdAt and sets updatedAt.\n *\n * @param queueName - The name of the queue\n * @param maxRetries - Maximum retry attempts\n * @returns true if metadata was stored successfully, false otherwise\n */\n public async apply(\n queueName: string,\n maxRetries: number,\n ): Promise<boolean> {\n if (!this.isManagementPluginEnabled || !this.managementClient) {\n this.logger.warn(`Cannot store metadata for queue '${queueName}' - management plugin not available`);\n return false;\n }\n\n try {\n const existingMetadata = await this.getMetadata(queueName);\n const metadata = RabbitMQMetadata.createMetadataFor(\n maxRetries,\n existingMetadata ?? undefined\n );\n\n const paramName = RabbitMQMetadata.getParameterName(queueName);\n\n const success = await this.managementClient.setParameter(\n paramName,\n metadata\n );\n\n if (success) {\n const action = existingMetadata ? \"Updated\" : \"Created\";\n this.logger.info(`${action} metadata for queue: ${queueName}`);\n return true;\n }\n\n this.logger.error(`Failed to store metadata for queue: ${queueName}`);\n return false;\n } catch (error) {\n this.logger.error(`Error storing metadata for queue ${queueName}: ${error}`);\n return false;\n }\n }\n\n /**\n * Get metadata for a queue.\n *\n * @param queueName - The name of the queue\n * @returns The queue metadata or null if not found\n */\n public async getMetadata(\n queueName: string,\n ): Promise<RunMQQueueMetadata | null> {\n if (!this.isManagementPluginEnabled || !this.managementClient) {\n return null;\n }\n\n try {\n const paramName = RabbitMQMetadata.getParameterName(queueName);\n\n return await this.managementClient.getParameter<RunMQQueueMetadata>(\n paramName\n );\n } catch (error) {\n this.logger.warn(`Failed to get metadata for queue ${queueName}: ${error}`);\n return null;\n }\n }\n\n /**\n * Delete metadata for a queue.\n *\n * @param queueName - The name of the queue\n */\n public async cleanup(queueName: string): Promise<void> {\n if (!this.isManagementPluginEnabled || !this.managementClient) {\n return;\n }\n\n const paramName = RabbitMQMetadata.getParameterName(queueName);\n await this.managementClient.deleteParameter(paramName);\n this.logger.info(`Deleted metadata for queue: ${queueName}`);\n }\n\n /**\n * Check if management plugin is enabled and metadata storage is available.\n */\n public isEnabled(): boolean {\n return this.isManagementPluginEnabled;\n }\n}\n\n","import {ConsumerConfiguration} from \"@src/core/consumer/ConsumerConfiguration\";\nimport {Constants, DEFAULTS} from \"@src/core/constants\";\nimport {RabbitMQMessage} from \"@src/core/message/RabbitMQMessage\";\nimport {\n RunMQSucceededMessageAcknowledgerProcessor\n} from \"@src/core/consumer/processors/RunMQSucceededMessageAcknowledgerProcessor\";\nimport {RunMQFailedMessageRejecterProcessor} from \"@src/core/consumer/processors/RunMQFailedMessageRejecterProcessor\";\nimport {RunMQRetriesCheckerProcessor} from \"@src/core/consumer/processors/RunMQRetriesCheckerProcessor\";\nimport {RunMQFailureLoggerProcessor} from \"@src/core/consumer/processors/RunMQFailureLoggerProcessor\";\nimport {RunMQBaseProcessor} from \"@src/core/consumer/processors/RunMQBaseProcessor\";\nimport {RunMQExceptionLoggerProcessor} from \"@src/core/consumer/processors/RunMQExceptionLoggerProcessor\";\nimport {RunMQLogger} from \"@src/core/logging/RunMQLogger\";\nimport {DefaultDeserializer} from \"@src/core/serializers/deserializer/DefaultDeserializer\";\nimport {ConsumerCreatorUtils} from \"@src/core/consumer/ConsumerCreatorUtils\";\nimport {RunMQPublisherCreator} from \"@src/core/publisher/RunMQPublisherCreator\";\nimport {AMQPChannel, AMQPClient, RabbitMQManagementConfig} from \"@src/types\";\nimport {RunMQTTLPolicyManager} from \"@src/core/management/Policies/RunMQTTLPolicyManager\";\nimport {RunMQMetadataManager} from \"@src/core/management/Policies/RunMQMetadataManager\";\nimport {RunMQException} from \"@src/core/exceptions/RunMQException\";\nimport {Exceptions} from \"@src/core/exceptions/Exceptions\";\n\nexport class RunMQConsumerCreator {\n private ttlPolicyManager: RunMQTTLPolicyManager;\n private metadataManager: RunMQMetadataManager;\n\n constructor(\n private client: AMQPClient,\n private logger: RunMQLogger,\n managementConfig?: RabbitMQManagementConfig\n ) {\n this.ttlPolicyManager = new RunMQTTLPolicyManager(logger, managementConfig);\n this.metadataManager = new RunMQMetadataManager(logger, managementConfig);\n }\n\n public async createConsumer<T>(consumerConfiguration: ConsumerConfiguration<T>) {\n await this.ttlPolicyManager.initialize();\n await this.metadataManager.initialize();\n await this.assertQueues<T>(consumerConfiguration);\n await this.bindQueues<T>(consumerConfiguration);\n await this.storeMetadata<T>(consumerConfiguration);\n for (let i = 0; i < consumerConfiguration.processorConfig.consumersCount; i++) {\n await this.runProcessor<T>(consumerConfiguration);\n }\n }\n\n private async storeMetadata<T>(consumerConfiguration: ConsumerConfiguration<T>): Promise<void> {\n const maxRetries = consumerConfiguration.processorConfig.attempts ?? DEFAULTS.PROCESSING_ATTEMPTS;\n\n await this.metadataManager.apply(\n consumerConfiguration.processorConfig.name,\n maxRetries\n );\n }\n\n private async runProcessor<T>(consumerConfiguration: ConsumerConfiguration<T>): Promise<void> {\n const consumerChannel = await this.getProcessorChannel();\n const DLQPublisher = new RunMQPublisherCreator(this.logger).createPublisher(Constants.DEAD_LETTER_ROUTER_EXCHANGE_NAME);\n\n await consumerChannel.prefetch(DEFAULTS.PREFETCH_COUNT);\n await consumerChannel.consume(consumerConfiguration.processorConfig.name, async (msg) => {\n if (msg) {\n const rabbitmqMessage = new RabbitMQMessage(\n msg.content.toString(),\n msg.properties.messageId,\n msg.properties.correlationId,\n consumerChannel,\n msg,\n msg.properties.headers,\n )\n return new RunMQExceptionLoggerProcessor(\n new RunMQSucceededMessageAcknowledgerProcessor(\n new RunMQFailedMessageRejecterProcessor(\n new RunMQRetriesCheckerProcessor(\n new RunMQFailureLoggerProcessor(\n new RunMQBaseProcessor<T>(\n consumerConfiguration.processor,\n consumerConfiguration.processorConfig,\n new DefaultDeserializer<T>()\n ),\n this.logger\n ),\n consumerConfiguration.processorConfig,\n DLQPublisher,\n this.logger\n )\n )\n ), this.logger).consume(rabbitmqMessage)\n }\n });\n }\n\n\n private async assertQueues<T>(consumerConfiguration: ConsumerConfiguration<T>) {\n const defaultChannel = await this.client.getDefaultChannel();\n\n await defaultChannel.assertQueue(consumerConfiguration.processorConfig.name, {\n durable: true,\n deadLetterExchange: Constants.DEAD_LETTER_ROUTER_EXCHANGE_NAME,\n deadLetterRoutingKey: consumerConfiguration.processorConfig.name\n });\n await defaultChannel.assertQueue(ConsumerCreatorUtils.getDLQTopicName(consumerConfiguration.processorConfig.name), {\n durable: true,\n deadLetterExchange: Constants.ROUTER_EXCHANGE_NAME,\n deadLetterRoutingKey: consumerConfiguration.processorConfig.name\n });\n\n const retryDelayQueueName = ConsumerCreatorUtils.getRetryDelayTopicName(consumerConfiguration.processorConfig.name);\n const messageDelay = consumerConfiguration.processorConfig.attemptsDelay ?? DEFAULTS.PROCESSING_RETRY_DELAY\n\n\n const policiesForTTL = consumerConfiguration.processorConfig.usePoliciesForDelay ?? false;\n if (!policiesForTTL) {\n await defaultChannel.assertQueue(retryDelayQueueName, {\n durable: true,\n deadLetterExchange: Constants.ROUTER_EXCHANGE_NAME,\n messageTtl: messageDelay,\n });\n return;\n }\n\n const result = await this.ttlPolicyManager.apply(\n retryDelayQueueName,\n messageDelay\n );\n if (result) {\n await defaultChannel.assertQueue(retryDelayQueueName, {\n durable: true,\n deadLetterExchange: Constants.ROUTER_EXCHANGE_NAME\n });\n return;\n }\n throw new RunMQException(\n Exceptions.FAILURE_TO_DEFINE_TTL_POLICY,\n {\n error: \"Failed to apply TTL policy to queue: \" + retryDelayQueueName\n }\n );\n }\n\n\n private async bindQueues<T>(consumerConfiguration: ConsumerConfiguration<T>) {\n const defaultChannel = await this.client.getDefaultChannel();\n\n await defaultChannel.bindQueue(\n consumerConfiguration.processorConfig.name,\n Constants.ROUTER_EXCHANGE_NAME,\n consumerConfiguration.topic\n );\n await defaultChannel.bindQueue(\n consumerConfiguration.processorConfig.name,\n Constants.ROUTER_EXCHANGE_NAME,\n consumerConfiguration.processorConfig.name\n );\n await defaultChannel.bindQueue(\n ConsumerCreatorUtils.getRetryDelayTopicName(consumerConfiguration.processorConfig.name),\n Constants.DEAD_LETTER_ROUTER_EXCHANGE_NAME,\n consumerConfiguration.processorConfig.name\n );\n await defaultChannel.bindQueue(\n ConsumerCreatorUtils.getDLQTopicName(consumerConfiguration.processorConfig.name),\n Constants.DEAD_LETTER_ROUTER_EXCHANGE_NAME,\n ConsumerCreatorUtils.getDLQTopicName(consumerConfiguration.processorConfig.name)\n );\n }\n\n private async getProcessorChannel(): Promise<AMQPChannel> {\n return await this.client.getChannel()\n }\n}","import {RunMQProcessorConfiguration} from \"@src/types\";\nimport {RunMQMessage} from \"@src/core/message/RunMQMessage\";\n\nexport class ConsumerConfiguration<T> {\n constructor(\n readonly topic: string,\n readonly processorConfig: RunMQProcessorConfiguration,\n readonly processor: (message: RunMQMessage<T>) => Promise<void>) {\n }\n}","export class RabbitMQMessageProperties {\n constructor(\n readonly id: string,\n readonly correlationId: string,\n ) {\n }\n}","import {RunMQProcessorConfiguration, RunMQConnectionConfig, RunMQPublisher, RunMQMessageContent, AMQPChannel} from \"@src/types\";\nimport {RunMQException} from \"@src/core/exceptions/RunMQException\";\nimport {RabbitMQClientAdapter} from \"@src/core/clients/RabbitMQClientAdapter\";\nimport {Exceptions} from \"@src/core/exceptions/Exceptions\";\nimport {RunMQUtils} from \"@src/core/utils/RunMQUtils\";\nimport {Constants, DEFAULTS} from \"@src/core/constants\";\nimport {RunMQConsumerCreator} from \"@src/core/consumer/RunMQConsumerCreator\";\nimport {ConsumerConfiguration} from \"@src/core/consumer/ConsumerConfiguration\";\nimport {RunMQLogger} from \"@src/core/logging/RunMQLogger\";\nimport {RunMQConsoleLogger} from \"@src/core/logging/RunMQConsoleLogger\";\nimport {RunMQPublisherCreator} from \"@src/core/publisher/RunMQPublisherCreator\";\nimport {RabbitMQMessage} from \"@src/core/message/RabbitMQMessage\";\nimport {RabbitMQMessageProperties} from \"@src/core/message/RabbitMQMessageProperties\";\n\nexport class RunMQ {\n private readonly client: RabbitMQClientAdapter;\n private readonly config: RunMQConnectionConfig;\n private readonly consumer: RunMQConsumerCreator;\n private publisher: RunMQPublisher | undefined\n private readonly logger: RunMQLogger\n private retryAttempts: number = 0;\n private defaultChannel: AMQPChannel | undefined;\n\n private constructor(config: RunMQConnectionConfig, logger: RunMQLogger) {\n this.logger = logger;\n this.config = {\n ...config,\n reconnectDelay: config.reconnectDelay ?? DEFAULTS.RECONNECT_DELAY,\n maxReconnectAttempts: config.maxReconnectAttempts ?? DEFAULTS.MAX_RECONNECT_ATTEMPTS,\n };\n this.client = new RabbitMQClientAdapter(this.config, this.logger);\n this.consumer = new RunMQConsumerCreator(this.client, this.logger, this.config.management);\n }\n\n /**\n * Starts the RunMQ instance by establishing a connection to RabbitMQ and initializing necessary components.\n * @param config The configuration for the RunMQ connection @see RunMQConnectionConfig\n * @param logger (Optional) A custom logger implementing the RunMQLogger interface; if not provided, a default console logger will be used\n * @returns A promise that resolves to the initialized RunMQ instance\n */\n public static async start(config: RunMQConnectionConfig, logger: RunMQLogger = new RunMQConsoleLogger): Promise<RunMQ> {\n const instance = new RunMQ(config, logger);\n await instance.connectWithRetry();\n await instance.initialize();\n return instance;\n }\n\n /**\n * Processes messages from the specified topic using the provided processor function and configuration.\n * @param topic The name of the topic to process messages from, it should match the name used during publishing\n * @param config The configuration for the message processor @see RunMQProcessorConfiguration\n * @param processor The function that will process the incoming messages\n */\n public async process<T = Record<string, never>>(topic: string, config: RunMQProcessorConfiguration, processor: (message: RunMQMessageContent<T>) => Promise<void>) {\n await this.consumer.createConsumer<T>(new ConsumerConfiguration(topic, config, processor))\n }\n\n /**\n * Publishes a message to the specified topic with an optional correlation ID\n * @param topic The name of the topic to publish the message to\n * @param message The message payload to be published\n * @param correlationId (Optional) A unique identifier for correlating messages; if not provided, a new UUID will be generated\n */\n public publish(topic: string, message: Record<string, any>, correlationId: string = RunMQUtils.generateUUID()): void {\n if (!this.publisher || !this.defaultChannel) {\n throw new RunMQException(Exceptions.NOT_INITIALIZED, {});\n }\n RunMQUtils.assertRecord(message);\n this.publisher.publish(topic,\n RabbitMQMessage.from(\n message,\n this.defaultChannel,\n new RabbitMQMessageProperties(RunMQUtils.generateUUID(), correlationId)\n )\n );\n this.logger.info(`Published message`, {\n topic,\n correlationId,\n message,\n });\n }\n\n /**\n * Disconnects from RabbitMQ, handling any errors that may occur during the disconnection process.\n */\n public async disconnect(): Promise<void> {\n try {\n await this.client.disconnect();\n } catch (error) {\n throw new RunMQException(\n Exceptions.CONNECTION_NOT_ESTABLISHED,\n {\n error: error instanceof Error ? error.message : String(error)\n }\n );\n }\n }\n\n /**\n * Checks if the connection is currently active.\n */\n public isActive(): boolean {\n return this.client.isActive();\n }\n\n private async connectWithRetry(): Promise<void> {\n const maxAttempts = this.config.maxReconnectAttempts!;\n const delay = this.config.reconnectDelay!;\n\n while (this.retryAttempts < maxAttempts) {\n try {\n await this.client.connect();\n this.logger.log('Successfully connected to RabbitMQ');\n this.retryAttempts = 0;\n return;\n } catch (error) {\n this.retryAttempts++;\n this.logger.error(`Connection attempt ${this.retryAttempts}/${maxAttempts} failed:`, error);\n\n if (this.retryAttempts >= maxAttempts) {\n throw new RunMQException(\n Exceptions.EXCEEDING_CONNECTION_ATTEMPTS,\n {\n attempts: maxAttempts,\n error: error instanceof Error ? error.message : String(error)\n }\n );\n }\n\n this.logger.error(`Retrying in ${delay}ms...`);\n await RunMQUtils.delay(delay);\n }\n }\n }\n\n private async initialize(): Promise<void> {\n this.defaultChannel = await this.client.getDefaultChannel();\n await this.defaultChannel.assertExchange(Constants.ROUTER_EXCHANGE_NAME, 'direct', {durable: true});\n await this.defaultChannel.assertExchange(Constants.DEAD_LETTER_ROUTER_EXCHANGE_NAME, 'direct', {durable: true});\n this.publisher = new RunMQPublisherCreator(this.logger).createPublisher();\n }\n}"],"mappings":"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","names":["_a","_a","Ajv","_a","_a","_a"]}
|
package/dist/index.d.cts
CHANGED
|
@@ -114,6 +114,7 @@ interface RunMQLogger {
|
|
|
114
114
|
declare class RunMQ {
|
|
115
115
|
private readonly client;
|
|
116
116
|
private readonly config;
|
|
117
|
+
private readonly consumer;
|
|
117
118
|
private publisher;
|
|
118
119
|
private readonly logger;
|
|
119
120
|
private retryAttempts;
|
|
@@ -152,4 +153,29 @@ declare class RunMQ {
|
|
|
152
153
|
private initialize;
|
|
153
154
|
}
|
|
154
155
|
|
|
155
|
-
|
|
156
|
+
/**
|
|
157
|
+
* Metadata stored for each RunMQ-managed queue.
|
|
158
|
+
* This metadata is stored as a RabbitMQ operator policy with lowest priority.
|
|
159
|
+
*/
|
|
160
|
+
interface RunMQQueueMetadata {
|
|
161
|
+
/**
|
|
162
|
+
* Schema version of the metadata object.
|
|
163
|
+
* Used for future migrations if metadata structure changes.
|
|
164
|
+
*/
|
|
165
|
+
version: number;
|
|
166
|
+
/**
|
|
167
|
+
* Maximum number of retry attempts before message goes to DLQ.
|
|
168
|
+
*/
|
|
169
|
+
maxRetries: number;
|
|
170
|
+
/**
|
|
171
|
+
* ISO 8601 timestamp when the metadata was first created.
|
|
172
|
+
*/
|
|
173
|
+
createdAt: string;
|
|
174
|
+
/**
|
|
175
|
+
* ISO 8601 timestamp when the metadata was last updated.
|
|
176
|
+
* Only present if metadata has been updated after creation.
|
|
177
|
+
*/
|
|
178
|
+
updatedAt?: string;
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
export { type MessageSchema, type RabbitMQManagementConfig, RunMQ, type RunMQConnectionConfig, type RunMQLogger, type RunMQMessageContent, type RunMQMessageMetaContent, type RunMQProcessorConfiguration, type RunMQQueueMetadata, type SchemaFailureStrategy, type SchemaType };
|
package/dist/index.d.ts
CHANGED
|
@@ -114,6 +114,7 @@ interface RunMQLogger {
|
|
|
114
114
|
declare class RunMQ {
|
|
115
115
|
private readonly client;
|
|
116
116
|
private readonly config;
|
|
117
|
+
private readonly consumer;
|
|
117
118
|
private publisher;
|
|
118
119
|
private readonly logger;
|
|
119
120
|
private retryAttempts;
|
|
@@ -152,4 +153,29 @@ declare class RunMQ {
|
|
|
152
153
|
private initialize;
|
|
153
154
|
}
|
|
154
155
|
|
|
155
|
-
|
|
156
|
+
/**
|
|
157
|
+
* Metadata stored for each RunMQ-managed queue.
|
|
158
|
+
* This metadata is stored as a RabbitMQ operator policy with lowest priority.
|
|
159
|
+
*/
|
|
160
|
+
interface RunMQQueueMetadata {
|
|
161
|
+
/**
|
|
162
|
+
* Schema version of the metadata object.
|
|
163
|
+
* Used for future migrations if metadata structure changes.
|
|
164
|
+
*/
|
|
165
|
+
version: number;
|
|
166
|
+
/**
|
|
167
|
+
* Maximum number of retry attempts before message goes to DLQ.
|
|
168
|
+
*/
|
|
169
|
+
maxRetries: number;
|
|
170
|
+
/**
|
|
171
|
+
* ISO 8601 timestamp when the metadata was first created.
|
|
172
|
+
*/
|
|
173
|
+
createdAt: string;
|
|
174
|
+
/**
|
|
175
|
+
* ISO 8601 timestamp when the metadata was last updated.
|
|
176
|
+
* Only present if metadata has been updated after creation.
|
|
177
|
+
*/
|
|
178
|
+
updatedAt?: string;
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
export { type MessageSchema, type RabbitMQManagementConfig, RunMQ, type RunMQConnectionConfig, type RunMQLogger, type RunMQMessageContent, type RunMQMessageMetaContent, type RunMQProcessorConfiguration, type RunMQQueueMetadata, type SchemaFailureStrategy, type SchemaType };
|