Fork me on GitHub
#nbb
<
2023-07-29
>
ray12:07:20

it's no wonder some people (ahem) are not fans of async code ... here's how to connect

ray13:07:13

(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]))))

ray13:07:27

and of course it's reporting ready via event.error thinking-face ... so might not be quite right 😆

borkdude13:07:47

Do they have a promise based API?

ray19:07:01

after more fiddling ... this is how it works

ray19:07:08

(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))

👍 2
ray21:07:32

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

ray21:07:15

it's the recommended lib by Confluent so it could be good to have a working example

borkdude21:07:31

cool. in the nbb project examples directory there's also lots of libraries. perhaps you can put it there as well

2