{"_rev":"3-add03f97f0620ab8c470b1c1a7ddf891","time":{"created":"2026-06-15T21:14:50.290Z","modified":"2026-06-15T21:14:50.880Z","1.0.0":"2026-06-15T21:06:35.092Z","1.0.1":"2026-06-15T21:14:50.581Z"},"_id":"@ctdesarrollo-pkgs/rabbitmq-resilience","name":"@ctdesarrollo-pkgs/rabbitmq-resilience","dist-tags":{"latest":"1.0.1"},"versions":{"1.0.1":{"name":"@ctdesarrollo-pkgs/rabbitmq-resilience","version":"1.0.1","main":"dist/index.js","types":"dist/index.d.ts","scripts":{"dev":"tsnd --respawn --clear -r tsconfig-paths/register src/app.ts","build":"rimraf ./dist && tsc && tsc-alias && echo 'Copying HTML files...' && cpx \"src/**/*.html\" dist/ && echo 'HTML files and image copied!'"},"keywords":["rabbitmq","resilience","event","DDD"],"author":{"name":"geomerdev"},"license":"MIT","description":"A TS package to enable Event-Driven architecture in your microservices architecture, with resilience patterns out-of-the-box.","repository":{"type":"git","url":"git+https://github.com/ctdesarrollo-fbr/rabbitmq-resilience.git"},"bugs":{"url":"https://github.com/ctdesarrollo-fbr/rabbitmq-resilience/issues"},"homepage":"https://github.com/ctdesarrollo-fbr/rabbitmq-resilience#readme","devDependencies":{"@eslint/js":"^9.11.0","@types/amqplib":"0.10.6","@types/crypto-js":"^4.2.2","@types/eslint__js":"^8.42.3","@types/express":"^4.17.21","@types/jest":"^29.5.12","@types/jsonwebtoken":"^9.0.7","@types/node":"^20.12.7","@types/nodemailer":"^6.4.15","@types/ssh2-sftp-client":"^9.0.5","@types/supertest":"^6.0.2","@types/uuid":"^9.0.8","@types/ws":"^8.18.1","cpx":"^1.5.0","sqlite3":"^5.1.7","ts-jest":"^29.2.3","ts-node":"^10.9.2","ts-node-dev":"^2.0.0","ts-patch":"^3.2.1","tsc-alias":"^1.8.10","tsconfig-paths":"^4.2.0","typescript":"^5.6.2"},"peerDependencies":{"@hono/node-server":"^1.11.1","amqplib":"^0.10.4","hono":"^4.3.2","nodemailer":"^7.0.5","sequelize":"^6.37.2","socket.io":"^4.8.1","ssh2-sftp-client":"^12.0.1","uuid":"^9.0.1"},"peerDependenciesMeta":{"ssh2-sftp-client":{"optional":true},"nodemailer":{"optional":true}},"gitHead":"a9039fa66a4a87323c44bb7ccb7fc20a8503b4c0","_id":"@ctdesarrollo-pkgs/rabbitmq-resilience@1.0.1","_nodeVersion":"26.1.0","_npmVersion":"11.13.0","dist":{"integrity":"sha512-i10lgL2fRuvgqs+OKdpTF6/1QHEAgWsftmY4aJcjfrWAdq23uyAmqXSVtH6X+c1g8Hc/faZaAO1Nk9w6nuuaXQ==","shasum":"4f01dc37a526b0ee77cca8cac817b205d905a595","tarball":"https://registry.npmjs.org/@ctdesarrollo-pkgs/rabbitmq-resilience/-/rabbitmq-resilience-1.0.1.tgz","fileCount":184,"unpackedSize":244369,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQC+ym+ZhpA+LvSKWrj+6RzQh51XLF27Owe9h8kc623svgIgLL24G4jE2O7wE37ISxlcXG7nn5QG8D5wNWZFTmDiO/o="}]},"_npmUser":{"name":"ctdesarollo","email":"ctdesarrollo.packages@funiber.org"},"directories":{},"maintainers":[{"name":"ctdesarollo","email":"ctdesarrollo.packages@funiber.org"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/rabbitmq-resilience_1.0.1_1781558090449_0.6404175612169227"},"_hasShrinkwrap":false}},"maintainers":[{"name":"ctdesarollo","email":"ctdesarrollo.packages@funiber.org"}],"description":"A TS package to enable Event-Driven architecture in your microservices architecture, with resilience patterns out-of-the-box.","homepage":"https://github.com/ctdesarrollo-fbr/rabbitmq-resilience#readme","keywords":["rabbitmq","resilience","event","DDD"],"repository":{"type":"git","url":"git+https://github.com/ctdesarrollo-fbr/rabbitmq-resilience.git"},"author":{"name":"geomerdev"},"bugs":{"url":"https://github.com/ctdesarrollo-fbr/rabbitmq-resilience/issues"},"license":"MIT","readme":"\n# rabbitmq-resilience\n\n`rabbitmq-resilience` is a library designed to provide resilience and reliability for RabbitMQ message handling in Node.js applications.\n\n## Installation\n\nTo install the package, use npm:\n\n```bash\nnpm install @ctdesarrollo-pkgs/rabbitmq-resilience\n```\n\n## Configuration\n\nTo configure the `RabbitMQResilience` instance, you need to provide a configuration object that adheres to the `RabbitMQResilienceConfig` interface. Here is an example configuration:\n\n```typescript\nimport { Sequelize } from \"sequelize\";\nimport { Options } from \"amqplib\";\nimport { RabbitMQResilienceConfig } from \"@/domain/interfaces/rabbitMQResilienceConfig\";\nimport { EventResilienceHandlerConfig } from \"@/domain/interfaces/eventResilienceHandlerConfig\";\nimport { EventProcessConfig } from \"@/domain/interfaces/eventProcessConfig\";\n\nexport const rabbitMQResilienceConfig: RabbitMQResilienceConfig = {\n    rabbitMQConfigConnect: {\n        protocol: process.env.RABBIT_PROTOCOL ?? 'amqp',\n        hostname: process.env.RABBIT_HOSTNAME ?? 'localhost',\n        port: Number(process.env.RABBIT_PORT) ?? 5672,\n        username: process.env.RABBIT_USERNAME ?? 'guest',\n        password: process.env.RABBIT_PASSWORD ?? 'guest',\n        vhost: process.env.RABBIT_VHOST ?? '/',\n    } as Options.Connect,\n    queue: process.env.RABBIT_QUEUE ?? 'geomerdev.subdomain-name',\n    routingKey: process.env.RABBIT_ROUTING_KEY ?? 'geomerdev',\n    exchange: process.env.RABBIT_EXCHANGE ?? 'geomerdev',\n    typeExchange: process.env.RABBIT_TYPE_EXCHANGE ?? 'fanout',\n    prefetch: Number(process.env.RABBIT_PREFETCH) ?? 1,\n    directExchange: process.env.RABBIT_DIRECT_EXCHANGE ?? 'geomerdev-direct',\n    typeDirectExchange: process.env.RABBIT_TYPE_DIRECT_EXCHANGE ?? 'direct',\n    retryQueue: process.env.RABBIT_RETRY_QUEUE ?? 'geomerdev.subdomain-name.events-retry',\n    retryRoutingKey: process.env.RABBIT_RETRY_ROUTING_KEY ?? 'geomerdev.subdomain-name.events-retry',\n    retryEndpoint: process.env.RABBIT_RETRY_ENDPOINT ?? 'geomerdev.service',\n    deadLetterQueue: process.env.RABBIT_DEAD_LETTER_QUEUE ?? 'geomerdev.dead-letter',\n    deadLetterRoutingKey: process.env.RABBIT_DEAD_LETTER_ROUTING_KEY ?? 'geomerdev.dead-letter',\n    messageTTL: Number(process.env.RABBIT_MESSAGE_TTL) ?? 10000,\n    eventResilienceHandlerConfig: {\n        immediateRetryAttempts: Number(process.env.IMMEDIATE_RETRY_ATTEMPTS) ?? 5,\n        delayedRetryAttempts: Number(process.env.DELAYED_RETRY_ATTEMPTS) ?? 3,\n        delayInMs: Number(process.env.DELAY_IN_MS) ?? 1000,\n    } as EventResilienceHandlerConfig,\n    eventsToProcess: [] as EventProcessConfig[], // Add your event process configurations here\n    sequelizeConnection: new Sequelize({\n        dialect: 'mysql',\n        host: process.env.DB_HOST ?? 'localhost',\n        port: Number(process.env.DB_PORT) ?? 3306,\n        username: process.env.DB_USERNAME ?? 'user',\n        password: process.env.DB_PASSWORD ?? 'password',\n        database: process.env.DB_NAME ?? 'database',\n    }),\n    sequelizeOptions: { // If sequelizeConnection as null this is required\n        dialect: 'mysql',\n        host: process.env.DB_HOST ?? 'localhost',\n        port: Number(process.env.DB_PORT) ?? 3306,\n        username: process.env.DB_USERNAME ?? 'user',\n        password: process.env.DB_PASSWORD ?? 'password',\n        database: process.env.DB_NAME ?? 'database',\n    }\n};\n```\n## Configuring `eventsToProcess`\n\nTo configure the events to be processed, you need to provide an array of `EventProcessConfig` objects. Each object specifies the event type and the processes to be executed for that event. Here is an example configuration:\n\n```typescript\nimport { EventProcessConfig, RabbitMQMessageDto } from 'rabbitmq-resilience';\nimport { Process } from \"@/infrastructure/rabbitmqResilience/process\";\n\nexport const eventsToProcess: EventProcessConfig[] = [\n    {\n        eventType: 'domain.sub-domain.event',\n        processes: [\n            {\n                processFunction: async (event: RabbitMQMessageDto) => Process.success(JSON.parse(event.content.toString())),\n                processName: 'process-success'\n            }\n        ]\n    },\n    {\n        eventType: 'domain.sub-domain.event.fail',\n        processes: [\n            {\n                processFunction: async (event: RabbitMQMessageDto) => Process.fail(JSON.parse(event.content.toString())),\n                processName: 'process-fail'\n            }\n        ]\n    },\n    {\n        eventType: 'domain.sub-domain.event.failCustomException',\n        processes: [\n            {\n                processFunction: async (event: RabbitMQMessageDto) => Process.failCustomException(JSON.parse(event.content.toString())),\n                processName: 'process-fail-custom-exception'\n            }\n        ]\n    },\n    {\n        eventType: 'domain.sub-domain.event.random',\n        processes: [\n            {\n                processFunction: async (event: RabbitMQMessageDto) => Process.random(JSON.parse(event.content.toString())),\n                processName: 'process-random'\n            }\n        ]\n    },\n    {\n        eventType: 'domain.sub-domain.event.multiple',\n        processes: [\n            {\n                processFunction: async (event: RabbitMQMessageDto) => Process.success(JSON.parse(event.content.toString())),\n                processName: 'process-success'\n            },\n            {\n                processFunction: async (event: RabbitMQMessageDto) => Process.fail(JSON.parse(event.content.toString())),\n                processName: 'process-fail'\n            },\n            {\n                processFunction: async (event: RabbitMQMessageDto) => Process.failCustomException(JSON.parse(event.content.toString())),\n                processName: 'process-fail-custom-exception'\n            },\n            {\n                processFunction: async (event: RabbitMQMessageDto) => Process.random(JSON.parse(event.content.toString())),\n                processName: 'process-random'\n            }\n        ]\n    }\n];\n```\n\nThis configuration specifies different event types and their corresponding processes. Each process includes a function to handle the event and a name for the process.\n## Example Environment Variables\n\nHere are some example environment variables you can set for the configuration:\n\n```bash\nRABBIT_USERNAME=guest\nRABBIT_PASSWORD=guest\nRABBIT_PROTOCOL=amqp\nRABBIT_HOSTNAME=localhost\nRABBIT_PORT=5672\nRABBIT_VHOST=/\nRABBIT_QUEUE=geomerdev.subdomain-name\nRABBIT_ROUTING_KEY=geomerdev\nRABBIT_EXCHANGE=geomerdev\nRABBIT_DIRECT_EXCHANGE=geomerdev-direct\nRABBIT_TYPE_EXCHANGE=fanout\nRABBIT_TYPE_DIRECT_EXCHANGE=direct\nRABBIT_PREFETCH=1\nRABBIT_RETRY_QUEUE=geomerdev.subdomain-name.events-retry\nRABBIT_RETRY_ROUTING_KEY=geomerdev.subdomain-name.events-retry\nRABBIT_RETRY_ENDPOINT=geomerdev.service\nRABBIT_MESSAGE_TTL=10000\nRABBIT_DEAD_LETTER_QUEUE=geomerdev.dead-letter\nRABBIT_DEAD_LETTER_ROUTING_KEY=geomerdev.dead-letter\nIMMEDIATE_RETRY_ATTEMPTS=5\nDELAYED_RETRY_ATTEMPTS=3\nDELAY_IN_MS=1000\nDB_HOST=localhost\nDB_PORT=3306\nDB_USERNAME=user\nDB_PASSWORD=password\nDB_NAME=database\n```\n### Configuring Routes and Socket Manager\n\nTo configure the routes for the `RabbitMQResilience` library, you need to set up the routes in your application. Here is an example of how to do it:\n\n```typescript\nimport { Hono } from 'hono';\nimport { RabbitMQResilienceRoutes ,RabbitMQResilienceSocketManager} from 'rabbitmq-resilience';\n\nclass App {\n    private app: Hono;\n    private port: number;\n\n    constructor(options: { port?: number }) {\n        const { port = 3000 } = options;\n        this.app = new Hono();\n        this.port = port;\n    }\n\n    public async start() {\n        // Set up routes of library\n        this.app.route('/', new RabbitMQResilienceRoutes().routes);\n\n        const server = serve({\n            fetch: this.app.fetch,\n            port: this.port\n        }, (info) => {\n            console.log(`Server running on port ${info.port}`);\n        });\n\n        // Initialize socket manager of library\n        RabbitMQResilienceSocketManager.initialize(server, '/websocket/');\n    }\n}\n```\n\n## Usage\n\n### Initialization\n\nFirst, initialize the `RabbitMQResilience` instance with the necessary configuration:\n\n```typescript\nimport { RabbitMQResilience } from 'rabbitmq-resilience';\nimport { rabbitMQResilienceConfig } from '@/infrastructure/rabbitmqResilience/rabbitMQResilienceConfig';\n\nexport const RabbitMQR = RabbitMQResilience.initialize(rabbitMQResilienceConfig);\n```\n\n### Publishing Events\n\nYou can publish events to the default exchange or a custom exchange:\n\n```typescript\nimport { RabbitMQMessageDto } from 'rabbitmq-resilience';\n\n// Create a message\nconst message = new RabbitMQMessageDto(\n  Buffer.from('Your message content'),\n  { /* message fields */ },\n  { /* message properties */ }\n);\n\n// Publish to the default exchange\nawait RabbitMQR.publishEvent(message);\n\n// Publish to a custom exchange\nawait RabbitMQR.publishEventCustomExchange(message, 'custom-exchange', 'routing-key');\n```\n\n### Republishing and Reprocessing Events\n\nYou can republish or reprocess events using their UUID:\n\n```typescript\n// Republishing an event\nawait RabbitMQR.republishEvent('event-uuid');\n\n// Reprocessing an event\nawait RabbitMQR.reprocessEvent('event-uuid', 'process-name');\n```\n\n### Control your logs\n\nYou can decide what logs want to see and wich one no. \nFind it at the config file like this. If set it as off all are on by default\n\n```\n    {\n        ...\n        showLogs: {\n            log?:boolean,\n            error?:boolean,\n            warn?:boolean,\n            info?:boolean,\n            debug?:boolean,\n            trace?:boolean,\n            time?:boolean,\n            timeEnd?:boolean\n        },\n        ...\n    }\n```\n\n### Configuration of smtp\nThis smtp is for failed events the ones that goes to dead letter.\nThis configuration is obligatory\n````\n    {\n        ...\n        emailConfig:{\n            APP_NAME:string,\n            EMAIL:string,\n            EMAIL_AUTH_USER:string,\n            EMAIL_AUTH_PASS:string,\n            EMAIL_HOST:string,\n            EMAIL_PORT:number\n        },\n        ...\n    }\n````\n\n### Table rotations\nThis section is made so the tables of rabbitmq-resilence dont overlap with information. For this to work you have to enable first. If the sftp server is not enable then the migration will be save at local server.Follow up this configurations.\n\n```\n    {\n        ...\n            rotationTables:{\n                enable: boolean;\n                typeOfRotation: 'max-records' | 'size-table' | 'time-rotation';\n                sftpServer?: SftpConnectOptions;\n                maxRecords?: number;\n                maxSizeMB?: number;\n                maxAgeDays?: number;\n            }\n        ...\n    }\n```\n\n\n\n## License\n\nThis project is licensed under the MIT License. See the [LICENSE](LICENSE) file for details.\n\n## Author\n\nCreated by [geomerdev](https://geomerdev.com).","readmeFilename":"README.md"}