playing around with https://github.com/Blizzard/node-rdkafka
it's no wonder some people (ahem) are not fans of async code ... here's how to connect
(defn ->producer []
(p/let [producer (Producer. kafka-config)]
(let [resolve (p/deferred)
reject (p/deferred)]
(set! (.-on producer "ready") (fn []
(js/console.log "Producer is ready")
(p/resolve! resolve producer)))
(set! (.-on producer "delivery-report") (fn [err report]
(if err
(println (js->clj err))
(println (js->clj report)))))
(set! (.-on producer "event.error") (fn [err]
(js/console.log "event.error" err)
(p/reject! reject err)))
(.connect producer)
(.setPollInterval producer 100)
(p/any [resolve reject]))))
and of course it's reporting ready via event.error thinking-face ... so might not be quite right 😆
Do they have a promise based API?
yes
https://developer.confluent.io/get-started/nodejs/#build-producer
after more fiddling ... this is how it works
(defn create-producer []
(let [producer (Producer. kafka-config)
connection (p/deferred)]
(.on producer "ready" (fn [] (p/resolve! connection producer)))
(.on producer "delivery-report" (fn [err report]
(if err
(js/console.warn "Delivery error: " err)
(let [{:keys [key value]} (js->clj report {:keywordize-keys true})]
(println "Delivery data - key:" (str key) "value:" (str value))))))
(.on producer "event.error" (fn [err] (p/reject! connection err)))
(.connect producer)
(.setPollInterval producer 100)
connection))
I did a search on github for uses of this lib and could not find any CLJS examples so I'll make a small repo for future reference once I've filled out the consumer and a few test cases
it's the recommended lib by Confluent so it could be good to have a working example
cool. in the nbb project examples directory there's also lots of libraries. perhaps you can put it there as well