@alexknips/nestjs-kafka-events
Version:
Lightweight, tested, straight-forward wrapper around KafkaJS and Confluent's Schema Registry.
107 lines • 5.04 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);
};
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