@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/common.cc ADDED
@@ -0,0 +1,1628 @@
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/common.h"
11
+
12
+ #include <iostream>
13
+ #include <list>
14
+ #include <string>
15
+ #include <vector>
16
+
17
+ namespace NodeKafka {
18
+
19
+ void Log(std::string str) {
20
+ std::cerr << "% " << str.c_str() << std::endl;
21
+ }
22
+
23
+ template<typename T>
24
+ T GetParameter(v8::Local<v8::Object> object, std::string field_name, T def) {
25
+ v8::Local<v8::String> field = Nan::New(field_name.c_str()).ToLocalChecked();
26
+ if (Nan::Has(object, field).FromMaybe(false)) {
27
+ Nan::Maybe<T> maybeT = Nan::To<T>(Nan::Get(object, field).ToLocalChecked());
28
+ if (maybeT.IsNothing()) {
29
+ return def;
30
+ } else {
31
+ return maybeT.FromJust();
32
+ }
33
+ }
34
+ return def;
35
+ }
36
+
37
+ template<>
38
+ int64_t GetParameter<int64_t>(v8::Local<v8::Object> object,
39
+ std::string field_name, int64_t def) {
40
+ v8::Local<v8::String> field = Nan::New(field_name.c_str()).ToLocalChecked();
41
+ if (Nan::Has(object, field).FromMaybe(false)) {
42
+ v8::Local<v8::Value> v = Nan::Get(object, field).ToLocalChecked();
43
+
44
+ if (!v->IsNumber()) {
45
+ return def;
46
+ }
47
+
48
+ Nan::Maybe<int64_t> maybeInt = Nan::To<int64_t>(v);
49
+ if (maybeInt.IsNothing()) {
50
+ return def;
51
+ } else {
52
+ return maybeInt.FromJust();
53
+ }
54
+ }
55
+ return def;
56
+ }
57
+
58
+ template<>
59
+ bool GetParameter<bool>(v8::Local<v8::Object> object,
60
+ std::string field_name, bool def) {
61
+ v8::Local<v8::String> field = Nan::New(field_name.c_str()).ToLocalChecked();
62
+ if (Nan::Has(object, field).FromMaybe(false)) {
63
+ v8::Local<v8::Value> v = Nan::Get(object, field).ToLocalChecked();
64
+
65
+ if (!v->IsBoolean()) {
66
+ return def;
67
+ }
68
+
69
+ Nan::Maybe<bool> maybeInt = Nan::To<bool>(v);
70
+ if (maybeInt.IsNothing()) {
71
+ return def;
72
+ } else {
73
+ return maybeInt.FromJust();
74
+ }
75
+ }
76
+ return def;
77
+ }
78
+
79
+ template<>
80
+ int GetParameter<int>(v8::Local<v8::Object> object,
81
+ std::string field_name, int def) {
82
+ return static_cast<int>(GetParameter<int64_t>(object, field_name, def));
83
+ }
84
+
85
+ template<>
86
+ std::string GetParameter<std::string>(v8::Local<v8::Object> object,
87
+ std::string field_name,
88
+ std::string def) {
89
+ v8::Local<v8::String> field = Nan::New(field_name.c_str()).ToLocalChecked();
90
+ if (Nan::Has(object, field).FromMaybe(false)) {
91
+ v8::Local<v8::Value> parameter =
92
+ Nan::Get(object, field).ToLocalChecked();
93
+ // Nan::To<v8::String>();
94
+
95
+ if (!parameter->IsUndefined() && !parameter->IsNull()) {
96
+ v8::Local<v8::String> val = Nan::To<v8::String>(parameter)
97
+ .ToLocalChecked();
98
+
99
+ if (!val->IsUndefined() && !val->IsNull()) {
100
+ Nan::Utf8String parameterValue(val);
101
+ std::string parameterString(*parameterValue);
102
+
103
+ return parameterString;
104
+ }
105
+ }
106
+ }
107
+ return def;
108
+ }
109
+
110
+ template<>
111
+ std::vector<std::string> GetParameter<std::vector<std::string> >(
112
+ v8::Local<v8::Object> object, std::string field_name,
113
+ std::vector<std::string> def) {
114
+ v8::Local<v8::String> field = Nan::New(field_name.c_str()).ToLocalChecked();
115
+
116
+ if (Nan::Has(object, field).FromMaybe(false)) {
117
+ v8::Local<v8::Value> maybeArray = Nan::Get(object, field).ToLocalChecked();
118
+ if (maybeArray->IsArray()) {
119
+ v8::Local<v8::Array> parameter = maybeArray.As<v8::Array>();
120
+ return v8ArrayToStringVector(parameter);
121
+ }
122
+ }
123
+ return def;
124
+ }
125
+
126
+ std::vector<std::string> v8ArrayToStringVector(v8::Local<v8::Array> parameter) {
127
+ std::vector<std::string> newItem;
128
+
129
+ if (parameter->Length() >= 1) {
130
+ for (unsigned int i = 0; i < parameter->Length(); i++) {
131
+ v8::Local<v8::Value> v;
132
+ if (!Nan::Get(parameter, i).ToLocal(&v)) {
133
+ continue;
134
+ }
135
+ Nan::MaybeLocal<v8::String> p = Nan::To<v8::String>(v);
136
+ if (p.IsEmpty()) {
137
+ continue;
138
+ }
139
+ Nan::Utf8String pVal(p.ToLocalChecked());
140
+ std::string pString(*pVal);
141
+ newItem.push_back(pString);
142
+ }
143
+ }
144
+ return newItem;
145
+ }
146
+
147
+ std::list<std::string> v8ArrayToStringList(v8::Local<v8::Array> parameter) {
148
+ std::list<std::string> newItem;
149
+ if (parameter->Length() >= 1) {
150
+ for (unsigned int i = 0; i < parameter->Length(); i++) {
151
+ v8::Local<v8::Value> v;
152
+ if (!Nan::Get(parameter, i).ToLocal(&v)) {
153
+ continue;
154
+ }
155
+ Nan::MaybeLocal<v8::String> p = Nan::To<v8::String>(v);
156
+ if (p.IsEmpty()) {
157
+ continue;
158
+ }
159
+ Nan::Utf8String pVal(p.ToLocalChecked());
160
+ std::string pString(*pVal);
161
+ newItem.push_back(pString);
162
+ }
163
+ }
164
+ return newItem;
165
+ }
166
+
167
+ template<> v8::Local<v8::Array> GetParameter<v8::Local<v8::Array> >(
168
+ v8::Local<v8::Object> object,
169
+ std::string field_name,
170
+ v8::Local<v8::Array> def) {
171
+ v8::Local<v8::String> field = Nan::New(field_name.c_str()).ToLocalChecked();
172
+
173
+ if (Nan::Has(object, field).FromMaybe(false)) {
174
+ v8::Local<v8::Value> maybeArray = Nan::Get(object, field).ToLocalChecked();
175
+ if (maybeArray->IsArray()) {
176
+ v8::Local<v8::Array> parameter = maybeArray.As<v8::Array>();
177
+ return parameter;
178
+ }
179
+ }
180
+
181
+ return def;
182
+ }
183
+
184
+ namespace Conversion {
185
+
186
+ namespace Util {
187
+ std::vector<std::string> ToStringVector(v8::Local<v8::Array> parameter) {
188
+ std::vector<std::string> newItem;
189
+
190
+ if (parameter->Length() >= 1) {
191
+ for (unsigned int i = 0; i < parameter->Length(); i++) {
192
+ v8::Local<v8::Value> element;
193
+ if (!Nan::Get(parameter, i).ToLocal(&element)) {
194
+ continue;
195
+ }
196
+
197
+ if (!element->IsRegExp()) {
198
+ Nan::MaybeLocal<v8::String> p = Nan::To<v8::String>(element);
199
+
200
+ if (p.IsEmpty()) {
201
+ continue;
202
+ }
203
+
204
+ Nan::Utf8String pVal(p.ToLocalChecked());
205
+ std::string pString(*pVal);
206
+
207
+ newItem.push_back(pString);
208
+ } else {
209
+ Nan::Utf8String pVal(element.As<v8::RegExp>()->GetSource());
210
+ std::string pString(*pVal);
211
+
212
+ Log(pString);
213
+
214
+ newItem.push_back(pString);
215
+ }
216
+ }
217
+ }
218
+
219
+ return newItem;
220
+ }
221
+
222
+ v8::Local<v8::Array> ToV8Array(std::vector<std::string> parameter) {
223
+ v8::Local<v8::Array> newItem = Nan::New<v8::Array>();
224
+
225
+ for (size_t i = 0; i < parameter.size(); i++) {
226
+ std::string topic = parameter[i];
227
+ Nan::Set(newItem, i, Nan::New<v8::String>(topic).ToLocalChecked());
228
+ }
229
+
230
+ return newItem;
231
+ }
232
+
233
+ /**
234
+ * @brief Converts a list of rd_kafka_error_t* into a v8 array of RdKafkaError
235
+ * objects.
236
+ */
237
+ v8::Local<v8::Array> ToV8Array(const rd_kafka_error_t** error_list,
238
+ size_t error_cnt) {
239
+ v8::Local<v8::Array> errors = Nan::New<v8::Array>();
240
+
241
+ for (size_t i = 0; i < error_cnt; i++) {
242
+ RdKafka::ErrorCode code =
243
+ static_cast<RdKafka::ErrorCode>(rd_kafka_error_code(error_list[i]));
244
+ std::string msg = std::string(rd_kafka_error_string(error_list[i]));
245
+ Nan::Set(errors, i, RdKafkaError(code, msg));
246
+ }
247
+
248
+ return errors;
249
+ }
250
+
251
+ /**
252
+ * @brief Converts a rd_kafka_Node_t* into a v8 object.
253
+ */
254
+ v8::Local<v8::Object> ToV8Object(const rd_kafka_Node_t* node) {
255
+ /* Return object type
256
+ {
257
+ id: number
258
+ host: string
259
+ port: number
260
+ rack?: string
261
+ }
262
+ */
263
+ v8::Local<v8::Object> obj = Nan::New<v8::Object>();
264
+
265
+ // Check if node is NULL - can happen during broker restarts/metadata updates
266
+ if (!node) {
267
+ Nan::Set(obj, Nan::New("id").ToLocalChecked(), Nan::New<v8::Number>(-1));
268
+ Nan::Set(obj, Nan::New("host").ToLocalChecked(),
269
+ Nan::New<v8::String>("").ToLocalChecked());
270
+ Nan::Set(obj, Nan::New("port").ToLocalChecked(), Nan::New<v8::Number>(-1));
271
+ return obj;
272
+ }
273
+
274
+ Nan::Set(obj, Nan::New("id").ToLocalChecked(),
275
+ Nan::New<v8::Number>(rd_kafka_Node_id(node)));
276
+
277
+ // Check host for NULL before using - prevents segfault when host is NULL
278
+ const char* host = rd_kafka_Node_host(node);
279
+ if (host) {
280
+ Nan::Set(obj, Nan::New("host").ToLocalChecked(),
281
+ Nan::New<v8::String>(host).ToLocalChecked());
282
+ } else {
283
+ Nan::Set(obj, Nan::New("host").ToLocalChecked(),
284
+ Nan::New<v8::String>("").ToLocalChecked());
285
+ }
286
+
287
+ Nan::Set(obj, Nan::New("port").ToLocalChecked(),
288
+ Nan::New<v8::Number>(rd_kafka_Node_port(node)));
289
+
290
+ const char* rack = rd_kafka_Node_rack(node);
291
+ if (rack) {
292
+ Nan::Set(obj, Nan::New("rack").ToLocalChecked(),
293
+ Nan::New<v8::String>(rack).ToLocalChecked());
294
+ }
295
+
296
+ return obj;
297
+ }
298
+
299
+ /**
300
+ * @brief Converts a rd_kafka_Uuid_t* into a v8 object.
301
+ */
302
+ v8::Local<v8::Object> UuidToV8Object(const rd_kafka_Uuid_t* uuid) {
303
+ /*Return object type
304
+ {
305
+ mostSignificantBits: bigint
306
+ leastSignificantBits: bigint
307
+ base64: string
308
+ }
309
+ */
310
+ v8::Local<v8::Object> obj = Nan::New<v8::Object>();
311
+
312
+ Nan::Set(obj, Nan::New("mostSignificantBits").ToLocalChecked(),
313
+ v8::BigInt::New(v8::Isolate::GetCurrent(),
314
+ rd_kafka_Uuid_most_significant_bits(uuid)));
315
+ Nan::Set(obj, Nan::New("leastSignificantBits").ToLocalChecked(),
316
+ v8::BigInt::New(v8::Isolate::GetCurrent(),
317
+ rd_kafka_Uuid_least_significant_bits(uuid)));
318
+ Nan::Set(
319
+ obj, Nan::New("base64").ToLocalChecked(),
320
+ Nan::New<v8::String>(rd_kafka_Uuid_base64str(uuid)).ToLocalChecked());
321
+
322
+ return obj;
323
+ }
324
+
325
+ /**
326
+ * @brief Converts a list of rd_kafka_AclOperation_t into a v8 array.
327
+ */
328
+ v8::Local<v8::Array> ToV8Array(
329
+ const rd_kafka_AclOperation_t* authorized_operations,
330
+ size_t authorized_operations_cnt) {
331
+ v8::Local<v8::Array> array = Nan::New<v8::Array>();
332
+
333
+ for (size_t i = 0; i < authorized_operations_cnt; i++) {
334
+ Nan::Set(array, i, Nan::New<v8::Number>(authorized_operations[i]));
335
+ }
336
+
337
+ return array;
338
+ }
339
+
340
+ } // namespace Util
341
+
342
+ namespace TopicPartition {
343
+
344
+ /**
345
+ * @brief RdKafka::TopicPartition vector to a v8 Array
346
+ *
347
+ * @see v8ArrayToTopicPartitionVector
348
+ * @note This method returns a v8 array of a mix of topic partition
349
+ * objects and errors. For a more uniform return type of
350
+ * topic partitions (which have an internal error property),
351
+ * use `ToTopicPartitionV8Array(const rd_kafka_topic_partition_list_t*,
352
+ * bool)`.
353
+ */
354
+ v8::Local<v8::Array> ToV8Array(
355
+ std::vector<RdKafka::TopicPartition*> & topic_partition_list) { // NOLINT
356
+ v8::Local<v8::Array> array = Nan::New<v8::Array>();
357
+ for (size_t topic_partition_i = 0;
358
+ topic_partition_i < topic_partition_list.size(); topic_partition_i++) {
359
+ RdKafka::TopicPartition* topic_partition =
360
+ topic_partition_list[topic_partition_i];
361
+
362
+ // TODO: why do we set the entire array element to be an error rather adding
363
+ // an error field to TopicPartition? Or create a TopicPartitionError?
364
+ if (topic_partition->err() != RdKafka::ErrorCode::ERR_NO_ERROR) {
365
+ Nan::Set(array, topic_partition_i,
366
+ Nan::Error(Nan::New(RdKafka::err2str(topic_partition->err()))
367
+ .ToLocalChecked()));
368
+ } else {
369
+ // We have the list now let's get the properties from it
370
+ v8::Local<v8::Object> obj = Nan::New<v8::Object>();
371
+
372
+ if (topic_partition->offset() != RdKafka::Topic::OFFSET_INVALID) {
373
+ Nan::Set(obj, Nan::New("offset").ToLocalChecked(),
374
+ Nan::New<v8::Number>(topic_partition->offset()));
375
+ }
376
+
377
+ // If present, size >= 1, since it will include at least the
378
+ // null terminator.
379
+ if (topic_partition->get_metadata().size() > 0) {
380
+ Nan::Set(obj, Nan::New("metadata").ToLocalChecked(),
381
+ Nan::New<v8::String>(
382
+ reinterpret_cast<const char*>(topic_partition->get_metadata().data()), // NOLINT
383
+ // null terminator is not required by the constructor.
384
+ topic_partition->get_metadata().size() - 1)
385
+ .ToLocalChecked());
386
+ }
387
+
388
+ Nan::Set(obj, Nan::New("partition").ToLocalChecked(),
389
+ Nan::New<v8::Number>(topic_partition->partition()));
390
+ Nan::Set(obj, Nan::New("topic").ToLocalChecked(),
391
+ Nan::New<v8::String>(topic_partition->topic().c_str())
392
+ .ToLocalChecked());
393
+
394
+ int leader_epoch = topic_partition->get_leader_epoch();
395
+ if (leader_epoch >= 0) {
396
+ Nan::Set(obj, Nan::New("leaderEpoch").ToLocalChecked(),
397
+ Nan::New<v8::Number>(leader_epoch));
398
+ }
399
+
400
+ Nan::Set(array, topic_partition_i, obj);
401
+ }
402
+ }
403
+
404
+ return array;
405
+ }
406
+
407
+ /**
408
+ * @brief Converts a rd_kafka_topic_partition_list_t* into a list of v8 objects.
409
+ *
410
+ * @param topic_partition_list The list of topic partitions to convert.
411
+ * @param include_offset Whether to include the offset in the output.
412
+ * @returns [{topic: string, partition: number, offset?: number, error?:
413
+ * LibrdKafkaError}]
414
+ *
415
+ * @note Contains error within the topic partitions object, and not as separate
416
+ * array elements, unlike the `ToV8Array(std::vector<RdKafka::TopicPartition*> &
417
+ * topic_partition_list)`.
418
+ */
419
+ v8::Local<v8::Array> ToTopicPartitionV8Array(
420
+ const rd_kafka_topic_partition_list_t* topic_partition_list,
421
+ bool include_offset) {
422
+ v8::Local<v8::Array> array = Nan::New<v8::Array>();
423
+
424
+ for (int topic_partition_i = 0; topic_partition_i < topic_partition_list->cnt;
425
+ topic_partition_i++) {
426
+ rd_kafka_topic_partition_t topic_partition =
427
+ topic_partition_list->elems[topic_partition_i];
428
+ v8::Local<v8::Object> obj = Nan::New<v8::Object>();
429
+
430
+ Nan::Set(obj, Nan::New("partition").ToLocalChecked(),
431
+ Nan::New<v8::Number>(topic_partition.partition));
432
+ Nan::Set(obj, Nan::New("topic").ToLocalChecked(),
433
+ Nan::New<v8::String>(topic_partition.topic).ToLocalChecked());
434
+
435
+ if (topic_partition.err != RD_KAFKA_RESP_ERR_NO_ERROR) {
436
+ v8::Local<v8::Object> error = NodeKafka::RdKafkaError(
437
+ static_cast<RdKafka::ErrorCode>(topic_partition.err));
438
+ Nan::Set(obj, Nan::New("error").ToLocalChecked(), error);
439
+ }
440
+
441
+ if (include_offset) {
442
+ Nan::Set(obj, Nan::New("offset").ToLocalChecked(),
443
+ Nan::New<v8::Number>(topic_partition.offset));
444
+ }
445
+
446
+ int leader_epoch =
447
+ rd_kafka_topic_partition_get_leader_epoch(&topic_partition);
448
+ if (leader_epoch >= 0) {
449
+ Nan::Set(obj, Nan::New("leaderEpoch").ToLocalChecked(),
450
+ Nan::New<v8::Number>(leader_epoch));
451
+ }
452
+
453
+ Nan::Set(array, topic_partition_i, obj);
454
+ }
455
+ return array;
456
+ }
457
+
458
+ /**
459
+ * @brief v8 Array of topic partitions to RdKafka::TopicPartition vector
460
+ *
461
+ * @see v8ArrayToTopicPartitionVector
462
+ *
463
+ * @note You must delete all the pointers inside here when you are done!!
464
+ */
465
+ std::vector<RdKafka::TopicPartition*> FromV8Array(
466
+ const v8::Local<v8::Array> & topic_partition_list) {
467
+ // NOTE: ARRAY OF POINTERS! DELETE THEM WHEN YOU ARE FINISHED
468
+ std::vector<RdKafka::TopicPartition*> array;
469
+
470
+ for (size_t topic_partition_i = 0;
471
+ topic_partition_i < topic_partition_list->Length(); topic_partition_i++) {
472
+ v8::Local<v8::Value> topic_partition_value;
473
+ if (!Nan::Get(topic_partition_list, topic_partition_i)
474
+ .ToLocal(&topic_partition_value)) {
475
+ continue;
476
+ }
477
+
478
+ if (topic_partition_value->IsObject()) {
479
+ array.push_back(FromV8Object(
480
+ Nan::To<v8::Object>(topic_partition_value).ToLocalChecked()));
481
+ }
482
+ }
483
+
484
+ return array;
485
+ }
486
+
487
+ /**
488
+ * @brief v8 Array of Topic Partitions to rd_kafka_topic_partition_list_t
489
+ *
490
+ * @note Converts a v8 array of type [{topic: string, partition: number,
491
+ * offset?: number}] to a rd_kafka_topic_partition_list_t
492
+ */
493
+ rd_kafka_topic_partition_list_t* TopicPartitionv8ArrayToTopicPartitionList(
494
+ v8::Local<v8::Array> parameter, bool include_offset) {
495
+ rd_kafka_topic_partition_list_t* newList =
496
+ rd_kafka_topic_partition_list_new(parameter->Length());
497
+
498
+ for (unsigned int i = 0; i < parameter->Length(); i++) {
499
+ v8::Local<v8::Value> v;
500
+ if (!Nan::Get(parameter, i).ToLocal(&v)) {
501
+ continue;
502
+ }
503
+
504
+ if (!v->IsObject()) {
505
+ return NULL; // Return NULL to indicate an error
506
+ }
507
+
508
+ v8::Local<v8::Object> item = v.As<v8::Object>();
509
+
510
+ std::string topic = GetParameter<std::string>(item, "topic", "");
511
+ int partition = GetParameter<int>(item, "partition", -1);
512
+
513
+ rd_kafka_topic_partition_t* toppar =
514
+ rd_kafka_topic_partition_list_add(newList, topic.c_str(), partition);
515
+
516
+ if (include_offset) {
517
+ int64_t offset = GetParameter<int64_t>(item, "offset", 0);
518
+ toppar->offset = offset;
519
+ }
520
+ }
521
+ return newList;
522
+ }
523
+
524
+ /**
525
+ * @brief v8 Array of Topic Partitions with offsetspec to
526
+ * rd_kafka_topic_partition_list_t
527
+ *
528
+ * @note Converts a v8 array of type [{topic: string, partition: number,
529
+ * offset: {timestamp: number}}] to a rd_kafka_topic_partition_list_t
530
+ */
531
+ rd_kafka_topic_partition_list_t*
532
+ TopicPartitionOffsetSpecv8ArrayToTopicPartitionList(
533
+ v8::Local<v8::Array> parameter) {
534
+ rd_kafka_topic_partition_list_t* newList =
535
+ rd_kafka_topic_partition_list_new(parameter->Length());
536
+
537
+ for (unsigned int i = 0; i < parameter->Length(); i++) {
538
+ v8::Local<v8::Value> v;
539
+ if (!Nan::Get(parameter, i).ToLocal(&v)) {
540
+ continue;
541
+ }
542
+
543
+ if (!v->IsObject()) {
544
+ return NULL; // Return NULL to indicate an error
545
+ }
546
+
547
+ v8::Local<v8::Object> item = v.As<v8::Object>();
548
+
549
+ std::string topic = GetParameter<std::string>(item, "topic", "");
550
+ int partition = GetParameter<int>(item, "partition", -1);
551
+
552
+ rd_kafka_topic_partition_t* toppar =
553
+ rd_kafka_topic_partition_list_add(newList, topic.c_str(), partition);
554
+
555
+ v8::Local<v8::Value> offsetValue =
556
+ Nan::Get(item, Nan::New("offset").ToLocalChecked()).ToLocalChecked();
557
+ if (offsetValue->IsObject()) {
558
+ v8::Local<v8::Object> offsetObject = offsetValue.As<v8::Object>();
559
+ int64_t offset = GetParameter<int64_t>(offsetObject, "timestamp", 0);
560
+ toppar->offset = offset;
561
+ } else {
562
+ toppar->offset = 0;
563
+ }
564
+ }
565
+ return newList;
566
+ }
567
+
568
+ /**
569
+ * @brief v8::Object to RdKafka::TopicPartition
570
+ *
571
+ */
572
+ RdKafka::TopicPartition * FromV8Object(v8::Local<v8::Object> topic_partition) {
573
+ std::string topic = GetParameter<std::string>(topic_partition, "topic", "");
574
+ int partition = GetParameter<int>(topic_partition, "partition", -1);
575
+ int64_t offset = GetParameter<int64_t>(topic_partition, "offset", 0);
576
+
577
+ if (partition == -1) {
578
+ return NULL;
579
+ }
580
+
581
+ if (topic.empty()) {
582
+ return NULL;
583
+ }
584
+
585
+ RdKafka::TopicPartition *toppar =
586
+ RdKafka::TopicPartition::create(topic, partition, offset);
587
+
588
+ v8::Local<v8::String> metadataKey = Nan::New("metadata").ToLocalChecked();
589
+ if (Nan::Has(topic_partition, metadataKey).FromMaybe(false)) {
590
+ v8::Local<v8::Value> metadataValue =
591
+ Nan::Get(topic_partition, metadataKey).ToLocalChecked();
592
+
593
+ if (metadataValue->IsString()) {
594
+ Nan::Utf8String metadataValueUtf8Str(metadataValue.As<v8::String>());
595
+ std::string metadataValueStr(*metadataValueUtf8Str);
596
+ std::vector<unsigned char> metadataVector(metadataValueStr.begin(),
597
+ metadataValueStr.end());
598
+ metadataVector.push_back(
599
+ '\0'); // The null terminator is not included in the iterator.
600
+ toppar->set_metadata(metadataVector);
601
+ }
602
+ }
603
+
604
+ toppar->set_leader_epoch(-1);
605
+ v8::Local<v8::String> leaderEpochKey =
606
+ Nan::New("leaderEpoch").ToLocalChecked();
607
+ if (Nan::Has(topic_partition, leaderEpochKey).FromMaybe(false)) {
608
+ v8::Local<v8::Value> leaderEpochValue =
609
+ Nan::Get(topic_partition, leaderEpochKey).ToLocalChecked();
610
+
611
+ if (leaderEpochValue->IsNumber()) {
612
+ int32_t leaderEpoch = Nan::To<int32_t>(leaderEpochValue).FromJust();
613
+ toppar->set_leader_epoch(leaderEpoch);
614
+ }
615
+ }
616
+
617
+ return toppar;
618
+ }
619
+
620
+ } // namespace TopicPartition
621
+
622
+ namespace Metadata {
623
+
624
+ /**
625
+ * @brief RdKafka::Metadata to v8::Object
626
+ *
627
+ */
628
+ v8::Local<v8::Object> ToV8Object(RdKafka::Metadata* metadata) {
629
+ v8::Local<v8::Object> obj = Nan::New<v8::Object>();
630
+
631
+ v8::Local<v8::Array> broker_data = Nan::New<v8::Array>();
632
+ v8::Local<v8::Array> topic_data = Nan::New<v8::Array>();
633
+
634
+ const BrokerMetadataList* brokers = metadata->brokers(); // NOLINT
635
+
636
+ unsigned int broker_i = 0;
637
+
638
+ for (BrokerMetadataList::const_iterator it = brokers->begin();
639
+ it != brokers->end(); ++it, broker_i++) {
640
+ // Start iterating over brokers and set the object up
641
+
642
+ const RdKafka::BrokerMetadata* x = *it;
643
+
644
+ v8::Local<v8::Object> current_broker = Nan::New<v8::Object>();
645
+
646
+ Nan::Set(current_broker, Nan::New("id").ToLocalChecked(),
647
+ Nan::New<v8::Number>(x->id()));
648
+ Nan::Set(current_broker, Nan::New("host").ToLocalChecked(),
649
+ Nan::New<v8::String>(x->host().c_str()).ToLocalChecked());
650
+ Nan::Set(current_broker, Nan::New("port").ToLocalChecked(),
651
+ Nan::New<v8::Number>(x->port()));
652
+
653
+ Nan::Set(broker_data, broker_i, current_broker);
654
+ }
655
+
656
+ unsigned int topic_i = 0;
657
+
658
+ const TopicMetadataList* topics = metadata->topics();
659
+
660
+ for (TopicMetadataList::const_iterator it = topics->begin();
661
+ it != topics->end(); ++it, topic_i++) {
662
+ // Start iterating over topics
663
+
664
+ const RdKafka::TopicMetadata* x = *it;
665
+
666
+ v8::Local<v8::Object> current_topic = Nan::New<v8::Object>();
667
+
668
+ Nan::Set(current_topic, Nan::New("name").ToLocalChecked(),
669
+ Nan::New<v8::String>(x->topic().c_str()).ToLocalChecked());
670
+
671
+ v8::Local<v8::Array> current_topic_partitions = Nan::New<v8::Array>();
672
+
673
+ const PartitionMetadataList* current_partition_data = x->partitions();
674
+
675
+ unsigned int partition_i = 0;
676
+ PartitionMetadataList::const_iterator itt;
677
+
678
+ for (itt = current_partition_data->begin();
679
+ itt != current_partition_data->end(); ++itt, partition_i++) {
680
+ // partition iterate
681
+ const RdKafka::PartitionMetadata* xx = *itt;
682
+
683
+ v8::Local<v8::Object> current_partition = Nan::New<v8::Object>();
684
+
685
+ Nan::Set(current_partition, Nan::New("id").ToLocalChecked(),
686
+ Nan::New<v8::Number>(xx->id()));
687
+ Nan::Set(current_partition, Nan::New("leader").ToLocalChecked(),
688
+ Nan::New<v8::Number>(xx->leader()));
689
+
690
+ const std::vector<int32_t> * replicas = xx->replicas();
691
+ const std::vector<int32_t> * isrs = xx->isrs();
692
+
693
+ std::vector<int32_t>::const_iterator r_it;
694
+ std::vector<int32_t>::const_iterator i_it;
695
+
696
+ unsigned int r_i = 0;
697
+ unsigned int i_i = 0;
698
+
699
+ v8::Local<v8::Array> current_replicas = Nan::New<v8::Array>();
700
+
701
+ for (r_it = replicas->begin(); r_it != replicas->end(); ++r_it, r_i++) {
702
+ Nan::Set(current_replicas, r_i, Nan::New<v8::Int32>(*r_it));
703
+ }
704
+
705
+ v8::Local<v8::Array> current_isrs = Nan::New<v8::Array>();
706
+
707
+ for (i_it = isrs->begin(); i_it != isrs->end(); ++i_it, i_i++) {
708
+ Nan::Set(current_isrs, i_i, Nan::New<v8::Int32>(*i_it));
709
+ }
710
+
711
+ Nan::Set(current_partition, Nan::New("replicas").ToLocalChecked(),
712
+ current_replicas);
713
+ Nan::Set(current_partition, Nan::New("isrs").ToLocalChecked(),
714
+ current_isrs);
715
+
716
+ Nan::Set(current_topic_partitions, partition_i, current_partition);
717
+ } // iterate over partitions
718
+
719
+ Nan::Set(current_topic, Nan::New("partitions").ToLocalChecked(),
720
+ current_topic_partitions);
721
+
722
+ Nan::Set(topic_data, topic_i, current_topic);
723
+ } // End iterating over topics
724
+
725
+ Nan::Set(obj, Nan::New("orig_broker_id").ToLocalChecked(),
726
+ Nan::New<v8::Number>(metadata->orig_broker_id()));
727
+
728
+ Nan::Set(obj, Nan::New("orig_broker_name").ToLocalChecked(),
729
+ Nan::New<v8::String>(metadata->orig_broker_name()).ToLocalChecked());
730
+
731
+ Nan::Set(obj, Nan::New("topics").ToLocalChecked(), topic_data);
732
+ Nan::Set(obj, Nan::New("brokers").ToLocalChecked(), broker_data);
733
+
734
+ return obj;
735
+ }
736
+
737
+ } // namespace Metadata
738
+
739
+ namespace Message {
740
+
741
+ // Overload for all use cases except delivery reports
742
+ v8::Local<v8::Object> ToV8Object(RdKafka::Message *message) {
743
+ return ToV8Object(message, true, true);
744
+ }
745
+
746
+ v8::Local<v8::Object> ToV8Object(RdKafka::Message *message,
747
+ bool include_payload,
748
+ bool include_headers) {
749
+ if (message->err() == RdKafka::ERR_NO_ERROR) {
750
+ v8::Local<v8::Object> pack = Nan::New<v8::Object>();
751
+
752
+ const void* message_payload = message->payload();
753
+
754
+ if (!include_payload) {
755
+ Nan::Set(pack, Nan::New<v8::String>("value").ToLocalChecked(),
756
+ Nan::Undefined());
757
+ } else if (message_payload) {
758
+ Nan::Set(pack, Nan::New<v8::String>("value").ToLocalChecked(),
759
+ Nan::Encode(message_payload, message->len(), Nan::Encoding::BUFFER));
760
+ } else {
761
+ Nan::Set(pack, Nan::New<v8::String>("value").ToLocalChecked(),
762
+ Nan::Null());
763
+ }
764
+
765
+ RdKafka::Headers* headers;
766
+ if (((headers = message->headers()) != 0) && include_headers) {
767
+ v8::Local<v8::Array> v8headers = Nan::New<v8::Array>();
768
+ int index = 0;
769
+ std::vector<RdKafka::Headers::Header> all = headers->get_all();
770
+ for (std::vector<RdKafka::Headers::Header>::iterator it = all.begin();
771
+ it != all.end(); it++) {
772
+ v8::Local<v8::Object> v8header = Nan::New<v8::Object>();
773
+ Nan::Set(v8header, Nan::New<v8::String>(it->key()).ToLocalChecked(),
774
+ Nan::Encode(it->value_string(),
775
+ it->value_size(), Nan::Encoding::BUFFER));
776
+ Nan::Set(v8headers, index, v8header);
777
+ index++;
778
+ }
779
+ Nan::Set(pack,
780
+ Nan::New<v8::String>("headers").ToLocalChecked(), v8headers);
781
+ }
782
+
783
+ Nan::Set(pack, Nan::New<v8::String>("size").ToLocalChecked(),
784
+ Nan::New<v8::Number>(message->len()));
785
+
786
+ const void* key_payload = message->key_pointer();
787
+
788
+ if (key_payload) {
789
+ // We want this to also be a buffer to avoid corruption
790
+ // https://github.com/confluentinc/confluent-kafka-javascript/issues/208
791
+ Nan::Set(pack, Nan::New<v8::String>("key").ToLocalChecked(),
792
+ Nan::Encode(key_payload, message->key_len(), Nan::Encoding::BUFFER));
793
+ } else {
794
+ Nan::Set(pack, Nan::New<v8::String>("key").ToLocalChecked(),
795
+ Nan::Null());
796
+ }
797
+
798
+ Nan::Set(pack, Nan::New<v8::String>("topic").ToLocalChecked(),
799
+ Nan::New<v8::String>(message->topic_name()).ToLocalChecked());
800
+ Nan::Set(pack, Nan::New<v8::String>("offset").ToLocalChecked(),
801
+ Nan::New<v8::Number>(message->offset()));
802
+ Nan::Set(pack, Nan::New<v8::String>("partition").ToLocalChecked(),
803
+ Nan::New<v8::Number>(message->partition()));
804
+ Nan::Set(pack, Nan::New<v8::String>("timestamp").ToLocalChecked(),
805
+ Nan::New<v8::Number>(message->timestamp().timestamp));
806
+
807
+ int32_t leader_epoch = message->leader_epoch();
808
+ if (leader_epoch >= 0) {
809
+ Nan::Set(pack, Nan::New<v8::String>("leaderEpoch").ToLocalChecked(),
810
+ Nan::New<v8::Number>(leader_epoch));
811
+ }
812
+
813
+ return pack;
814
+ } else {
815
+ return RdKafkaError(message->err());
816
+ }
817
+ }
818
+
819
+ } // namespace Message
820
+
821
+ /**
822
+ * @section Admin API models
823
+ */
824
+
825
+ namespace Admin {
826
+
827
+ /**
828
+ * Create a low level rdkafka handle to represent a topic
829
+ *
830
+ *
831
+ */
832
+ rd_kafka_NewTopic_t* FromV8TopicObject(
833
+ v8::Local<v8::Object> object, std::string &errstr) { // NOLINT
834
+ std::string topic_name = GetParameter<std::string>(object, "topic", "");
835
+ int num_partitions = GetParameter<int>(object, "num_partitions", 0);
836
+ int replication_factor = GetParameter<int>(object, "replication_factor", 0);
837
+
838
+ char errbuf[512];
839
+
840
+ rd_kafka_NewTopic_t* new_topic = rd_kafka_NewTopic_new(
841
+ topic_name.c_str(),
842
+ num_partitions,
843
+ replication_factor,
844
+ errbuf,
845
+ sizeof(errbuf));
846
+
847
+ if (new_topic == NULL) {
848
+ errstr = std::string(errbuf);
849
+ return NULL;
850
+ }
851
+
852
+ rd_kafka_resp_err_t err;
853
+
854
+ if (Nan::Has(object, Nan::New("config").ToLocalChecked()).FromMaybe(false)) {
855
+ // Get the config v8::Object that we can get parameters on
856
+ v8::Local<v8::Object> config =
857
+ Nan::Get(object, Nan::New("config").ToLocalChecked())
858
+ .ToLocalChecked().As<v8::Object>();
859
+
860
+ // Get all of the keys of the object
861
+ v8::MaybeLocal<v8::Array> config_keys = Nan::GetOwnPropertyNames(config);
862
+
863
+ if (!config_keys.IsEmpty()) {
864
+ v8::Local<v8::Array> field_array = config_keys.ToLocalChecked();
865
+ for (size_t i = 0; i < field_array->Length(); i++) {
866
+ v8::Local<v8::String> config_key = Nan::Get(field_array, i)
867
+ .ToLocalChecked().As<v8::String>();
868
+ v8::Local<v8::Value> config_value = Nan::Get(config, config_key)
869
+ .ToLocalChecked();
870
+
871
+ // If the config value is a string...
872
+ if (config_value->IsString()) {
873
+ Nan::Utf8String pKeyVal(config_key);
874
+ std::string pKeyString(*pKeyVal);
875
+
876
+ Nan::Utf8String pValueVal(config_value.As<v8::String>());
877
+ std::string pValString(*pValueVal);
878
+
879
+ err = rd_kafka_NewTopic_set_config(
880
+ new_topic, pKeyString.c_str(), pValString.c_str());
881
+
882
+ if (err != RD_KAFKA_RESP_ERR_NO_ERROR) {
883
+ errstr = rd_kafka_err2str(err);
884
+ rd_kafka_NewTopic_destroy(new_topic);
885
+ return NULL;
886
+ }
887
+ } else {
888
+ errstr = "Config values must all be provided as strings.";
889
+ rd_kafka_NewTopic_destroy(new_topic);
890
+ return NULL;
891
+ }
892
+ }
893
+ }
894
+ }
895
+
896
+ return new_topic;
897
+ }
898
+
899
+ rd_kafka_NewTopic_t** FromV8TopicObjectArray(v8::Local<v8::Array>) {
900
+ return NULL;
901
+ }
902
+
903
+ /**
904
+ * @brief Converts a v8 array of group states into a vector of
905
+ * rd_kafka_consumer_group_state_t.
906
+ */
907
+ std::vector<rd_kafka_consumer_group_state_t> FromV8GroupStateArray(
908
+ v8::Local<v8::Array> array) {
909
+ v8::Local<v8::Array> parameter = array.As<v8::Array>();
910
+ std::vector<rd_kafka_consumer_group_state_t> returnVec;
911
+ if (parameter->Length() >= 1) {
912
+ for (unsigned int i = 0; i < parameter->Length(); i++) {
913
+ v8::Local<v8::Value> v;
914
+ if (!Nan::Get(parameter, i).ToLocal(&v)) {
915
+ continue;
916
+ }
917
+ Nan::Maybe<int64_t> maybeT = Nan::To<int64_t>(v);
918
+ if (maybeT.IsNothing()) {
919
+ continue;
920
+ }
921
+ int64_t state_number = maybeT.FromJust();
922
+ if (state_number >= RD_KAFKA_CONSUMER_GROUP_STATE__CNT) {
923
+ continue;
924
+ }
925
+ returnVec.push_back(
926
+ static_cast<rd_kafka_consumer_group_state_t>(state_number));
927
+ }
928
+ }
929
+ return returnVec;
930
+ }
931
+
932
+ /**
933
+ * @brief Converts a v8 array of group types into a vector of
934
+ * rd_kafka_consumer_group_type_t.
935
+ */
936
+ std::vector<rd_kafka_consumer_group_type_t> FromV8GroupTypeArray(
937
+ v8::Local<v8::Array> array) {
938
+ v8::Local<v8::Array> parameter = array.As<v8::Array>();
939
+ std::vector<rd_kafka_consumer_group_type_t> returnVec;
940
+ if (parameter->Length() >= 1) {
941
+ for (unsigned int i = 0; i < parameter->Length(); i++) {
942
+ v8::Local<v8::Value> v;
943
+ if (!Nan::Get(parameter, i).ToLocal(&v)) {
944
+ continue;
945
+ }
946
+ Nan::Maybe<int64_t> maybeT = Nan::To<int64_t>(v);
947
+ if (maybeT.IsNothing()) {
948
+ continue;
949
+ }
950
+ int64_t type_number = maybeT.FromJust();
951
+ if (type_number < 0 || type_number >= RD_KAFKA_CONSUMER_GROUP_TYPE__CNT) {
952
+ continue;
953
+ }
954
+ returnVec.push_back(
955
+ static_cast<rd_kafka_consumer_group_type_t>(type_number));
956
+ }
957
+ }
958
+ return returnVec;
959
+ }
960
+
961
+ /**
962
+ * @brief Converts a rd_kafka_ListConsumerGroups_result_t* into a v8 object.
963
+ */
964
+ v8::Local<v8::Object> FromListConsumerGroupsResult(
965
+ const rd_kafka_ListConsumerGroups_result_t* result) {
966
+ /* Return object type:
967
+ {
968
+ groups: {
969
+ groupId: string,
970
+ protocolType: string,
971
+ isSimpleConsumerGroup: boolean,
972
+ state: ConsumerGroupState (internally a number)
973
+ type: ConsumerGroupType (internally a number)
974
+ }[],
975
+ errors: LibrdKafkaError[]
976
+ }
977
+ */
978
+ v8::Local<v8::Object> returnObject = Nan::New<v8::Object>();
979
+
980
+ size_t error_cnt;
981
+ const rd_kafka_error_t** error_list =
982
+ rd_kafka_ListConsumerGroups_result_errors(result, &error_cnt);
983
+ Nan::Set(returnObject, Nan::New("errors").ToLocalChecked(),
984
+ Conversion::Util::ToV8Array(error_list, error_cnt));
985
+
986
+ v8::Local<v8::Array> groups = Nan::New<v8::Array>();
987
+ size_t groups_cnt;
988
+ const rd_kafka_ConsumerGroupListing_t** groups_list =
989
+ rd_kafka_ListConsumerGroups_result_valid(result, &groups_cnt);
990
+
991
+ for (size_t i = 0; i < groups_cnt; i++) {
992
+ const rd_kafka_ConsumerGroupListing_t* group = groups_list[i];
993
+ v8::Local<v8::Object> groupObject = Nan::New<v8::Object>();
994
+
995
+ Nan::Set(groupObject, Nan::New("groupId").ToLocalChecked(),
996
+ Nan::New<v8::String>(rd_kafka_ConsumerGroupListing_group_id(group))
997
+ .ToLocalChecked());
998
+
999
+ bool is_simple =
1000
+ rd_kafka_ConsumerGroupListing_is_simple_consumer_group(group);
1001
+ Nan::Set(groupObject, Nan::New("isSimpleConsumerGroup").ToLocalChecked(),
1002
+ Nan::New<v8::Boolean>(is_simple));
1003
+
1004
+ std::string protocol_type = is_simple ? "simple" : "consumer";
1005
+ Nan::Set(groupObject, Nan::New("protocolType").ToLocalChecked(),
1006
+ Nan::New<v8::String>(protocol_type).ToLocalChecked());
1007
+
1008
+ Nan::Set(groupObject, Nan::New("state").ToLocalChecked(),
1009
+ Nan::New<v8::Number>(rd_kafka_ConsumerGroupListing_state(group)));
1010
+
1011
+ Nan::Set(groupObject, Nan::New("type").ToLocalChecked(),
1012
+ Nan::New<v8::Number>(rd_kafka_ConsumerGroupListing_type(group)));
1013
+
1014
+ Nan::Set(groups, i, groupObject);
1015
+ }
1016
+
1017
+ Nan::Set(returnObject, Nan::New("groups").ToLocalChecked(), groups);
1018
+ return returnObject;
1019
+ }
1020
+
1021
+ /**
1022
+ * @brief Converts a rd_kafka_MemberDescription_t* into a v8 object.
1023
+ */
1024
+ v8::Local<v8::Object> FromMemberDescription(
1025
+ const rd_kafka_MemberDescription_t* member) {
1026
+ /* Return object type:
1027
+ {
1028
+ clientHost: string
1029
+ clientId: string
1030
+ memberId: string
1031
+ memberAssignment: Buffer // will be always null
1032
+ memberMetadata: Buffer // will be always null
1033
+ groupInstanceId: string
1034
+ assignment: {
1035
+ topicPartitions: TopicPartition[]
1036
+ },
1037
+ targetAssignment?: {
1038
+ topicPartitions: TopicPartition[]
1039
+ }
1040
+ }
1041
+ */
1042
+ v8::Local<v8::Object> returnObject = Nan::New<v8::Object>();
1043
+
1044
+ // clientHost
1045
+ Nan::Set(returnObject, Nan::New("clientHost").ToLocalChecked(),
1046
+ Nan::New<v8::String>(rd_kafka_MemberDescription_host(member))
1047
+ .ToLocalChecked());
1048
+
1049
+ // clientId
1050
+ Nan::Set(returnObject, Nan::New("clientId").ToLocalChecked(),
1051
+ Nan::New<v8::String>(rd_kafka_MemberDescription_client_id(member))
1052
+ .ToLocalChecked());
1053
+
1054
+ // memberId
1055
+ Nan::Set(returnObject, Nan::New("memberId").ToLocalChecked(),
1056
+ Nan::New<v8::String>(rd_kafka_MemberDescription_consumer_id(member))
1057
+ .ToLocalChecked());
1058
+
1059
+ // memberAssignment - not passed to user, always null
1060
+ Nan::Set(returnObject, Nan::New("memberAssignment").ToLocalChecked(),
1061
+ Nan::Null());
1062
+
1063
+ // memberMetadata - not passed to user, always null
1064
+ Nan::Set(returnObject, Nan::New("memberMetadata").ToLocalChecked(),
1065
+ Nan::Null());
1066
+
1067
+ // groupInstanceId
1068
+ const char* group_instance_id =
1069
+ rd_kafka_MemberDescription_group_instance_id(member);
1070
+ if (group_instance_id) {
1071
+ Nan::Set(returnObject, Nan::New("groupInstanceId").ToLocalChecked(),
1072
+ Nan::New<v8::String>(group_instance_id).ToLocalChecked());
1073
+ }
1074
+
1075
+ // assignment
1076
+ const rd_kafka_MemberAssignment_t* assignment =
1077
+ rd_kafka_MemberDescription_assignment(member);
1078
+ const rd_kafka_topic_partition_list_t* partitions =
1079
+ rd_kafka_MemberAssignment_partitions(assignment);
1080
+ v8::Local<v8::Array> topicPartitions =
1081
+ Conversion::TopicPartition::ToTopicPartitionV8Array(partitions, false);
1082
+ v8::Local<v8::Object> assignmentObject = Nan::New<v8::Object>();
1083
+ Nan::Set(assignmentObject, Nan::New("topicPartitions").ToLocalChecked(),
1084
+ topicPartitions);
1085
+ Nan::Set(returnObject, Nan::New("assignment").ToLocalChecked(),
1086
+ assignmentObject);
1087
+
1088
+ // targetAssignment
1089
+ const rd_kafka_MemberAssignment_t* target_assignment =
1090
+ rd_kafka_MemberDescription_target_assignment(member);
1091
+ if (target_assignment) {
1092
+ const rd_kafka_topic_partition_list_t* target_partitions =
1093
+ rd_kafka_MemberAssignment_partitions(target_assignment);
1094
+ v8::Local<v8::Array> targetTopicPartitions =
1095
+ Conversion::TopicPartition::ToTopicPartitionV8Array(
1096
+ target_partitions, false);
1097
+ v8::Local<v8::Object> targetAssignmentObject = Nan::New<v8::Object>();
1098
+ Nan::Set(targetAssignmentObject,
1099
+ Nan::New("topicPartitions").ToLocalChecked(),
1100
+ targetTopicPartitions);
1101
+ Nan::Set(returnObject, Nan::New("targetAssignment").ToLocalChecked(),
1102
+ targetAssignmentObject);
1103
+ }
1104
+
1105
+ return returnObject;
1106
+ }
1107
+
1108
+ /**
1109
+ * @brief Converts a rd_kafka_ConsumerGroupDescription_t* into a v8 object.
1110
+ */
1111
+ v8::Local<v8::Object> FromConsumerGroupDescription(
1112
+ const rd_kafka_ConsumerGroupDescription_t* desc) {
1113
+ /* Return object type:
1114
+ {
1115
+ groupId: string,
1116
+ error: LibrdKafkaError,
1117
+ members: MemberDescription[],
1118
+ protocol: string
1119
+ isSimpleConsumerGroup: boolean
1120
+ protocolType: string
1121
+ partitionAssignor: string
1122
+ state: ConsumerGroupState - internally a number
1123
+ coordinator: Node
1124
+ authorizedOperations: AclOperationType[] - internally numbers
1125
+ }
1126
+ */
1127
+ v8::Local<v8::Object> returnObject = Nan::New<v8::Object>();
1128
+
1129
+ // groupId
1130
+ Nan::Set(
1131
+ returnObject, Nan::New("groupId").ToLocalChecked(),
1132
+ Nan::New<v8::String>(rd_kafka_ConsumerGroupDescription_group_id(desc))
1133
+ .ToLocalChecked());
1134
+
1135
+ // error
1136
+ const rd_kafka_error_t* error = rd_kafka_ConsumerGroupDescription_error(desc);
1137
+ if (error) {
1138
+ RdKafka::ErrorCode code =
1139
+ static_cast<RdKafka::ErrorCode>(rd_kafka_error_code(error));
1140
+ std::string msg = std::string(rd_kafka_error_string(error));
1141
+ Nan::Set(returnObject, Nan::New("error").ToLocalChecked(),
1142
+ RdKafkaError(code, msg));
1143
+ }
1144
+
1145
+ // members
1146
+ v8::Local<v8::Array> members = Nan::New<v8::Array>();
1147
+ size_t member_cnt = rd_kafka_ConsumerGroupDescription_member_count(desc);
1148
+ for (size_t i = 0; i < member_cnt; i++) {
1149
+ const rd_kafka_MemberDescription_t* member =
1150
+ rd_kafka_ConsumerGroupDescription_member(desc, i);
1151
+ Nan::Set(members, i, FromMemberDescription(member));
1152
+ }
1153
+ Nan::Set(returnObject, Nan::New("members").ToLocalChecked(), members);
1154
+
1155
+ // isSimpleConsumerGroup
1156
+ bool is_simple =
1157
+ rd_kafka_ConsumerGroupDescription_is_simple_consumer_group(desc);
1158
+ Nan::Set(returnObject, Nan::New("isSimpleConsumerGroup").ToLocalChecked(),
1159
+ Nan::New<v8::Boolean>(is_simple));
1160
+
1161
+ // protocolType
1162
+ std::string protocolType = is_simple ? "simple" : "consumer";
1163
+ Nan::Set(returnObject, Nan::New("protocolType").ToLocalChecked(),
1164
+ Nan::New<v8::String>(protocolType).ToLocalChecked());
1165
+
1166
+ // protocol
1167
+ Nan::Set(returnObject, Nan::New("protocol").ToLocalChecked(),
1168
+ Nan::New<v8::String>(
1169
+ rd_kafka_ConsumerGroupDescription_partition_assignor(desc))
1170
+ .ToLocalChecked());
1171
+
1172
+ // partitionAssignor
1173
+ Nan::Set(returnObject, Nan::New("partitionAssignor").ToLocalChecked(),
1174
+ Nan::New<v8::String>(
1175
+ rd_kafka_ConsumerGroupDescription_partition_assignor(desc))
1176
+ .ToLocalChecked());
1177
+
1178
+ // state
1179
+ Nan::Set(returnObject, Nan::New("state").ToLocalChecked(),
1180
+ Nan::New<v8::Number>(rd_kafka_ConsumerGroupDescription_state(desc)));
1181
+
1182
+ // type
1183
+ Nan::Set(returnObject, Nan::New("type").ToLocalChecked(),
1184
+ Nan::New<v8::Number>(rd_kafka_ConsumerGroupDescription_type(desc)));
1185
+
1186
+ // coordinator
1187
+ const rd_kafka_Node_t* coordinator =
1188
+ rd_kafka_ConsumerGroupDescription_coordinator(desc);
1189
+ if (coordinator) {
1190
+ v8::Local<v8::Object> coordinatorObject =
1191
+ Conversion::Util::ToV8Object(coordinator);
1192
+ Nan::Set(returnObject, Nan::New("coordinator").ToLocalChecked(),
1193
+ coordinatorObject);
1194
+ }
1195
+
1196
+ // authorizedOperations
1197
+ size_t authorized_operations_cnt;
1198
+ const rd_kafka_AclOperation_t* authorized_operations =
1199
+ rd_kafka_ConsumerGroupDescription_authorized_operations(
1200
+ desc, &authorized_operations_cnt);
1201
+ if (authorized_operations) {
1202
+ Nan::Set(returnObject, Nan::New("authorizedOperations").ToLocalChecked(),
1203
+ Conversion::Util::ToV8Array(authorized_operations,
1204
+ authorized_operations_cnt));
1205
+ }
1206
+
1207
+ return returnObject;
1208
+ }
1209
+
1210
+ /**
1211
+ * @brief Converts a rd_kafka_DescribeConsumerGroups_result_t* into a v8 object.
1212
+ */
1213
+ v8::Local<v8::Object> FromDescribeConsumerGroupsResult(
1214
+ const rd_kafka_DescribeConsumerGroups_result_t* result) {
1215
+ /* Return object type:
1216
+ { groups: GroupDescription[] }
1217
+ */
1218
+ v8::Local<v8::Object> returnObject = Nan::New<v8::Object>();
1219
+ v8::Local<v8::Array> groups = Nan::New<v8::Array>();
1220
+ size_t groups_cnt;
1221
+ const rd_kafka_ConsumerGroupDescription_t** groups_list =
1222
+ rd_kafka_DescribeConsumerGroups_result_groups(result, &groups_cnt);
1223
+
1224
+ for (size_t i = 0; i < groups_cnt; i++) {
1225
+ const rd_kafka_ConsumerGroupDescription_t* group = groups_list[i];
1226
+ Nan::Set(groups, i, FromConsumerGroupDescription(group));
1227
+ }
1228
+
1229
+ Nan::Set(returnObject, Nan::New("groups").ToLocalChecked(), groups);
1230
+ return returnObject;
1231
+ }
1232
+
1233
+ /**
1234
+ * @brief Converts a rd_kafka_DeleteGroups_result_t* into a v8 array.
1235
+ */
1236
+ v8::Local<v8::Array> FromDeleteGroupsResult(
1237
+ const rd_kafka_DeleteGroups_result_t* result) {
1238
+ /* Return object type:
1239
+ [{
1240
+ groupId: string
1241
+ errorCode?: number
1242
+ error?: LibrdKafkaError
1243
+ }]
1244
+ */
1245
+ v8::Local<v8::Array> returnArray = Nan::New<v8::Array>();
1246
+ size_t result_cnt;
1247
+ const rd_kafka_group_result_t** results =
1248
+ rd_kafka_DeleteGroups_result_groups(result, &result_cnt);
1249
+
1250
+ for (size_t i = 0; i < result_cnt; i++) {
1251
+ const rd_kafka_group_result_t* group_result = results[i];
1252
+ v8::Local<v8::Object> group_object = Nan::New<v8::Object>();
1253
+
1254
+ Nan::Set(group_object, Nan::New("groupId").ToLocalChecked(),
1255
+ Nan::New<v8::String>(rd_kafka_group_result_name(group_result))
1256
+ .ToLocalChecked());
1257
+
1258
+ const rd_kafka_error_t* error = rd_kafka_group_result_error(group_result);
1259
+ if (!error) {
1260
+ Nan::Set(group_object, Nan::New("errorCode").ToLocalChecked(),
1261
+ Nan::New<v8::Number>(RD_KAFKA_RESP_ERR_NO_ERROR));
1262
+ } else {
1263
+ RdKafka::ErrorCode code =
1264
+ static_cast<RdKafka::ErrorCode>(rd_kafka_error_code(error));
1265
+ const char* msg = rd_kafka_error_string(error);
1266
+
1267
+ Nan::Set(group_object, Nan::New("errorCode").ToLocalChecked(),
1268
+ Nan::New<v8::Number>(code));
1269
+ Nan::Set(group_object, Nan::New("error").ToLocalChecked(),
1270
+ RdKafkaError(code, msg));
1271
+ }
1272
+ Nan::Set(returnArray, i, group_object);
1273
+ }
1274
+
1275
+ return returnArray;
1276
+ }
1277
+
1278
+ /**
1279
+ * @brief Converts a rd_kafka_ListConsumerGroupOffsets_result_t*
1280
+ * into a v8 Array.
1281
+ */
1282
+ v8::Local<v8::Array> FromListConsumerGroupOffsetsResult(
1283
+ const rd_kafka_ListConsumerGroupOffsets_result_t* result) {
1284
+ /* Return Object type:
1285
+ GroupResults[] = [{
1286
+ groupId : string,
1287
+ error? : LibrdKafkaError,
1288
+ partitions : TopicPartitionOffset[]
1289
+ }]
1290
+
1291
+ TopicPartitionOffset:
1292
+ {
1293
+ topic : string,
1294
+ partition : number,
1295
+ offset : number,
1296
+ metadata : string | null,
1297
+ leaderEpoch? : number,
1298
+ error? : LibrdKafkaError
1299
+ }
1300
+ */
1301
+
1302
+ v8::Local<v8::Array> returnArray = Nan::New<v8::Array>();
1303
+ size_t result_cnt;
1304
+ const rd_kafka_group_result_t** res =
1305
+ rd_kafka_ListConsumerGroupOffsets_result_groups(result, &result_cnt);
1306
+
1307
+ for (size_t i = 0; i < result_cnt; i++) {
1308
+ const rd_kafka_group_result_t* group_result = res[i];
1309
+
1310
+ // Create group result object
1311
+ v8::Local<v8::Object> group_object = Nan::New<v8::Object>();
1312
+
1313
+ // Set groupId
1314
+ std::string groupId = rd_kafka_group_result_name(group_result);
1315
+ Nan::Set(group_object, Nan::New("groupId").ToLocalChecked(),
1316
+ Nan::New<v8::String>(groupId.c_str()).ToLocalChecked());
1317
+
1318
+ // Set group-level error (if any)
1319
+ const rd_kafka_error_t* group_error =
1320
+ rd_kafka_group_result_error(group_result);
1321
+ if (group_error) {
1322
+ RdKafka::ErrorCode code =
1323
+ static_cast<RdKafka::ErrorCode>(rd_kafka_error_code(group_error));
1324
+ const char* msg = rd_kafka_error_string(group_error);
1325
+ Nan::Set(group_object, Nan::New("error").ToLocalChecked(),
1326
+ RdKafkaError(code, msg));
1327
+ }
1328
+
1329
+ // Get the list of partitions for this group
1330
+ const rd_kafka_topic_partition_list_t* partitionList =
1331
+ rd_kafka_group_result_partitions(group_result);
1332
+
1333
+ // Prepare array for TopicPartitionOffset[]
1334
+ v8::Local<v8::Array> partitionsArray = Nan::New<v8::Array>();
1335
+ int partitionIndex = 0;
1336
+
1337
+ for (int j = 0; j < partitionList->cnt; j++) {
1338
+ const rd_kafka_topic_partition_t* partition = &partitionList->elems[j];
1339
+
1340
+ // Create the TopicPartitionOffset object
1341
+ v8::Local<v8::Object> partition_object = Nan::New<v8::Object>();
1342
+
1343
+ // Set topic, partition, and offset
1344
+ Nan::Set(partition_object, Nan::New("topic").ToLocalChecked(),
1345
+ Nan::New<v8::String>(partition->topic).ToLocalChecked());
1346
+ Nan::Set(partition_object, Nan::New("partition").ToLocalChecked(),
1347
+ Nan::New<v8::Number>(partition->partition));
1348
+ Nan::Set(partition_object, Nan::New("offset").ToLocalChecked(),
1349
+ Nan::New<v8::Number>(partition->offset));
1350
+
1351
+ // Set metadata (if available)
1352
+ if (partition->metadata != nullptr) {
1353
+ Nan::Set(
1354
+ partition_object, Nan::New("metadata").ToLocalChecked(),
1355
+ Nan::New<v8::String>(static_cast<const char*>(partition->metadata))
1356
+ .ToLocalChecked());
1357
+ } else {
1358
+ Nan::Set(partition_object, Nan::New("metadata").ToLocalChecked(),
1359
+ Nan::Null());
1360
+ }
1361
+
1362
+ // Set leaderEpoch (if available)
1363
+ int32_t leader_epoch =
1364
+ rd_kafka_topic_partition_get_leader_epoch(partition);
1365
+ if (leader_epoch >= 0) {
1366
+ Nan::Set(partition_object, Nan::New("leaderEpoch").ToLocalChecked(),
1367
+ Nan::New<v8::Number>(leader_epoch));
1368
+ }
1369
+
1370
+ // Set partition-level error (if any)
1371
+ if (partition->err != RD_KAFKA_RESP_ERR_NO_ERROR) {
1372
+ RdKafka::ErrorCode code =
1373
+ static_cast<RdKafka::ErrorCode>(partition->err);
1374
+ Nan::Set(partition_object, Nan::New("error").ToLocalChecked(),
1375
+ RdKafkaError(code, rd_kafka_err2str(partition->err)));
1376
+ }
1377
+
1378
+ Nan::Set(partitionsArray, partitionIndex++, partition_object);
1379
+ }
1380
+
1381
+ Nan::Set(group_object, Nan::New("partitions").ToLocalChecked(),
1382
+ partitionsArray);
1383
+
1384
+ Nan::Set(returnArray, i, group_object);
1385
+ }
1386
+
1387
+ return returnArray;
1388
+ }
1389
+
1390
+ /**
1391
+ * @brief Converts a rd_kafka_DeleteRecords_result_t* into a v8 Array.
1392
+ */
1393
+ v8::Local<v8::Array> FromDeleteRecordsResult(
1394
+ const rd_kafka_DeleteRecords_result_t* result) {
1395
+ /* Return object type:
1396
+ [{
1397
+ topic: string,
1398
+ partition: number,
1399
+ lowWatermark: number,
1400
+ error?: LibrdKafkaError
1401
+ }]
1402
+ */
1403
+ const rd_kafka_topic_partition_list_t* partitionList =
1404
+ rd_kafka_DeleteRecords_result_offsets(result);
1405
+
1406
+ v8::Local<v8::Array> partitionsArray = Nan::New<v8::Array>();
1407
+ int partitionIndex = 0;
1408
+
1409
+ for (int j = 0; j < partitionList->cnt; j++) {
1410
+ const rd_kafka_topic_partition_t* partition = &partitionList->elems[j];
1411
+
1412
+ // Create the TopicPartitionOffset object
1413
+ v8::Local<v8::Object> partition_object = Nan::New<v8::Object>();
1414
+
1415
+ // Set topic, partition, and offset and error(if required)
1416
+ Nan::Set(partition_object, Nan::New("topic").ToLocalChecked(),
1417
+ Nan::New<v8::String>(partition->topic).ToLocalChecked());
1418
+ Nan::Set(partition_object, Nan::New("partition").ToLocalChecked(),
1419
+ Nan::New<v8::Number>(partition->partition));
1420
+ Nan::Set(partition_object, Nan::New("lowWatermark").ToLocalChecked(),
1421
+ Nan::New<v8::Number>(partition->offset));
1422
+
1423
+ if (partition->err != RD_KAFKA_RESP_ERR_NO_ERROR) {
1424
+ RdKafka::ErrorCode code = static_cast<RdKafka::ErrorCode>(partition->err);
1425
+ Nan::Set(partition_object, Nan::New("error").ToLocalChecked(),
1426
+ RdKafkaError(code, rd_kafka_err2str(partition->err)));
1427
+ }
1428
+
1429
+ Nan::Set(partitionsArray, partitionIndex++, partition_object);
1430
+ }
1431
+
1432
+ return partitionsArray;
1433
+ }
1434
+
1435
+ /**
1436
+ * @brief Converts a rd_kafka_DescribeTopics_result_t* into a v8 Array.
1437
+ */
1438
+ v8::Local<v8::Array> FromDescribeTopicsResult(
1439
+ const rd_kafka_DescribeTopics_result_t* result) {
1440
+ /* Return object type:
1441
+ [{
1442
+ name: string,
1443
+ topicId: Uuid,
1444
+ isInternal: boolean,
1445
+ partitions: [{
1446
+ partition: number,
1447
+ leader: Node,
1448
+ isr: Node[],
1449
+ replicas: Node[],
1450
+ }]
1451
+ error?: LibrdKafkaError,
1452
+ authorizedOperations?: AclOperationType[]
1453
+ }]
1454
+ */
1455
+
1456
+ /*
1457
+ Node:
1458
+ {
1459
+ id: number,
1460
+ host: string,
1461
+ port: number
1462
+ rack?: string
1463
+ }
1464
+ */
1465
+
1466
+ v8::Local<v8::Array> returnArray = Nan::New<v8::Array>();
1467
+ size_t result_cnt;
1468
+ const rd_kafka_TopicDescription_t** results =
1469
+ rd_kafka_DescribeTopics_result_topics(result, &result_cnt);
1470
+
1471
+ int topicIndex = 0;
1472
+
1473
+ for (size_t i = 0; i < result_cnt; i++) {
1474
+ v8::Local<v8::Object> topic_object = Nan::New<v8::Object>();
1475
+
1476
+ const char* topic_name = rd_kafka_TopicDescription_name(results[i]);
1477
+ Nan::Set(topic_object, Nan::New("name").ToLocalChecked(),
1478
+ Nan::New<v8::String>(topic_name).ToLocalChecked());
1479
+
1480
+ const rd_kafka_Uuid_t* topic_id =
1481
+ rd_kafka_TopicDescription_topic_id(results[i]);
1482
+ Nan::Set(topic_object, Nan::New("topicId").ToLocalChecked(),
1483
+ Conversion::Util::UuidToV8Object(topic_id));
1484
+
1485
+ int is_internal = rd_kafka_TopicDescription_is_internal(results[i]);
1486
+ Nan::Set(topic_object, Nan::New("isInternal").ToLocalChecked(),
1487
+ Nan::New<v8::Boolean>(is_internal));
1488
+
1489
+ const rd_kafka_error_t* error = rd_kafka_TopicDescription_error(results[i]);
1490
+ if (error) {
1491
+ RdKafka::ErrorCode code =
1492
+ static_cast<RdKafka::ErrorCode>(rd_kafka_error_code(error));
1493
+ Nan::Set(topic_object, Nan::New("error").ToLocalChecked(),
1494
+ RdKafkaError(code, rd_kafka_error_string(error)));
1495
+ }
1496
+
1497
+ size_t authorized_operations_cnt;
1498
+ const rd_kafka_AclOperation_t* authorized_operations =
1499
+ rd_kafka_TopicDescription_authorized_operations(
1500
+ results[i], &authorized_operations_cnt);
1501
+ if (authorized_operations) {
1502
+ Nan::Set(topic_object, Nan::New("authorizedOperations").ToLocalChecked(),
1503
+ Conversion::Util::ToV8Array(authorized_operations,
1504
+ authorized_operations_cnt));
1505
+ }
1506
+
1507
+ size_t partition_cnt;
1508
+ const rd_kafka_TopicPartitionInfo_t** partitions =
1509
+ rd_kafka_TopicDescription_partitions(results[i], &partition_cnt);
1510
+ v8::Local<v8::Array> partitionsArray = Nan::New<v8::Array>();
1511
+ for (size_t j = 0; j < partition_cnt; j++) {
1512
+ v8::Local<v8::Object> partition_object = Nan::New<v8::Object>();
1513
+ const rd_kafka_TopicPartitionInfo_t* partition = partitions[j];
1514
+ Nan::Set(partition_object, Nan::New("partition").ToLocalChecked(),
1515
+ Nan::New<v8::Number>(
1516
+ rd_kafka_TopicPartitionInfo_partition(partition)));
1517
+
1518
+ const rd_kafka_Node_t* leader =
1519
+ rd_kafka_TopicPartitionInfo_leader(partition);
1520
+ // Check leader for NULL - can happen when partition has no leader
1521
+ if (leader) {
1522
+ Nan::Set(partition_object, Nan::New("leader").ToLocalChecked(),
1523
+ Conversion::Util::ToV8Object(leader));
1524
+ } else {
1525
+ Nan::Set(partition_object, Nan::New("leader").ToLocalChecked(),
1526
+ Nan::Null());
1527
+ }
1528
+
1529
+ size_t isr_cnt;
1530
+ const rd_kafka_Node_t** isr =
1531
+ rd_kafka_TopicPartitionInfo_isr(partition, &isr_cnt);
1532
+ v8::Local<v8::Array> isrArray = Nan::New<v8::Array>();
1533
+ for (size_t k = 0; k < isr_cnt; k++) {
1534
+ Nan::Set(isrArray, k, Conversion::Util::ToV8Object(isr[k]));
1535
+ }
1536
+ Nan::Set(partition_object, Nan::New("isr").ToLocalChecked(), isrArray);
1537
+
1538
+ size_t replicas_cnt;
1539
+ const rd_kafka_Node_t** replicas =
1540
+ rd_kafka_TopicPartitionInfo_replicas(partition, &replicas_cnt);
1541
+ v8::Local<v8::Array> replicasArray = Nan::New<v8::Array>();
1542
+ for (size_t k = 0; k < replicas_cnt; k++) {
1543
+ Nan::Set(replicasArray, k, Conversion::Util::ToV8Object(replicas[k]));
1544
+ }
1545
+ Nan::Set(partition_object, Nan::New("replicas").ToLocalChecked(),
1546
+ replicasArray);
1547
+
1548
+ Nan::Set(partitionsArray, j, partition_object);
1549
+ }
1550
+ Nan::Set(topic_object, Nan::New("partitions").ToLocalChecked(),
1551
+ partitionsArray);
1552
+
1553
+ Nan::Set(returnArray, topicIndex++, topic_object);
1554
+ }
1555
+
1556
+ return returnArray;
1557
+ }
1558
+
1559
+ /**
1560
+ * @brief Converts a rd_kafka_ListOffsets_result_t* into a v8 Array.
1561
+ */
1562
+ v8::Local<v8::Array> FromListOffsetsResult(
1563
+ const rd_kafka_ListOffsets_result_t* result) {
1564
+ /* Return object type:
1565
+ [{
1566
+ topic: string,
1567
+ partition: number,
1568
+ offset: number,
1569
+ error: LibrdKafkaError
1570
+ timestamp: number
1571
+ }]
1572
+ */
1573
+
1574
+ size_t result_cnt, i;
1575
+ const rd_kafka_ListOffsetsResultInfo_t** results =
1576
+ rd_kafka_ListOffsets_result_infos(result, &result_cnt);
1577
+
1578
+ v8::Local<v8::Array> resultArray = Nan::New<v8::Array>();
1579
+ int partitionIndex = 0;
1580
+
1581
+ for (i = 0; i < result_cnt; i++) {
1582
+ const rd_kafka_topic_partition_t* partition =
1583
+ rd_kafka_ListOffsetsResultInfo_topic_partition(results[i]);
1584
+ int64_t timestamp = rd_kafka_ListOffsetsResultInfo_timestamp(results[i]);
1585
+
1586
+ // Create the ListOffsetsResult object
1587
+ v8::Local<v8::Object> partition_object = Nan::New<v8::Object>();
1588
+
1589
+ // Set topic, partition, offset, error and timestamp
1590
+ Nan::Set(partition_object, Nan::New("topic").ToLocalChecked(),
1591
+ Nan::New<v8::String>(partition->topic).ToLocalChecked());
1592
+ Nan::Set(partition_object, Nan::New("partition").ToLocalChecked(),
1593
+ Nan::New<v8::Number>(partition->partition));
1594
+ Nan::Set(partition_object, Nan::New("offset").ToLocalChecked(),
1595
+ Nan::New<v8::Number>(partition->offset));
1596
+ if (partition->err != RD_KAFKA_RESP_ERR_NO_ERROR) {
1597
+ RdKafka::ErrorCode code = static_cast<RdKafka::ErrorCode>(partition->err);
1598
+ Nan::Set(partition_object, Nan::New("error").ToLocalChecked(),
1599
+ RdKafkaError(code, rd_kafka_err2str(partition->err)));
1600
+ }
1601
+ // Set leaderEpoch (if available)
1602
+ int32_t leader_epoch =
1603
+ rd_kafka_topic_partition_get_leader_epoch(partition);
1604
+ if (leader_epoch >= 0) {
1605
+ Nan::Set(partition_object, Nan::New("leaderEpoch").ToLocalChecked(),
1606
+ Nan::New<v8::Number>(leader_epoch));
1607
+ }
1608
+ Nan::Set(partition_object, Nan::New("timestamp").ToLocalChecked(),
1609
+ Nan::New<v8::Number>(timestamp));
1610
+
1611
+ Nan::Set(resultArray, partitionIndex++, partition_object);
1612
+ }
1613
+
1614
+ return resultArray;
1615
+ }
1616
+
1617
+ } // namespace Admin
1618
+
1619
+ } // namespace Conversion
1620
+
1621
+ namespace Util {
1622
+ std::string FromV8String(v8::Local<v8::String> val) {
1623
+ Nan::Utf8String keyUTF8(val);
1624
+ return std::string(*keyUTF8);
1625
+ }
1626
+ } // Namespace Util
1627
+
1628
+ } // namespace NodeKafka