@ohos-ports/confluentinc-kafka-javascript 1.10.0-beta.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (628) hide show
  1. package/CHANGELOG.md +457 -0
  2. package/LICENSE.kafkajs +31 -0
  3. package/LICENSE.node-rdkafka +25 -0
  4. package/LICENSE.txt +20 -0
  5. package/README.md +133 -0
  6. package/binding.gyp +184 -0
  7. package/build/Release/confluent-kafka-javascript.node +0 -0
  8. package/build/deps/librdkafka++.so.1 +0 -0
  9. package/build/deps/librdkafka.Makefile +6 -0
  10. package/build/deps/librdkafka.so.1 +0 -0
  11. package/build/deps/librdkafka.target.mk +55 -0
  12. package/deps/librdkafka/.clang-format +136 -0
  13. package/deps/librdkafka/.clang-format-cpp +103 -0
  14. package/deps/librdkafka/.dir-locals.el +10 -0
  15. package/deps/librdkafka/.formatignore +35 -0
  16. package/deps/librdkafka/.gdbmacros +19 -0
  17. package/deps/librdkafka/CHANGELOG.md +2477 -0
  18. package/deps/librdkafka/CMakeLists.txt +291 -0
  19. package/deps/librdkafka/CODE_OF_CONDUCT.md +46 -0
  20. package/deps/librdkafka/CONFIGURATION.md +212 -0
  21. package/deps/librdkafka/CONTRIBUTING.md +431 -0
  22. package/deps/librdkafka/Doxyfile +2375 -0
  23. package/deps/librdkafka/INTRODUCTION.md +2752 -0
  24. package/deps/librdkafka/LICENSE +26 -0
  25. package/deps/librdkafka/LICENSE.cjson +22 -0
  26. package/deps/librdkafka/LICENSE.crc32c +28 -0
  27. package/deps/librdkafka/LICENSE.fnv1a +18 -0
  28. package/deps/librdkafka/LICENSE.hdrhistogram +27 -0
  29. package/deps/librdkafka/LICENSE.lz4 +26 -0
  30. package/deps/librdkafka/LICENSE.murmur2 +25 -0
  31. package/deps/librdkafka/LICENSE.nanopb +22 -0
  32. package/deps/librdkafka/LICENSE.opentelemetry +203 -0
  33. package/deps/librdkafka/LICENSE.pycrc +23 -0
  34. package/deps/librdkafka/LICENSE.queue +31 -0
  35. package/deps/librdkafka/LICENSE.regexp +5 -0
  36. package/deps/librdkafka/LICENSE.snappy +36 -0
  37. package/deps/librdkafka/LICENSE.tinycthread +26 -0
  38. package/deps/librdkafka/LICENSE.wingetopt +49 -0
  39. package/deps/librdkafka/LICENSES.txt +625 -0
  40. package/deps/librdkafka/Makefile +125 -0
  41. package/deps/librdkafka/README.md +201 -0
  42. package/deps/librdkafka/README.win32 +26 -0
  43. package/deps/librdkafka/STATISTICS.md +624 -0
  44. package/deps/librdkafka/configure +214 -0
  45. package/deps/librdkafka/configure.self +341 -0
  46. package/deps/librdkafka/dev-conf.sh +123 -0
  47. package/deps/librdkafka/lds-gen.py +73 -0
  48. package/deps/librdkafka/mainpage.doxy +40 -0
  49. package/deps/librdkafka/mklove/Makefile.base +329 -0
  50. package/deps/librdkafka/mklove/modules/configure.atomics +144 -0
  51. package/deps/librdkafka/mklove/modules/configure.base +2484 -0
  52. package/deps/librdkafka/mklove/modules/configure.builtin +70 -0
  53. package/deps/librdkafka/mklove/modules/configure.cc +186 -0
  54. package/deps/librdkafka/mklove/modules/configure.cxx +8 -0
  55. package/deps/librdkafka/mklove/modules/configure.fileversion +65 -0
  56. package/deps/librdkafka/mklove/modules/configure.gitversion +29 -0
  57. package/deps/librdkafka/mklove/modules/configure.good_cflags +18 -0
  58. package/deps/librdkafka/mklove/modules/configure.host +132 -0
  59. package/deps/librdkafka/mklove/modules/configure.lib +49 -0
  60. package/deps/librdkafka/mklove/modules/configure.libcurl +99 -0
  61. package/deps/librdkafka/mklove/modules/configure.libsasl2 +36 -0
  62. package/deps/librdkafka/mklove/modules/configure.libssl +147 -0
  63. package/deps/librdkafka/mklove/modules/configure.libzstd +58 -0
  64. package/deps/librdkafka/mklove/modules/configure.parseversion +95 -0
  65. package/deps/librdkafka/mklove/modules/configure.pic +16 -0
  66. package/deps/librdkafka/mklove/modules/configure.socket +20 -0
  67. package/deps/librdkafka/mklove/modules/configure.zlib +61 -0
  68. package/deps/librdkafka/mklove/modules/patches/README.md +8 -0
  69. package/deps/librdkafka/mklove/modules/patches/libcurl.0000-no-runtime-linking-check.patch +11 -0
  70. package/deps/librdkafka/mklove/modules/patches/libssl.0000-osx-rand-include-fix-OpenSSL-PR16409.patch +56 -0
  71. package/deps/librdkafka/service.yml +182 -0
  72. package/deps/librdkafka/src/CMakeLists.txt +379 -0
  73. package/deps/librdkafka/src/Makefile +105 -0
  74. package/deps/librdkafka/src/README.lz4.md +30 -0
  75. package/deps/librdkafka/src/cJSON.c +3191 -0
  76. package/deps/librdkafka/src/cJSON.h +306 -0
  77. package/deps/librdkafka/src/crc32c.c +430 -0
  78. package/deps/librdkafka/src/crc32c.h +38 -0
  79. package/deps/librdkafka/src/generate_proto.sh +66 -0
  80. package/deps/librdkafka/src/librdkafka_cgrp_synch.png +0 -0
  81. package/deps/librdkafka/src/lz4.c +2727 -0
  82. package/deps/librdkafka/src/lz4.h +842 -0
  83. package/deps/librdkafka/src/lz4frame.c +2078 -0
  84. package/deps/librdkafka/src/lz4frame.h +692 -0
  85. package/deps/librdkafka/src/lz4frame_static.h +47 -0
  86. package/deps/librdkafka/src/lz4hc.c +1631 -0
  87. package/deps/librdkafka/src/lz4hc.h +413 -0
  88. package/deps/librdkafka/src/nanopb/pb.h +917 -0
  89. package/deps/librdkafka/src/nanopb/pb_common.c +388 -0
  90. package/deps/librdkafka/src/nanopb/pb_common.h +49 -0
  91. package/deps/librdkafka/src/nanopb/pb_decode.c +1727 -0
  92. package/deps/librdkafka/src/nanopb/pb_decode.h +193 -0
  93. package/deps/librdkafka/src/nanopb/pb_encode.c +1000 -0
  94. package/deps/librdkafka/src/nanopb/pb_encode.h +185 -0
  95. package/deps/librdkafka/src/opentelemetry/common.pb.c +32 -0
  96. package/deps/librdkafka/src/opentelemetry/common.pb.h +170 -0
  97. package/deps/librdkafka/src/opentelemetry/metrics.options +2 -0
  98. package/deps/librdkafka/src/opentelemetry/metrics.pb.c +67 -0
  99. package/deps/librdkafka/src/opentelemetry/metrics.pb.h +966 -0
  100. package/deps/librdkafka/src/opentelemetry/resource.pb.c +12 -0
  101. package/deps/librdkafka/src/opentelemetry/resource.pb.h +58 -0
  102. package/deps/librdkafka/src/queue.h +850 -0
  103. package/deps/librdkafka/src/rd.h +592 -0
  104. package/deps/librdkafka/src/rdaddr.c +255 -0
  105. package/deps/librdkafka/src/rdaddr.h +202 -0
  106. package/deps/librdkafka/src/rdatomic.h +262 -0
  107. package/deps/librdkafka/src/rdavg.h +260 -0
  108. package/deps/librdkafka/src/rdavl.c +210 -0
  109. package/deps/librdkafka/src/rdavl.h +250 -0
  110. package/deps/librdkafka/src/rdbase64.c +200 -0
  111. package/deps/librdkafka/src/rdbase64.h +43 -0
  112. package/deps/librdkafka/src/rdbuf.c +1884 -0
  113. package/deps/librdkafka/src/rdbuf.h +375 -0
  114. package/deps/librdkafka/src/rdcrc32.c +114 -0
  115. package/deps/librdkafka/src/rdcrc32.h +170 -0
  116. package/deps/librdkafka/src/rddl.c +179 -0
  117. package/deps/librdkafka/src/rddl.h +43 -0
  118. package/deps/librdkafka/src/rdendian.h +175 -0
  119. package/deps/librdkafka/src/rdfloat.h +67 -0
  120. package/deps/librdkafka/src/rdfnv1a.c +113 -0
  121. package/deps/librdkafka/src/rdfnv1a.h +35 -0
  122. package/deps/librdkafka/src/rdgz.c +120 -0
  123. package/deps/librdkafka/src/rdgz.h +46 -0
  124. package/deps/librdkafka/src/rdhdrhistogram.c +721 -0
  125. package/deps/librdkafka/src/rdhdrhistogram.h +87 -0
  126. package/deps/librdkafka/src/rdhttp.c +831 -0
  127. package/deps/librdkafka/src/rdhttp.h +101 -0
  128. package/deps/librdkafka/src/rdinterval.h +177 -0
  129. package/deps/librdkafka/src/rdkafka.c +7287 -0
  130. package/deps/librdkafka/src/rdkafka.h +11795 -0
  131. package/deps/librdkafka/src/rdkafka_admin.c +10165 -0
  132. package/deps/librdkafka/src/rdkafka_admin.h +658 -0
  133. package/deps/librdkafka/src/rdkafka_assignment.c +1282 -0
  134. package/deps/librdkafka/src/rdkafka_assignment.h +73 -0
  135. package/deps/librdkafka/src/rdkafka_assignor.c +1800 -0
  136. package/deps/librdkafka/src/rdkafka_assignor.h +402 -0
  137. package/deps/librdkafka/src/rdkafka_aux.c +409 -0
  138. package/deps/librdkafka/src/rdkafka_aux.h +174 -0
  139. package/deps/librdkafka/src/rdkafka_background.c +222 -0
  140. package/deps/librdkafka/src/rdkafka_broker.c +6736 -0
  141. package/deps/librdkafka/src/rdkafka_broker.h +851 -0
  142. package/deps/librdkafka/src/rdkafka_buf.c +543 -0
  143. package/deps/librdkafka/src/rdkafka_buf.h +1525 -0
  144. package/deps/librdkafka/src/rdkafka_cert.c +576 -0
  145. package/deps/librdkafka/src/rdkafka_cert.h +62 -0
  146. package/deps/librdkafka/src/rdkafka_cgrp.c +8310 -0
  147. package/deps/librdkafka/src/rdkafka_cgrp.h +589 -0
  148. package/deps/librdkafka/src/rdkafka_conf.c +5177 -0
  149. package/deps/librdkafka/src/rdkafka_conf.h +746 -0
  150. package/deps/librdkafka/src/rdkafka_confval.h +97 -0
  151. package/deps/librdkafka/src/rdkafka_coord.c +623 -0
  152. package/deps/librdkafka/src/rdkafka_coord.h +132 -0
  153. package/deps/librdkafka/src/rdkafka_error.c +228 -0
  154. package/deps/librdkafka/src/rdkafka_error.h +80 -0
  155. package/deps/librdkafka/src/rdkafka_event.c +502 -0
  156. package/deps/librdkafka/src/rdkafka_event.h +126 -0
  157. package/deps/librdkafka/src/rdkafka_feature.c +898 -0
  158. package/deps/librdkafka/src/rdkafka_feature.h +104 -0
  159. package/deps/librdkafka/src/rdkafka_fetcher.c +3820 -0
  160. package/deps/librdkafka/src/rdkafka_fetcher.h +62 -0
  161. package/deps/librdkafka/src/rdkafka_header.c +220 -0
  162. package/deps/librdkafka/src/rdkafka_header.h +76 -0
  163. package/deps/librdkafka/src/rdkafka_idempotence.c +807 -0
  164. package/deps/librdkafka/src/rdkafka_idempotence.h +144 -0
  165. package/deps/librdkafka/src/rdkafka_int.h +1505 -0
  166. package/deps/librdkafka/src/rdkafka_interceptor.c +842 -0
  167. package/deps/librdkafka/src/rdkafka_interceptor.h +104 -0
  168. package/deps/librdkafka/src/rdkafka_lz4.c +450 -0
  169. package/deps/librdkafka/src/rdkafka_lz4.h +49 -0
  170. package/deps/librdkafka/src/rdkafka_metadata.c +2347 -0
  171. package/deps/librdkafka/src/rdkafka_metadata.h +350 -0
  172. package/deps/librdkafka/src/rdkafka_metadata_cache.c +1183 -0
  173. package/deps/librdkafka/src/rdkafka_mock.c +4514 -0
  174. package/deps/librdkafka/src/rdkafka_mock.h +867 -0
  175. package/deps/librdkafka/src/rdkafka_mock_cgrp.c +1877 -0
  176. package/deps/librdkafka/src/rdkafka_mock_handlers.c +5255 -0
  177. package/deps/librdkafka/src/rdkafka_mock_int.h +1005 -0
  178. package/deps/librdkafka/src/rdkafka_mock_sharegrp.c +1207 -0
  179. package/deps/librdkafka/src/rdkafka_msg.c +2619 -0
  180. package/deps/librdkafka/src/rdkafka_msg.h +629 -0
  181. package/deps/librdkafka/src/rdkafka_msgbatch.h +62 -0
  182. package/deps/librdkafka/src/rdkafka_msgset.h +105 -0
  183. package/deps/librdkafka/src/rdkafka_msgset_reader.c +2099 -0
  184. package/deps/librdkafka/src/rdkafka_msgset_writer.c +1474 -0
  185. package/deps/librdkafka/src/rdkafka_offset.c +1565 -0
  186. package/deps/librdkafka/src/rdkafka_offset.h +150 -0
  187. package/deps/librdkafka/src/rdkafka_op.c +1219 -0
  188. package/deps/librdkafka/src/rdkafka_op.h +1065 -0
  189. package/deps/librdkafka/src/rdkafka_partition.c +5109 -0
  190. package/deps/librdkafka/src/rdkafka_partition.h +1215 -0
  191. package/deps/librdkafka/src/rdkafka_pattern.c +228 -0
  192. package/deps/librdkafka/src/rdkafka_pattern.h +70 -0
  193. package/deps/librdkafka/src/rdkafka_plugin.c +213 -0
  194. package/deps/librdkafka/src/rdkafka_plugin.h +41 -0
  195. package/deps/librdkafka/src/rdkafka_proto.h +739 -0
  196. package/deps/librdkafka/src/rdkafka_protocol.h +131 -0
  197. package/deps/librdkafka/src/rdkafka_queue.c +1351 -0
  198. package/deps/librdkafka/src/rdkafka_queue.h +1235 -0
  199. package/deps/librdkafka/src/rdkafka_range_assignor.c +1748 -0
  200. package/deps/librdkafka/src/rdkafka_request.c +7298 -0
  201. package/deps/librdkafka/src/rdkafka_request.h +761 -0
  202. package/deps/librdkafka/src/rdkafka_roundrobin_assignor.c +123 -0
  203. package/deps/librdkafka/src/rdkafka_sasl.c +589 -0
  204. package/deps/librdkafka/src/rdkafka_sasl.h +63 -0
  205. package/deps/librdkafka/src/rdkafka_sasl_cyrus.c +722 -0
  206. package/deps/librdkafka/src/rdkafka_sasl_int.h +89 -0
  207. package/deps/librdkafka/src/rdkafka_sasl_oauthbearer.c +1833 -0
  208. package/deps/librdkafka/src/rdkafka_sasl_oauthbearer.h +52 -0
  209. package/deps/librdkafka/src/rdkafka_sasl_oauthbearer_oidc.c +1827 -0
  210. package/deps/librdkafka/src/rdkafka_sasl_oauthbearer_oidc.h +52 -0
  211. package/deps/librdkafka/src/rdkafka_sasl_plain.c +142 -0
  212. package/deps/librdkafka/src/rdkafka_sasl_scram.c +858 -0
  213. package/deps/librdkafka/src/rdkafka_sasl_win32.c +550 -0
  214. package/deps/librdkafka/src/rdkafka_share_acknowledgement.c +1445 -0
  215. package/deps/librdkafka/src/rdkafka_share_acknowledgement.h +373 -0
  216. package/deps/librdkafka/src/rdkafka_ssl.c +2235 -0
  217. package/deps/librdkafka/src/rdkafka_ssl.h +86 -0
  218. package/deps/librdkafka/src/rdkafka_sticky_assignor.c +4785 -0
  219. package/deps/librdkafka/src/rdkafka_subscription.c +411 -0
  220. package/deps/librdkafka/src/rdkafka_telemetry.c +761 -0
  221. package/deps/librdkafka/src/rdkafka_telemetry.h +52 -0
  222. package/deps/librdkafka/src/rdkafka_telemetry_decode.c +1307 -0
  223. package/deps/librdkafka/src/rdkafka_telemetry_decode.h +59 -0
  224. package/deps/librdkafka/src/rdkafka_telemetry_encode.c +1309 -0
  225. package/deps/librdkafka/src/rdkafka_telemetry_encode.h +459 -0
  226. package/deps/librdkafka/src/rdkafka_timer.c +407 -0
  227. package/deps/librdkafka/src/rdkafka_timer.h +117 -0
  228. package/deps/librdkafka/src/rdkafka_topic.c +2382 -0
  229. package/deps/librdkafka/src/rdkafka_topic.h +369 -0
  230. package/deps/librdkafka/src/rdkafka_transport.c +1309 -0
  231. package/deps/librdkafka/src/rdkafka_transport.h +99 -0
  232. package/deps/librdkafka/src/rdkafka_transport_int.h +100 -0
  233. package/deps/librdkafka/src/rdkafka_txnmgr.c +3256 -0
  234. package/deps/librdkafka/src/rdkafka_txnmgr.h +171 -0
  235. package/deps/librdkafka/src/rdkafka_zstd.c +226 -0
  236. package/deps/librdkafka/src/rdkafka_zstd.h +57 -0
  237. package/deps/librdkafka/src/rdlist.c +593 -0
  238. package/deps/librdkafka/src/rdlist.h +444 -0
  239. package/deps/librdkafka/src/rdlog.c +89 -0
  240. package/deps/librdkafka/src/rdlog.h +41 -0
  241. package/deps/librdkafka/src/rdmap.c +508 -0
  242. package/deps/librdkafka/src/rdmap.h +492 -0
  243. package/deps/librdkafka/src/rdmurmur2.c +167 -0
  244. package/deps/librdkafka/src/rdmurmur2.h +35 -0
  245. package/deps/librdkafka/src/rdports.c +61 -0
  246. package/deps/librdkafka/src/rdports.h +38 -0
  247. package/deps/librdkafka/src/rdposix.h +250 -0
  248. package/deps/librdkafka/src/rdrand.c +151 -0
  249. package/deps/librdkafka/src/rdrand.h +72 -0
  250. package/deps/librdkafka/src/rdregex.c +156 -0
  251. package/deps/librdkafka/src/rdregex.h +43 -0
  252. package/deps/librdkafka/src/rdsignal.h +57 -0
  253. package/deps/librdkafka/src/rdstring.c +645 -0
  254. package/deps/librdkafka/src/rdstring.h +98 -0
  255. package/deps/librdkafka/src/rdsysqueue.h +404 -0
  256. package/deps/librdkafka/src/rdtime.h +356 -0
  257. package/deps/librdkafka/src/rdtypes.h +86 -0
  258. package/deps/librdkafka/src/rdunittest.c +564 -0
  259. package/deps/librdkafka/src/rdunittest.h +232 -0
  260. package/deps/librdkafka/src/rdunittest_acknowledge.c +1177 -0
  261. package/deps/librdkafka/src/rdunittest_fetcher.c +1211 -0
  262. package/deps/librdkafka/src/rdunittest_msgset_errors.c +1521 -0
  263. package/deps/librdkafka/src/rdvarint.c +134 -0
  264. package/deps/librdkafka/src/rdvarint.h +165 -0
  265. package/deps/librdkafka/src/rdwin32.h +382 -0
  266. package/deps/librdkafka/src/rdxxhash.c +1030 -0
  267. package/deps/librdkafka/src/rdxxhash.h +328 -0
  268. package/deps/librdkafka/src/regexp.c +1352 -0
  269. package/deps/librdkafka/src/regexp.h +41 -0
  270. package/deps/librdkafka/src/snappy.c +1866 -0
  271. package/deps/librdkafka/src/snappy.h +62 -0
  272. package/deps/librdkafka/src/snappy_compat.h +138 -0
  273. package/deps/librdkafka/src/statistics_schema.json +444 -0
  274. package/deps/librdkafka/src/tinycthread.c +932 -0
  275. package/deps/librdkafka/src/tinycthread.h +503 -0
  276. package/deps/librdkafka/src/tinycthread_extra.c +210 -0
  277. package/deps/librdkafka/src/tinycthread_extra.h +218 -0
  278. package/deps/librdkafka/src/win32_config.h +58 -0
  279. package/deps/librdkafka/src-cpp/CMakeLists.txt +90 -0
  280. package/deps/librdkafka/src-cpp/ConfImpl.cpp +84 -0
  281. package/deps/librdkafka/src-cpp/ConsumerImpl.cpp +244 -0
  282. package/deps/librdkafka/src-cpp/HandleImpl.cpp +436 -0
  283. package/deps/librdkafka/src-cpp/HeadersImpl.cpp +48 -0
  284. package/deps/librdkafka/src-cpp/KafkaConsumerImpl.cpp +296 -0
  285. package/deps/librdkafka/src-cpp/Makefile +55 -0
  286. package/deps/librdkafka/src-cpp/MessageImpl.cpp +38 -0
  287. package/deps/librdkafka/src-cpp/MetadataImpl.cpp +170 -0
  288. package/deps/librdkafka/src-cpp/ProducerImpl.cpp +197 -0
  289. package/deps/librdkafka/src-cpp/QueueImpl.cpp +70 -0
  290. package/deps/librdkafka/src-cpp/README.md +16 -0
  291. package/deps/librdkafka/src-cpp/RdKafka.cpp +59 -0
  292. package/deps/librdkafka/src-cpp/TopicImpl.cpp +124 -0
  293. package/deps/librdkafka/src-cpp/TopicPartitionImpl.cpp +57 -0
  294. package/deps/librdkafka/src-cpp/rdkafkacpp.h +3797 -0
  295. package/deps/librdkafka/src-cpp/rdkafkacpp_int.h +1641 -0
  296. package/deps/librdkafka/tests/0000-unittests.c +72 -0
  297. package/deps/librdkafka/tests/0001-multiobj.c +102 -0
  298. package/deps/librdkafka/tests/0002-unkpart.c +244 -0
  299. package/deps/librdkafka/tests/0003-msgmaxsize.c +173 -0
  300. package/deps/librdkafka/tests/0004-conf.c +934 -0
  301. package/deps/librdkafka/tests/0005-order.c +133 -0
  302. package/deps/librdkafka/tests/0006-symbols.c +163 -0
  303. package/deps/librdkafka/tests/0007-autotopic.c +136 -0
  304. package/deps/librdkafka/tests/0008-reqacks.c +179 -0
  305. package/deps/librdkafka/tests/0009-mock_cluster.c +272 -0
  306. package/deps/librdkafka/tests/0011-produce_batch.c +753 -0
  307. package/deps/librdkafka/tests/0012-produce_consume.c +537 -0
  308. package/deps/librdkafka/tests/0013-null-msgs.c +473 -0
  309. package/deps/librdkafka/tests/0014-reconsume-191.c +512 -0
  310. package/deps/librdkafka/tests/0015-offset_seeks.c +172 -0
  311. package/deps/librdkafka/tests/0016-client_swname.c +181 -0
  312. package/deps/librdkafka/tests/0017-compression.c +140 -0
  313. package/deps/librdkafka/tests/0018-cgrp_term.c +444 -0
  314. package/deps/librdkafka/tests/0019-list_groups.c +289 -0
  315. package/deps/librdkafka/tests/0020-destroy_hang.c +162 -0
  316. package/deps/librdkafka/tests/0021-rkt_destroy.c +72 -0
  317. package/deps/librdkafka/tests/0022-consume_batch.c +331 -0
  318. package/deps/librdkafka/tests/0025-timers.c +147 -0
  319. package/deps/librdkafka/tests/0026-consume_pause.c +547 -0
  320. package/deps/librdkafka/tests/0028-long_topicnames.c +79 -0
  321. package/deps/librdkafka/tests/0029-assign_offset.c +202 -0
  322. package/deps/librdkafka/tests/0030-offset_commit.c +589 -0
  323. package/deps/librdkafka/tests/0031-get_offsets.c +235 -0
  324. package/deps/librdkafka/tests/0033-regex_subscribe.c +536 -0
  325. package/deps/librdkafka/tests/0034-offset_reset.c +398 -0
  326. package/deps/librdkafka/tests/0035-api_version.c +73 -0
  327. package/deps/librdkafka/tests/0036-partial_fetch.c +87 -0
  328. package/deps/librdkafka/tests/0037-destroy_hang_local.c +85 -0
  329. package/deps/librdkafka/tests/0038-performance.c +121 -0
  330. package/deps/librdkafka/tests/0039-event.c +284 -0
  331. package/deps/librdkafka/tests/0040-io_event.c +257 -0
  332. package/deps/librdkafka/tests/0041-fetch_max_bytes.c +97 -0
  333. package/deps/librdkafka/tests/0042-many_topics.c +252 -0
  334. package/deps/librdkafka/tests/0043-no_connection.c +77 -0
  335. package/deps/librdkafka/tests/0044-partition_cnt.c +94 -0
  336. package/deps/librdkafka/tests/0045-subscribe_update.c +1010 -0
  337. package/deps/librdkafka/tests/0046-rkt_cache.c +65 -0
  338. package/deps/librdkafka/tests/0047-partial_buf_tmout.c +98 -0
  339. package/deps/librdkafka/tests/0048-partitioner.c +283 -0
  340. package/deps/librdkafka/tests/0049-consume_conn_close.c +162 -0
  341. package/deps/librdkafka/tests/0050-subscribe_adds.c +145 -0
  342. package/deps/librdkafka/tests/0051-assign_adds.c +126 -0
  343. package/deps/librdkafka/tests/0052-msg_timestamps.c +238 -0
  344. package/deps/librdkafka/tests/0053-stats_cb.cpp +527 -0
  345. package/deps/librdkafka/tests/0054-offset_time.cpp +236 -0
  346. package/deps/librdkafka/tests/0055-producer_latency.c +539 -0
  347. package/deps/librdkafka/tests/0056-balanced_group_mt.c +315 -0
  348. package/deps/librdkafka/tests/0057-invalid_topic.cpp +112 -0
  349. package/deps/librdkafka/tests/0058-log.cpp +123 -0
  350. package/deps/librdkafka/tests/0059-bsearch.cpp +241 -0
  351. package/deps/librdkafka/tests/0060-op_prio.cpp +163 -0
  352. package/deps/librdkafka/tests/0061-consumer_lag.cpp +295 -0
  353. package/deps/librdkafka/tests/0062-stats_event.c +126 -0
  354. package/deps/librdkafka/tests/0063-clusterid.cpp +180 -0
  355. package/deps/librdkafka/tests/0064-interceptors.c +529 -0
  356. package/deps/librdkafka/tests/0065-yield.cpp +140 -0
  357. package/deps/librdkafka/tests/0066-plugins.cpp +143 -0
  358. package/deps/librdkafka/tests/0067-empty_topic.cpp +151 -0
  359. package/deps/librdkafka/tests/0068-produce_timeout.c +136 -0
  360. package/deps/librdkafka/tests/0069-consumer_add_parts.c +119 -0
  361. package/deps/librdkafka/tests/0070-null_empty.cpp +197 -0
  362. package/deps/librdkafka/tests/0072-headers_ut.c +448 -0
  363. package/deps/librdkafka/tests/0073-headers.c +381 -0
  364. package/deps/librdkafka/tests/0074-producev.c +87 -0
  365. package/deps/librdkafka/tests/0075-retry.c +290 -0
  366. package/deps/librdkafka/tests/0076-produce_retry.c +452 -0
  367. package/deps/librdkafka/tests/0077-compaction.c +366 -0
  368. package/deps/librdkafka/tests/0078-c_from_cpp.cpp +96 -0
  369. package/deps/librdkafka/tests/0079-fork.c +93 -0
  370. package/deps/librdkafka/tests/0080-admin_ut.c +3095 -0
  371. package/deps/librdkafka/tests/0081-admin.c +5633 -0
  372. package/deps/librdkafka/tests/0082-fetch_max_bytes.cpp +137 -0
  373. package/deps/librdkafka/tests/0083-cb_event.c +233 -0
  374. package/deps/librdkafka/tests/0084-destroy_flags.c +208 -0
  375. package/deps/librdkafka/tests/0085-headers.cpp +392 -0
  376. package/deps/librdkafka/tests/0086-purge.c +368 -0
  377. package/deps/librdkafka/tests/0088-produce_metadata_timeout.c +162 -0
  378. package/deps/librdkafka/tests/0089-max_poll_interval.c +511 -0
  379. package/deps/librdkafka/tests/0090-idempotence.c +171 -0
  380. package/deps/librdkafka/tests/0091-max_poll_interval_timeout.c +295 -0
  381. package/deps/librdkafka/tests/0092-mixed_msgver.c +103 -0
  382. package/deps/librdkafka/tests/0093-holb.c +200 -0
  383. package/deps/librdkafka/tests/0094-idempotence_msg_timeout.c +231 -0
  384. package/deps/librdkafka/tests/0095-all_brokers_down.cpp +122 -0
  385. package/deps/librdkafka/tests/0097-ssl_verify.cpp +674 -0
  386. package/deps/librdkafka/tests/0098-consumer-txn.cpp +1218 -0
  387. package/deps/librdkafka/tests/0099-commit_metadata.c +194 -0
  388. package/deps/librdkafka/tests/0100-thread_interceptors.cpp +195 -0
  389. package/deps/librdkafka/tests/0101-fetch-from-follower.cpp +446 -0
  390. package/deps/librdkafka/tests/0102-static_group_rebalance.c +836 -0
  391. package/deps/librdkafka/tests/0103-transactions.c +1383 -0
  392. package/deps/librdkafka/tests/0104-fetch_from_follower_mock.c +625 -0
  393. package/deps/librdkafka/tests/0105-transactions_mock.c +3930 -0
  394. package/deps/librdkafka/tests/0106-cgrp_sess_timeout.c +318 -0
  395. package/deps/librdkafka/tests/0107-topic_recreate.c +259 -0
  396. package/deps/librdkafka/tests/0109-auto_create_topics.cpp +278 -0
  397. package/deps/librdkafka/tests/0110-batch_size.cpp +182 -0
  398. package/deps/librdkafka/tests/0111-delay_create_topics.cpp +127 -0
  399. package/deps/librdkafka/tests/0112-assign_unknown_part.c +87 -0
  400. package/deps/librdkafka/tests/0113-cooperative_rebalance.cpp +3473 -0
  401. package/deps/librdkafka/tests/0114-sticky_partitioning.cpp +176 -0
  402. package/deps/librdkafka/tests/0115-producer_auth.cpp +182 -0
  403. package/deps/librdkafka/tests/0116-kafkaconsumer_close.cpp +216 -0
  404. package/deps/librdkafka/tests/0117-mock_errors.c +331 -0
  405. package/deps/librdkafka/tests/0118-commit_rebalance.c +154 -0
  406. package/deps/librdkafka/tests/0119-consumer_auth.cpp +167 -0
  407. package/deps/librdkafka/tests/0120-asymmetric_subscription.c +185 -0
  408. package/deps/librdkafka/tests/0121-clusterid.c +115 -0
  409. package/deps/librdkafka/tests/0122-buffer_cleaning_after_rebalance.c +227 -0
  410. package/deps/librdkafka/tests/0123-connections_max_idle.c +98 -0
  411. package/deps/librdkafka/tests/0124-openssl_invalid_engine.c +69 -0
  412. package/deps/librdkafka/tests/0125-immediate_flush.c +144 -0
  413. package/deps/librdkafka/tests/0126-oauthbearer_oidc.c +1164 -0
  414. package/deps/librdkafka/tests/0127-fetch_queue_backoff.cpp +165 -0
  415. package/deps/librdkafka/tests/0128-sasl_callback_queue.cpp +217 -0
  416. package/deps/librdkafka/tests/0129-fetch_aborted_msgs.c +79 -0
  417. package/deps/librdkafka/tests/0130-store_offsets.c +178 -0
  418. package/deps/librdkafka/tests/0131-connect_timeout.c +81 -0
  419. package/deps/librdkafka/tests/0132-strategy_ordering.c +179 -0
  420. package/deps/librdkafka/tests/0133-ssl_keys.c +150 -0
  421. package/deps/librdkafka/tests/0134-ssl_provider.c +92 -0
  422. package/deps/librdkafka/tests/0135-sasl_credentials.cpp +279 -0
  423. package/deps/librdkafka/tests/0136-resolve_cb.c +181 -0
  424. package/deps/librdkafka/tests/0137-barrier_batch_consume.c +752 -0
  425. package/deps/librdkafka/tests/0138-admin_mock.c +281 -0
  426. package/deps/librdkafka/tests/0139-offset_validation_mock.c +950 -0
  427. package/deps/librdkafka/tests/0140-commit_metadata.cpp +108 -0
  428. package/deps/librdkafka/tests/0142-reauthentication.c +931 -0
  429. package/deps/librdkafka/tests/0143-exponential_backoff_mock.c +552 -0
  430. package/deps/librdkafka/tests/0144-idempotence_mock.c +373 -0
  431. package/deps/librdkafka/tests/0145-pause_resume_mock.c +119 -0
  432. package/deps/librdkafka/tests/0146-metadata_mock.c +505 -0
  433. package/deps/librdkafka/tests/0147-consumer_group_consumer_mock.c +1210 -0
  434. package/deps/librdkafka/tests/0148-offset_fetch_commit_error_mock.c +569 -0
  435. package/deps/librdkafka/tests/0149-broker-same-host-port.c +140 -0
  436. package/deps/librdkafka/tests/0150-telemetry_mock.c +651 -0
  437. package/deps/librdkafka/tests/0151-purge-brokers.c +566 -0
  438. package/deps/librdkafka/tests/0152-rebootstrap.c +59 -0
  439. package/deps/librdkafka/tests/0153-memberid.c +128 -0
  440. package/deps/librdkafka/tests/0155-share_group_heartbeat_mock.c +2695 -0
  441. package/deps/librdkafka/tests/0156-share_consumer_fetch_mock.c +1551 -0
  442. package/deps/librdkafka/tests/0157-share_consumer_ack_mock.c +1788 -0
  443. package/deps/librdkafka/tests/0158-share_consumer_transactions_mock.c +467 -0
  444. package/deps/librdkafka/tests/0170-share_consumer_subscription.c +2192 -0
  445. package/deps/librdkafka/tests/0171-share_consumer_consume.c +2150 -0
  446. package/deps/librdkafka/tests/0172-share_consumer_acknowledge.c +1919 -0
  447. package/deps/librdkafka/tests/0173-share_consumer_commit_async.c +2735 -0
  448. package/deps/librdkafka/tests/0174-share_consumer_concurrency.c +1434 -0
  449. package/deps/librdkafka/tests/0175-share_consumer_groups.c +574 -0
  450. package/deps/librdkafka/tests/0176-share_consumer_commit_sync.c +2986 -0
  451. package/deps/librdkafka/tests/0177-share_consumer_transactions.c +1815 -0
  452. package/deps/librdkafka/tests/0178-share_consumer_close.c +2102 -0
  453. package/deps/librdkafka/tests/0179-share_consumer_destroy.c +2482 -0
  454. package/deps/librdkafka/tests/0180-share_consumer_config.c +1677 -0
  455. package/deps/librdkafka/tests/0181-share_consumer_topic_delete.c +354 -0
  456. package/deps/librdkafka/tests/0182-share_consumer_error_handling_mock.c +3358 -0
  457. package/deps/librdkafka/tests/0183-share_consumer_leader_change_mock.c +1234 -0
  458. package/deps/librdkafka/tests/0184-share_consumer_topic_recreate.c +1356 -0
  459. package/deps/librdkafka/tests/0185-share_consumer_max_poll_interval.c +557 -0
  460. package/deps/librdkafka/tests/0186-share_consumer_fatal_error.c +360 -0
  461. package/deps/librdkafka/tests/0190-share_consumer_telemetry.c +387 -0
  462. package/deps/librdkafka/tests/1000-unktopic.c +164 -0
  463. package/deps/librdkafka/tests/8000-idle.cpp +60 -0
  464. package/deps/librdkafka/tests/8001-fetch_from_follower_mock_manual.c +113 -0
  465. package/deps/librdkafka/tests/CMakeLists.txt +193 -0
  466. package/deps/librdkafka/tests/LibrdkafkaTestApp.py +291 -0
  467. package/deps/librdkafka/tests/Makefile +182 -0
  468. package/deps/librdkafka/tests/README.md +514 -0
  469. package/deps/librdkafka/tests/autotest.sh +33 -0
  470. package/deps/librdkafka/tests/backtrace.gdb +30 -0
  471. package/deps/librdkafka/tests/broker_version_tests.py +315 -0
  472. package/deps/librdkafka/tests/buildbox.sh +17 -0
  473. package/deps/librdkafka/tests/cleanup-checker-tests.sh +20 -0
  474. package/deps/librdkafka/tests/cluster_testing.py +203 -0
  475. package/deps/librdkafka/tests/delete-test-topics.sh +56 -0
  476. package/deps/librdkafka/tests/fixtures/oauthbearer/jwt_assertion_template.json +10 -0
  477. package/deps/librdkafka/tests/fixtures/ssl/Makefile +8 -0
  478. package/deps/librdkafka/tests/fixtures/ssl/README.md +13 -0
  479. package/deps/librdkafka/tests/fixtures/ssl/client.keystore.intermediate.p12 +0 -0
  480. package/deps/librdkafka/tests/fixtures/ssl/client.keystore.p12 +0 -0
  481. package/deps/librdkafka/tests/fixtures/ssl/client2.certificate.intermediate.pem +72 -0
  482. package/deps/librdkafka/tests/fixtures/ssl/client2.certificate.pem +50 -0
  483. package/deps/librdkafka/tests/fixtures/ssl/client2.intermediate.key +46 -0
  484. package/deps/librdkafka/tests/fixtures/ssl/client2.key +46 -0
  485. package/deps/librdkafka/tests/fixtures/ssl/create_keys.sh +168 -0
  486. package/deps/librdkafka/tests/fuzzers/Makefile +12 -0
  487. package/deps/librdkafka/tests/fuzzers/README.md +31 -0
  488. package/deps/librdkafka/tests/fuzzers/fuzz_regex.c +74 -0
  489. package/deps/librdkafka/tests/fuzzers/helpers.h +90 -0
  490. package/deps/librdkafka/tests/gen-ssl-certs.sh +165 -0
  491. package/deps/librdkafka/tests/interactive_broker_version.py +170 -0
  492. package/deps/librdkafka/tests/interceptor_test/CMakeLists.txt +16 -0
  493. package/deps/librdkafka/tests/interceptor_test/Makefile +22 -0
  494. package/deps/librdkafka/tests/interceptor_test/interceptor_test.c +314 -0
  495. package/deps/librdkafka/tests/interceptor_test/interceptor_test.h +54 -0
  496. package/deps/librdkafka/tests/java/IncrementalRebalanceCli.java +97 -0
  497. package/deps/librdkafka/tests/java/Makefile +13 -0
  498. package/deps/librdkafka/tests/java/Murmur2Cli.java +46 -0
  499. package/deps/librdkafka/tests/java/README.md +14 -0
  500. package/deps/librdkafka/tests/java/TransactionProducerCli.java +162 -0
  501. package/deps/librdkafka/tests/java/run-class.sh +11 -0
  502. package/deps/librdkafka/tests/librdkafka.suppressions +483 -0
  503. package/deps/librdkafka/tests/lz4_manual_test.sh +59 -0
  504. package/deps/librdkafka/tests/multi-broker-version-test.sh +50 -0
  505. package/deps/librdkafka/tests/parse-refcnt.sh +43 -0
  506. package/deps/librdkafka/tests/performance_plot.py +115 -0
  507. package/deps/librdkafka/tests/plugin_test/Makefile +19 -0
  508. package/deps/librdkafka/tests/plugin_test/plugin_test.c +58 -0
  509. package/deps/librdkafka/tests/requirements.txt +2 -0
  510. package/deps/librdkafka/tests/run-all-tests.sh +81 -0
  511. package/deps/librdkafka/tests/run-consumer-tests.sh +16 -0
  512. package/deps/librdkafka/tests/run-producer-tests.sh +16 -0
  513. package/deps/librdkafka/tests/run-test-batches.py +157 -0
  514. package/deps/librdkafka/tests/run-test.sh +141 -0
  515. package/deps/librdkafka/tests/rusage.c +249 -0
  516. package/deps/librdkafka/tests/sasl_test.py +289 -0
  517. package/deps/librdkafka/tests/scenarios/README.md +6 -0
  518. package/deps/librdkafka/tests/scenarios/ak23.json +6 -0
  519. package/deps/librdkafka/tests/scenarios/default.json +5 -0
  520. package/deps/librdkafka/tests/scenarios/noautocreate.json +5 -0
  521. package/deps/librdkafka/tests/share_telemetry_verify/share-otel-collector-config.yaml +28 -0
  522. package/deps/librdkafka/tests/sockem.c +801 -0
  523. package/deps/librdkafka/tests/sockem.h +85 -0
  524. package/deps/librdkafka/tests/sockem_ctrl.c +145 -0
  525. package/deps/librdkafka/tests/sockem_ctrl.h +61 -0
  526. package/deps/librdkafka/tests/test.c +8376 -0
  527. package/deps/librdkafka/tests/test.conf.example +27 -0
  528. package/deps/librdkafka/tests/test.h +1150 -0
  529. package/deps/librdkafka/tests/testcpp.cpp +131 -0
  530. package/deps/librdkafka/tests/testcpp.h +388 -0
  531. package/deps/librdkafka/tests/testshared.h +416 -0
  532. package/deps/librdkafka/tests/tools/README.md +4 -0
  533. package/deps/librdkafka/tests/tools/stats/README.md +21 -0
  534. package/deps/librdkafka/tests/tools/stats/filter.jq +42 -0
  535. package/deps/librdkafka/tests/tools/stats/graph.py +150 -0
  536. package/deps/librdkafka/tests/tools/stats/requirements.txt +3 -0
  537. package/deps/librdkafka/tests/tools/stats/to_csv.py +124 -0
  538. package/deps/librdkafka/tests/trivup/trivup-0.15.0.tar.gz +0 -0
  539. package/deps/librdkafka/tests/until-fail.sh +87 -0
  540. package/deps/librdkafka/tests/xxxx-assign_partition.c +122 -0
  541. package/deps/librdkafka/tests/xxxx-metadata.cpp +159 -0
  542. package/deps/librdkafka/vcpkg.json +23 -0
  543. package/deps/librdkafka/win32/README.md +5 -0
  544. package/deps/librdkafka/win32/build-package.bat +3 -0
  545. package/deps/librdkafka/win32/build.bat +19 -0
  546. package/deps/librdkafka/win32/common.vcxproj +84 -0
  547. package/deps/librdkafka/win32/interceptor_test/interceptor_test.vcxproj +87 -0
  548. package/deps/librdkafka/win32/librdkafka.autopkg.template +54 -0
  549. package/deps/librdkafka/win32/librdkafka.master.testing.targets +13 -0
  550. package/deps/librdkafka/win32/librdkafka.sln +226 -0
  551. package/deps/librdkafka/win32/librdkafka.vcxproj +282 -0
  552. package/deps/librdkafka/win32/librdkafkacpp/librdkafkacpp.vcxproj +104 -0
  553. package/deps/librdkafka/win32/msbuild.ps1 +58 -0
  554. package/deps/librdkafka/win32/openssl_engine_example/openssl_engine_example.vcxproj +132 -0
  555. package/deps/librdkafka/win32/package-zip.ps1 +46 -0
  556. package/deps/librdkafka/win32/packages/repositories.config +4 -0
  557. package/deps/librdkafka/win32/push-package.bat +4 -0
  558. package/deps/librdkafka/win32/rdkafka_complex_consumer_example_cpp/rdkafka_complex_consumer_example_cpp.vcxproj +67 -0
  559. package/deps/librdkafka/win32/rdkafka_example/rdkafka_example.vcxproj +97 -0
  560. package/deps/librdkafka/win32/rdkafka_performance/rdkafka_performance.vcxproj +97 -0
  561. package/deps/librdkafka/win32/setup-msys2.ps1 +47 -0
  562. package/deps/librdkafka/win32/setup-vcpkg.ps1 +34 -0
  563. package/deps/librdkafka/win32/tests/test.conf.example +25 -0
  564. package/deps/librdkafka/win32/tests/tests.vcxproj +278 -0
  565. package/deps/librdkafka/win32/win_ssl_cert_store/win_ssl_cert_store.vcxproj +132 -0
  566. package/deps/librdkafka/win32/wingetopt.c +564 -0
  567. package/deps/librdkafka/win32/wingetopt.h +101 -0
  568. package/deps/librdkafka/win32/wintime.h +33 -0
  569. package/deps/librdkafka.gyp +83 -0
  570. package/deps/windows-install.py +80 -0
  571. package/index.d.ts +3 -0
  572. package/lib/admin.js +732 -0
  573. package/lib/client.js +679 -0
  574. package/lib/error.js +501 -0
  575. package/lib/index.js +8 -0
  576. package/lib/kafka-consumer-stream.js +399 -0
  577. package/lib/kafka-consumer.js +798 -0
  578. package/lib/kafkajs/_admin.js +1052 -0
  579. package/lib/kafkajs/_common.js +887 -0
  580. package/lib/kafkajs/_consumer.js +2156 -0
  581. package/lib/kafkajs/_consumer_cache.js +310 -0
  582. package/lib/kafkajs/_error.js +298 -0
  583. package/lib/kafkajs/_kafka.js +125 -0
  584. package/lib/kafkajs/_linked-list.js +220 -0
  585. package/lib/kafkajs/_producer.js +863 -0
  586. package/lib/kafkajs/index.js +5 -0
  587. package/lib/producer/high-level-producer.js +400 -0
  588. package/lib/producer-stream.js +337 -0
  589. package/lib/producer.js +405 -0
  590. package/lib/rdkafka.js +44 -0
  591. package/lib/tools/ref-counter.js +53 -0
  592. package/lib/topic-partition.js +91 -0
  593. package/lib/topic.js +43 -0
  594. package/lib/util.js +55 -0
  595. package/librdkafka.js +12 -0
  596. package/package.json +85 -0
  597. package/shim/source_location +54 -0
  598. package/src/admin.cc +1597 -0
  599. package/src/admin.h +112 -0
  600. package/src/binding.cc +76 -0
  601. package/src/binding.h +25 -0
  602. package/src/callbacks.cc +676 -0
  603. package/src/callbacks.h +302 -0
  604. package/src/common.cc +1628 -0
  605. package/src/common.h +192 -0
  606. package/src/config.cc +219 -0
  607. package/src/config.h +61 -0
  608. package/src/connection.cc +703 -0
  609. package/src/connection.h +117 -0
  610. package/src/errors.cc +119 -0
  611. package/src/errors.h +60 -0
  612. package/src/kafka-consumer.cc +1539 -0
  613. package/src/kafka-consumer.h +147 -0
  614. package/src/producer.cc +917 -0
  615. package/src/producer.h +124 -0
  616. package/src/topic.cc +173 -0
  617. package/src/topic.h +54 -0
  618. package/src/workers.cc +1714 -0
  619. package/src/workers.h +690 -0
  620. package/types/config.d.ts +1269 -0
  621. package/types/errors.d.ts +373 -0
  622. package/types/kafkajs.d.ts +568 -0
  623. package/types/rdkafka.d.ts +571 -0
  624. package/util/configure.js +32 -0
  625. package/util/generate-docs.sh +18 -0
  626. package/util/get-env.js +6 -0
  627. package/util/test-compile.js +11 -0
  628. package/util/test-producer-delivery.js +100 -0
@@ -0,0 +1,917 @@
1
+ /*
2
+ * confluent-kafka-javascript - Node.js wrapper for RdKafka C/C++ library
3
+ *
4
+ * Copyright (c) 2016-2023 Blizzard Entertainment
5
+ * (c) 2023 Confluent, Inc.
6
+ *
7
+ * This software may be modified and distributed under the terms
8
+ * of the MIT license. See the LICENSE.txt file for details.
9
+ */
10
+
11
+ #include <string>
12
+ #include <vector>
13
+
14
+ #include "src/producer.h"
15
+ #include "src/kafka-consumer.h"
16
+ #include "src/workers.h"
17
+
18
+ namespace NodeKafka {
19
+
20
+ /**
21
+ * @brief Producer v8 wrapped object.
22
+ *
23
+ * Wraps the RdKafka::Producer object with compositional inheritence and
24
+ * provides methods for interacting with it exposed to node.
25
+ *
26
+ * The base wrappable RdKafka::Handle deals with most of the wrapping but
27
+ * we still need to declare its prototype.
28
+ *
29
+ * @sa RdKafka::Producer
30
+ * @sa NodeKafka::Connection
31
+ */
32
+
33
+ Producer::Producer(Conf* gconfig, Conf* tconfig):
34
+ Connection(gconfig, tconfig),
35
+ m_dr_cb(),
36
+ m_partitioner_cb() {
37
+ std::string errstr;
38
+
39
+ if (m_tconfig)
40
+ m_gconfig->set("default_topic_conf", m_tconfig, errstr);
41
+
42
+ m_gconfig->set("dr_cb", &m_dr_cb, errstr);
43
+ }
44
+
45
+ Producer::~Producer() {
46
+ Disconnect();
47
+ }
48
+
49
+ Nan::Persistent<v8::Function> Producer::constructor;
50
+
51
+ void Producer::Init(v8::Local<v8::Object> exports) {
52
+ Nan::HandleScope scope;
53
+
54
+ v8::Local<v8::FunctionTemplate> tpl = Nan::New<v8::FunctionTemplate>(New);
55
+ tpl->SetClassName(Nan::New("Producer").ToLocalChecked());
56
+ tpl->InstanceTemplate()->SetInternalFieldCount(1);
57
+
58
+ /*
59
+ * Lifecycle events inherited from NodeKafka::Connection
60
+ *
61
+ * @sa NodeKafka::Connection
62
+ */
63
+
64
+ Nan::SetPrototypeMethod(tpl, "configureCallbacks", NodeConfigureCallbacks);
65
+
66
+ /*
67
+ * @brief Methods to do with establishing state
68
+ */
69
+
70
+ Nan::SetPrototypeMethod(tpl, "connect", NodeConnect);
71
+ Nan::SetPrototypeMethod(tpl, "disconnect", NodeDisconnect);
72
+ Nan::SetPrototypeMethod(tpl, "getMetadata", NodeGetMetadata);
73
+ Nan::SetPrototypeMethod(tpl, "queryWatermarkOffsets", NodeQueryWatermarkOffsets); // NOLINT
74
+ Nan::SetPrototypeMethod(tpl, "poll", NodePoll);
75
+ Nan::SetPrototypeMethod(tpl, "setPollInBackground", NodeSetPollInBackground);
76
+ Nan::SetPrototypeMethod(tpl, "setSaslCredentials", NodeSetSaslCredentials);
77
+ Nan::SetPrototypeMethod(tpl, "setOAuthBearerToken", NodeSetOAuthBearerToken);
78
+ Nan::SetPrototypeMethod(tpl, "setOAuthBearerTokenFailure",
79
+ NodeSetOAuthBearerTokenFailure);
80
+
81
+ /*
82
+ * @brief Methods exposed to do with message production
83
+ */
84
+
85
+ Nan::SetPrototypeMethod(tpl, "setPartitioner", NodeSetPartitioner);
86
+ Nan::SetPrototypeMethod(tpl, "produce", NodeProduce);
87
+
88
+ Nan::SetPrototypeMethod(tpl, "flush", NodeFlush);
89
+
90
+ /*
91
+ * @brief Methods exposed to do with transactions
92
+ */
93
+
94
+ Nan::SetPrototypeMethod(tpl, "initTransactions", NodeInitTransactions);
95
+ Nan::SetPrototypeMethod(tpl, "beginTransaction", NodeBeginTransaction);
96
+ Nan::SetPrototypeMethod(tpl, "commitTransaction", NodeCommitTransaction);
97
+ Nan::SetPrototypeMethod(tpl, "abortTransaction", NodeAbortTransaction);
98
+ Nan::SetPrototypeMethod(tpl, "sendOffsetsToTransaction", NodeSendOffsetsToTransaction); // NOLINT
99
+
100
+ // connect. disconnect. resume. pause. get meta data
101
+ constructor.Reset((tpl->GetFunction(Nan::GetCurrentContext()))
102
+ .ToLocalChecked());
103
+
104
+ Nan::Set(exports, Nan::New("Producer").ToLocalChecked(),
105
+ tpl->GetFunction(Nan::GetCurrentContext()).ToLocalChecked());
106
+ }
107
+
108
+ void Producer::New(const Nan::FunctionCallbackInfo<v8::Value>& info) {
109
+ if (!info.IsConstructCall()) {
110
+ return Nan::ThrowError("non-constructor invocation not supported");
111
+ }
112
+
113
+ if (info.Length() < 2) {
114
+ return Nan::ThrowError("You must supply global and topic configuration");
115
+ }
116
+
117
+ if (!info[0]->IsObject()) {
118
+ return Nan::ThrowError("Global configuration data must be specified");
119
+ }
120
+
121
+ std::string errstr;
122
+
123
+ Conf* gconfig =
124
+ Conf::create(RdKafka::Conf::CONF_GLOBAL,
125
+ (info[0]->ToObject(Nan::GetCurrentContext())).ToLocalChecked(), errstr);
126
+
127
+ if (!gconfig) {
128
+ return Nan::ThrowError(errstr.c_str());
129
+ }
130
+
131
+ // If tconfig isn't set, then just let us pick properties from gconf.
132
+ Conf* tconfig = nullptr;
133
+ if (info[1]->IsObject()) {
134
+ tconfig = Conf::create(
135
+ RdKafka::Conf::CONF_TOPIC,
136
+ (info[1]->ToObject(Nan::GetCurrentContext())).ToLocalChecked(), errstr);
137
+
138
+ if (!tconfig) {
139
+ // No longer need this since we aren't instantiating anything
140
+ delete gconfig;
141
+ return Nan::ThrowError(errstr.c_str());
142
+ }
143
+ }
144
+
145
+ Producer* producer = new Producer(gconfig, tconfig);
146
+
147
+ // Wrap it
148
+ producer->Wrap(info.This());
149
+
150
+ // Then there is some weird initialization that happens
151
+ // basically it sets the configuration data
152
+ // we don't need to do that because we lazy load it
153
+
154
+ info.GetReturnValue().Set(info.This());
155
+ }
156
+
157
+ v8::Local<v8::Object> Producer::NewInstance(v8::Local<v8::Value> arg) {
158
+ Nan::EscapableHandleScope scope;
159
+
160
+ const unsigned argc = 1;
161
+
162
+ v8::Local<v8::Value> argv[argc] = { arg };
163
+ v8::Local<v8::Function> cons = Nan::New<v8::Function>(constructor);
164
+ v8::Local<v8::Object> instance =
165
+ Nan::NewInstance(cons, argc, argv).ToLocalChecked();
166
+
167
+ return scope.Escape(instance);
168
+ }
169
+
170
+ Baton Producer::Connect() {
171
+ if (IsConnected()) {
172
+ return Baton(RdKafka::ERR_NO_ERROR);
173
+ }
174
+
175
+ std::string errstr;
176
+
177
+ Baton baton = setupSaslOAuthBearerConfig();
178
+ if (baton.err() != RdKafka::ERR_NO_ERROR) {
179
+ return baton;
180
+ }
181
+
182
+ {
183
+ scoped_shared_read_lock lock(m_connection_lock);
184
+ m_client = RdKafka::Producer::create(m_gconfig, errstr);
185
+ }
186
+
187
+ if (!m_client) {
188
+ return Baton(RdKafka::ERR__STATE, errstr);
189
+ }
190
+
191
+ /* Set the client name at the first possible opportunity for logging. */
192
+ m_event_cb.dispatcher.SetClientName(m_client->name());
193
+
194
+ baton = setupSaslOAuthBearerBackgroundQueue();
195
+ return baton;
196
+ }
197
+
198
+ void Producer::ActivateDispatchers() {
199
+ m_gconfig->listen(); // From global config.
200
+ m_event_cb.dispatcher.Activate(); // From connection
201
+ m_dr_cb.dispatcher.Activate();
202
+ }
203
+
204
+ void Producer::DeactivateDispatchers() {
205
+ m_gconfig->stop(); // From global config.
206
+ m_event_cb.dispatcher.Deactivate(); // From connection
207
+ m_dr_cb.dispatcher.Deactivate();
208
+ }
209
+
210
+ void Producer::Disconnect() {
211
+ if (IsConnected()) {
212
+ scoped_shared_write_lock lock(m_connection_lock);
213
+ delete m_client;
214
+ m_client = NULL;
215
+ }
216
+ }
217
+
218
+ /**
219
+ * [Producer::Produce description]
220
+ * @param message - pointer to the message we are sending. This method will
221
+ * create a copy of it, so you are still required to free it when done.
222
+ * @param size - size of the message. We are copying the memory so we need
223
+ * the size
224
+ * @param topic - RdKafka::Topic* object to send the message to. Generally
225
+ * created by NodeKafka::Topic::toRDKafkaTopic
226
+ * @param partition - partition to send it to. Send in
227
+ * RdKafka::Topic::PARTITION_UA to send to an unassigned topic
228
+ * @param key - a string pointer for the key, or null if there is none.
229
+ * @return - A baton object with error code set if it failed.
230
+ */
231
+ Baton Producer::Produce(void* message, size_t size, RdKafka::Topic* topic,
232
+ int32_t partition, const void *key, size_t key_len, void* opaque) {
233
+ RdKafka::ErrorCode response_code;
234
+
235
+ if (IsConnected()) {
236
+ scoped_shared_read_lock lock(m_connection_lock);
237
+ if (IsConnected()) {
238
+ RdKafka::Producer* producer = dynamic_cast<RdKafka::Producer*>(m_client);
239
+ response_code = producer->produce(topic, partition,
240
+ RdKafka::Producer::RK_MSG_COPY,
241
+ message, size, key, key_len, opaque);
242
+ } else {
243
+ response_code = RdKafka::ERR__STATE;
244
+ }
245
+ } else {
246
+ response_code = RdKafka::ERR__STATE;
247
+ }
248
+
249
+ // These topics actually link to the configuration
250
+ // they are made from. It's so we can reuse topic configurations
251
+ // That means if we delete it here and librd thinks its still linked,
252
+ // producing to the same topic will try to reuse it and it will die.
253
+ //
254
+ // Honestly, we may need to make configuration a first class object
255
+ // @todo(Conf needs to be a first class object that is passed around)
256
+ // delete topic;
257
+
258
+ if (response_code != RdKafka::ERR_NO_ERROR) {
259
+ return Baton(response_code);
260
+ }
261
+
262
+ return Baton(RdKafka::ERR_NO_ERROR);
263
+ }
264
+
265
+ /**
266
+ * [Producer::Produce description]
267
+ * @param message - pointer to the message we are sending. This method will
268
+ * create a copy of it, so you are still required to free it when done.
269
+ * @param size - size of the message. We are copying the memory so we need
270
+ * the size
271
+ * @param topic - String topic to use so we do not need to create
272
+ * an RdKafka::Topic*
273
+ * @param partition - partition to send it to. Send in
274
+ * RdKafka::Topic::PARTITION_UA to send to an unassigned topic
275
+ * @param key - a string pointer for the key, or null if there is none.
276
+ * @return - A baton object with error code set if it failed.
277
+ */
278
+ Baton Producer::Produce(void* message, size_t size, std::string topic,
279
+ int32_t partition, std::string *key, int64_t timestamp, void* opaque,
280
+ RdKafka::Headers* headers) {
281
+ return Produce(message, size, topic, partition,
282
+ key ? key->data() : NULL, key ? key->size() : 0,
283
+ timestamp, opaque, headers);
284
+ }
285
+
286
+ /**
287
+ * [Producer::Produce description]
288
+ * @param message - pointer to the message we are sending. This method will
289
+ * create a copy of it, so you are still required to free it when done.
290
+ * @param size - size of the message. We are copying the memory so we need
291
+ * the size
292
+ * @param topic - String topic to use so we do not need to create
293
+ * an RdKafka::Topic*
294
+ * @param partition - partition to send it to. Send in
295
+ * RdKafka::Topic::PARTITION_UA to send to an unassigned topic
296
+ * @param key - a string pointer for the key, or null if there is none.
297
+ * @return - A baton object with error code set if it failed.
298
+ */
299
+ Baton Producer::Produce(void* message, size_t size, std::string topic,
300
+ int32_t partition, const void *key, size_t key_len,
301
+ int64_t timestamp, void* opaque, RdKafka::Headers* headers) {
302
+ RdKafka::ErrorCode response_code;
303
+
304
+ if (IsConnected()) {
305
+ scoped_shared_read_lock lock(m_connection_lock);
306
+ if (IsConnected()) {
307
+ RdKafka::Producer* producer = dynamic_cast<RdKafka::Producer*>(m_client);
308
+ // This one is a bit different
309
+ response_code = producer->produce(topic, partition,
310
+ RdKafka::Producer::RK_MSG_COPY,
311
+ message, size,
312
+ key, key_len,
313
+ timestamp, headers, opaque);
314
+ } else {
315
+ response_code = RdKafka::ERR__STATE;
316
+ }
317
+ } else {
318
+ response_code = RdKafka::ERR__STATE;
319
+ }
320
+
321
+ // These topics actually link to the configuration
322
+ // they are made from. It's so we can reuse topic configurations
323
+ // That means if we delete it here and librd thinks its still linked,
324
+ // producing to the same topic will try to reuse it and it will die.
325
+ //
326
+ // Honestly, we may need to make configuration a first class object
327
+ // @todo(Conf needs to be a first class object that is passed around)
328
+ // delete topic;
329
+
330
+ if (response_code != RdKafka::ERR_NO_ERROR) {
331
+ return Baton(response_code);
332
+ }
333
+
334
+ return Baton(RdKafka::ERR_NO_ERROR);
335
+ }
336
+
337
+ void Producer::Poll() {
338
+ // We're not allowed to call poll when we have forwarded the main
339
+ // queue to the background queue, as that would indirectly poll
340
+ // the background queue. However, that's not allowed by librdkafka.
341
+ if (m_is_background_polling) {
342
+ return;
343
+ }
344
+ m_client->poll(0);
345
+ }
346
+
347
+ void Producer::ConfigureCallback(const std::string& string_key,
348
+ const v8::Local<v8::Function>& cb, bool add) {
349
+ if (string_key.compare("delivery_cb") == 0) {
350
+ if (add) {
351
+ bool dr_msg_cb = false;
352
+ v8::Local<v8::String> dr_msg_cb_key = Nan::New("dr_msg_cb").ToLocalChecked(); // NOLINT
353
+ if (Nan::Has(cb, dr_msg_cb_key).FromMaybe(false)) {
354
+ v8::Local<v8::Value> v = Nan::Get(cb, dr_msg_cb_key).ToLocalChecked();
355
+ if (v->IsBoolean()) {
356
+ dr_msg_cb = Nan::To<bool>(v).ToChecked();
357
+ }
358
+ }
359
+ if (dr_msg_cb) {
360
+ this->m_dr_cb.SendMessageBuffer(true);
361
+ }
362
+ this->m_dr_cb.dispatcher.AddCallback(cb);
363
+ } else {
364
+ this->m_dr_cb.dispatcher.RemoveCallback(cb);
365
+ }
366
+ } else {
367
+ Connection::ConfigureCallback(string_key, cb, add);
368
+ }
369
+ }
370
+
371
+ Baton Producer::InitTransactions(int32_t timeout_ms) {
372
+ if (!IsConnected()) {
373
+ return Baton(RdKafka::ERR__STATE);
374
+ }
375
+
376
+ RdKafka::Producer* producer = dynamic_cast<RdKafka::Producer*>(m_client);
377
+ RdKafka::Error* error = producer->init_transactions(timeout_ms);
378
+
379
+ return rdkafkaErrorToBaton( error);
380
+ }
381
+
382
+ Baton Producer::BeginTransaction() {
383
+ if (!IsConnected()) {
384
+ return Baton(RdKafka::ERR__STATE);
385
+ }
386
+
387
+ RdKafka::Producer* producer = dynamic_cast<RdKafka::Producer*>(m_client);
388
+ RdKafka::Error* error = producer->begin_transaction();
389
+
390
+ return rdkafkaErrorToBaton( error);
391
+ }
392
+
393
+ Baton Producer::CommitTransaction(int32_t timeout_ms) {
394
+ if (!IsConnected()) {
395
+ return Baton(RdKafka::ERR__STATE);
396
+ }
397
+
398
+ RdKafka::Producer* producer = dynamic_cast<RdKafka::Producer*>(m_client);
399
+ RdKafka::Error* error = producer->commit_transaction(timeout_ms);
400
+
401
+ return rdkafkaErrorToBaton( error);
402
+ }
403
+
404
+ Baton Producer::AbortTransaction(int32_t timeout_ms) {
405
+ if (!IsConnected()) {
406
+ return Baton(RdKafka::ERR__STATE);
407
+ }
408
+
409
+ RdKafka::Producer* producer = dynamic_cast<RdKafka::Producer*>(m_client);
410
+ RdKafka::Error* error = producer->abort_transaction(timeout_ms);
411
+
412
+ return rdkafkaErrorToBaton( error);
413
+ }
414
+
415
+ Baton Producer::SendOffsetsToTransaction(
416
+ std::vector<RdKafka::TopicPartition*> &offsets,
417
+ NodeKafka::KafkaConsumer* consumer,
418
+ int timeout_ms) {
419
+ if (!IsConnected()) {
420
+ return Baton(RdKafka::ERR__STATE);
421
+ }
422
+
423
+ RdKafka::ConsumerGroupMetadata* group_metadata =
424
+ dynamic_cast<RdKafka::KafkaConsumer*>(consumer->m_client)->groupMetadata(); // NOLINT
425
+
426
+ RdKafka::Producer* producer = dynamic_cast<RdKafka::Producer*>(m_client);
427
+ RdKafka::Error* error =
428
+ producer->send_offsets_to_transaction(offsets, group_metadata, timeout_ms);
429
+ delete group_metadata;
430
+
431
+ return rdkafkaErrorToBaton( error);
432
+ }
433
+
434
+ /* Node exposed methods */
435
+
436
+ /**
437
+ * @brief Producer::NodeProduce - produce a message through a producer
438
+ *
439
+ * This is a synchronous method. You may ask, "why?". The answer is because
440
+ * there is no true value doing this asynchronously. All it does is degrade
441
+ * performance. This method does not block - all it does is add a message
442
+ * to a queue. In the case where the queue is full, it will return an error
443
+ * immediately. The only way this method blocks is when you provide it a
444
+ * flag to do so, which we never do.
445
+ *
446
+ * Doing it asynchronously eats up the libuv threadpool for no reason and
447
+ * increases execution time by a very small amount. It will take two ticks of
448
+ * the event loop to execute at minimum - 1 for executing it and another for
449
+ * calling back the callback.
450
+ *
451
+ * @sa RdKafka::Producer::produce
452
+ */
453
+ NAN_METHOD(Producer::NodeProduce) {
454
+ Nan::HandleScope scope;
455
+
456
+ // Need to extract the message data here.
457
+ if (info.Length() < 3) {
458
+ // Just throw an exception
459
+ return Nan::ThrowError("Need to specify a topic, partition, and message");
460
+ }
461
+
462
+ // Second parameter is the partition
463
+ int32_t partition;
464
+
465
+ if (info[1]->IsNull() || info[1]->IsUndefined()) {
466
+ partition = RdKafka::Topic::PARTITION_UA;
467
+ } else {
468
+ partition = Nan::To<int32_t>(info[1]).FromJust();
469
+ }
470
+
471
+ if (partition < 0) {
472
+ partition = RdKafka::Topic::PARTITION_UA;
473
+ }
474
+
475
+ size_t message_buffer_length;
476
+ void* message_buffer_data;
477
+
478
+ if (info[2]->IsNull()) {
479
+ // This is okay for whatever reason
480
+ message_buffer_length = 0;
481
+ message_buffer_data = NULL;
482
+ } else if (!node::Buffer::HasInstance(info[2])) {
483
+ return Nan::ThrowError("Message must be a buffer or null");
484
+ } else {
485
+ v8::Local<v8::Object> message_buffer_object =
486
+ (info[2]->ToObject(Nan::GetCurrentContext())).ToLocalChecked();
487
+
488
+ // v8 handles the garbage collection here so we need to make a copy of
489
+ // the buffer or assign the buffer to a persistent handle.
490
+
491
+ // I'm not sure which would be the more performant option. I assume
492
+ // the persistent handle would be but for now we'll try this one
493
+ // which should be more memory-efficient and allow v8 to dispose of the
494
+ // buffer sooner
495
+
496
+ message_buffer_length = node::Buffer::Length(message_buffer_object);
497
+ message_buffer_data = node::Buffer::Data(message_buffer_object);
498
+ if (message_buffer_data == NULL) {
499
+ // empty string message buffer should not end up as null message
500
+ v8::Local<v8::Object> message_buffer_object_emptystring =
501
+ Nan::NewBuffer(new char[0], 0).ToLocalChecked();
502
+ message_buffer_length =
503
+ node::Buffer::Length(message_buffer_object_emptystring);
504
+ message_buffer_data = node::Buffer::Data(message_buffer_object_emptystring); // NOLINT
505
+ }
506
+ }
507
+
508
+ size_t key_buffer_length;
509
+ const void* key_buffer_data;
510
+ std::string * key = NULL;
511
+
512
+ if (info[3]->IsNull() || info[3]->IsUndefined()) {
513
+ // This is okay for whatever reason
514
+ key_buffer_length = 0;
515
+ key_buffer_data = NULL;
516
+ } else if (node::Buffer::HasInstance(info[3])) {
517
+ v8::Local<v8::Object> key_buffer_object =
518
+ (info[3]->ToObject(Nan::GetCurrentContext())).ToLocalChecked();
519
+
520
+ // v8 handles the garbage collection here so we need to make a copy of
521
+ // the buffer or assign the buffer to a persistent handle.
522
+
523
+ // I'm not sure which would be the more performant option. I assume
524
+ // the persistent handle would be but for now we'll try this one
525
+ // which should be more memory-efficient and allow v8 to dispose of the
526
+ // buffer sooner
527
+
528
+ key_buffer_length = node::Buffer::Length(key_buffer_object);
529
+ key_buffer_data = node::Buffer::Data(key_buffer_object);
530
+ if (key_buffer_data == NULL) {
531
+ // empty string key buffer should not end up as null key
532
+ v8::Local<v8::Object> key_buffer_object_emptystring =
533
+ Nan::NewBuffer(new char[0], 0).ToLocalChecked();
534
+ key_buffer_length = node::Buffer::Length(key_buffer_object_emptystring);
535
+ key_buffer_data = node::Buffer::Data(key_buffer_object_emptystring);
536
+ }
537
+ } else {
538
+ // If it was a string just use the utf8 value.
539
+ v8::Local<v8::String> val = Nan::To<v8::String>(info[3]).ToLocalChecked();
540
+ // Get string pointer for this thing
541
+ Nan::Utf8String keyUTF8(val);
542
+ key = new std::string(*keyUTF8);
543
+
544
+ key_buffer_data = key->data();
545
+ key_buffer_length = key->length();
546
+ }
547
+
548
+ int64_t timestamp;
549
+
550
+ if (info.Length() > 4 && !info[4]->IsUndefined() && !info[4]->IsNull()) {
551
+ if (!info[4]->IsNumber()) {
552
+ return Nan::ThrowError("Timestamp must be a number");
553
+ }
554
+
555
+ timestamp = Nan::To<int64_t>(info[4]).FromJust();
556
+ } else {
557
+ timestamp = 0;
558
+ }
559
+
560
+ void* opaque = NULL;
561
+ // Opaque handling
562
+ if (info.Length() > 5 && !info[5]->IsUndefined()) {
563
+ // We need to create a persistent handle
564
+ opaque = new Nan::Persistent<v8::Value>(info[5]);
565
+ // To get the local from this later,
566
+ // v8::Local<v8::Object> object = Nan::New(persistent);
567
+ }
568
+
569
+ std::vector<RdKafka::Headers::Header> headers;
570
+ if (info.Length() > 6 && !info[6]->IsUndefined()) {
571
+ v8::Local<v8::Array> v8Headers = v8::Local<v8::Array>::Cast(info[6]);
572
+
573
+ if (v8Headers->Length() >= 1) {
574
+ for (unsigned int i = 0; i < v8Headers->Length(); i++) {
575
+ v8::Local<v8::Object> header = Nan::Get(v8Headers, i).ToLocalChecked()
576
+ ->ToObject(Nan::GetCurrentContext()).ToLocalChecked();
577
+ if (header.IsEmpty()) {
578
+ continue;
579
+ }
580
+
581
+ v8::Local<v8::Array> props = header->GetOwnPropertyNames(
582
+ Nan::GetCurrentContext()).ToLocalChecked();
583
+
584
+ // TODO: Other properties in the list of properties should not be
585
+ // ignored, but they are. This is a bug, need to handle it either in JS
586
+ // or here.
587
+ Nan::MaybeLocal<v8::String> v8Key =
588
+ Nan::To<v8::String>(Nan::Get(props, 0).ToLocalChecked());
589
+
590
+ // The key must be a string.
591
+ if (v8Key.IsEmpty()) {
592
+ Nan::ThrowError("Header key must be a string");
593
+ }
594
+ Nan::Utf8String uKey(v8Key.ToLocalChecked());
595
+ std::string key(*uKey);
596
+
597
+ // Valid types for the header are string or buffer.
598
+ // Other types will throw an error.
599
+ v8::Local<v8::Value> v8Value =
600
+ Nan::Get(header, v8Key.ToLocalChecked()).ToLocalChecked();
601
+
602
+ if (node::Buffer::HasInstance(v8Value)) {
603
+ const char* value = node::Buffer::Data(v8Value);
604
+ const size_t value_len = node::Buffer::Length(v8Value);
605
+ headers.push_back(RdKafka::Headers::Header(key, value, value_len));
606
+ } else if (v8Value->IsString()) {
607
+ Nan::Utf8String uValue(v8Value);
608
+ std::string value(*uValue);
609
+ headers.push_back(
610
+ RdKafka::Headers::Header(key, value.c_str(), value.size()));
611
+ } else {
612
+ Nan::ThrowError("Header value must be a string or buffer");
613
+ }
614
+ }
615
+ }
616
+ }
617
+
618
+ Producer* producer = ObjectWrap::Unwrap<Producer>(info.This());
619
+
620
+ // Let the JS library throw if we need to so the error can be more rich
621
+ int error_code;
622
+
623
+ if (info[0]->IsString()) {
624
+ // Get string pointer for this thing
625
+ Nan::Utf8String topicUTF8(Nan::To<v8::String>(info[0]).ToLocalChecked());
626
+ std::string topic_name(*topicUTF8);
627
+ RdKafka::Headers *rd_headers = RdKafka::Headers::create(headers);
628
+
629
+ Baton b = producer->Produce(message_buffer_data, message_buffer_length,
630
+ topic_name, partition, key_buffer_data, key_buffer_length,
631
+ timestamp, opaque, rd_headers);
632
+
633
+ error_code = static_cast<int>(b.err());
634
+ if (error_code != 0 && rd_headers) {
635
+ delete rd_headers;
636
+ }
637
+ } else {
638
+ // First parameter is a topic OBJECT
639
+ Topic* topic = ObjectWrap::Unwrap<Topic>(info[0].As<v8::Object>());
640
+
641
+ // Unwrap it and turn it into an RdKafka::Topic*
642
+ Baton topic_baton = topic->toRDKafkaTopic(producer);
643
+
644
+ if (topic_baton.err() != RdKafka::ERR_NO_ERROR) {
645
+ // Let the JS library throw if we need to so the error can be more rich
646
+ error_code = static_cast<int>(topic_baton.err());
647
+
648
+ return info.GetReturnValue().Set(Nan::New<v8::Number>(error_code));
649
+ }
650
+
651
+ RdKafka::Topic* rd_topic = topic_baton.data<RdKafka::Topic*>();
652
+
653
+ Baton b = producer->Produce(message_buffer_data, message_buffer_length,
654
+ rd_topic, partition, key_buffer_data, key_buffer_length, opaque);
655
+
656
+ // Delete the topic when we are done.
657
+ delete rd_topic;
658
+
659
+ error_code = static_cast<int>(b.err());
660
+ }
661
+
662
+ if (error_code != 0 && opaque) {
663
+ // If there was an error enqueing this message, there will never
664
+ // be a delivery report for it, so we have to clean up the opaque
665
+ // data now, if there was any.
666
+
667
+ Nan::Persistent<v8::Value> *persistent =
668
+ static_cast<Nan::Persistent<v8::Value> *>(opaque);
669
+ persistent->Reset();
670
+ delete persistent;
671
+ }
672
+
673
+ if (key != NULL) {
674
+ delete key;
675
+ }
676
+
677
+ info.GetReturnValue().Set(Nan::New<v8::Number>(error_code));
678
+ }
679
+
680
+ NAN_METHOD(Producer::NodeSetPartitioner) {
681
+ Nan::HandleScope scope;
682
+
683
+ if (info.Length() < 1 || !info[0]->IsFunction()) {
684
+ // Just throw an exception
685
+ return Nan::ThrowError("Need to specify a callback");
686
+ }
687
+
688
+ Producer* producer = ObjectWrap::Unwrap<Producer>(info.This());
689
+ v8::Local<v8::Function> cb = info[0].As<v8::Function>();
690
+ producer->m_partitioner_cb.SetCallback(cb);
691
+ info.GetReturnValue().Set(Nan::True());
692
+ }
693
+
694
+ NAN_METHOD(Producer::NodeConnect) {
695
+ Nan::HandleScope scope;
696
+
697
+ if (info.Length() < 1 || !info[0]->IsFunction()) {
698
+ // Just throw an exception
699
+ return Nan::ThrowError("Need to specify a callback");
700
+ }
701
+
702
+ // This needs to be offloaded to libuv
703
+ v8::Local<v8::Function> cb = info[0].As<v8::Function>();
704
+ Nan::Callback *callback = new Nan::Callback(cb);
705
+
706
+ Producer* producer = ObjectWrap::Unwrap<Producer>(info.This());
707
+
708
+ // Activate the dispatchers before the connection, as some callbacks may run
709
+ // on the background thread.
710
+ // We will deactivate them if the connection fails.
711
+ producer->ActivateDispatchers();
712
+
713
+ Nan::AsyncQueueWorker(new Workers::ProducerConnect(callback, producer));
714
+
715
+ info.GetReturnValue().Set(Nan::Null());
716
+ }
717
+
718
+ NAN_METHOD(Producer::NodePoll) {
719
+ Nan::HandleScope scope;
720
+
721
+ Producer* producer = ObjectWrap::Unwrap<Producer>(info.This());
722
+
723
+ if (!producer->IsConnected()) {
724
+ Nan::ThrowError("Producer is disconnected");
725
+ } else {
726
+ producer->Poll();
727
+ info.GetReturnValue().Set(Nan::True());
728
+ }
729
+ }
730
+
731
+ NAN_METHOD(Producer::NodeSetPollInBackground) {
732
+ Nan::HandleScope scope;
733
+ if (info.Length() < 1 || !info[0]->IsBoolean()) {
734
+ // Just throw an exception
735
+ return Nan::ThrowError(
736
+ "Need to specify a boolean for setting or unsetting");
737
+ }
738
+ bool set = Nan::To<bool>(info[0]).FromJust();
739
+
740
+ Producer* producer = ObjectWrap::Unwrap<Producer>(info.This());
741
+ Baton b = producer->SetPollInBackground(set);
742
+ if (b.err() != RdKafka::ERR_NO_ERROR) {
743
+ return Nan::ThrowError(b.errstr().c_str());
744
+ }
745
+ info.GetReturnValue().Set(b.ToObject());
746
+ }
747
+
748
+ Baton Producer::Flush(int timeout_ms) {
749
+ RdKafka::ErrorCode response_code;
750
+ if (IsConnected()) {
751
+ scoped_shared_read_lock lock(m_connection_lock);
752
+ if (IsConnected()) {
753
+ RdKafka::Producer* producer = dynamic_cast<RdKafka::Producer*>(m_client);
754
+ response_code = producer->flush(timeout_ms);
755
+ } else {
756
+ response_code = RdKafka::ERR__STATE;
757
+ }
758
+ } else {
759
+ response_code = RdKafka::ERR__STATE;
760
+ }
761
+
762
+ return Baton(response_code);
763
+ }
764
+
765
+ NAN_METHOD(Producer::NodeFlush) {
766
+ Nan::HandleScope scope;
767
+
768
+ if (info.Length() < 2 || !info[1]->IsFunction() || !info[0]->IsNumber()) {
769
+ // Just throw an exception
770
+ return Nan::ThrowError("Need to specify a timeout and a callback");
771
+ }
772
+
773
+ int timeout_ms = Nan::To<int>(info[0]).FromJust();
774
+
775
+ v8::Local<v8::Function> cb = info[1].As<v8::Function>();
776
+ Nan::Callback *callback = new Nan::Callback(cb);
777
+
778
+ Producer* producer = ObjectWrap::Unwrap<Producer>(info.This());
779
+
780
+ Nan::AsyncQueueWorker(
781
+ new Workers::ProducerFlush(callback, producer, timeout_ms));
782
+
783
+ info.GetReturnValue().Set(Nan::Null());
784
+ }
785
+
786
+ NAN_METHOD(Producer::NodeDisconnect) {
787
+ Nan::HandleScope scope;
788
+
789
+ if (info.Length() < 1 || !info[0]->IsFunction()) {
790
+ // Just throw an exception
791
+ return Nan::ThrowError("Need to specify a callback");
792
+ }
793
+
794
+
795
+ v8::Local<v8::Function> cb = info[0].As<v8::Function>();
796
+ Nan::Callback *callback = new Nan::Callback(cb);
797
+
798
+ Producer* producer = ObjectWrap::Unwrap<Producer>(info.This());
799
+ Nan::AsyncQueueWorker(new Workers::ProducerDisconnect(callback, producer));
800
+
801
+ info.GetReturnValue().Set(Nan::Null());
802
+ }
803
+
804
+ NAN_METHOD(Producer::NodeInitTransactions) {
805
+ Nan::HandleScope scope;
806
+
807
+ if (info.Length() < 2 || !info[1]->IsFunction() || !info[0]->IsNumber()) {
808
+ return Nan::ThrowError("Need to specify a timeout and a callback");
809
+ }
810
+
811
+ int timeout_ms = Nan::To<int>(info[0]).FromJust();
812
+
813
+ v8::Local<v8::Function> cb = info[1].As<v8::Function>();
814
+ Nan::Callback *callback = new Nan::Callback(cb);
815
+
816
+ Producer* producer = ObjectWrap::Unwrap<Producer>(info.This());
817
+ Nan::AsyncQueueWorker(
818
+ new Workers::ProducerInitTransactions(callback, producer, timeout_ms));
819
+
820
+ info.GetReturnValue().Set(Nan::Null());
821
+ }
822
+
823
+ NAN_METHOD(Producer::NodeBeginTransaction) {
824
+ Nan::HandleScope scope;
825
+
826
+ if (info.Length() < 1 || !info[0]->IsFunction()) {
827
+ return Nan::ThrowError("Need to specify a callback");
828
+ }
829
+
830
+ v8::Local<v8::Function> cb = info[0].As<v8::Function>();
831
+ Nan::Callback *callback = new Nan::Callback(cb);
832
+
833
+ Producer* producer = ObjectWrap::Unwrap<Producer>(info.This());
834
+ Nan::AsyncQueueWorker(new Workers::ProducerBeginTransaction(callback, producer)); // NOLINT
835
+
836
+ info.GetReturnValue().Set(Nan::Null());
837
+ }
838
+
839
+ NAN_METHOD(Producer::NodeCommitTransaction) {
840
+ Nan::HandleScope scope;
841
+
842
+ if (info.Length() < 2 || !info[1]->IsFunction() || !info[0]->IsNumber()) {
843
+ return Nan::ThrowError("Need to specify a timeout and a callback");
844
+ }
845
+
846
+ int timeout_ms = Nan::To<int>(info[0]).FromJust();
847
+
848
+ v8::Local<v8::Function> cb = info[1].As<v8::Function>();
849
+ Nan::Callback *callback = new Nan::Callback(cb);
850
+
851
+ Producer* producer = ObjectWrap::Unwrap<Producer>(info.This());
852
+ Nan::AsyncQueueWorker(
853
+ new Workers::ProducerCommitTransaction(callback, producer, timeout_ms));
854
+
855
+ info.GetReturnValue().Set(Nan::Null());
856
+ }
857
+
858
+ NAN_METHOD(Producer::NodeAbortTransaction) {
859
+ Nan::HandleScope scope;
860
+
861
+ if (info.Length() < 2 || !info[1]->IsFunction() || !info[0]->IsNumber()) {
862
+ return Nan::ThrowError("Need to specify a timeout and a callback");
863
+ }
864
+
865
+ int timeout_ms = Nan::To<int>(info[0]).FromJust();
866
+
867
+ v8::Local<v8::Function> cb = info[1].As<v8::Function>();
868
+ Nan::Callback *callback = new Nan::Callback(cb);
869
+
870
+ Producer* producer = ObjectWrap::Unwrap<Producer>(info.This());
871
+ Nan::AsyncQueueWorker(
872
+ new Workers::ProducerAbortTransaction(callback, producer, timeout_ms));
873
+
874
+ info.GetReturnValue().Set(Nan::Null());
875
+ }
876
+
877
+ NAN_METHOD(Producer::NodeSendOffsetsToTransaction) {
878
+ Nan::HandleScope scope;
879
+
880
+ if (info.Length() < 4) {
881
+ return Nan::ThrowError(
882
+ "Need to specify offsets, consumer, timeout for 'send offsets to transaction', and callback"); // NOLINT
883
+ }
884
+ if (!info[0]->IsArray()) {
885
+ return Nan::ThrowError(
886
+ "First argument to 'send offsets to transaction' has to be a consumer object"); // NOLINT
887
+ }
888
+ if (!info[1]->IsObject()) {
889
+ Nan::ThrowError("Kafka consumer must be provided");
890
+ }
891
+ if (!info[2]->IsNumber()) {
892
+ Nan::ThrowError("Timeout must be provided");
893
+ }
894
+ if (!info[3]->IsFunction()) {
895
+ return Nan::ThrowError("Need to specify a callback");
896
+ }
897
+
898
+ std::vector<RdKafka::TopicPartition*> toppars =
899
+ Conversion::TopicPartition::FromV8Array(info[0].As<v8::Array>());
900
+ NodeKafka::KafkaConsumer* consumer =
901
+ ObjectWrap::Unwrap<KafkaConsumer>(info[1].As<v8::Object>());
902
+ int timeout_ms = Nan::To<int>(info[2]).FromJust();
903
+ v8::Local<v8::Function> cb = info[3].As<v8::Function>();
904
+ Nan::Callback *callback = new Nan::Callback(cb);
905
+
906
+ Producer* producer = ObjectWrap::Unwrap<Producer>(info.This());
907
+ Nan::AsyncQueueWorker(new Workers::ProducerSendOffsetsToTransaction(
908
+ callback,
909
+ producer,
910
+ toppars,
911
+ consumer,
912
+ timeout_ms));
913
+
914
+ info.GetReturnValue().Set(Nan::Null());
915
+ }
916
+
917
+ } // namespace NodeKafka