@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
package/src/workers.cc ADDED
@@ -0,0 +1,1714 @@
1
+ /*
2
+ * confluent-kafka-javascript - Node.js wrapper for RdKafka C/C++ library
3
+ *
4
+ * Copyright (c) 2016-2023 Blizzard Entertainment
5
+ * (c) 2024 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
+ #include "src/workers.h"
11
+
12
+ #include <string>
13
+ #include <vector>
14
+
15
+ #ifndef _WIN32
16
+ #include <unistd.h>
17
+ #else
18
+ // Windows specific
19
+ #include <time.h>
20
+ #endif
21
+
22
+ using NodeKafka::Producer;
23
+ using NodeKafka::Connection;
24
+
25
+ namespace NodeKafka {
26
+ namespace Workers {
27
+
28
+ namespace Handle {
29
+ /**
30
+ * @brief Handle: get offsets for times.
31
+ *
32
+ * This callback will take a topic partition list with timestamps and
33
+ * for each topic partition, will fill in the offsets. It is done async
34
+ * because it has a timeout and I don't want node to block
35
+ *
36
+ * @see RdKafka::KafkaConsumer::Committed
37
+ */
38
+
39
+ OffsetsForTimes::OffsetsForTimes(Nan::Callback *callback,
40
+ Connection* handle,
41
+ std::vector<RdKafka::TopicPartition*> & t,
42
+ const int & timeout_ms) :
43
+ ErrorAwareWorker(callback),
44
+ m_handle(handle),
45
+ m_topic_partitions(t),
46
+ m_timeout_ms(timeout_ms) {}
47
+
48
+ OffsetsForTimes::~OffsetsForTimes() {
49
+ // Delete the underlying topic partitions as they are ephemeral or cloned
50
+ RdKafka::TopicPartition::destroy(m_topic_partitions);
51
+ }
52
+
53
+ void OffsetsForTimes::Execute() {
54
+ Baton b = m_handle->OffsetsForTimes(m_topic_partitions, m_timeout_ms);
55
+ if (b.err() != RdKafka::ERR_NO_ERROR) {
56
+ SetErrorBaton(b);
57
+ }
58
+ }
59
+
60
+ void OffsetsForTimes::HandleOKCallback() {
61
+ Nan::HandleScope scope;
62
+
63
+ const unsigned int argc = 2;
64
+ v8::Local<v8::Value> argv[argc];
65
+
66
+ argv[0] = Nan::Null();
67
+ argv[1] = Conversion::TopicPartition::ToV8Array(m_topic_partitions);
68
+
69
+ callback->Call(argc, argv);
70
+ }
71
+
72
+ void OffsetsForTimes::HandleErrorCallback() {
73
+ Nan::HandleScope scope;
74
+
75
+ const unsigned int argc = 1;
76
+ v8::Local<v8::Value> argv[argc] = { GetErrorObject() };
77
+
78
+ callback->Call(argc, argv);
79
+ }
80
+ } // namespace Handle
81
+
82
+ ConnectionMetadata::ConnectionMetadata(
83
+ Nan::Callback *callback, Connection* connection,
84
+ std::string topic, int timeout_ms, bool all_topics) :
85
+ ErrorAwareWorker(callback),
86
+ m_connection(connection),
87
+ m_topic(topic),
88
+ m_timeout_ms(timeout_ms),
89
+ m_all_topics(all_topics),
90
+ m_metadata(NULL) {}
91
+
92
+ ConnectionMetadata::~ConnectionMetadata() {}
93
+
94
+ void ConnectionMetadata::Execute() {
95
+ Baton b = m_connection->GetMetadata(m_all_topics, m_topic, m_timeout_ms);
96
+
97
+ if (b.err() == RdKafka::ERR_NO_ERROR) {
98
+ // No good way to do this except some stupid string delimiting.
99
+ // maybe we'll delimit it by a | or something and just split
100
+ // the string to create the object
101
+ m_metadata = b.data<RdKafka::Metadata*>();
102
+ } else {
103
+ SetErrorBaton(b);
104
+ }
105
+ }
106
+
107
+ void ConnectionMetadata::HandleOKCallback() {
108
+ Nan::HandleScope scope;
109
+
110
+ const unsigned int argc = 2;
111
+
112
+ // This is a big one!
113
+ v8::Local<v8::Value> argv[argc] = { Nan::Null(),
114
+ Conversion::Metadata::ToV8Object(m_metadata)};
115
+
116
+ callback->Call(argc, argv);
117
+
118
+ delete m_metadata;
119
+ }
120
+
121
+ void ConnectionMetadata::HandleErrorCallback() {
122
+ Nan::HandleScope scope;
123
+
124
+ const unsigned int argc = 1;
125
+ v8::Local<v8::Value> argv[argc] = { GetErrorObject() };
126
+
127
+ callback->Call(argc, argv);
128
+ }
129
+
130
+ /**
131
+ * @brief Client query watermark offsets worker
132
+ *
133
+ * Easy Nan::AsyncWorker for getting watermark offsets from a broker
134
+ *
135
+ * @sa RdKafka::Handle::query_watermark_offsets
136
+ * @sa NodeKafka::Connection::QueryWatermarkOffsets
137
+ */
138
+
139
+ ConnectionQueryWatermarkOffsets::ConnectionQueryWatermarkOffsets(
140
+ Nan::Callback *callback, Connection* connection,
141
+ std::string topic, int32_t partition, int timeout_ms) :
142
+ ErrorAwareWorker(callback),
143
+ m_connection(connection),
144
+ m_topic(topic),
145
+ m_partition(partition),
146
+ m_timeout_ms(timeout_ms) {}
147
+
148
+ ConnectionQueryWatermarkOffsets::~ConnectionQueryWatermarkOffsets() {}
149
+
150
+ void ConnectionQueryWatermarkOffsets::Execute() {
151
+ Baton b = m_connection->QueryWatermarkOffsets(
152
+ m_topic, m_partition, &m_low_offset, &m_high_offset, m_timeout_ms);
153
+
154
+ // If we got any error here we need to bail out
155
+ if (b.err() != RdKafka::ERR_NO_ERROR) {
156
+ SetErrorBaton(b);
157
+ }
158
+ }
159
+
160
+ void ConnectionQueryWatermarkOffsets::HandleOKCallback() {
161
+ Nan::HandleScope scope;
162
+
163
+ const unsigned int argc = 2;
164
+
165
+ v8::Local<v8::Object> offsetsObj = Nan::New<v8::Object>();
166
+ Nan::Set(offsetsObj, Nan::New<v8::String>("lowOffset").ToLocalChecked(),
167
+ Nan::New<v8::Number>(m_low_offset));
168
+ Nan::Set(offsetsObj, Nan::New<v8::String>("highOffset").ToLocalChecked(),
169
+ Nan::New<v8::Number>(m_high_offset));
170
+
171
+ // This is a big one!
172
+ v8::Local<v8::Value> argv[argc] = { Nan::Null(), offsetsObj};
173
+
174
+ callback->Call(argc, argv);
175
+ }
176
+
177
+ void ConnectionQueryWatermarkOffsets::HandleErrorCallback() {
178
+ Nan::HandleScope scope;
179
+
180
+ const unsigned int argc = 1;
181
+ v8::Local<v8::Value> argv[argc] = { GetErrorObject() };
182
+
183
+ callback->Call(argc, argv);
184
+ }
185
+
186
+ /**
187
+ * @brief Producer connect worker.
188
+ *
189
+ * Easy Nan::AsyncWorker for setting up client connections
190
+ *
191
+ * @sa RdKafka::Producer::connect
192
+ * @sa NodeKafka::Producer::Connect
193
+ */
194
+
195
+ ProducerConnect::ProducerConnect(Nan::Callback *callback, Producer* producer):
196
+ ErrorAwareWorker(callback),
197
+ producer(producer) {}
198
+
199
+ ProducerConnect::~ProducerConnect() {}
200
+
201
+ void ProducerConnect::Execute() {
202
+ Baton b = producer->Connect();
203
+
204
+ if (b.err() != RdKafka::ERR_NO_ERROR) {
205
+ SetErrorBaton(b);
206
+ }
207
+ }
208
+
209
+ void ProducerConnect::HandleOKCallback() {
210
+ Nan::HandleScope scope;
211
+
212
+ const unsigned int argc = 2;
213
+
214
+ v8::Local<v8::Object> obj = Nan::New<v8::Object>();
215
+ Nan::Set(obj, Nan::New("name").ToLocalChecked(),
216
+ Nan::New(producer->Name()).ToLocalChecked());
217
+
218
+ v8::Local<v8::Value> argv[argc] = { Nan::Null(), obj};
219
+
220
+ callback->Call(argc, argv);
221
+ }
222
+
223
+ void ProducerConnect::HandleErrorCallback() {
224
+ Nan::HandleScope scope;
225
+
226
+ producer->DeactivateDispatchers();
227
+
228
+ const unsigned int argc = 1;
229
+ v8::Local<v8::Value> argv[argc] = { GetErrorObject() };
230
+
231
+ callback->Call(argc, argv);
232
+ }
233
+
234
+ /**
235
+ * @brief Producer disconnect worker
236
+ *
237
+ * Easy Nan::AsyncWorker for disconnecting from clients
238
+ */
239
+
240
+ ProducerDisconnect::ProducerDisconnect(Nan::Callback *callback,
241
+ Producer* producer):
242
+ ErrorAwareWorker(callback),
243
+ producer(producer) {}
244
+
245
+ ProducerDisconnect::~ProducerDisconnect() {}
246
+
247
+ void ProducerDisconnect::Execute() {
248
+ producer->Disconnect();
249
+ }
250
+
251
+ void ProducerDisconnect::HandleOKCallback() {
252
+ Nan::HandleScope scope;
253
+
254
+ const unsigned int argc = 2;
255
+ v8::Local<v8::Value> argv[argc] = { Nan::Null(), Nan::True()};
256
+
257
+ // Deactivate the dispatchers
258
+ producer->DeactivateDispatchers();
259
+
260
+ callback->Call(argc, argv);
261
+ }
262
+
263
+ void ProducerDisconnect::HandleErrorCallback() {
264
+ // This should never run
265
+ assert(0);
266
+ }
267
+
268
+ /**
269
+ * @brief Producer flush worker
270
+ *
271
+ * Easy Nan::AsyncWorker for flushing a producer.
272
+ */
273
+
274
+ ProducerFlush::ProducerFlush(Nan::Callback *callback,
275
+ Producer* producer, int timeout_ms):
276
+ ErrorAwareWorker(callback),
277
+ producer(producer),
278
+ timeout_ms(timeout_ms) {}
279
+
280
+ ProducerFlush::~ProducerFlush() {}
281
+
282
+ void ProducerFlush::Execute() {
283
+ if (!producer->IsConnected()) {
284
+ SetErrorMessage("Producer is disconnected");
285
+ return;
286
+ }
287
+
288
+ Baton b = producer->Flush(timeout_ms);
289
+ if (b.err() != RdKafka::ErrorCode::ERR_NO_ERROR) {
290
+ SetErrorBaton(b);
291
+ }
292
+ }
293
+
294
+ void ProducerFlush::HandleOKCallback() {
295
+ Nan::HandleScope scope;
296
+
297
+ const unsigned int argc = 1;
298
+ v8::Local<v8::Value> argv[argc] = { Nan::Null() };
299
+
300
+ callback->Call(argc, argv);
301
+ }
302
+
303
+ /**
304
+ * @brief Producer init transactions worker.
305
+ *
306
+ * Easy Nan::AsyncWorker for initiating transactions
307
+ *
308
+ * @sa RdKafka::Producer::init_transactions
309
+ * @sa NodeKafka::Producer::InitTransactions
310
+ */
311
+
312
+ ProducerInitTransactions::ProducerInitTransactions(Nan::Callback *callback,
313
+ Producer* producer, const int & timeout_ms):
314
+ ErrorAwareWorker(callback),
315
+ producer(producer),
316
+ m_timeout_ms(timeout_ms) {}
317
+
318
+ ProducerInitTransactions::~ProducerInitTransactions() {}
319
+
320
+ void ProducerInitTransactions::Execute() {
321
+ Baton b = producer->InitTransactions(m_timeout_ms);
322
+
323
+ if (b.err() != RdKafka::ERR_NO_ERROR) {
324
+ SetErrorBaton(b);
325
+ }
326
+ }
327
+
328
+ void ProducerInitTransactions::HandleOKCallback() {
329
+ Nan::HandleScope scope;
330
+
331
+ const unsigned int argc = 1;
332
+ v8::Local<v8::Value> argv[argc] = { Nan::Null() };
333
+
334
+ // Activate the dispatchers
335
+ producer->ActivateDispatchers();
336
+
337
+ callback->Call(argc, argv);
338
+ }
339
+
340
+ void ProducerInitTransactions::HandleErrorCallback() {
341
+ Nan::HandleScope scope;
342
+
343
+ const unsigned int argc = 1;
344
+ v8::Local<v8::Value> argv[argc] = { m_baton.ToTxnObject() };
345
+
346
+ callback->Call(argc, argv);
347
+ }
348
+
349
+ /**
350
+ * @brief Producer begin transaction worker.
351
+ *
352
+ * Easy Nan::AsyncWorker for begin transaction
353
+ *
354
+ * @sa RdKafka::Producer::begin_transaction
355
+ * @sa NodeKafka::Producer::BeginTransaction
356
+ */
357
+
358
+ ProducerBeginTransaction::ProducerBeginTransaction(Nan::Callback* callback,
359
+ Producer* producer)
360
+ : ErrorAwareWorker(callback), producer(producer) {}
361
+
362
+ ProducerBeginTransaction::~ProducerBeginTransaction() {}
363
+
364
+ void ProducerBeginTransaction::Execute() {
365
+ Baton b = producer->BeginTransaction();
366
+
367
+ if (b.err() != RdKafka::ERR_NO_ERROR) {
368
+ SetErrorBaton(b);
369
+ }
370
+ }
371
+
372
+ void ProducerBeginTransaction::HandleOKCallback() {
373
+ Nan::HandleScope scope;
374
+
375
+ const unsigned int argc = 1;
376
+
377
+ v8::Local<v8::Value> argv[argc] = { Nan::Null() };
378
+
379
+ // Activate the dispatchers
380
+ producer->ActivateDispatchers();
381
+
382
+ callback->Call(argc, argv);
383
+ }
384
+
385
+ void ProducerBeginTransaction::HandleErrorCallback() {
386
+ Nan::HandleScope scope;
387
+
388
+ const unsigned int argc = 1;
389
+ v8::Local<v8::Value> argv[argc] = { GetErrorObject() };
390
+
391
+ callback->Call(argc, argv);
392
+ }
393
+
394
+ /**
395
+ * @brief Producer commit transaction worker.
396
+ *
397
+ * Easy Nan::AsyncWorker for committing transaction
398
+ *
399
+ * @sa RdKafka::Producer::commit_transaction
400
+ * @sa NodeKafka::Producer::CommitTransaction
401
+ */
402
+
403
+ ProducerCommitTransaction::ProducerCommitTransaction(Nan::Callback *callback,
404
+ Producer* producer, const int & timeout_ms):
405
+ ErrorAwareWorker(callback),
406
+ producer(producer),
407
+ m_timeout_ms(timeout_ms) {}
408
+
409
+ ProducerCommitTransaction::~ProducerCommitTransaction() {}
410
+
411
+ void ProducerCommitTransaction::Execute() {
412
+ Baton b = producer->CommitTransaction(m_timeout_ms);
413
+
414
+ if (b.err() != RdKafka::ERR_NO_ERROR) {
415
+ SetErrorBaton(b);
416
+ }
417
+ }
418
+
419
+ void ProducerCommitTransaction::HandleOKCallback() {
420
+ Nan::HandleScope scope;
421
+
422
+ const unsigned int argc = 1;
423
+ v8::Local<v8::Value> argv[argc] = { Nan::Null() };
424
+
425
+ // Activate the dispatchers
426
+ producer->ActivateDispatchers();
427
+
428
+ callback->Call(argc, argv);
429
+ }
430
+
431
+ void ProducerCommitTransaction::HandleErrorCallback() {
432
+ Nan::HandleScope scope;
433
+
434
+ const unsigned int argc = 1;
435
+ v8::Local<v8::Value> argv[argc] = { m_baton.ToTxnObject() };
436
+
437
+ callback->Call(argc, argv);
438
+ }
439
+
440
+ /**
441
+ * @brief Producer abort transaction worker.
442
+ *
443
+ * Easy Nan::AsyncWorker for aborting transaction
444
+ *
445
+ * @sa RdKafka::Producer::abort_transaction
446
+ * @sa NodeKafka::Producer::AbortTransaction
447
+ */
448
+
449
+ ProducerAbortTransaction::ProducerAbortTransaction(Nan::Callback *callback,
450
+ Producer* producer, const int & timeout_ms):
451
+ ErrorAwareWorker(callback),
452
+ producer(producer),
453
+ m_timeout_ms(timeout_ms) {}
454
+
455
+ ProducerAbortTransaction::~ProducerAbortTransaction() {}
456
+
457
+ void ProducerAbortTransaction::Execute() {
458
+ Baton b = producer->AbortTransaction(m_timeout_ms);
459
+
460
+ if (b.err() != RdKafka::ERR_NO_ERROR) {
461
+ SetErrorBaton(b);
462
+ }
463
+ }
464
+
465
+ void ProducerAbortTransaction::HandleOKCallback() {
466
+ Nan::HandleScope scope;
467
+
468
+ const unsigned int argc = 1;
469
+ v8::Local<v8::Value> argv[argc] = { Nan::Null() };
470
+
471
+ // Activate the dispatchers
472
+ producer->ActivateDispatchers();
473
+
474
+ callback->Call(argc, argv);
475
+ }
476
+
477
+ void ProducerAbortTransaction::HandleErrorCallback() {
478
+ Nan::HandleScope scope;
479
+
480
+ const unsigned int argc = 1;
481
+ v8::Local<v8::Value> argv[argc] = { m_baton.ToTxnObject() };
482
+
483
+ callback->Call(argc, argv);
484
+ }
485
+
486
+ /**
487
+ * @brief Producer SendOffsetsToTransaction worker.
488
+ *
489
+ * Easy Nan::AsyncWorker for SendOffsetsToTransaction
490
+ *
491
+ * @sa RdKafka::Producer::send_offsets_to_transaction
492
+ * @sa NodeKafka::Producer::SendOffsetsToTransaction
493
+ */
494
+
495
+ ProducerSendOffsetsToTransaction::ProducerSendOffsetsToTransaction(
496
+ Nan::Callback *callback,
497
+ Producer* producer,
498
+ std::vector<RdKafka::TopicPartition *> & t,
499
+ KafkaConsumer* consumer,
500
+ const int & timeout_ms):
501
+ ErrorAwareWorker(callback),
502
+ producer(producer),
503
+ m_topic_partitions(t),
504
+ consumer(consumer),
505
+ m_timeout_ms(timeout_ms) {}
506
+
507
+ ProducerSendOffsetsToTransaction::~ProducerSendOffsetsToTransaction() {}
508
+
509
+ void ProducerSendOffsetsToTransaction::Execute() {
510
+ Baton b = producer->SendOffsetsToTransaction(m_topic_partitions, consumer,
511
+ m_timeout_ms);
512
+
513
+ if (b.err() != RdKafka::ERR_NO_ERROR) {
514
+ SetErrorBaton(b);
515
+ }
516
+ }
517
+
518
+ void ProducerSendOffsetsToTransaction::HandleOKCallback() {
519
+ Nan::HandleScope scope;
520
+
521
+ const unsigned int argc = 1;
522
+ v8::Local<v8::Value> argv[argc] = { Nan::Null() };
523
+
524
+ // Activate the dispatchers
525
+ producer->ActivateDispatchers();
526
+
527
+ callback->Call(argc, argv);
528
+ }
529
+
530
+ void ProducerSendOffsetsToTransaction::HandleErrorCallback() {
531
+ Nan::HandleScope scope;
532
+
533
+ const unsigned int argc = 1;
534
+ v8::Local<v8::Value> argv[argc] = { m_baton.ToTxnObject() };
535
+
536
+ callback->Call(argc, argv);
537
+ }
538
+
539
+ /**
540
+ * @brief KafkaConsumer connect worker.
541
+ *
542
+ * Easy Nan::AsyncWorker for setting up client connections
543
+ *
544
+ * @sa RdKafka::KafkaConsumer::connect
545
+ * @sa NodeKafka::KafkaConsumer::Connect
546
+ */
547
+
548
+ KafkaConsumerConnect::KafkaConsumerConnect(Nan::Callback *callback,
549
+ KafkaConsumer* consumer):
550
+ ErrorAwareWorker(callback),
551
+ consumer(consumer) {}
552
+
553
+ KafkaConsumerConnect::~KafkaConsumerConnect() {}
554
+
555
+ void KafkaConsumerConnect::Execute() {
556
+ Baton b = consumer->Connect();
557
+ // consumer->Wait();
558
+
559
+ if (b.err() != RdKafka::ERR_NO_ERROR) {
560
+ SetErrorBaton(b);
561
+ }
562
+ }
563
+
564
+ void KafkaConsumerConnect::HandleOKCallback() {
565
+ Nan::HandleScope scope;
566
+
567
+ const unsigned int argc = 2;
568
+
569
+ // Create the object
570
+ v8::Local<v8::Object> obj = Nan::New<v8::Object>();
571
+ Nan::Set(obj, Nan::New("name").ToLocalChecked(),
572
+ Nan::New(consumer->Name()).ToLocalChecked());
573
+
574
+ v8::Local<v8::Value> argv[argc] = { Nan::Null(), obj };
575
+
576
+ callback->Call(argc, argv);
577
+ }
578
+
579
+ void KafkaConsumerConnect::HandleErrorCallback() {
580
+ Nan::HandleScope scope;
581
+
582
+ consumer->DeactivateDispatchers();
583
+
584
+ const unsigned int argc = 1;
585
+ v8::Local<v8::Value> argv[argc] = { Nan::Error(ErrorMessage()) };
586
+
587
+ callback->Call(argc, argv);
588
+ }
589
+
590
+ /**
591
+ * @brief KafkaConsumer disconnect worker.
592
+ *
593
+ * Easy Nan::AsyncWorker for disconnecting and cleaning up librdkafka artifacts
594
+ *
595
+ * @sa RdKafka::KafkaConsumer::disconnect
596
+ * @sa NodeKafka::KafkaConsumer::Disconnect
597
+ */
598
+
599
+ KafkaConsumerDisconnect::KafkaConsumerDisconnect(Nan::Callback *callback,
600
+ KafkaConsumer* consumer):
601
+ ErrorAwareWorker(callback),
602
+ consumer(consumer) {}
603
+
604
+ KafkaConsumerDisconnect::~KafkaConsumerDisconnect() {}
605
+
606
+ void KafkaConsumerDisconnect::Execute() {
607
+ Baton b = consumer->Disconnect();
608
+
609
+ if (b.err() != RdKafka::ERR_NO_ERROR) {
610
+ SetErrorBaton(b);
611
+ }
612
+ }
613
+
614
+ void KafkaConsumerDisconnect::HandleOKCallback() {
615
+ Nan::HandleScope scope;
616
+
617
+ const unsigned int argc = 2;
618
+ v8::Local<v8::Value> argv[argc] = { Nan::Null(), Nan::True() };
619
+
620
+ consumer->DeactivateDispatchers();
621
+
622
+ callback->Call(argc, argv);
623
+ }
624
+
625
+ void KafkaConsumerDisconnect::HandleErrorCallback() {
626
+ Nan::HandleScope scope;
627
+
628
+ const unsigned int argc = 1;
629
+ v8::Local<v8::Value> argv[argc] = { GetErrorObject() };
630
+
631
+ consumer->DeactivateDispatchers();
632
+
633
+ callback->Call(argc, argv);
634
+ }
635
+
636
+ /**
637
+ * @brief KafkaConsumer get messages worker.
638
+ *
639
+ * A more complex Nan::AsyncProgressWorker. I made a custom superclass to deal
640
+ * with more real-time progress points. Instead of using ProgressWorker, which
641
+ * is not time sensitive, this custom worker will poll using libuv and send
642
+ * data back to v8 as it comes available without missing any
643
+ *
644
+ * The actual event runs through a continuous while loop. It stops when the
645
+ * consumer is flagged as disconnected or as unsubscribed.
646
+ *
647
+ * @todo thread-safe isConnected checking
648
+ * @note Chances are, when the connection is broken with the way librdkafka
649
+ * works, we are shutting down. But we want it to shut down properly so we
650
+ * probably need the consumer to have a thread lock that can be used when
651
+ * we are dealing with manipulating the `client`
652
+ *
653
+ * @sa RdKafka::KafkaConsumer::Consume
654
+ * @sa NodeKafka::KafkaConsumer::GetMessage
655
+ */
656
+
657
+ KafkaConsumerConsumeLoop::KafkaConsumerConsumeLoop(Nan::Callback *callback,
658
+ KafkaConsumer* consumer,
659
+ const int & timeout_ms,
660
+ const int & timeout_sleep_delay_ms) :
661
+ MessageWorker(callback),
662
+ consumer(consumer),
663
+ m_looping(true),
664
+ m_timeout_ms(timeout_ms),
665
+ m_timeout_sleep_delay_ms(timeout_sleep_delay_ms) {
666
+ uv_thread_create(&thread_event_loop, KafkaConsumerConsumeLoop::ConsumeLoop,
667
+ reinterpret_cast<void*>(this));
668
+ }
669
+
670
+ KafkaConsumerConsumeLoop::~KafkaConsumerConsumeLoop() {}
671
+
672
+ void KafkaConsumerConsumeLoop::Close() {
673
+ m_looping = false;
674
+ uv_thread_join(&thread_event_loop);
675
+ }
676
+
677
+ void KafkaConsumerConsumeLoop::Execute(const ExecutionMessageBus& bus) {
678
+ // ConsumeLoop is used instead
679
+ }
680
+
681
+ void KafkaConsumerConsumeLoop::ConsumeLoop(void* arg) {
682
+ KafkaConsumerConsumeLoop* consumerLoop =
683
+ reinterpret_cast<KafkaConsumerConsumeLoop*>(arg);
684
+ ExecutionMessageBus bus(consumerLoop);
685
+ KafkaConsumer* consumer = consumerLoop->consumer;
686
+
687
+ // Do one check here before we move forward
688
+ while (consumerLoop->m_looping && consumer->IsConnected()) {
689
+ Baton b = consumer->Consume(consumerLoop->m_timeout_ms);
690
+ RdKafka::ErrorCode ec = b.err();
691
+ if (ec == RdKafka::ERR_NO_ERROR) {
692
+ RdKafka::Message *message = b.data<RdKafka::Message*>();
693
+ switch (message->err()) {
694
+ case RdKafka::ERR__PARTITION_EOF:
695
+ bus.Send(message);
696
+ break;
697
+
698
+ case RdKafka::ERR__TIMED_OUT:
699
+ case RdKafka::ERR__TIMED_OUT_QUEUE:
700
+ delete message;
701
+ if (consumerLoop->m_timeout_sleep_delay_ms > 0) {
702
+ // If it is timed out this could just mean there were no
703
+ // new messages fetched quickly enough. This isn't really
704
+ // an error that should kill us.
705
+ #ifndef _WIN32
706
+ usleep(consumerLoop->m_timeout_sleep_delay_ms*1000);
707
+ #else
708
+ _sleep(consumerLoop->m_timeout_sleep_delay_ms);
709
+ #endif
710
+ }
711
+ break;
712
+ case RdKafka::ERR_NO_ERROR:
713
+ bus.Send(message);
714
+ break;
715
+ default:
716
+ // Unknown error. We need to break out of this
717
+ consumerLoop->SetErrorBaton(b);
718
+ consumerLoop->m_looping = false;
719
+ break;
720
+ }
721
+ } else if (ec == RdKafka::ERR_UNKNOWN_TOPIC_OR_PART ||
722
+ ec == RdKafka::ERR_TOPIC_AUTHORIZATION_FAILED) {
723
+ bus.SendWarning(ec);
724
+ } else {
725
+ // Unknown error. We need to break out of this
726
+ consumerLoop->SetErrorBaton(b);
727
+ consumerLoop->m_looping = false;
728
+ }
729
+ }
730
+ }
731
+
732
+ void KafkaConsumerConsumeLoop::HandleMessageCallback(RdKafka::Message* msg,
733
+ RdKafka::ErrorCode ec) {
734
+ Nan::HandleScope scope;
735
+
736
+ const unsigned int argc = 4;
737
+ v8::Local<v8::Value> argv[argc];
738
+
739
+ argv[0] = Nan::Null();
740
+ if (msg == NULL) {
741
+ argv[1] = Nan::Null();
742
+ argv[2] = Nan::Null();
743
+ argv[3] = Nan::New<v8::Number>(ec);
744
+ } else {
745
+ argv[3] = Nan::Null();
746
+ switch (msg->err()) {
747
+ case RdKafka::ERR__PARTITION_EOF: {
748
+ argv[1] = Nan::Null();
749
+ v8::Local<v8::Object> eofEvent = Nan::New<v8::Object>();
750
+
751
+ Nan::Set(eofEvent, Nan::New<v8::String>("topic").ToLocalChecked(),
752
+ Nan::New<v8::String>(msg->topic_name()).ToLocalChecked());
753
+ Nan::Set(eofEvent, Nan::New<v8::String>("offset").ToLocalChecked(),
754
+ Nan::New<v8::Number>(msg->offset()));
755
+ Nan::Set(eofEvent, Nan::New<v8::String>("partition").ToLocalChecked(),
756
+ Nan::New<v8::Number>(msg->partition()));
757
+
758
+ argv[2] = eofEvent;
759
+ break;
760
+ }
761
+ default:
762
+ argv[1] = Conversion::Message::ToV8Object(msg);
763
+ argv[2] = Nan::Null();
764
+ break;
765
+ }
766
+
767
+ // We can delete msg now
768
+ delete msg;
769
+ }
770
+
771
+ callback->Call(argc, argv);
772
+ }
773
+
774
+ void KafkaConsumerConsumeLoop::HandleOKCallback() {
775
+ Nan::HandleScope scope;
776
+ }
777
+
778
+ void KafkaConsumerConsumeLoop::HandleErrorCallback() {
779
+ Nan::HandleScope scope;
780
+
781
+ const unsigned int argc = 1;
782
+ v8::Local<v8::Value> argv[argc] = { Nan::Error(ErrorMessage()) };
783
+
784
+ callback->Call(argc, argv);
785
+ }
786
+
787
+ /**
788
+ * @brief KafkaConsumer get messages worker.
789
+ *
790
+ * This callback will get a number of messages. Can be of use in streams or
791
+ * places where you don't want an infinite loop managed in C++land and would
792
+ * rather manage it in Node.
793
+ *
794
+ * @see RdKafka::KafkaConsumer::Consume
795
+ * @see NodeKafka::KafkaConsumer::GetMessage
796
+ */
797
+
798
+ KafkaConsumerConsumeNum::KafkaConsumerConsumeNum(Nan::Callback *callback,
799
+ KafkaConsumer* consumer,
800
+ const uint32_t & num_messages,
801
+ const int & timeout_ms,
802
+ bool timeout_only_for_first_message) :
803
+ ErrorAwareWorker(callback),
804
+ m_consumer(consumer),
805
+ m_num_messages(num_messages),
806
+ m_timeout_ms(timeout_ms),
807
+ m_timeout_only_for_first_message(timeout_only_for_first_message) {}
808
+
809
+ KafkaConsumerConsumeNum::~KafkaConsumerConsumeNum() {}
810
+
811
+ void KafkaConsumerConsumeNum::Execute() {
812
+ std::size_t max = static_cast<std::size_t>(m_num_messages);
813
+ bool looping = true;
814
+ int timeout_ms = m_timeout_ms;
815
+ std::size_t eof_event_count = 0;
816
+
817
+ while (m_messages.size() - eof_event_count < max && looping) {
818
+ // Get a message
819
+ Baton b = m_consumer->Consume(timeout_ms);
820
+ if (b.err() == RdKafka::ERR_NO_ERROR) {
821
+ RdKafka::Message *message = b.data<RdKafka::Message*>();
822
+ RdKafka::ErrorCode errorCode = message->err();
823
+ switch (errorCode) {
824
+ case RdKafka::ERR__PARTITION_EOF:
825
+ // If partition EOF and have consumed messages, retry with timeout 1
826
+ // This allows getting ready messages, while not waiting for new ones
827
+ if (m_messages.size() > eof_event_count) {
828
+ timeout_ms = 1;
829
+ }
830
+
831
+ // We will only go into this code path when `enable.partition.eof`
832
+ // is set to true. In this case, consumer is also interested in EOF
833
+ // messages, so we return an EOF message
834
+ m_messages.push_back(message);
835
+ eof_event_count += 1;
836
+ break;
837
+ case RdKafka::ERR__TIMED_OUT:
838
+ case RdKafka::ERR__TIMED_OUT_QUEUE:
839
+ // Break of the loop if we timed out
840
+ delete message;
841
+ looping = false;
842
+ break;
843
+ case RdKafka::ERR_NO_ERROR:
844
+ m_messages.push_back(b.data<RdKafka::Message*>());
845
+
846
+ // This allows getting ready messages, while not waiting for new ones.
847
+ // This is useful when we want to get the as many messages as possible
848
+ // within the timeout but not wait if we already have one or more
849
+ // messages.
850
+ if (m_timeout_only_for_first_message) {
851
+ timeout_ms = 1;
852
+ }
853
+
854
+ break;
855
+ default:
856
+ // Set the error for any other errors and break
857
+ delete message;
858
+ if (m_messages.size() == eof_event_count) {
859
+ SetErrorBaton(Baton(errorCode));
860
+ }
861
+ looping = false;
862
+ break;
863
+ }
864
+ } else {
865
+ if (m_messages.size() == eof_event_count) {
866
+ SetErrorBaton(b);
867
+ }
868
+ looping = false;
869
+ }
870
+ }
871
+ }
872
+
873
+ void KafkaConsumerConsumeNum::HandleOKCallback() {
874
+ Nan::HandleScope scope;
875
+ const unsigned int argc = 3;
876
+ v8::Local<v8::Value> argv[argc];
877
+ argv[0] = Nan::Null();
878
+
879
+ v8::Local<v8::Array> returnArray = Nan::New<v8::Array>();
880
+ v8::Local<v8::Array> eofEventsArray = Nan::New<v8::Array>();
881
+
882
+ if (m_messages.size() > 0) {
883
+ int returnArrayIndex = -1;
884
+ int eofEventsArrayIndex = -1;
885
+ for (std::vector<RdKafka::Message*>::iterator it = m_messages.begin();
886
+ it != m_messages.end(); ++it) {
887
+ RdKafka::Message* message = *it;
888
+
889
+ switch (message->err()) {
890
+ case RdKafka::ERR_NO_ERROR:
891
+ ++returnArrayIndex;
892
+ Nan::Set(returnArray, returnArrayIndex,
893
+ Conversion::Message::ToV8Object(message));
894
+ break;
895
+ case RdKafka::ERR__PARTITION_EOF:
896
+ ++eofEventsArrayIndex;
897
+
898
+ // create EOF event
899
+ v8::Local<v8::Object> eofEvent = Nan::New<v8::Object>();
900
+
901
+ Nan::Set(eofEvent, Nan::New<v8::String>("topic").ToLocalChecked(),
902
+ Nan::New<v8::String>(message->topic_name()).ToLocalChecked());
903
+ Nan::Set(eofEvent, Nan::New<v8::String>("offset").ToLocalChecked(),
904
+ Nan::New<v8::Number>(message->offset()));
905
+ Nan::Set(eofEvent, Nan::New<v8::String>("partition").ToLocalChecked(),
906
+ Nan::New<v8::Number>(message->partition()));
907
+
908
+ // also store index at which position in the message array this event
909
+ // was emitted this way, we can later emit it at the right point in
910
+ // time
911
+ Nan::Set(eofEvent,
912
+ Nan::New<v8::String>("messageIndex").ToLocalChecked(),
913
+ Nan::New<v8::Number>(returnArrayIndex));
914
+
915
+ Nan::Set(eofEventsArray, eofEventsArrayIndex, eofEvent);
916
+ }
917
+
918
+ delete message;
919
+ }
920
+ }
921
+
922
+ argv[1] = returnArray;
923
+ argv[2] = eofEventsArray;
924
+
925
+ callback->Call(argc, argv);
926
+ }
927
+
928
+ void KafkaConsumerConsumeNum::HandleErrorCallback() {
929
+ Nan::HandleScope scope;
930
+
931
+ if (m_messages.size() > 0) {
932
+ for (std::vector<RdKafka::Message*>::iterator it = m_messages.begin();
933
+ it != m_messages.end(); ++it) {
934
+ RdKafka::Message* message = *it;
935
+ delete message;
936
+ }
937
+ }
938
+
939
+ const unsigned int argc = 1;
940
+ v8::Local<v8::Value> argv[argc] = { GetErrorObject() };
941
+
942
+ callback->Call(argc, argv);
943
+ }
944
+
945
+ /**
946
+ * @brief KafkaConsumer get message worker.
947
+ *
948
+ * This callback will get a single message. Can be of use in streams or places
949
+ * where you don't want an infinite loop managed in C++land and would rather
950
+ * manage it in Node.
951
+ *
952
+ * @see RdKafka::KafkaConsumer::Consume
953
+ * @see NodeKafka::KafkaConsumer::GetMessage
954
+ */
955
+
956
+ KafkaConsumerConsume::KafkaConsumerConsume(Nan::Callback *callback,
957
+ KafkaConsumer* consumer,
958
+ const int & timeout_ms) :
959
+ ErrorAwareWorker(callback),
960
+ consumer(consumer),
961
+ m_timeout_ms(timeout_ms) {}
962
+
963
+ KafkaConsumerConsume::~KafkaConsumerConsume() {}
964
+
965
+ void KafkaConsumerConsume::Execute() {
966
+ Baton b = consumer->Consume(m_timeout_ms);
967
+ if (b.err() != RdKafka::ERR_NO_ERROR) {
968
+ SetErrorBaton(b);
969
+ } else {
970
+ RdKafka::Message *message = b.data<RdKafka::Message*>();
971
+ RdKafka::ErrorCode errorCode = message->err();
972
+ if (errorCode == RdKafka::ERR_NO_ERROR) {
973
+ m_message = message;
974
+ } else {
975
+ delete message;
976
+ }
977
+ }
978
+ }
979
+
980
+ void KafkaConsumerConsume::HandleOKCallback() {
981
+ Nan::HandleScope scope;
982
+
983
+ const unsigned int argc = 2;
984
+ v8::Local<v8::Value> argv[argc];
985
+
986
+ argv[0] = Nan::Null();
987
+ argv[1] = Conversion::Message::ToV8Object(m_message);
988
+
989
+ delete m_message;
990
+
991
+ callback->Call(argc, argv);
992
+ }
993
+
994
+ void KafkaConsumerConsume::HandleErrorCallback() {
995
+ Nan::HandleScope scope;
996
+
997
+ const unsigned int argc = 1;
998
+ v8::Local<v8::Value> argv[argc] = { GetErrorObject() };
999
+
1000
+ callback->Call(argc, argv);
1001
+ }
1002
+
1003
+ /**
1004
+ * @brief KafkaConsumer get committed topic partitions worker.
1005
+ *
1006
+ * This callback will get a topic partition list of committed offsets
1007
+ * for each topic partition. It is done async because it has a timeout
1008
+ * and I don't want node to block
1009
+ *
1010
+ * @see RdKafka::KafkaConsumer::Committed
1011
+ */
1012
+
1013
+ KafkaConsumerCommitted::KafkaConsumerCommitted(Nan::Callback *callback,
1014
+ KafkaConsumer* consumer,
1015
+ std::vector<RdKafka::TopicPartition*> & t,
1016
+ const int & timeout_ms) :
1017
+ ErrorAwareWorker(callback),
1018
+ m_consumer(consumer),
1019
+ m_topic_partitions(t),
1020
+ m_timeout_ms(timeout_ms) {}
1021
+
1022
+ KafkaConsumerCommitted::~KafkaConsumerCommitted() {
1023
+ // Delete the underlying topic partitions as they are ephemeral or cloned
1024
+ RdKafka::TopicPartition::destroy(m_topic_partitions);
1025
+ }
1026
+
1027
+ void KafkaConsumerCommitted::Execute() {
1028
+ Baton b = m_consumer->Committed(m_topic_partitions, m_timeout_ms);
1029
+ if (b.err() != RdKafka::ERR_NO_ERROR) {
1030
+ SetErrorBaton(b);
1031
+ }
1032
+ }
1033
+
1034
+ void KafkaConsumerCommitted::HandleOKCallback() {
1035
+ Nan::HandleScope scope;
1036
+
1037
+ const unsigned int argc = 2;
1038
+ v8::Local<v8::Value> argv[argc];
1039
+
1040
+ argv[0] = Nan::Null();
1041
+ argv[1] = Conversion::TopicPartition::ToV8Array(m_topic_partitions);
1042
+
1043
+ callback->Call(argc, argv);
1044
+ }
1045
+
1046
+ void KafkaConsumerCommitted::HandleErrorCallback() {
1047
+ Nan::HandleScope scope;
1048
+
1049
+ const unsigned int argc = 1;
1050
+ v8::Local<v8::Value> argv[argc] = { GetErrorObject() };
1051
+
1052
+ callback->Call(argc, argv);
1053
+ }
1054
+
1055
+ /**
1056
+ * @brief KafkaConsumer commit offsets with a callback function.
1057
+ *
1058
+ * The first callback argument is the commit error, or null on success.
1059
+ *
1060
+ * @see RdKafka::KafkaConsumer::commitSync
1061
+ */
1062
+ KafkaConsumerCommitCb::KafkaConsumerCommitCb(Nan::Callback *callback,
1063
+ KafkaConsumer* consumer,
1064
+ std::optional<std::vector<RdKafka::TopicPartition*>> & t) :
1065
+ ErrorAwareWorker(callback),
1066
+ m_consumer(consumer),
1067
+ m_topic_partitions(t) {}
1068
+
1069
+ KafkaConsumerCommitCb::~KafkaConsumerCommitCb() {
1070
+ // Delete the underlying topic partitions as they are ephemeral or cloned
1071
+ if (m_topic_partitions.has_value())
1072
+ RdKafka::TopicPartition::destroy(m_topic_partitions.value());
1073
+ }
1074
+
1075
+ void KafkaConsumerCommitCb::Execute() {
1076
+ Baton b = Baton(NULL);
1077
+ if (m_topic_partitions.has_value()) {
1078
+ b = m_consumer->Commit(m_topic_partitions.value());
1079
+ } else {
1080
+ b = m_consumer->Commit();
1081
+ }
1082
+ if (b.err() != RdKafka::ERR_NO_ERROR) {
1083
+ SetErrorBaton(b);
1084
+ }
1085
+ }
1086
+
1087
+ void KafkaConsumerCommitCb::HandleOKCallback() {
1088
+ Nan::HandleScope scope;
1089
+
1090
+ const unsigned int argc = 1;
1091
+ v8::Local<v8::Value> argv[argc];
1092
+
1093
+ argv[0] = Nan::Null();
1094
+
1095
+ callback->Call(argc, argv);
1096
+ }
1097
+
1098
+ void KafkaConsumerCommitCb::HandleErrorCallback() {
1099
+ Nan::HandleScope scope;
1100
+
1101
+ const unsigned int argc = 1;
1102
+ v8::Local<v8::Value> argv[argc] = { GetErrorObject() };
1103
+
1104
+ callback->Call(argc, argv);
1105
+ }
1106
+
1107
+ /**
1108
+ * @brief KafkaConsumer seek
1109
+ *
1110
+ * This callback will take a topic partition list with offsets and
1111
+ * seek messages from there
1112
+ *
1113
+ * @see RdKafka::KafkaConsumer::seek
1114
+ *
1115
+ * @remark Consumption for the given partition must have started for the
1116
+ * seek to work. Use assign() to set the starting offset.
1117
+ */
1118
+
1119
+ KafkaConsumerSeek::KafkaConsumerSeek(Nan::Callback *callback,
1120
+ KafkaConsumer* consumer,
1121
+ const RdKafka::TopicPartition * toppar,
1122
+ const int & timeout_ms) :
1123
+ ErrorAwareWorker(callback),
1124
+ m_consumer(consumer),
1125
+ m_toppar(toppar),
1126
+ m_timeout_ms(timeout_ms) {}
1127
+
1128
+ KafkaConsumerSeek::~KafkaConsumerSeek() {
1129
+ if (m_timeout_ms > 0) {
1130
+ // Delete it when we are done with it.
1131
+ // However, if the timeout was less than 1, that means librdkafka is going
1132
+ // to queue the request up asynchronously, which apparently looks like if
1133
+ // we delete the memory here, since it was a pointer, librdkafka segfaults
1134
+ // when it actually does the operation (since it no longer blocks).
1135
+
1136
+ // Well, that means we will be leaking memory when people do a timeout of 0
1137
+ // so... we should never get to this block. But just in case...
1138
+ delete m_toppar;
1139
+ }
1140
+ }
1141
+
1142
+ void KafkaConsumerSeek::Execute() {
1143
+ Baton b = m_consumer->Seek(*m_toppar, m_timeout_ms);
1144
+ if (b.err() != RdKafka::ERR_NO_ERROR) {
1145
+ SetErrorBaton(b);
1146
+ }
1147
+ }
1148
+
1149
+ void KafkaConsumerSeek::HandleOKCallback() {
1150
+ Nan::HandleScope scope;
1151
+
1152
+ const unsigned int argc = 1;
1153
+ v8::Local<v8::Value> argv[argc];
1154
+
1155
+ argv[0] = Nan::Null();
1156
+
1157
+ callback->Call(argc, argv);
1158
+ }
1159
+
1160
+ void KafkaConsumerSeek::HandleErrorCallback() {
1161
+ Nan::HandleScope scope;
1162
+
1163
+ const unsigned int argc = 1;
1164
+ v8::Local<v8::Value> argv[argc] = { GetErrorObject() };
1165
+
1166
+ callback->Call(argc, argv);
1167
+ }
1168
+
1169
+ /**
1170
+ * @brief createTopic
1171
+ *
1172
+ * This callback will create a topic
1173
+ *
1174
+ */
1175
+ AdminClientCreateTopic::AdminClientCreateTopic(Nan::Callback *callback,
1176
+ AdminClient* client,
1177
+ rd_kafka_NewTopic_t* topic,
1178
+ const int & timeout_ms) :
1179
+ ErrorAwareWorker(callback),
1180
+ m_client(client),
1181
+ m_topic(topic),
1182
+ m_timeout_ms(timeout_ms) {}
1183
+
1184
+ AdminClientCreateTopic::~AdminClientCreateTopic() {
1185
+ // Destroy the topic creation request when we are done
1186
+ rd_kafka_NewTopic_destroy(m_topic);
1187
+ }
1188
+
1189
+ void AdminClientCreateTopic::Execute() {
1190
+ Baton b = m_client->CreateTopic(m_topic, m_timeout_ms);
1191
+ if (b.err() != RdKafka::ERR_NO_ERROR) {
1192
+ SetErrorBaton(b);
1193
+ }
1194
+ }
1195
+
1196
+ void AdminClientCreateTopic::HandleOKCallback() {
1197
+ Nan::HandleScope scope;
1198
+
1199
+ const unsigned int argc = 1;
1200
+ v8::Local<v8::Value> argv[argc];
1201
+
1202
+ argv[0] = Nan::Null();
1203
+
1204
+ callback->Call(argc, argv);
1205
+ }
1206
+
1207
+ void AdminClientCreateTopic::HandleErrorCallback() {
1208
+ Nan::HandleScope scope;
1209
+
1210
+ const unsigned int argc = 1;
1211
+ v8::Local<v8::Value> argv[argc] = { GetErrorObject() };
1212
+
1213
+ callback->Call(argc, argv);
1214
+ }
1215
+
1216
+ /**
1217
+ * @brief Delete a topic in an asynchronous worker.
1218
+ *
1219
+ * This callback will delete a topic
1220
+ *
1221
+ */
1222
+ AdminClientDeleteTopic::AdminClientDeleteTopic(Nan::Callback *callback,
1223
+ AdminClient* client,
1224
+ rd_kafka_DeleteTopic_t* topic,
1225
+ const int & timeout_ms) :
1226
+ ErrorAwareWorker(callback),
1227
+ m_client(client),
1228
+ m_topic(topic),
1229
+ m_timeout_ms(timeout_ms) {}
1230
+
1231
+ AdminClientDeleteTopic::~AdminClientDeleteTopic() {
1232
+ // Destroy the topic creation request when we are done
1233
+ rd_kafka_DeleteTopic_destroy(m_topic);
1234
+ }
1235
+
1236
+ void AdminClientDeleteTopic::Execute() {
1237
+ Baton b = m_client->DeleteTopic(m_topic, m_timeout_ms);
1238
+ if (b.err() != RdKafka::ERR_NO_ERROR) {
1239
+ SetErrorBaton(b);
1240
+ }
1241
+ }
1242
+
1243
+ void AdminClientDeleteTopic::HandleOKCallback() {
1244
+ Nan::HandleScope scope;
1245
+
1246
+ const unsigned int argc = 1;
1247
+ v8::Local<v8::Value> argv[argc];
1248
+
1249
+ argv[0] = Nan::Null();
1250
+
1251
+ callback->Call(argc, argv);
1252
+ }
1253
+
1254
+ void AdminClientDeleteTopic::HandleErrorCallback() {
1255
+ Nan::HandleScope scope;
1256
+
1257
+ const unsigned int argc = 1;
1258
+ v8::Local<v8::Value> argv[argc] = { GetErrorObject() };
1259
+
1260
+ callback->Call(argc, argv);
1261
+ }
1262
+
1263
+ /**
1264
+ * @brief Delete a topic in an asynchronous worker.
1265
+ *
1266
+ * This callback will delete a topic
1267
+ *
1268
+ */
1269
+ AdminClientCreatePartitions::AdminClientCreatePartitions(
1270
+ Nan::Callback *callback,
1271
+ AdminClient* client,
1272
+ rd_kafka_NewPartitions_t* partitions,
1273
+ const int & timeout_ms) :
1274
+ ErrorAwareWorker(callback),
1275
+ m_client(client),
1276
+ m_partitions(partitions),
1277
+ m_timeout_ms(timeout_ms) {}
1278
+
1279
+ AdminClientCreatePartitions::~AdminClientCreatePartitions() {
1280
+ // Destroy the topic creation request when we are done
1281
+ rd_kafka_NewPartitions_destroy(m_partitions);
1282
+ }
1283
+
1284
+ void AdminClientCreatePartitions::Execute() {
1285
+ Baton b = m_client->CreatePartitions(m_partitions, m_timeout_ms);
1286
+ if (b.err() != RdKafka::ERR_NO_ERROR) {
1287
+ SetErrorBaton(b);
1288
+ }
1289
+ }
1290
+
1291
+ void AdminClientCreatePartitions::HandleOKCallback() {
1292
+ Nan::HandleScope scope;
1293
+
1294
+ const unsigned int argc = 1;
1295
+ v8::Local<v8::Value> argv[argc];
1296
+
1297
+ argv[0] = Nan::Null();
1298
+
1299
+ callback->Call(argc, argv);
1300
+ }
1301
+
1302
+ void AdminClientCreatePartitions::HandleErrorCallback() {
1303
+ Nan::HandleScope scope;
1304
+
1305
+ const unsigned int argc = 1;
1306
+ v8::Local<v8::Value> argv[argc] = { GetErrorObject() };
1307
+
1308
+ callback->Call(argc, argv);
1309
+ }
1310
+
1311
+ /**
1312
+ * @brief List consumer groups in an asynchronous worker.
1313
+ *
1314
+ * This callback will list consumer groups.
1315
+ *
1316
+ */
1317
+ AdminClientListGroups::AdminClientListGroups(
1318
+ Nan::Callback* callback, AdminClient* client, bool is_match_states_set,
1319
+ std::vector<rd_kafka_consumer_group_state_t>& match_states,
1320
+ bool is_match_types_set,
1321
+ std::vector<rd_kafka_consumer_group_type_t>& match_types,
1322
+ const int& timeout_ms)
1323
+ : ErrorAwareWorker(callback),
1324
+ m_client(client),
1325
+ m_is_match_states_set(is_match_states_set),
1326
+ m_match_states(match_states),
1327
+ m_is_match_types_set(is_match_types_set),
1328
+ m_match_types(match_types),
1329
+ m_timeout_ms(timeout_ms) {}
1330
+
1331
+ AdminClientListGroups::~AdminClientListGroups() {
1332
+ if (this->m_event_response) {
1333
+ rd_kafka_event_destroy(this->m_event_response);
1334
+ }
1335
+ }
1336
+
1337
+ void AdminClientListGroups::Execute() {
1338
+ Baton b = m_client->ListGroups(m_is_match_states_set, m_match_states,
1339
+ m_is_match_types_set, m_match_types,
1340
+ m_timeout_ms, &m_event_response);
1341
+ if (b.err() != RdKafka::ERR_NO_ERROR) {
1342
+ SetErrorBaton(b);
1343
+ }
1344
+ }
1345
+
1346
+ void AdminClientListGroups::HandleOKCallback() {
1347
+ Nan::HandleScope scope;
1348
+
1349
+ const unsigned int argc = 2;
1350
+ v8::Local<v8::Value> argv[argc];
1351
+
1352
+ argv[0] = Nan::Null();
1353
+
1354
+ const rd_kafka_ListConsumerGroups_result_t* result =
1355
+ rd_kafka_event_ListConsumerGroups_result(m_event_response);
1356
+
1357
+ argv[1] = Conversion::Admin::FromListConsumerGroupsResult(result);
1358
+
1359
+ callback->Call(argc, argv);
1360
+ }
1361
+
1362
+ void AdminClientListGroups::HandleErrorCallback() {
1363
+ Nan::HandleScope scope;
1364
+
1365
+ const unsigned int argc = 1;
1366
+ v8::Local<v8::Value> argv[argc] = {GetErrorObject()};
1367
+
1368
+ callback->Call(argc, argv);
1369
+ }
1370
+
1371
+ /**
1372
+ * @brief Describe consumer groups in an asynchronous worker.
1373
+ *
1374
+ * This callback will describe consumer groups.
1375
+ *
1376
+ */
1377
+ AdminClientDescribeGroups::AdminClientDescribeGroups(
1378
+ Nan::Callback* callback, NodeKafka::AdminClient* client,
1379
+ std::vector<std::string>& groups, bool include_authorized_operations,
1380
+ const int& timeout_ms)
1381
+ : ErrorAwareWorker(callback),
1382
+ m_client(client),
1383
+ m_groups(groups),
1384
+ m_include_authorized_operations(include_authorized_operations),
1385
+ m_timeout_ms(timeout_ms) {}
1386
+
1387
+ AdminClientDescribeGroups::~AdminClientDescribeGroups() {
1388
+ if (this->m_event_response) {
1389
+ rd_kafka_event_destroy(this->m_event_response);
1390
+ }
1391
+ }
1392
+
1393
+ void AdminClientDescribeGroups::Execute() {
1394
+ Baton b = m_client->DescribeGroups(m_groups, m_include_authorized_operations,
1395
+ m_timeout_ms, &m_event_response);
1396
+ if (b.err() != RdKafka::ERR_NO_ERROR) {
1397
+ SetErrorBaton(b);
1398
+ }
1399
+ }
1400
+
1401
+ void AdminClientDescribeGroups::HandleOKCallback() {
1402
+ Nan::HandleScope scope;
1403
+
1404
+ const unsigned int argc = 2;
1405
+ v8::Local<v8::Value> argv[argc];
1406
+
1407
+ argv[0] = Nan::Null();
1408
+ argv[1] = Conversion::Admin::FromDescribeConsumerGroupsResult(
1409
+ rd_kafka_event_DescribeConsumerGroups_result(m_event_response));
1410
+
1411
+ callback->Call(argc, argv);
1412
+ }
1413
+
1414
+ void AdminClientDescribeGroups::HandleErrorCallback() {
1415
+ Nan::HandleScope scope;
1416
+
1417
+ const unsigned int argc = 1;
1418
+ v8::Local<v8::Value> argv[argc] = {GetErrorObject()};
1419
+
1420
+ callback->Call(argc, argv);
1421
+ }
1422
+
1423
+ /**
1424
+ * @brief Delete consumer groups in an asynchronous worker.
1425
+ *
1426
+ * This callback will delete consumer groups.
1427
+ *
1428
+ */
1429
+ AdminClientDeleteGroups::AdminClientDeleteGroups(
1430
+ Nan::Callback* callback, NodeKafka::AdminClient* client,
1431
+ rd_kafka_DeleteGroup_t **group_list,
1432
+ size_t group_cnt,
1433
+ const int& timeout_ms)
1434
+ : ErrorAwareWorker(callback),
1435
+ m_client(client),
1436
+ m_group_list(group_list),
1437
+ m_group_cnt(group_cnt),
1438
+ m_timeout_ms(timeout_ms) {}
1439
+
1440
+ AdminClientDeleteGroups::~AdminClientDeleteGroups() {
1441
+ if (m_group_list) {
1442
+ rd_kafka_DeleteGroup_destroy_array(m_group_list, m_group_cnt);
1443
+ free(m_group_list);
1444
+ }
1445
+
1446
+ if (this->m_event_response) {
1447
+ rd_kafka_event_destroy(this->m_event_response);
1448
+ }
1449
+ }
1450
+
1451
+ void AdminClientDeleteGroups::Execute() {
1452
+ Baton b = m_client->DeleteGroups(m_group_list, m_group_cnt, m_timeout_ms,
1453
+ &m_event_response);
1454
+ if (b.err() != RdKafka::ERR_NO_ERROR) {
1455
+ SetErrorBaton(b);
1456
+ }
1457
+ }
1458
+
1459
+ void AdminClientDeleteGroups::HandleOKCallback() {
1460
+ Nan::HandleScope scope;
1461
+
1462
+ const unsigned int argc = 2;
1463
+ v8::Local<v8::Value> argv[argc];
1464
+
1465
+ argv[0] = Nan::Null();
1466
+ argv[1] = Conversion::Admin::FromDeleteGroupsResult(
1467
+ rd_kafka_event_DeleteGroups_result(m_event_response));
1468
+
1469
+ callback->Call(argc, argv);
1470
+ }
1471
+
1472
+ void AdminClientDeleteGroups::HandleErrorCallback() {
1473
+ Nan::HandleScope scope;
1474
+
1475
+ const unsigned int argc = 1;
1476
+ v8::Local<v8::Value> argv[argc] = {GetErrorObject()};
1477
+
1478
+ callback->Call(argc, argv);
1479
+ }
1480
+
1481
+ /**
1482
+ * @brief List Consumer Group Offsets in an asynchronous worker
1483
+ *
1484
+ * This callback will list all the consumer group offsets for the specified
1485
+ * group's topic partitions.
1486
+ *
1487
+ */
1488
+ AdminClientListConsumerGroupOffsets::AdminClientListConsumerGroupOffsets(
1489
+ Nan::Callback* callback, NodeKafka::AdminClient* client,
1490
+ rd_kafka_ListConsumerGroupOffsets_t **req,
1491
+ size_t req_cnt,
1492
+ const bool require_stable_offsets,
1493
+ const int& timeout_ms)
1494
+ : ErrorAwareWorker(callback),
1495
+ m_client(client),
1496
+ m_req(req),
1497
+ m_req_cnt(req_cnt),
1498
+ m_require_stable_offsets(require_stable_offsets),
1499
+ m_timeout_ms(timeout_ms) {}
1500
+
1501
+ AdminClientListConsumerGroupOffsets::~AdminClientListConsumerGroupOffsets() {
1502
+ if (m_req) {
1503
+ rd_kafka_ListConsumerGroupOffsets_destroy_array(m_req, m_req_cnt);
1504
+ free(m_req);
1505
+ }
1506
+
1507
+ if (this->m_event_response) {
1508
+ rd_kafka_event_destroy(this->m_event_response);
1509
+ }
1510
+ }
1511
+
1512
+ void AdminClientListConsumerGroupOffsets::Execute() {
1513
+ Baton b = m_client->ListConsumerGroupOffsets(m_req, m_req_cnt,
1514
+ m_require_stable_offsets,
1515
+ m_timeout_ms, &m_event_response);
1516
+ if (b.err() != RdKafka::ERR_NO_ERROR) {
1517
+ SetErrorBaton(b);
1518
+ }
1519
+ }
1520
+
1521
+ void AdminClientListConsumerGroupOffsets::HandleOKCallback() {
1522
+ Nan::HandleScope scope;
1523
+ const unsigned int argc = 2;
1524
+ v8::Local<v8::Value> argv[argc];
1525
+
1526
+ argv[0] = Nan::Null();
1527
+ argv[1] = Conversion::Admin::FromListConsumerGroupOffsetsResult(
1528
+ rd_kafka_event_ListConsumerGroupOffsets_result(m_event_response));
1529
+
1530
+ callback->Call(argc, argv);
1531
+ }
1532
+
1533
+ void AdminClientListConsumerGroupOffsets::HandleErrorCallback() {
1534
+ Nan::HandleScope scope;
1535
+
1536
+ const unsigned int argc = 1;
1537
+ v8::Local<v8::Value> argv[argc] = {GetErrorObject()};
1538
+
1539
+ callback->Call(argc, argv);
1540
+ }
1541
+
1542
+ /**
1543
+ * @brief Delete Records in an asynchronous worker.
1544
+ *
1545
+ * This callback will delete records for the specified topic partitions
1546
+ * till the given offset, or till the end of the partition.
1547
+ *
1548
+ */
1549
+ AdminClientDeleteRecords::AdminClientDeleteRecords(
1550
+ Nan::Callback* callback, NodeKafka::AdminClient* client,
1551
+ rd_kafka_DeleteRecords_t **del_records,
1552
+ size_t del_records_cnt,
1553
+ const int& operation_timeout_ms,
1554
+ const int& timeout_ms)
1555
+ : ErrorAwareWorker(callback),
1556
+ m_client(client),
1557
+ m_del_records(del_records),
1558
+ m_del_records_cnt(del_records_cnt),
1559
+ m_operation_timeout_ms(operation_timeout_ms),
1560
+ m_timeout_ms(timeout_ms) {}
1561
+
1562
+ AdminClientDeleteRecords::~AdminClientDeleteRecords() {
1563
+ if (m_del_records) {
1564
+ rd_kafka_DeleteRecords_destroy_array(m_del_records, m_del_records_cnt);
1565
+ free(m_del_records);
1566
+ }
1567
+
1568
+ if (this->m_event_response) {
1569
+ rd_kafka_event_destroy(this->m_event_response);
1570
+ }
1571
+ }
1572
+
1573
+ void AdminClientDeleteRecords::Execute() {
1574
+ Baton b = m_client->DeleteRecords(m_del_records, m_del_records_cnt,
1575
+ m_operation_timeout_ms, m_timeout_ms,
1576
+ &m_event_response);
1577
+ if (b.err() != RdKafka::ERR_NO_ERROR) {
1578
+ SetErrorBaton(b);
1579
+ }
1580
+ }
1581
+
1582
+ void AdminClientDeleteRecords::HandleOKCallback() {
1583
+ Nan::HandleScope scope;
1584
+
1585
+ const unsigned int argc = 2;
1586
+ v8::Local<v8::Value> argv[argc];
1587
+
1588
+ argv[0] = Nan::Null();
1589
+ argv[1] = Conversion::Admin::FromDeleteRecordsResult(
1590
+ rd_kafka_event_DeleteRecords_result(m_event_response));
1591
+
1592
+ callback->Call(argc, argv);
1593
+ }
1594
+
1595
+ void AdminClientDeleteRecords::HandleErrorCallback() {
1596
+ Nan::HandleScope scope;
1597
+
1598
+ const unsigned int argc = 1;
1599
+ v8::Local<v8::Value> argv[argc] = {GetErrorObject()};
1600
+
1601
+ callback->Call(argc, argv);
1602
+ }
1603
+
1604
+ /**
1605
+ * @brief Describe Topics in an asynchronous worker
1606
+ *
1607
+ * This callback will describe topics.
1608
+ */
1609
+ AdminClientDescribeTopics::AdminClientDescribeTopics(
1610
+ Nan::Callback* callback, NodeKafka::AdminClient* client,
1611
+ rd_kafka_TopicCollection_t* topics,
1612
+ const bool include_authorized_operations,
1613
+ const int& timeout_ms)
1614
+ : ErrorAwareWorker(callback),
1615
+ m_client(client),
1616
+ m_topics(topics),
1617
+ m_include_authorized_operations(include_authorized_operations),
1618
+ m_timeout_ms(timeout_ms) {}
1619
+
1620
+ AdminClientDescribeTopics::~AdminClientDescribeTopics() {
1621
+ if (m_topics) {
1622
+ rd_kafka_TopicCollection_destroy(m_topics);
1623
+ }
1624
+
1625
+ if (this->m_event_response) {
1626
+ rd_kafka_event_destroy(this->m_event_response);
1627
+ }
1628
+ }
1629
+
1630
+ void AdminClientDescribeTopics::Execute() {
1631
+ Baton b = m_client->DescribeTopics(m_topics, m_include_authorized_operations,
1632
+ m_timeout_ms, &m_event_response);
1633
+ if (b.err() != RdKafka::ERR_NO_ERROR) {
1634
+ SetErrorBaton(b);
1635
+ }
1636
+ }
1637
+
1638
+ void AdminClientDescribeTopics::HandleOKCallback() {
1639
+ Nan::HandleScope scope;
1640
+ const unsigned int argc = 2;
1641
+ v8::Local<v8::Value> argv[argc];
1642
+
1643
+ argv[0] = Nan::Null();
1644
+ argv[1] = Conversion::Admin::FromDescribeTopicsResult(
1645
+ rd_kafka_event_DescribeTopics_result(m_event_response));
1646
+
1647
+ callback->Call(argc, argv);
1648
+ }
1649
+
1650
+ void AdminClientDescribeTopics::HandleErrorCallback() {
1651
+ Nan::HandleScope scope;
1652
+
1653
+ const unsigned int argc = 1;
1654
+ v8::Local<v8::Value> argv[argc] = {GetErrorObject()};
1655
+
1656
+ callback->Call(argc, argv);
1657
+ }
1658
+
1659
+ /**
1660
+ * @brief ListOffsets in an asynchronous worker
1661
+ *
1662
+ * This callback will list requested offsets for the specified topic partitions.
1663
+ */
1664
+ AdminClientListOffsets::AdminClientListOffsets(
1665
+ Nan::Callback* callback, NodeKafka::AdminClient* client,
1666
+ rd_kafka_topic_partition_list_t* partitions, const int& timeout_ms,
1667
+ rd_kafka_IsolationLevel_t isolation_level)
1668
+ : ErrorAwareWorker(callback),
1669
+ m_client(client),
1670
+ m_partitions(partitions),
1671
+ m_timeout_ms(timeout_ms),
1672
+ m_isolation_level(isolation_level) {}
1673
+
1674
+ AdminClientListOffsets::~AdminClientListOffsets() {
1675
+ if (m_partitions) {
1676
+ rd_kafka_topic_partition_list_destroy(m_partitions);
1677
+ }
1678
+
1679
+ if (this->m_event_response) {
1680
+ rd_kafka_event_destroy(this->m_event_response);
1681
+ }
1682
+ }
1683
+
1684
+ void AdminClientListOffsets::Execute() {
1685
+ Baton b = m_client->ListOffsets(m_partitions, m_timeout_ms, m_isolation_level,
1686
+ &m_event_response);
1687
+ if (b.err() != RdKafka::ERR_NO_ERROR) {
1688
+ SetErrorBaton(b);
1689
+ }
1690
+ }
1691
+
1692
+ void AdminClientListOffsets::HandleOKCallback() {
1693
+ Nan::HandleScope scope;
1694
+ const unsigned int argc = 2;
1695
+ v8::Local<v8::Value> argv[argc];
1696
+
1697
+ argv[0] = Nan::Null();
1698
+ argv[1] = Conversion::Admin::FromListOffsetsResult(
1699
+ rd_kafka_event_ListOffsets_result(m_event_response));
1700
+
1701
+ callback->Call(argc, argv);
1702
+ }
1703
+
1704
+ void AdminClientListOffsets::HandleErrorCallback() {
1705
+ Nan::HandleScope scope;
1706
+
1707
+ const unsigned int argc = 1;
1708
+ v8::Local<v8::Value> argv[argc] = {GetErrorObject()};
1709
+
1710
+ callback->Call(argc, argv);
1711
+ }
1712
+
1713
+ } // namespace Workers
1714
+ } // namespace NodeKafka