UNPKG

@vpriem/kafka-broker

Version:

Easily compose and manage your kafka resources in one place

115 lines 4.74 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.Broker = void 0; const events_1 = __importDefault(require("events")); const confluent_schema_registry_1 = require("@kafkajs/confluent-schema-registry"); const buildConfig_1 = require("./buildConfig"); const ProducerContainer_1 = require("./ProducerContainer"); const SubscriptionContainer_1 = require("./SubscriptionContainer"); const SubscriptionList_1 = require("./SubscriptionList"); const BrokerError_1 = require("./BrokerError"); const encodeMessages_1 = require("./encodeMessages"); const KafkaContainer_1 = require("./KafkaContainer"); const buildContainerConfig_1 = require("./buildContainerConfig"); const isConfig = (config) => config.config !== undefined; class Broker extends events_1.default { config; registry; producers; subscriptions; constructor(config) { super({ captureRejections: true }); this.config = isConfig(config) ? (0, buildConfig_1.buildConfig)(config) : (0, buildContainerConfig_1.buildContainerConfig)(config); const kafka = new KafkaContainer_1.KafkaContainer(this.config.kafka); if (this.config.schemaRegistry) { this.registry = new confluent_schema_registry_1.SchemaRegistry(this.config.schemaRegistry, this.config.schemaRegistry.options); } this.producers = new ProducerContainer_1.ProducerContainer(kafka, this.config.producers); [ 'producer.connect', 'producer.disconnect', 'producer.network.request', 'producer.network.request_timeout', 'producer.network.request_queue_size', 'producer.batch.start', ].forEach((eventName) => { this.producers.on(eventName, (event) => this.emit(eventName, event)); }); this.subscriptions = new SubscriptionContainer_1.SubscriptionContainer(kafka, this, this.config.subscriptions, this.registry).on('error', (error) => this.emit('error', error)); [ 'consumer.heartbeat', 'consumer.commit_offsets', 'consumer.group_join', 'consumer.fetch_start', 'consumer.fetch', 'consumer.start_batch_process', 'consumer.end_batch_process', 'consumer.connect', 'consumer.disconnect', 'consumer.stop', 'consumer.crash', 'consumer.rebalancing', 'consumer.received_unsubscribed_topics', 'consumer.network.request', 'consumer.network.request_timeout', 'consumer.network.request_queue_size', ].forEach((eventName) => { this.subscriptions.on(eventName, (event) => this.emit(eventName, event)); }); } namespace() { return this.config.namespace; } schemaRegistry() { return this.registry; } async publish(publicationName, messageOrMessages) { const publicationConfig = this.config.publications[publicationName]; if (typeof publicationConfig === 'undefined') { throw new BrokerError_1.BrokerError(`Unknown publication "${publicationName}"`); } const { config, producer: producerName, topic, messageConfig, schema, } = publicationConfig; let messages = Array.isArray(messageOrMessages) ? messageOrMessages : [messageOrMessages]; if (messageConfig) { messages = messages.map((message) => ({ ...messageConfig, ...message, })); } const encodedMessages = await (0, encodeMessages_1.encodeMessages)(messages, schema, this.registry); if (Array.isArray(topic)) { return this.producers.publish(producerName, { ...config, topicMessages: topic.map((t) => ({ topic: t, messages: encodedMessages, })), }); } return this.producers.publish(producerName, { ...config, topic, messages: encodedMessages, }); } subscription(name) { return this.subscriptions.create(name); } subscriptionList() { const names = Object.keys(this.config.subscriptions); return new SubscriptionList_1.SubscriptionList(...names.map((name) => this.subscription(name))); } async shutdown() { await this.subscriptions.disconnect(); await this.producers.disconnect(); } } exports.Broker = Broker; //# sourceMappingURL=Broker.js.map