{"_id":"@abinashpatri/rabbitmq","_rev":"2-3c1dfcb7d0cc16d83d8bc1eb503d4c3b","name":"@abinashpatri/rabbitmq","dist-tags":{"latest":"1.0.1"},"versions":{"1.0.0":{"name":"@abinashpatri/rabbitmq","version":"1.0.0","keywords":["events","rabbitmq","messaging","typescript"],"author":{"name":"Abinash Patri"},"license":"MIT","_id":"@abinashpatri/rabbitmq@1.0.0","maintainers":[{"name":"abinashpatri","email":"abinashpatri33@gmail.com"}],"dist":{"shasum":"5dfb0eb751cf09e67029a2f3ce002698ade13759","tarball":"https://registry.npmjs.org/@abinashpatri/rabbitmq/-/rabbitmq-1.0.0.tgz","fileCount":17,"integrity":"sha512-HizLHjH/maFZI+ltjR8fNNHx0F2JsQJH5GFjI28Cwqg38sRF0GGOYpo0fOflF3gReK4CpzfZZMKekGse+JAk9w==","signatures":[{"sig":"MEUCIQDIPhDhdthsAjDDNmszypCLn+OPN4Vmx4fT1FE1t7orRgIgZWflx+5w8xUi7fPh6uYYU7MV6SKwqkcWbRnLRzDVatk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":115266},"main":"./dist/index.js","type":"commonjs","types":"./dist/index.d.ts","module":"./dist/index.mjs","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"},"./rabbitMQ":{"types":"./dist/rabbitMQ/index.d.ts","import":"./dist/rabbitMQ/index.mjs","require":"./dist/rabbitMQ/index.js"}},"scripts":{"dev":"tsup --watch","build":"tsup","typecheck":"tsc --noEmit","prepublishOnly":"npm run typecheck && npm run build"},"_npmUser":{"name":"abinashpatri","email":"abinashpatri33@gmail.com"},"_npmVersion":"11.6.2","description":"Production-grade RabbitMQ event utility library","directories":{},"sideEffects":false,"_nodeVersion":"24.11.1","dependencies":{"amqplib":"^0.10.9"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.1","eslint":"^10.1.0","prettier":"^3.8.1","typescript":"^5.9.3","@types/node":"^25.5.0","@types/amqplib":"^0.10.7"},"_npmOperationalInternal":{"tmp":"tmp/rabbitmq_1.0.0_1774251675826_0.506466364270272","host":"s3://npm-registry-packages-npm-production"}},"1.0.1":{"name":"@abinashpatri/rabbitmq","version":"1.0.1","description":"Production-grade RabbitMQ event utility library","main":"./dist/index.js","module":"./dist/index.mjs","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","require":"./dist/index.js","import":"./dist/index.mjs"},"./rabbitMQ":{"types":"./dist/rabbitMQ/index.d.ts","require":"./dist/rabbitMQ/index.js","import":"./dist/rabbitMQ/index.mjs"}},"sideEffects":false,"scripts":{"build":"tsup","dev":"tsup --watch","typecheck":"tsc --noEmit","prepublishOnly":"npm run typecheck && npm run build"},"keywords":["events","rabbitmq","messaging","typescript"],"author":{"name":"Abinash Patri"},"license":"MIT","type":"commonjs","engines":{"node":">=18"},"devDependencies":{"@types/amqplib":"^0.10.7","@types/node":"^25.5.0","eslint":"^10.1.0","prettier":"^3.8.1","tsup":"^8.5.1","typescript":"^5.9.3"},"dependencies":{"amqplib":"^0.10.9"},"_id":"@abinashpatri/rabbitmq@1.0.1","_nodeVersion":"24.11.1","_npmVersion":"11.6.2","dist":{"integrity":"sha512-drD0VkvRDV5x919Ep8Qau7SHUyDvZanQSwPR7UCnQHtJ2HPxiIU6kehuMe9mZguWhvZc2ktSYaHxPLGHepbnEA==","shasum":"b88ecd2d72ec700e74b9e4b5864a3e1a4700367d","tarball":"https://registry.npmjs.org/@abinashpatri/rabbitmq/-/rabbitmq-1.0.1.tgz","fileCount":17,"unpackedSize":115189,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQDyynSK1ecoKuAfaTu+ZUR1Hh0FXCgh+kFR7i0J204OwwIhAKvlGos0+g89ks2l7OkqgQFQY9OlDk6fzlADZxwwn+HU"}]},"_npmUser":{"name":"abinashpatri","email":"abinashpatri33@gmail.com"},"directories":{},"maintainers":[{"name":"abinashpatri","email":"abinashpatri33@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/rabbitmq_1.0.1_1774845162630_0.2519608797960442"},"_hasShrinkwrap":false}},"time":{"created":"2026-03-23T07:41:15.658Z","modified":"2026-03-30T04:32:42.906Z","1.0.0":"2026-03-23T07:41:15.961Z","1.0.1":"2026-03-30T04:32:42.795Z"},"author":{"name":"Abinash Patri"},"license":"MIT","keywords":["events","rabbitmq","messaging","typescript"],"description":"Production-grade RabbitMQ event utility library","maintainers":[{"name":"abinashpatri","email":"abinashpatri33@gmail.com"}],"readme":"# @abinashpatri/rabbitmq\n\nProduction-grade RabbitMQ event utility library for TypeScript and JavaScript services.\n\n## Highlights\n\n- RabbitMQ-only API surface.\n- Durable exchanges/queues with configurable retry and DLQ topology.\n- Confirm-channel publishing for safer delivery semantics.\n- Non-blocking retries using delayed redelivery via TTL + dead-letter routing.\n- Scoped clients for multi-service, multi-tenant, and test isolation.\n- CJS + ESM + bundled `.d.ts` types.\n\n## Install\n\n```bash\nnpm install @abinashpatri/rabbitmq\n```\n\n## Compatibility\n\n- Node.js: `>=18`\n- Runtime: CommonJS and ESM\n- Types: bundled TypeScript declarations\n\n## Import Patterns\n\n```ts\n// Root namespace import\nimport { rabbitMQ } from \"@abinashpatri/rabbitmq\";\n\n// Subpath import\nimport * as rabbitMQApi from \"@abinashpatri/rabbitmq/rabbitMQ\";\n```\n\n## Quick Start (TypeScript)\n\n```ts\nimport { rabbitMQ } from \"@abinashpatri/rabbitmq\";\n\ntype InvoiceCreatedEvent = {\n  eventId: string;\n  invoiceId: string;\n  customerId: string;\n  amount: number;\n};\n\nawait rabbitMQ.connect({\n  url: \"amqp://localhost\",\n  reconnect: {\n    enabled: true,\n    baseDelayMs: 1000,\n    maxDelayMs: 30000,\n    jitterMs: 250,\n  },\n});\n\nawait rabbitMQ.publish<InvoiceCreatedEvent>({\n  exchange: \"billing.events\",\n  routingKey: \"invoice.created\",\n  messageId: \"evt_10\",\n  type: \"invoice.created\",\n  appId: \"billing-service\",\n  message: {\n    eventId: \"evt_10\",\n    invoiceId: \"inv_1\",\n    customerId: \"cust_1\",\n    amount: 42,\n  },\n});\n\nconst consumer = await rabbitMQ.consume<InvoiceCreatedEvent>({\n  exchange: \"billing.events\",\n  queue: \"notifications.invoice.created\",\n  routingKey: \"invoice.created\",\n  prefetch: 20,\n  retryLimit: 5,\n  retryBaseDelayMs: 500,\n  retryBackoffMultiplier: 2,\n  retryMaxDelayMs: 45000,\n  retryJitterMs: 250,\n  handler: async (event) => {\n    console.log(\"processing invoice\", event.invoiceId);\n  },\n});\n\nprocess.on(\"SIGTERM\", async () => {\n  await consumer.disconnect();\n  await rabbitMQ.disconnect();\n  process.exit(0);\n});\n```\n\n## Quick Start (JavaScript)\n\n```js\nconst { rabbitMQ } = require(\"@abinashpatri/rabbitmq\");\n\nasync function run() {\n  await rabbitMQ.connect(\"amqp://localhost\");\n\n  await rabbitMQ.publish({\n    exchange: \"shipping.events\",\n    routingKey: \"shipment.created\",\n    messageId: \"evt_200\",\n    message: {\n      eventId: \"evt_200\",\n      shipmentId: \"ship_1\",\n      orderId: \"order_1\",\n    },\n  });\n\n  return rabbitMQ.consume({\n    exchange: \"shipping.events\",\n    queue: \"tracking.shipment.created\",\n    routingKey: \"shipment.created\",\n    retryLimit: 4,\n    handler: async (event) => {\n      console.log(\"tracking:\", event.shipmentId);\n    },\n  });\n}\n\nrun().catch(console.error);\n```\n\n## API Reference\n\n### Root export\n\n- `rabbitMQ` namespace\n\n### RabbitMQ namespace\n\n- `rabbitMQ.connect(\"amqp://...\")`\n- `rabbitMQ.connect({ url, socketOptions?, clientProperties?, reconnect? })`\n- `rabbitMQ.disconnect()`\n- `rabbitMQ.publish({ exchange, routingKey?, message, headers?, messageId?, type?, appId?, persistent?, mandatory?, client? })`\n- `rabbitMQ.consume({ exchange, queue, routingKey?, handler, prefetch?, retryLimit?, retryBaseDelayMs?, retryBackoffMultiplier?, retryMaxDelayMs?, retryJitterMs?, deadLetterExchange?, deadLetterQueue?, deadLetterRoutingKey?, retryExchange?, retryQueue?, retryRoutingKey?, client? })`\n- `rabbitMQ.createRabbitMQClient()`\n- `rabbitMQ.createScopedRabbitMQClient()`\n- `rabbitMQ.getRetryHeaders(msg)`\n- `rabbitMQ.buildRetryHeaders(retryCount)`\n- `rabbitMQ.withRetryCount(options, retryCount)`\n\nConsumer controls returned by `consume()`:\n\n- `stop()`\n- `disconnect()`\n\n## Reliability Semantics\n\n- Delivery semantics are **at-least-once**.\n- Publishing uses confirm channels (`waitForConfirms`) before returning.\n- Retries use delayed redelivery (message `expiration`) through retry queues.\n- Messages that exceed retry limit are dead-lettered to DLQ exchange/queue.\n- Handlers should be idempotent and safe for reprocessing.\n\n## Default Topology\n\nFor `exchange = app.events` and `queue = worker.q`:\n\n- Main exchange: `app.events` (topic)\n- Main queue: `worker.q` (durable)\n- Retry exchange: `app.events.retry` (topic)\n- Retry queue: `worker.q.retry` (durable)\n- DLQ exchange: `app.events.dlq` (topic)\n- DLQ queue: `worker.q.dlq` (durable)\n\nAll names can be overridden through `consume()` options.\n\n## Operational Guidance\n\n- Set `prefetch` based on downstream capacity (CPU, DB, external APIs).\n- Keep payloads JSON and include an immutable event identifier.\n- Emit metrics for retry count, DLQ volume, consumer lag, and handler latency.\n- Use scoped clients when multiple services/tenants run in one process.\n- Tune reconnect and retry settings per workload and failure profile.\n\n## License\n\nMIT License.\n","readmeFilename":"README.md"}