UNPKG

@alexknips/nestjs-kafka-events

Version:

Lightweight, tested, straight-forward wrapper around KafkaJS and Confluent's Schema Registry.

107 lines 5.04 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); }; Object.defineProperty(exports, "__esModule", { value: true }); exports.KafkaEventFunctionsService = void 0; const common_1 = require("@nestjs/common"); const core_1 = require("@nestjs/core"); const decorators_1 = require("./decorators"); const loggers_1 = require("./loggers"); let KafkaEventFunctionsService = class KafkaEventFunctionsService { constructor(modulesContainer, metadataScanner, kafkaLogger) { this.modulesContainer = modulesContainer; this.metadataScanner = metadataScanner; this.kafkaLogger = kafkaLogger; this.eventHandlerMap = new Map(); this.eventEmitterTopics = new Set(); } explore() { const modules = [...this.modulesContainer.values()]; const providersMap = modules .filter(({ providers }) => providers.size > 0) .map(({ providers }) => providers) .concat(modules .filter(({ controllers }) => controllers.size > 0) .map(({ controllers }) => controllers)); const instanceWrappers = []; providersMap.forEach((map) => { const mapKeys = [...map.keys()]; const r = mapKeys.map((key) => { return map.get(key); }); instanceWrappers.push(...r.filter((i) => !!i.instance)); }); const eventHandlers = instanceWrappers .map(({ instance }) => { const instancePrototype = Object.getPrototypeOf(instance); return this.metadataScanner.scanFromPrototype(instance, instancePrototype, (method) => this.exploreMethodMetadata(instance, instancePrototype, method, decorators_1.KAFKA_EVENT_HANDLER)); }) .reduce((prev, curr) => { return prev.concat(curr); }); const eventEmitters = instanceWrappers .map(({ instance }) => { const instancePrototype = Object.getPrototypeOf(instance); const r = this.metadataScanner.scanFromPrototype(instance, instancePrototype, (method) => this.exploreMethodMetadata(instance, instancePrototype, method, decorators_1.KAFKA_EVENT_EMITTER)); return r; }) .reduce((prev, curr) => { return prev.concat(curr); }); for (const eventHandler of eventHandlers) { this.eventHandlerMap.set(eventHandler.topic, { target: eventHandler.target, methodName: eventHandler.methodName, }); } for (const eventEmitter of eventEmitters) { this.eventEmitterTopics = new Set([ ...Array.from(this.eventEmitterTopics), ...(Array.isArray(eventEmitter.topics) ? eventEmitter.topics : [eventEmitter.topics]), ]); } this.kafkaLogger.debug(`Registered ${this.eventHandlerMap.size} event handlers`); this.kafkaLogger.debug(`Registered ${eventEmitters.length} event emitters with ${this.eventEmitterTopics.size} topics`); } getEventHandlerTopics() { return Array.from(this.eventHandlerMap.keys()); } getEventEmitterTopics() { return Array.from(this.eventEmitterTopics); } async callEventHandler(topic, event) { const handler = this.eventHandlerMap.get(topic); if (!handler) { this.kafkaLogger.warn(`Unable to find handler for topic ${topic}`); return; } return await handler.target[handler.methodName].apply(handler.target, [ event, ]); } exploreMethodMetadata(instance, instancePrototype, methodKey, metadataKey) { const targetCallback = instancePrototype[methodKey]; const handler = Reflect.getMetadata(metadataKey, targetCallback); if (handler == null) { return null; } return Object.assign(Object.assign({}, handler), { target: instance }); } }; KafkaEventFunctionsService = __decorate([ (0, common_1.Injectable)(), __metadata("design:paramtypes", [core_1.ModulesContainer, core_1.MetadataScanner, loggers_1.KafkaLogger]) ], KafkaEventFunctionsService); exports.KafkaEventFunctionsService = KafkaEventFunctionsService; //# sourceMappingURL=kafka-event-functions.service.js.map