@joktec/kafka
Version:
JokTec - Kafka Service
88 lines • 4.67 kB
JavaScript
;
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