UNPKG

@joktec/kafka

Version:
88 lines 4.67 kB
"use strict"; var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; return c > 3 && r && Object.defineProperty(target, key, r), r; }; var __metadata = (this && this.__metadata) || function (k, v) { if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); }; var KafkaConsumerLoader_1; Object.defineProperty(exports, "__esModule", { value: true }); exports.KafkaConsumerLoader = exports.KAFKA_CONSUME_METADATA = void 0; exports.KafkaConsume = KafkaConsume; const core_1 = require("@joktec/core"); const utils_1 = require("@joktec/utils"); const kafka_service_1 = require("../kafka.service"); const consumerInfos = {}; exports.KAFKA_CONSUME_METADATA = 'kafka:consume'; function KafkaConsume(topics, groupId, options = { useEnv: false, mode: 'each' }, conId = core_1.DEFAULT_CON_ID) { return function (target, propertyKey, descriptor) { const serviceName = target.constructor.name; const methodName = propertyKey.toString(); const code = `${serviceName}.${methodName}`; if (!consumerInfos[code]) consumerInfos[code] = []; Reflect.defineMetadata(exports.KAFKA_CONSUME_METADATA, { topics, groupId, options, conId }, descriptor.value); consumerInfos[code].push({ serviceClazz: target.constructor, serviceName, methodName }); }; } let KafkaConsumerLoader = KafkaConsumerLoader_1 = class KafkaConsumerLoader { constructor(configService, logService, kafkaService, reflector, moduleRef) { this.configService = configService; this.logService = logService; this.kafkaService = kafkaService; this.reflector = reflector; this.moduleRef = moduleRef; this.logService.setContext(KafkaConsumerLoader_1.name); } async onModuleInit() { setTimeout(() => this.init(), 5000); } async init() { const infos = Object.values(consumerInfos).flat(); for (const { serviceClazz, methodName } of infos) { const serviceInstance = this.moduleRef.get(serviceClazz, { strict: false }); const method = serviceInstance[methodName]; const metadata = this.reflector.get(exports.KAFKA_CONSUME_METADATA, method); if (metadata) { const options = metadata.options; let topicNames = (0, utils_1.toArray)(metadata.topics); if (options.useEnv) { const newTopicNames = []; for (const topicKey of (0, utils_1.toArray)(metadata.topics)) { const resolveTopic = this.configService.resolveConfigValue(topicKey, false); if (!resolveTopic) { this.logService.warn("`%s` Can't resolve topic name from config: %s", metadata.conId, topicKey); continue; } newTopicNames.push(resolveTopic); } topicNames = newTopicNames; } if (!topicNames.length) { this.logService.error("`%s` Topics are empty or can't resolve any topic names", metadata.conId); return; } const runner = options.mode === 'batch' ? this.kafkaService.consumeBatch.bind(this.kafkaService) : this.kafkaService.consume.bind(this.kafkaService); const handler = options.mode === 'batch' ? async (payload, ...args) => method.call(serviceInstance, payload, ...args) : async (payload, ...args) => method.call(serviceInstance, payload, ...args); await runner(topicNames, metadata.groupId, handler, options, metadata.conId); } } } }; exports.KafkaConsumerLoader = KafkaConsumerLoader; exports.KafkaConsumerLoader = KafkaConsumerLoader = KafkaConsumerLoader_1 = __decorate([ (0, core_1.Injectable)(), __metadata("design:paramtypes", [core_1.ConfigService, core_1.LogService, kafka_service_1.KafkaService, core_1.Reflector, core_1.ModuleRef]) ], KafkaConsumerLoader); //# sourceMappingURL=kafka.consumer.js.map