I made the example from Using packages from npm and that worked. So I want to try another one. I want to interact with Apache Kafka with the KafkaJS package.
When I try to create a consumer in this way:
fun createConsumer(): dynamic {
return js(
“kafka.consumer({groupID: ‘test-group’ })”
)
}
And call them from NodeJS I get the following error:
ReferenceError: kafka is not defined
The KafkaJS initially requires to create a Kafka instance, and only after that you can call a producer and consumer on instance.
unfortunately KafkaJS uses @types/nodejs, which can`t generated by dukat, but there is a small trick how to solve that.
-
Add KotlinX NodeJS as dependency
-
Run task nodeJsGenerateExternals and find the declarations in the externals folder
-
Copy the generated files inside your sources
-
Add to index.module_kafkajs.kt on top @file:JsModule(“kafkajs”)
-
Move all typealiases (non external) to other file (e.g. index.module.kafkajs2.kt)
And now them implementation is straight forward.
class KafkaTableTopicConfig (var kafkaConfig: KafkaConfig) {
var kafkaTopic: String = ""
@JsName("createKafkaConsumer")
fun createKConsumer() : dynamic {
return KafkaFactory().createKafkaConsumer(this@KafkaTableTopicConfig)
}
@JsName("createKafkaProducer")
fun createKProducer() : dynamic {
return KafkaFactory().createKProducer(this@KafkaTableTopicConfig)
}
}
And now the Factory:
class KafkaFactory {
fun createKafkaConsumer(tableTopicConfig: KafkaTableTopicConfig): dynamic {
return KafkaConsumer(tableTopicConfig).createConsumer()
}
fun createKafkaProducer(tableTopicConfig: KafkaTableTopicConfig): dynamic {
return KafkaProducer(tableTopicConfig).createProducer()
}
}
and then the producer:
class KafkaProducer (private val tableTopicConfig: KafkaTableTopicConfig) {
private var producer: dynamic = ""
fun createProducer(): dynamic {
val kafkaOptions: KafkaConfig = js("({})")
kafkaOptions.brokers = arrayOf(tableTopicConfig.kafkaConfig.bootstrapServer)
kafkaOptions.clientId = "7Facette_Producer_" + (0..36).shuffled().first().toString()
producer = Kafka(kafkaOptions).producer()
return producer
}
}
After a successfull build you can use that from your nodejs code.