{"_id":"@buka/nestjs-kafka","_rev":"4-a7738e53d9d094c3040b2c1c8b2231b0","name":"@buka/nestjs-kafka","dist-tags":{"latest":"1.1.2"},"versions":{"1.0.1-alpha.0":{"name":"@buka/nestjs-kafka","version":"1.0.1-alpha.0","description":"NestJS module supporting multiple connections implemented using KafkaJS","packageManager":"pnpm@8.14.0","main":"dist/umd/src/index.js","module":"dist/esm/src/index.js","types":"dist/esm/src/index.d.ts","keywords":["nestjs","nest","kafka","kafkajs","kafka-js","kafka.js","kafka-node","kafka-nodejs","node","nodejs","module","kafka-module","kafkajs-module"],"author":{"name":"Val.istar.Guo","email":"val.istar.guo@gmail.com"},"license":"MIT","homepage":"https://github.com/buka-lnc/npm.nestjs-kafka/#readme","bugs":{"url":"https://github.com/buka-lnc/npm.nestjs-kafka/issues"},"repository":{"type":"git","url":"git+https://github.com/buka-lnc/npm.nestjs-kafka.git"},"devDependencies":{"@buka/eslint-config":"^1.5.0","@commitlint/cli":"^18.2.0","@commitlint/config-conventional":"^18.1.0","@jest/globals":"^29.7.0","@nestjs/common":"^10.3.0","@nestjs/core":"^10.3.0","@rushstack/eslint-patch":"^1.5.1","@types/node":"^20.9.0","@typescript-eslint/eslint-plugin":"^6.10.0","@typescript-eslint/parser":"^6.10.0","eslint":"^8.53.0","husky":"^8.0.3","is-ci":"^3.0.1","jest":"^29.7.0","jest-mock":"^29.7.0","standard-version":"^9.5.0","ts-jest":"^29.1.1","ts-node":"^10.9.1","ts-patch":"^3.0.2","typescript":"^5.2.2","typescript-transform-paths":"^3.4.6"},"peerDependencies":{"@nestjs/common":"^9 || ^10","@nestjs/core":"^9 || ^10"},"dependencies":{"kafkajs":"^2.2.4"},"scripts":{"build":"npm run clean && ./build/build.sh","clean":"rm -rf ./dist/*","dev":"npm run clean && ./build/watch.sh","release":"standard-version","release:alpha":"standard-version --prerelease alpha","test":"jest"},"_id":"@buka/nestjs-kafka@1.0.1-alpha.0","_integrity":"sha512-D8gIlBPXgBcTlt/NsjtrxQiKNrpZHuFx94T9A1XL3OGHXtHRVRO2h8zYdu0AVzw1Pq1LpAuGcSFoNvKbJptBXA==","_resolved":"/private/var/folders/1k/vk9cb8mx55q79y3p3hxptxbh6bf95j/T/72036e7bef610915401829458d4733b9/buka-nestjs-kafka-1.0.1-alpha.0.tgz","_from":"file:buka-nestjs-kafka-1.0.1-alpha.0.tgz","_nodeVersion":"18.17.0","_npmVersion":"9.6.7","dist":{"integrity":"sha512-D8gIlBPXgBcTlt/NsjtrxQiKNrpZHuFx94T9A1XL3OGHXtHRVRO2h8zYdu0AVzw1Pq1LpAuGcSFoNvKbJptBXA==","shasum":"8ab68000d48e926bc2b431e28c31893399c70b09","tarball":"https://registry.npmjs.org/@buka/nestjs-kafka/-/nestjs-kafka-1.0.1-alpha.0.tgz","fileCount":109,"unpackedSize":58233,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIANbRm4a+a8UYo4DIeuiFFrMHV9Y0QIlXYjSWI9YxrLFAiBm0cqjyxOmCSWKch78QW8KOx4ZyhUiv5lLkXwrd2E6mA=="}]},"_npmUser":{"name":"val.istar.guo","email":"val.istar.guo@gmail.com"},"directories":{},"maintainers":[{"name":"val.istar.guo","email":"val.istar.guo@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/nestjs-kafka_1.0.1-alpha.0_1705389055803_0.3082666651946162"},"_hasShrinkwrap":false,"deprecated":"Please use Nestjs microservice instead"},"1.1.0":{"name":"@buka/nestjs-kafka","version":"1.1.0","description":"NestJS module supporting multiple connections implemented using KafkaJS","packageManager":"pnpm@8.14.0","main":"dist/umd/src/index.js","module":"dist/esm/src/index.js","types":"dist/esm/src/index.d.ts","keywords":["nestjs","nest","kafka","kafkajs","kafka-js","kafka.js","kafka-node","kafka-nodejs","node","nodejs","module","kafka-module","kafkajs-module"],"author":{"name":"Val.istar.Guo","email":"val.istar.guo@gmail.com"},"license":"MIT","homepage":"https://github.com/buka-lnc/npm.nestjs-kafka/#readme","bugs":{"url":"https://github.com/buka-lnc/npm.nestjs-kafka/issues"},"repository":{"type":"git","url":"git+https://github.com/buka-lnc/npm.nestjs-kafka.git"},"devDependencies":{"@buka/eslint-config":"^1.5.0","@commitlint/cli":"^18.2.0","@commitlint/config-conventional":"^18.1.0","@jest/globals":"^29.7.0","@nestjs/common":"^10.3.0","@nestjs/core":"^10.3.0","@rushstack/eslint-patch":"^1.5.1","@types/node":"^20.9.0","@typescript-eslint/eslint-plugin":"^6.10.0","@typescript-eslint/parser":"^6.10.0","eslint":"^8.53.0","husky":"^8.0.3","is-ci":"^3.0.1","jest":"^29.7.0","jest-mock":"^29.7.0","standard-version":"^9.5.0","ts-jest":"^29.1.1","ts-node":"^10.9.1","ts-patch":"^3.0.2","typescript":"^5.2.2","typescript-transform-paths":"^3.4.6"},"peerDependencies":{"@nestjs/common":"^9 || ^10","@nestjs/core":"^9 || ^10"},"dependencies":{"kafkajs":"^2.2.4"},"scripts":{"build":"npm run clean && ./build/build.sh","clean":"rm -rf ./dist/*","dev":"npm run clean && ./build/watch.sh","release":"standard-version","release:alpha":"standard-version --prerelease alpha","test":"jest"},"_id":"@buka/nestjs-kafka@1.1.0","_integrity":"sha512-cppeY1bDdHqdbXeRnDSwuD1pHUEcR9JQ0mGIM+n87ukQ+4MUUoE4AqVCB50EpyocqoLA2VZQAVCNJIwmKJ9wqw==","_resolved":"/tmp/562742dd285360618d2905a0538a4b69/buka-nestjs-kafka-1.1.0.tgz","_from":"file:buka-nestjs-kafka-1.1.0.tgz","_nodeVersion":"18.16.0","_npmVersion":"9.5.1","dist":{"integrity":"sha512-cppeY1bDdHqdbXeRnDSwuD1pHUEcR9JQ0mGIM+n87ukQ+4MUUoE4AqVCB50EpyocqoLA2VZQAVCNJIwmKJ9wqw==","shasum":"913ff60da02f7b5fbc9a8357e0545ce997e3a663","tarball":"https://registry.npmjs.org/@buka/nestjs-kafka/-/nestjs-kafka-1.1.0.tgz","fileCount":117,"unpackedSize":65991,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCVgI1PK3pPEGprztSVpWYta4DxDOjKP/kPH84gvCCq2AIhAJbA81U5HPRv9aDt1C6/M8SsT/rKiRZj/3NAFW+o4fie"}]},"_npmUser":{"name":"val.istar.guo","email":"val.istar.guo@gmail.com"},"directories":{},"maintainers":[{"name":"val.istar.guo","email":"val.istar.guo@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/nestjs-kafka_1.1.0_1706036885506_0.4643530387913919"},"_hasShrinkwrap":false,"deprecated":"Please use Nestjs microservice instead"},"1.1.1":{"name":"@buka/nestjs-kafka","version":"1.1.1","description":"NestJS module supporting multiple connections implemented using KafkaJS","packageManager":"pnpm@8.14.0","main":"dist/umd/src/index.js","module":"dist/esm/src/index.js","types":"dist/esm/src/index.d.ts","scripts":{"build":"npm run clean && ./build/build.sh","clean":"rm -rf ./dist/*","dev":"npm run clean && ./build/watch.sh","prepare":"ts-patch install -s && is-ci || husky install","prepublishOnly":"npm run build","release":"standard-version","release:alpha":"standard-version --prerelease alpha","test":"jest"},"keywords":["nestjs","nest","kafka","kafkajs","kafka-js","kafka.js","kafka-node","kafka-nodejs","node","nodejs","module","kafka-module","kafkajs-module"],"author":{"name":"Val.istar.Guo","email":"val.istar.guo@gmail.com"},"license":"MIT","homepage":"https://github.com/buka-lnc/npm.nestjs-kafka/#readme","bugs":{"url":"https://github.com/buka-lnc/npm.nestjs-kafka/issues"},"repository":{"type":"git","url":"git+https://github.com/buka-lnc/npm.nestjs-kafka.git"},"devDependencies":{"@buka/eslint-config":"^1.5.0","@commitlint/cli":"^18.2.0","@commitlint/config-conventional":"^18.1.0","@jest/globals":"^29.7.0","@nestjs/common":"^10.3.0","@nestjs/core":"^10.3.0","@rushstack/eslint-patch":"^1.5.1","@types/node":"^20.9.0","@typescript-eslint/eslint-plugin":"^6.10.0","@typescript-eslint/parser":"^6.10.0","eslint":"^8.53.0","husky":"^8.0.3","is-ci":"^3.0.1","jest":"^29.7.0","jest-mock":"^29.7.0","standard-version":"^9.5.0","ts-jest":"^29.1.1","ts-node":"^10.9.1","ts-patch":"^3.0.2","typescript":"^5.2.2","typescript-transform-paths":"^3.4.6"},"peerDependencies":{"@nestjs/common":"^9 || ^10","@nestjs/core":"^9 || ^10"},"dependencies":{"kafkajs":"^2.2.4"},"_id":"@buka/nestjs-kafka@1.1.1","gitHead":"d8b2c56452324e733a8821eef8c9cee96ab46773","_nodeVersion":"18.19.0","_npmVersion":"10.2.3","dist":{"integrity":"sha512-i5802pJyIA3dEWAW58EB/04HssBD08TPWKjQ5lh9iJmsLAD+RlBUCCGT6+MAbCRaX0zmEzXzPAUZG1JpxAixYQ==","shasum":"b623b64c7beda0351840fecc286600dcbed0290d","tarball":"https://registry.npmjs.org/@buka/nestjs-kafka/-/nestjs-kafka-1.1.1.tgz","fileCount":121,"unpackedSize":72153,"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@buka%2fnestjs-kafka@1.1.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDK8zrBKqT/ZFDBcvkoBjx8Z5cAYBAzaelv1EUdQ1y6ZwIhAITLQLczf4Q00IWnmdIOz1n9h7wJE2dWqJGsGE9YvEf/"}]},"_npmUser":{"name":"val.istar.guo","email":"val.istar.guo@gmail.com"},"directories":{},"maintainers":[{"name":"val.istar.guo","email":"val.istar.guo@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/nestjs-kafka_1.1.1_1706462440584_0.3410842043804265"},"_hasShrinkwrap":false,"deprecated":"Please use Nestjs microservice instead"},"1.1.2":{"name":"@buka/nestjs-kafka","version":"1.1.2","description":"NestJS module supporting multiple connections implemented using KafkaJS","packageManager":"pnpm@8.14.0","main":"dist/umd/src/index.js","module":"dist/esm/src/index.js","types":"dist/esm/src/index.d.ts","scripts":{"build":"npm run clean && ./build/build.sh","clean":"rm -rf ./dist/*","dev":"npm run clean && ./build/watch.sh","prepare":"ts-patch install -s && is-ci || husky install","prepublishOnly":"npm run build","release":"standard-version","release:alpha":"standard-version --prerelease alpha","test":"jest"},"keywords":["nestjs","nest","kafka","kafkajs","kafka-js","kafka.js","kafka-node","kafka-nodejs","node","nodejs","module","kafka-module","kafkajs-module"],"author":{"name":"Val.istar.Guo","email":"val.istar.guo@gmail.com"},"license":"MIT","homepage":"https://github.com/buka-lnc/npm.nestjs-kafka/#readme","bugs":{"url":"https://github.com/buka-lnc/npm.nestjs-kafka/issues"},"repository":{"type":"git","url":"git+https://github.com/buka-lnc/npm.nestjs-kafka.git"},"devDependencies":{"@buka/eslint-config":"^1.5.0","@commitlint/cli":"^18.2.0","@commitlint/config-conventional":"^18.1.0","@jest/globals":"^29.7.0","@nestjs/common":"^10.3.0","@nestjs/core":"^10.3.0","@rushstack/eslint-patch":"^1.5.1","@types/node":"^20.9.0","@typescript-eslint/eslint-plugin":"^6.10.0","@typescript-eslint/parser":"^6.10.0","eslint":"^8.53.0","husky":"^8.0.3","is-ci":"^3.0.1","jest":"^29.7.0","jest-mock":"^29.7.0","standard-version":"^9.5.0","ts-jest":"^29.1.1","ts-node":"^10.9.1","ts-patch":"^3.0.2","typescript":"^5.2.2","typescript-transform-paths":"^3.4.6"},"peerDependencies":{"@nestjs/common":"^9 || ^10","@nestjs/core":"^9 || ^10"},"dependencies":{"kafkajs":"^2.2.4"},"_id":"@buka/nestjs-kafka@1.1.2","gitHead":"ae9e96f8cf7b9c478793107b9708822cb66edf69","_nodeVersion":"18.20.2","_npmVersion":"10.5.0","dist":{"integrity":"sha512-IcxZW1LMBuSQJGpMYze0/UflfFFW30ce2OdOEU9i8XndkGxuSuzt6UEndEkKORtQiT2VAawrezgRGWuymDDwLQ==","shasum":"bff4c6ece55cd3e26e7bfb68fb4db20490df5a9f","tarball":"https://registry.npmjs.org/@buka/nestjs-kafka/-/nestjs-kafka-1.1.2.tgz","fileCount":121,"unpackedSize":72542,"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@buka%2fnestjs-kafka@1.1.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCck+ONJcnN1imOTwI7Kig9QnskwHmPqyhJ98KaekFvCwIhALLSzvgjsZqs89sNJaLYM+ilmOGwjd5HsnCcOjQYS7kX"}]},"_npmUser":{"name":"val.istar.guo","email":"val.istar.guo@gmail.com"},"directories":{},"maintainers":[{"name":"val.istar.guo","email":"val.istar.guo@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/nestjs-kafka_1.1.2_1713622003842_0.028176929644996296"},"_hasShrinkwrap":false,"deprecated":"Please use Nestjs microservice instead"}},"time":{"created":"2024-01-16T07:10:55.673Z","1.0.1-alpha.0":"2024-01-16T07:10:56.069Z","modified":"2024-04-20T14:10:35.696Z","1.1.0":"2024-01-23T19:08:05.696Z","1.1.1":"2024-01-28T17:20:40.775Z","1.1.2":"2024-04-20T14:06:43.983Z"},"maintainers":[{"name":"val.istar.guo","email":"val.istar.guo@gmail.com"}],"description":"NestJS module supporting multiple connections implemented using KafkaJS","homepage":"https://github.com/buka-lnc/npm.nestjs-kafka/#readme","keywords":["nestjs","nest","kafka","kafkajs","kafka-js","kafka.js","kafka-node","kafka-nodejs","node","nodejs","module","kafka-module","kafkajs-module"],"repository":{"type":"git","url":"git+https://github.com/buka-lnc/npm.nestjs-kafka.git"},"author":{"name":"Val.istar.Guo","email":"val.istar.guo@gmail.com"},"bugs":{"url":"https://github.com/buka-lnc/npm.nestjs-kafka/issues"},"license":"MIT","readme":"# @buka/nestjs-kafka\n\n[npm]: https://www.npmjs.com/package/@buka/nestjs-kafka\n\n[![version](https://img.shields.io/npm/v/@buka/nestjs-kafka.svg?logo=npm&style=for-the-badge)][npm]\n[![downloads](https://img.shields.io/npm/dm/@buka/nestjs-kafka.svg?logo=npm&style=for-the-badge)][npm]\n[![dependencies](https://img.shields.io/librariesio/release/npm/@buka/nestjs-kafka?logo=npm&style=for-the-badge)][npm]\n[![license](https://img.shields.io/npm/l/@buka/nestjs-kafka.svg?logo=github&style=for-the-badge)][npm]\n[![Codecov](https://img.shields.io/codecov/c/gh/buka-lnc/npm.nestjs-kafka?logo=codecov&token=PLF0DT6869&style=for-the-badge)](https://codecov.io/gh/buka-lnc/npm.nestjs-kafka)\n\n**Warning!!! This packages had be deprecated. Nestjs microservice has fully implemented this function. There is no reason to maintain this package.**\n\nThis is a nestJS module implemented using KafkaJS.\nThat support multiple connections and fits the coding style of nestjs.\n\n## Usage\n\nImport `KafkaModule.forRoot` to `AppModule`:\n\n```typescript\n// app.module.js\nimport { Module } from \"@nestjs/common\";\nimport { KafkaModule } from \"@buka/nestjs-kafka\";\n\n@Module({\n  imports: [\n    KafkaModule.forRoot({\n      name: \"my-kafka\",\n      groupId: \"my-group-id\",\n      clientId: \"my-client-id\",\n      brokers: [\"my_kafka_host:9092\"],\n    }),\n  ],\n})\nexport class AppModule {}\n```\n\n### KafkaConsumer\n\nCreate a provider named `AppConsumer` that consume messages：\n\n```typescript\n// app.consumer.js\n@Injectable()\n@KafkaConsumer()\nexport class AppConsumer {\n  @KafkaConsume(\"my-topic\")\n  async finishTask(@KafkaMessage() message: string): Promise<void> {\n    // do something\n    console.log(message);\n  }\n\n  @KafkaConsume(\"other-topic\", { json: true })\n  async finishTask(\n    @KafkaMessage() message: Record<string, any>\n  ): Promise<void> {\n    // do something\n    console.log(message);\n  }\n}\n```\n\n> `AppConsumer` and `AppService` can be merged into one provider, but writing them separately will make the code clearer.\n\nThen, append `AppConsumer` to `AppModule`:\n\n```typescript\nimport { Module } from \"@nestjs/common\";\nimport { AppConsumer } from \"./app.consumer\";\n\n@Module({\n  imports: [\n    /* ... */\n  ],\n  providers: [AppConsumer],\n})\nexport class AppModule {}\n```\n\n### KafkaProducer\n\n`KafkaProducer` will connect on module init and disconnect on module destroy.\nTo use this, import `KafkaModule.forProducer(options)` to `AppModule`:\n\n```typescript\n// app.module.js\nimport { Module } from \"@nestjs/common\";\nimport { KafkaModule, Partitioners } from \"@buka/nestjs-kafka\";\nimport AppService from \"./app.service\";\n\n@Module({\n  imports: [\n    KafkaModule.forRoot({\n      name: \"my-kafka\",\n      groupId: \"my-group-id\",\n      clientId: \"my-client-id\",\n      brokers: [\"my_kafka_host:9092\"],\n    }),\n    KafkaModule.forProducer({\n      name: \"my-kafka\",\n      createPartitioner: Partitioners.LegacyPartitioner,\n    }),\n  ],\n  provider: [AppService],\n})\nexport class AppModule {}\n```\n\n> The `options` of `.forProducer` is exactly the same as [the `options` of `kafka.producer` in KafkaJS](https://kafka.js.org/docs/producing)。\n\nInject `KafkaProducer` to your `AppService`:\n\n```typescript\n// app.service.js\n@Injectable()\nexport class AppService {\n  constructor(\n    @InjectKafkaProducer('my-kafka')\n    private readonly producer: KafkaProducer\n  ) {}\n\n  async sendMessage() {\n    this.producer.send({\n      topic: 'kafka-topic'\n      messages: [{ value: 'Hello Kafka' }]\n    })\n  }\n}\n```\n\nThe `.send` function of `KafkaProducer` is exactly the same as [the `.send` function of KafkaJS](https://kafka.js.org/docs/producing#producing-messages)。\n\n### KafkaService\n\nUsing the `KafkaService`, you can create `consumer` and `producer` like plain KafkaJS.\n\n```typescript\n// app.service.js\nimport { OnModuleDestroy, OnModuleInit } from \"@nestjs/common\";\nimport { Producer, ProducerRecord, RecordMetadata } from \"kafkajs\";\nimport { KafkaService } from \"@buka/nestjs-kafka\";\n\n@Injectable()\nexport class AppService implements OnModuleInit, OnModuleDestroy {\n  producer!: Producer;\n  consumer!: Consumer;\n\n  constructor(private readonly kafka: KafkaService) {}\n\n  async onModuleInit(): Promise<void> {\n    this.producer = this.kafka.producer();\n    await this.producer.connect();\n\n    this.consumer = this.kafka.consumer({\n      groupId: \"my-group-id\",\n    });\n\n    this.consumer.subscribe({ topic: \"kafka-topic\" });\n    this.consumer.run({\n      eachMessage: async (context) => {\n        // do somethings\n      },\n    });\n  }\n\n  async onModuleDestroy(): Promise<void> {\n    await this.producer.disconnect();\n    await this.consumer.disconnect();\n  }\n}\n```\n\n## Q&A\n\n### `KafkaConsumer` not working with `CreateRequestContext` of `mikro-orm`\n\nIf you don't pay attention to the order of `CreateRequestContext` decorators,\nyou may have problems with any of other method decorators, not only `@buka/nestjs-kafka`.\n\n```typescript\nimport { Injectable } from \"@nestjs/common\";\nimport { KafkaConsumer, KafkaConsume, KafkaMessage } from \"@buka/nestjs-kafka\";\nimport { CreateRequestContext } from \"@mikro-orm/mysql\";\n\n// app.consumer.js\n@Injectable()\n@KafkaConsumer()\nexport class AppConsumer {\n  @CreateRequestContext()\n  // !! KafkaConsume decorator will not work !!\n  @KafkaConsume(\"my-topic\")\n  async finishTask(@KafkaMessage() message: string): Promise<void> {\n    console.log(message);\n  }\n}\n```\n\nThere are two solutions:\n\n1. [recommend] written as two functions:\n\n   ```typescript\n   @Injectable()\n   @KafkaConsumer()\n   export class AppConsumer {\n     @KafkaConsume(\"my-topic\")\n     async consumeMessage(@KafkaMessage() message: string): Promise<void> {\n       // ... filter and format message\n       this.finishTask(JSON.parse(message))\n     }\n\n     @CreateRequestContext()\n     async finishTask(task: Task): Promise<void> {\n       // do something\n       console.log(task);\n     }\n   ```\n\n1. Pay attention to the order of `CreateRequestContext`:\n\n   ```typescript\n   @Injectable()\n   @KafkaConsumer()\n   export class AppConsumer {\n     @KafkaConsume(\"my-topic\")\n     // use CreateRequestContext as the last decorator\n     @CreateRequestContext()\n     async finishTask(@KafkaMessage() message: string): Promise<void> {\n       // do something\n       console.log(message);\n     }\n   }\n   ```\n","readmeFilename":"README.md"}