Patrick Doering
08/31/2020, 7:21 PMturansky
08/31/2020, 9:33 PM// declarations
@JsModule("kafka")
external object kafka {
fun consumer(options: ConsumerOptions): dynamic
}
external interface ConsumerOptions {
var groupID: String
}
// code
fun createConsumer(): dynamic {
val options: ConsumerOptions = js("({})")
options.groupID = "test-group"
return kafka.consumer(options)
}
turansky
08/31/2020, 9:34 PMPatrick Doering
09/01/2020, 5:02 AMIlya Goncharov [JB]
09/01/2020, 8:04 AMconsumer
but Kafka
So in fact in external declaration you have
@file:JsModule(“kafkajs”) // file means that all further external declarations will be found as a subobject on “kafkajs”
external object Kafka {
fun consumer(...)
}
Patrick Doering
09/01/2020, 8:15 AM@JsModule("kafkajs")
@JsNonModule
external object Kafka {
fun consumer(options: ConsumerOptions): dynamic
}
external interface ConsumerOptions {
var groupID: String
}
fun createConsumer(): dynamic {
val options: ConsumerOptions = js("({})")
options.groupID = "test-group"
return Kafka.consumer(options)
}
But with this I get the TypeError.
TypeError: $module$kafkajs.consumer is not a functionIlya Goncharov [JB]
09/01/2020, 8:38 AM@JsModule
. It means that all your external object looked as a JsModule. It is similar with JS code
const { consumer } = require("kafkajs")
But you need if I understand correctly
const { Kafka } = require("kafkajs")
const consumer = Kafka.consumer
For this you can mark all file with @JsModule
telling that all external declarations are part of JsModule
@file:JsModule("kafkajs") // file: is important!
external object Kafka {
fun consumer(options: ConsumerOptions): dynamic
}
external interface ConsumerOptions {
var groupID: String
}
Patrick Doering
09/01/2020, 9:05 AM@JsModule
how can I pass the configuration options to the consumer? I mean the original function is not usable any more.
fun createConsumer(): dynamic {
val options: ConsumerOptions = js("({})")
options.groupID = "test-group"
return Kafka.consumer(options)
}
And how should my call from NodeJS look like?
Please excuse the many questions I am completely new in Kotlin / JS and I want to learn and understand it.Ilya Goncharov [JB]
09/01/2020, 9:09 AM@JsModule
it means that you can add only external declarations to this file, you can move non-external fun to another file.
In all other questions it should be completely the sameturansky
09/01/2020, 9:48 AMPatrick Doering
09/01/2020, 10:17 AMconst kafka = new Kafka({
clientId: 'my-app',
brokers: ['kafka1:9092', 'kafka2:9092']
})
const producer = kafka.producer()
const consumer = kafka.consumer({ groupId: 'test-group' })
If I understand you right I have to implement it in that way:
File: KafkaImpl.kt
@file:JsModule("kafkajs") // file: is important!
package <myCoolPackage>
external object Kafka {
fun producer(): dynamic
fun consumer(options: ConsumerOptions): dynamic
}
external interface ConsumerOptions {
var groupID: String
}
and another File: KafkaInitialisation.kt
fun createConsumer(): dynamic {
val options: ConsumerOptions = js("({})")
options.groupID = "test-group"
return Kafka.consumer(options)
}
fun createProducer(): dynamic {
return Kafka.producer()
}
And call them from node with:
const myKafka = require('../build/js/packages/kafkaDemo').de.kafkaDemo.kafka;
async function testCall() {
const producer = myKafka.createProducer();
const consumer = myKafka.createConsumer();
}
testCall();
Is that right?Ilya Goncharov [JB]
09/01/2020, 10:21 AMPatrick Doering
09/01/2020, 12:08 PMPatrick Doering
09/01/2020, 1:10 PMIlya Goncharov [JB]
09/01/2020, 1:29 PMproducer
and consumer
on instance.
So it means that in your external declarations Kafka
should be class
But I can recommend to use dukat
, you can send third parameter into npm
dependency
implementation(npm("kafkajs", "...", true))
and it include generated external declarations into your build.
There is small trick, because kafkajs
uses @types/nodejs
, dukat can’t generate it, but we have nodejs declarations here (https://github.com/Kotlin/kotlinx-nodejs), you can have dependency on itIlya Goncharov [JB]
09/01/2020, 1:31 PMKafkaInitialisation
something like this
fun createConsumer(): dynamic {
val options: KafkaConfig = js("({})")
val consumerOptions: ConsumerConfig = js("({})")
consumerOptions.groupId = "test-group"
return Kafka(options).consumer(consumerOptions)
}
fun createProducer(): dynamic {
val options: KafkaConfig = js("({})")
return Kafka(options).producer()
}
Ilya Goncharov [JB]
09/01/2020, 1:35 PMdukat
generates a bit errors (it does not provide @JsModule
annotation in this case cc @[JB] Shagen)
So you can use manual task *generateExternals
and find declarations in folder externals
and copy it inside your sources, and make all necessary changesPatrick Doering
09/01/2020, 1:43 PMIlya Goncharov [JB]
09/01/2020, 1:46 PMkotlinx-nodejs
dependency
2. Run task nodeJsGenerateExternals
3. Copy from externals
to sources
4. Add to index.module_kafkajs.kt
on top @file:JsModule("kafkajs")
5. Move all typealiases (non external) to other file (in my case index.module_kafkajs2.kt
Patrick Doering
09/01/2020, 5:45 PM