@vpriem/kafka-broker
Version:
Easily compose and manage your kafka resources in one place
115 lines • 4.74 kB
JavaScript
;
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