{"id":20036093,"url":"https://github.com/dollarsignteam/nestjs-amqp","last_synced_at":"2025-05-05T05:31:45.943Z","repository":{"id":38323806,"uuid":"351016347","full_name":"dollarsignteam/nestjs-amqp","owner":"dollarsignteam","description":"NestJS AMQP 1.0","archived":false,"fork":false,"pushed_at":"2022-07-05T09:41:49.000Z","size":997,"stargazers_count":9,"open_issues_count":3,"forks_count":2,"subscribers_count":2,"default_branch":"main","last_synced_at":"2025-04-08T18:21:21.355Z","etag":null,"topics":["amqp","amqp1-0","amqp10","nestjs","typescript"],"latest_commit_sha":null,"homepage":"","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/dollarsignteam.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2021-03-24T09:16:18.000Z","updated_at":"2023-02-27T23:52:53.000Z","dependencies_parsed_at":"2022-08-25T02:21:25.040Z","dependency_job_id":null,"html_url":"https://github.com/dollarsignteam/nestjs-amqp","commit_stats":null,"previous_names":[],"tags_count":23,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dollarsignteam%2Fnestjs-amqp","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dollarsignteam%2Fnestjs-amqp/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dollarsignteam%2Fnestjs-amqp/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dollarsignteam%2Fnestjs-amqp/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/dollarsignteam","download_url":"https://codeload.github.com/dollarsignteam/nestjs-amqp/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":252446332,"owners_count":21749209,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["amqp","amqp1-0","amqp10","nestjs","typescript"],"created_at":"2024-11-13T10:10:50.515Z","updated_at":"2025-05-05T05:31:45.176Z","avatar_url":"https://github.com/dollarsignteam.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# NestJS AMQP 1.0\n\nAMQP 1.0 module for [Nest][5]\n\n[![GitHub Workflow Status](https://img.shields.io/github/workflow/status/dollarsignteam/nestjs-amqp/Node.js%20Package?logo=github)][1]\n[![npm (scoped)](https://img.shields.io/npm/v/@dollarsign/nestjs-amqp?logo=npm)][2]\n[![GitHub license](https://img.shields.io/github/license/dollarsignteam/nestjs-amqp)][3]\n\nIt is based on the [rhea-promise][6] package and inspired by [nest-amqp][7] package.\n\n## Features\n\n- Multiple connection\n- Multiple consumer\n- Concurrency\n\n## Installation\n\n### Yarn\n\n```bash\nyarn add @dollarsign/nestjs-amqp\n```\n\n### NPM\n\n```bash\nnpm install --save @dollarsign/nestjs-amqp\n```\n\n## Usage\n\n### Connection URI\n\n```text\nprotocol://[username:password@]host:port\n```\n\n### Create connection\n\n```typescript\nimport { AMQPModule } from '@dollarsign/nestjs-amqp';\nimport { Module } from '@nestjs/common';\n\nimport { AppController } from './app.controller';\nimport { AppService } from './app.service';\n\n@Module({\n  imports: [\n    AMQPModule.forRoot({\n      connectionUri: 'amqp://admin:admin@localhost:5671',\n    }),\n    AMQPModule.forRootAsync({\n      name: 'custom',\n      useFactory: () =\u003e {\n        return {\n          connectionOptions: {\n            hostname: 'localhost',\n            port: 5672,\n            username: 'admin',\n            password: 'admin',\n            reconnect: true,\n          },\n        };\n      },\n    }),\n  ],\n  controllers: [AppController],\n  providers: [AppService],\n})\nexport class AppModule {}\n```\n\n### Lifecycle hook `enableShutdownHooks` method\n\n```typescript\nasync function bootstrap(): Promise\u003cvoid\u003e {\n  const app = await NestFactory.create(AppModule, { logger });\n  const port = process.env.APP_PORT || 3000;\n  app.enableShutdownHooks();\n  await app.listen(port);\n}\n```\n\n### Send and Receive message\n\n```typescript\nimport { Logger } from '@dollarsign/logger';\nimport { Consumer, MessageControl, ProducerService, SendOptions } from '@dollarsign/nestjs-amqp';\nimport { delay } from '@dollarsign/utils';\nimport { Injectable } from '@nestjs/common';\n\nimport { SimpleMessage } from './interfaces';\n\n@Injectable()\nexport class AppService {\n  private readonly delayTime = 2000;\n  private readonly logger = new Logger({\n    name: AppService.name,\n    displayFilePath: false,\n  });\n\n  constructor(private readonly producer: ProducerService) {}\n\n  getHello(): string {\n    return 'Hello World!';\n  }\n\n  async sendMessage(): Promise\u003cstring\u003e {\n    const body = { timestamp: new Date().toISOString() };\n    const result = await this.producer.send\u003cSimpleMessage\u003e('demo1', body);\n    const status = result.status ? 'success' : 'failed';\n    return `Send to demo1 of default connection: ${status}`;\n  }\n\n  getRandomGroupId(): string {\n    const index = Math.floor(Math.random() * 100) % 2;\n    const groups = ['GroupA', 'GroupB'];\n    return groups[index];\n  }\n\n  async sendMessageWithOptions(): Promise\u003cstring\u003e {\n    const messageId = new Date().getTime();\n    const groupId = this.getRandomGroupId();\n    const options: SendOptions = {\n      connectionName: 'custom',\n      group_id: groupId,\n      correlation_id: `GROUP:${groupId}`,\n      message_id: messageId,\n      message_annotations: {\n        JMSMessageID: 'A',\n      },\n    };\n    const body = { timestamp: new Date().toISOString() };\n    const result = await this.producer.send\u003cSimpleMessage\u003e('demo2', body, options);\n    const status = result.status ? 'success' : 'failed';\n    return `Send to demo2 of custom connection: ${status}`;\n  }\n\n  async sendError(): Promise\u003cstring\u003e {\n    const message = { timestamp: new Date().toISOString() };\n    const result = await this.producer.send\u003cSimpleMessage\u003e('demo3', message);\n    const status = result.status ? 'success' : 'failed';\n    return `Send to demo3 of default connection: ${status}`;\n  }\n\n  @Consumer('demo1')\n  async receiveMessage(body: SimpleMessage): Promise\u003cvoid\u003e {\n    this.logger.info('Received from demo1', body);\n    await delay(this.delayTime);\n  }\n\n  @Consumer('demo2', { connectionName: 'custom', concurrency: 2 })\n  async receiveMessageWithOptions(body: SimpleMessage, control: MessageControl): Promise\u003cvoid\u003e {\n    const { message_id, group_id } = control.message;\n    this.logger.info(`Received from demo2 id: ${message_id}, ${group_id}`, body);\n    await delay(this.delayTime);\n    control.accept();\n  }\n\n  @Consumer('demo3')\n  async receiveError(body: SimpleMessage): Promise\u003cvoid\u003e {\n    this.logger.info('Received from demo3', body);\n    await delay(this.delayTime);\n    throw new Error(`Created at ${body.timestamp}`);\n  }\n}\n```\n\n### Consumer options\n\n```typescript\nexport interface ConsumerOptions {\n  // consumer count\n  concurrency?: number;\n  // connection name\n  connectionName?: string;\n  // number of messages to be processed at one time of each consumer\n  parallelMessageProcessing?: number;\n}\n```\n\n### Message control\n\n```typescript\n// accept the message\ncontrol.accept();\n\n// reject the message\ncontrol.reject('Processing failed');\n\n// release the message\ncontrol.release();\n\n// get context\nconst context = control.context;\n\n// get message\nconst context = control.message;\n```\n\n## Contributing\n\nContributions welcome! See [Contributing][4].\n\n## Author\n\nDollarsign\n\n## License\n\nLicensed under the MIT License - see the [LICENSE][3] file for details.\n\n[1]: https://github.com/dollarsignteam/nestjs-amqp\n[2]: https://www.npmjs.com/package/@dollarsign/nestjs-amqp\n[3]: https://github.com/dollarsignteam/nestjs-amqp/blob/main/LICENSE\n[4]: https://github.com/dollarsignteam/nestjs-amqp/blob/main/CONTRIBUTING.md\n[5]: https://github.com/nestjs/nest\n[6]: https://www.npmjs.com/package/rhea-promise\n[7]: https://github.com/team-supercharge/nest-amqp\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdollarsignteam%2Fnestjs-amqp","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdollarsignteam%2Fnestjs-amqp","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdollarsignteam%2Fnestjs-amqp/lists"}